Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
interpolation.c File Reference
#include "common/interpolation.h"
#include "common/darktable.h"
#include "common/math.h"
#include "control/conf.h"
#include <assert.h>
#include <glib.h>
#include <inttypes.h>
#include <stddef.h>
#include <stdint.h>
+ Include dependency graph for interpolation.c:

Go to the source code of this file.

Macros

#define RESAMPLING_BORDER_MODE   BORDER_REPLICATE
 
#define INTERPOLATION_BORDER_MODE   BORDER_MIRROR
 
#define MAX_HALF_FILTER_WIDTH   3
 
#define DEBUG_PRINT_VERBOSE   0
 
#define MAX_KERNEL_REQ   ((2 * (MAX_HALF_FILTER_WIDTH) + 3) & (~3))
 
#define TILE_ROWS   128
 

Enumerations

enum  border_mode {
  BORDER_REPLICATE ,
  BORDER_WRAP ,
  BORDER_MIRROR ,
  BORDER_CLAMP
}
 

Functions

static __attribute__ ((always_inline))
 
static float _maketaps_bilinear (float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
 
static float _maketaps_bicubic (float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
 
static float _maketaps_mitchell (float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
 
static void _compute_downsampling_kernel (const struct dt_interpolation *itor, int *taps, int *first, float *kernel, float *norm, const float outoinratio, const int xout)
 
__DT_CLONE_TARGETS__ float dt_interpolation_compute_sample (const struct dt_interpolation *itor, const float *in, const float x, const float y, const int width, const int height, const int samplestride, const int linestride)
 
__DT_CLONE_TARGETS__ void dt_interpolation_compute_pixel4c (const struct dt_interpolation *itor, const float *in, float *out, const float x, const float y, const int width, const int height, const int linestride)
 
const struct dt_interpolationdt_interpolation_new (enum dt_interpolation_type type)
 
static __DT_CLONE_TARGETS__ gboolean _prepare_resampling_plan (const struct dt_interpolation *itor, const int in, const int in_x0, const int out, const int out_x0, const float scale, int **plength, float **pkernel, int **pindex, int **pmeta)
 
static __DT_CLONE_TARGETS__ void _interpolation_resample_plain (const struct dt_interpolation *itor, float *const restrict out, const dt_iop_roi_t *const roi_out, const float *const restrict in, const dt_iop_roi_t *const roi_in)
 
void dt_interpolation_resample (const struct dt_interpolation *itor, float *out, const dt_iop_roi_t *const roi_out, const float *const in, const dt_iop_roi_t *const roi_in)
 
void dt_interpolation_resample_roi (const struct dt_interpolation *itor, float *out, const dt_iop_roi_t *const roi_out, const float *const in, const dt_iop_roi_t *const roi_in)
 
dt_interpolation_cl_global_tdt_interpolation_init_cl_global ()
 
void dt_interpolation_free_cl_global (dt_interpolation_cl_global_t *g)
 
static uint32_t roundToNextPowerOfTwo (uint32_t x)
 
int dt_interpolation_resample_cl (const struct dt_interpolation *itor, const int devid, cl_mem dev_out, const dt_iop_roi_t *const roi_out, cl_mem dev_in, const dt_iop_roi_t *const roi_in)
 
int dt_interpolation_resample_roi_cl (const struct dt_interpolation *itor, const int devid, cl_mem dev_out, const dt_iop_roi_t *const roi_out, cl_mem dev_in, const dt_iop_roi_t *const roi_in)
 
static void _interpolation_resample_1c_plain (const struct dt_interpolation *itor, float *out, const dt_iop_roi_t *const roi_out, const float *const in, const dt_iop_roi_t *const roi_in)
 
void dt_interpolation_resample_1c (const struct dt_interpolation *itor, float *out, const dt_iop_roi_t *const roi_out, const float *const in, const dt_iop_roi_t *const roi_in)
 
void dt_interpolation_resample_roi_1c (const struct dt_interpolation *itor, float *out, const dt_iop_roi_t *const roi_out, const float *const in, const dt_iop_roi_t *const roi_in)
 

Variables

static const struct dt_interpolation dt_interpolator []
 

Macro Definition Documentation

◆ DEBUG_PRINT_VERBOSE

#define DEBUG_PRINT_VERBOSE   0

Definition at line 68 of file interpolation.c.

◆ INTERPOLATION_BORDER_MODE

#define INTERPOLATION_BORDER_MODE   BORDER_MIRROR

Definition at line 61 of file interpolation.c.

◆ MAX_HALF_FILTER_WIDTH

#define MAX_HALF_FILTER_WIDTH   3

Definition at line 65 of file interpolation.c.

◆ MAX_KERNEL_REQ

#define MAX_KERNEL_REQ   ((2 * (MAX_HALF_FILTER_WIDTH) + 3) & (~3))

Definition at line 388 of file interpolation.c.

◆ RESAMPLING_BORDER_MODE

#define RESAMPLING_BORDER_MODE   BORDER_REPLICATE

Definition at line 57 of file interpolation.c.

◆ TILE_ROWS

#define TILE_ROWS   128

Definition at line 890 of file interpolation.c.

Enumeration Type Documentation

◆ border_mode

Border extrapolation modes

Enumerator
BORDER_REPLICATE 
BORDER_WRAP 
BORDER_MIRROR 
BORDER_CLAMP 

Definition at line 47 of file interpolation.c.

Function Documentation

◆ __attribute__()

static __attribute__ ( (always_inline)  )
inlinestatic

Clip into specified range

Parameters
idxindex to filter
lengthlength of line

Definition at line 83 of file interpolation.c.

References BORDER_CLAMP, BORDER_MIRROR, BORDER_REPLICATE, BORDER_WRAP, i, max, and min.

◆ _compute_downsampling_kernel()

static void _compute_downsampling_kernel ( const struct dt_interpolation itor,
int *  taps,
int *  first,
float *  kernel,
float *  norm,
const float  outoinratio,
const int  xout 
)
inlinestatic

Computes a downsampling filtering kernel (vectorized version, four taps per inner loop iteration)

Parameters
itor[in] Interpolator used
kernelsize[out] Number of taps
kernel[out] resulting taps (at least itor->width/inoout + 4 elements for no overflow)
norm[out] Kernel norm
first[out] index of the first sample for which the kernel is to be applied
outoinratio[in] "out samples" over "in samples" ratio
xout[in] Output coordinate

Definition at line 349 of file interpolation.c.

References ceil_fast(), i, kernel(), dt_interpolation::maketaps, n, t, and dt_interpolation::width.

Referenced by _prepare_resampling_plan().

◆ _interpolation_resample_1c_plain()

static void _interpolation_resample_1c_plain ( const struct dt_interpolation itor,
float *  out,
const dt_iop_roi_t *const  roi_out,
const float *const  in,
const dt_iop_roi_t *const  roi_in 
)
static

◆ _interpolation_resample_plain()

static __DT_CLONE_TARGETS__ void _interpolation_resample_plain ( const struct dt_interpolation itor,
float *const restrict  out,
const dt_iop_roi_t *const  roi_out,
const float *const restrict  in,
const dt_iop_roi_t *const  roi_in 
)
static

◆ _maketaps_bicubic()

static float _maketaps_bicubic ( float *  taps,
const size_t  num_taps,
const float  width,
const float  first_tap,
const float  interval 
)
static

Definition at line 195 of file interpolation.c.

References dt_simd_set1(), dt_store_simd_aligned(), for_four_channels, and i.

◆ _maketaps_bilinear()

static float _maketaps_bilinear ( float *  taps,
const size_t  num_taps,
const float  width,
const float  first_tap,
const float  interval 
)
static

Definition at line 170 of file interpolation.c.

References dt_simd_set1(), dt_store_simd_aligned(), and i.

◆ _maketaps_mitchell()

static float _maketaps_mitchell ( float *  taps,
const size_t  num_taps,
const float  width,
const float  first_tap,
const float  interval 
)
static

Definition at line 248 of file interpolation.c.

References c2, dt_simd_set1(), dt_store_simd_aligned(), for_four_channels, and i.

◆ _prepare_resampling_plan()

static __DT_CLONE_TARGETS__ gboolean _prepare_resampling_plan ( const struct dt_interpolation itor,
const int  in,
const int  in_x0,
const int  out,
const int  out_x0,
const float  scale,
int **  plength,
float **  pkernel,
int **  pindex,
int **  pmeta 
)
static

Prepares a 1D resampling plan

This consists of the following information

  • A list of lengths that tell how many pixels are relevant for the next output
  • A list of required filter kernels
  • A list of sample indexes

How to apply the resampling plan:

  1. Pick a length from the length array
  2. until length is reached
    1. pick a kernel tap>
    2. pick the relevant sample according to the picked index
    3. multiply them and accumulate
  3. here goes a single output sample

This until you reach the number of output pixels

Parameters
itorinterpolator used to resample
in[in] Number of input samples
out[in] Number of output samples
plength[out] Array of lengths for each pixel filtering (number of taps/indexes to use). This array mus be freed with dt_pixelpipe_cache_free_align() when you're done with the plan.
pkernel[out] Array of filter kernel taps
pindex[out] Array of sample indexes to be used for applying each kernel tap arrays of information
pmeta[out] Array of int triplets (length, kernel, index) telling where to start for an arbitrary out position meta[3*out]
Returns
FALSE for success, TRUE for failure

Definition at line 706 of file interpolation.c.

References _compute_downsampling_kernel(), ceil_fast(), DT_CACHELINE_BYTES, dt_pixelpipe_cache_alloc_align_cache, dt_round_size(), FALSE, fx, IS_NULL_PTR, kernel(), meta, out, RESAMPLING_BORDER_MODE, TRUE, void(), dt_interpolation::width, and x.

Referenced by _interpolation_resample_1c_plain(), _interpolation_resample_plain(), and dt_interpolation_resample_cl().

◆ dt_interpolation_compute_pixel4c()

__DT_CLONE_TARGETS__ void dt_interpolation_compute_pixel4c ( const struct dt_interpolation itor,
const float *  in,
float *  out,
const float  x,
const float  y,
const int  width,
const int  height,
const int  linestride 
)

Compute an interpolated 4 component pixel.

This function computes a full 4 component pixel. This helps a bit speedwise as interpolation coordinates are supposed to be the same for all components. Thus we can share horizontal and vertical interpolation kernels across all components

NB: a pixel is to be four floats big in stride

Parameters
inPointer to the input image
outPointer to the output sample
itorinterpolator to be used
xX-Coordinate of the requested sample
yY-Coordinate of the requested sample
widthWidth of the input image
heightWidth of the input image
linestrideStride in number of pixels for complete line

Definition at line 491 of file interpolation.c.

References BORDER_CLAMP, DT_ALIGNED_ARRAY, dt_simd_set1(), dt_store_simd(), height, i, INTERPOLATION_BORDER_MODE, MAX_HALF_FILTER_WIDTH, MAX_KERNEL_REQ, out, width, dt_interpolation::width, and x.

Referenced by apply_global_distortion_map(), distort_mask(), process(), and process().

◆ dt_interpolation_compute_sample()

__DT_CLONE_TARGETS__ float dt_interpolation_compute_sample ( const struct dt_interpolation itor,
const float *  in,
const float  x,
const float  y,
const int  width,
const int  height,
const int  samplestride,
const int  linestride 
)

Compute a single interpolated sample.

This function computes a single interpolated sample. Implied costs are:

  • Horizontal filtering kernel computation
  • Vertical filtering kernel computation
  • Sample computation
Parameters
inInput image
itorinterpolator to be used
xX-Coordinate of the requested sample
yY-Coordinate of the requested sample
widthWidth of the input image
heightWidth of the input image
samplestrideStride in bytes for a sample
linestrideStride in bytes for complete line
Returns
computed sample

Definition at line 391 of file interpolation.c.

References BORDER_CLAMP, DT_ALIGNED_ARRAY, height, i, INTERPOLATION_BORDER_MODE, MAX_HALF_FILTER_WIDTH, MAX_KERNEL_REQ, r, width, dt_interpolation::width, and x.

Referenced by apply_global_distortion_map(), distort_mask(), and process().

◆ dt_interpolation_free_cl_global()

void dt_interpolation_free_cl_global ( dt_interpolation_cl_global_t g)

Definition at line 1068 of file interpolation.c.

References dt_free, dt_opencl_free_kernel(), g, and IS_NULL_PTR.

Referenced by dt_opencl_cleanup().

◆ dt_interpolation_init_cl_global()

dt_interpolation_cl_global_t * dt_interpolation_init_cl_global ( void  )

◆ dt_interpolation_new()

◆ dt_interpolation_resample()

void dt_interpolation_resample ( const struct dt_interpolation itor,
float *  out,
const dt_iop_roi_t *const  roi_out,
const float *const  in,
const dt_iop_roi_t *const  roi_in 
)

Applies resampling (re-scaling) on full input and output buffers. roi_in and roi_out define the part of the buffers that is affected.

Definition at line 1027 of file interpolation.c.

References _interpolation_resample_plain(), and out.

Referenced by dt_interpolation_resample_roi(), dt_iop_clip_and_zoom(), and process().

◆ dt_interpolation_resample_1c()

void dt_interpolation_resample_1c ( const struct dt_interpolation itor,
float *  out,
const dt_iop_roi_t *const  roi_out,
const float *const  in,
const dt_iop_roi_t *const  roi_in 
)

Applies resampling (re-scaling) on full input and output buffers. roi_in and roi_out define the part of the buffers that is affected.

Definition at line 1404 of file interpolation.c.

References _interpolation_resample_1c_plain(), and out.

Referenced by dt_interpolation_resample_roi_1c().

◆ dt_interpolation_resample_cl()

◆ dt_interpolation_resample_roi()

void dt_interpolation_resample_roi ( const struct dt_interpolation itor,
float *  out,
const dt_iop_roi_t *const  roi_out,
const float *const  in,
const dt_iop_roi_t *const  roi_in 
)

Applies resampling (re-scaling) on a specific region-of-interest of an image. The input and output buffers hold exactly those roi's. roi_in and roi_out define the relative positions of the roi's within the full input and output image, respectively.

Definition at line 1041 of file interpolation.c.

References dt_interpolation_resample(), and out.

Referenced by dt_iop_clip_and_zoom_roi().

◆ dt_interpolation_resample_roi_1c()

void dt_interpolation_resample_roi_1c ( const struct dt_interpolation itor,
float *  out,
const dt_iop_roi_t *const  roi_out,
const float *const  in,
const dt_iop_roi_t *const  roi_in 
)

Applies resampling (re-scaling) on a specific region-of-interest of an image. The input and output buffers hold exactly those roi's. roi_in and roi_out define the relative positions of the roi's within the full input and output image, respectively.

Definition at line 1417 of file interpolation.c.

References dt_interpolation_resample_1c(), and out.

Referenced by distort_mask(), and dt_dev_distort_detail_mask().

◆ dt_interpolation_resample_roi_cl()

int dt_interpolation_resample_roi_cl ( const struct dt_interpolation itor,
const int  devid,
cl_mem  dev_out,
const dt_iop_roi_t *const  roi_out,
cl_mem  dev_in,
const dt_iop_roi_t *const  roi_in 
)

Applies resampling (re-scaling) on a specific region-of-interest of an image. The input and output buffers hold exactly those roi's. roi_in and roi_out define the relative positions of the roi's within the full input and output image, respectively.

Definition at line 1265 of file interpolation.c.

References dt_interpolation_resample_cl().

Referenced by dt_iop_clip_and_zoom_roi_cl().

◆ roundToNextPowerOfTwo()

static uint32_t roundToNextPowerOfTwo ( uint32_t  x)
static

Definition at line 1076 of file interpolation.c.

References x.

Referenced by dt_interpolation_resample_cl().

Variable Documentation

◆ dt_interpolator

const struct dt_interpolation dt_interpolator[]
static
Initial value:
= {
.name = "bilinear",
.width = 1,
.maketaps = &_maketaps_bilinear,
},
.name = "bicubic",
.width = 2,
.maketaps = &_maketaps_bicubic,
},
.name = "mitchell",
.width = 2,
.maketaps = &_maketaps_mitchell,
},
}
static float _maketaps_mitchell(float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
static float _maketaps_bilinear(float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
static float _maketaps_bicubic(float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
@ DT_INTERPOLATION_BICUBIC
@ DT_INTERPOLATION_BILINEAR
@ DT_INTERPOLATION_MITCHELL

Definition at line 293 of file interpolation.c.

Referenced by dt_interpolation_new().