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:

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 DT_LANCZOS_EPSILON   (1e-9f)
 
#define MAX_KERNEL_REQ   ((2 * (MAX_HALF_FILTER_WIDTH) + 3) & (~3))
 

Enumerations

enum  border_mode {
  BORDER_REPLICATE ,
  BORDER_WRAP ,
  BORDER_MIRROR ,
  BORDER_CLAMP
}
 

Functions

static ssize_t _clip (ssize_t i, const ssize_t min, const ssize_t max, enum border_mode mode)
 
static void _prepare_tap_boundaries (int *tap_first, int *tap_last, const enum border_mode mode, const int filterwidth, const int t, const int max)
 
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_lanczos (float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
 
static float _compute_upsampling_kernel (const struct dt_interpolation *itor, float *kernel, int *first, float t)
 
static void _compute_downsampling_kernel (const struct dt_interpolation *itor, int *taps, int *first, float *kernel, float *norm, const float outoinratio, const int xout)
 
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)
 
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 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 void _interpolation_resample_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 (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)
 
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

◆ DT_LANCZOS_EPSILON

#define DT_LANCZOS_EPSILON   (1e-9f)

◆ INTERPOLATION_BORDER_MODE

#define INTERPOLATION_BORDER_MODE   BORDER_MIRROR

◆ MAX_HALF_FILTER_WIDTH

#define MAX_HALF_FILTER_WIDTH   3

◆ MAX_KERNEL_REQ

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

◆ RESAMPLING_BORDER_MODE

#define RESAMPLING_BORDER_MODE   BORDER_REPLICATE

Enumeration Type Documentation

◆ border_mode

Border extrapolation modes

Enumerator
BORDER_REPLICATE 
BORDER_WRAP 
BORDER_MIRROR 
BORDER_CLAMP 

Function Documentation

◆ _clip()

static ssize_t _clip ( ssize_t  i,
const ssize_t  min,
const ssize_t  max,
enum border_mode  mode 
)
inlinestatic

Clip into specified range

Parameters
idxindex to filter
lengthlength of line

References BORDER_CLAMP, BORDER_MIRROR, BORDER_REPLICATE, and BORDER_WRAP.

Referenced by _prepare_resampling_plan(), dt_interpolation_compute_pixel4c(), and dt_interpolation_compute_sample().

◆ _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

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

Referenced by _prepare_resampling_plan().

◆ _compute_upsampling_kernel()

static float _compute_upsampling_kernel ( const struct dt_interpolation itor,
float *  kernel,
int *  first,
float  t 
)
inlinestatic

◆ _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 void _interpolation_resample_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

◆ _maketaps_bicubic()

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

References for_four_channels.

◆ _maketaps_bilinear()

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

References for_four_channels.

◆ _maketaps_lanczos()

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

◆ _prepare_resampling_plan()

static 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_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

References _clip(), _compute_downsampling_kernel(), _compute_upsampling_kernel(), _prepare_tap_boundaries(), ceil_fast(), dt_alloc_align, DT_CACHELINE_BYTES, dt_round_size(), FALSE, kernel(), meta, RESAMPLING_BORDER_MODE, TRUE, void(), and dt_interpolation::width.

Referenced by _interpolation_resample_1c_plain(), and _interpolation_resample_plain().

◆ _prepare_tap_boundaries()

static void _prepare_tap_boundaries ( int *  tap_first,
int *  tap_last,
const enum border_mode  mode,
const int  filterwidth,
const int  t,
const int  max 
)
inlinestatic

◆ dt_interpolation_compute_pixel4c()

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

References _clip(), _compute_upsampling_kernel(), _prepare_tap_boundaries(), BORDER_CLAMP, copy_pixel(), DT_ALIGNED_ARRAY, for_each_channel, height, INTERPOLATION_BORDER_MODE, MAX_HALF_FILTER_WIDTH, MAX_KERNEL_REQ, width, and dt_interpolation::width.

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

◆ dt_interpolation_compute_sample()

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

References _clip(), _compute_upsampling_kernel(), _prepare_tap_boundaries(), BORDER_CLAMP, DT_ALIGNED_ARRAY, height, INTERPOLATION_BORDER_MODE, MAX_HALF_FILTER_WIDTH, MAX_KERNEL_REQ, width, and dt_interpolation::width.

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

◆ 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.

References _interpolation_resample_plain().

Referenced by dt_interpolation_resample_roi(), and dt_iop_clip_and_zoom().

◆ 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.

References _interpolation_resample_1c_plain().

Referenced by dt_interpolation_resample_roi_1c().

◆ 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.

References dt_interpolation_resample(), dt_iop_roi_t::x, and dt_iop_roi_t::y.

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.

References dt_interpolation_resample_1c(), dt_iop_roi_t::x, and dt_iop_roi_t::y.

Referenced by distort_mask().

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 = "lanczos2",
.width = 2,
.maketaps = &_maketaps_lanczos,
},
.name = "lanczos3",
.width = 3,
.maketaps = &_maketaps_lanczos,
},
}
static float _maketaps_bilinear(float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
Definition interpolation.c:154
static float _maketaps_lanczos(float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
Definition interpolation.c:298
static float _maketaps_bicubic(float *taps, const size_t num_taps, const float width, const float first_tap, const float interval)
Definition interpolation.c:186
@ DT_INTERPOLATION_LANCZOS2
Definition interpolation.h:32
@ DT_INTERPOLATION_BICUBIC
Definition interpolation.h:31
@ DT_INTERPOLATION_BILINEAR
Definition interpolation.h:30
@ DT_INTERPOLATION_LANCZOS3
Definition interpolation.h:33

Referenced by dt_interpolation_new().