Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
channelmixerrgb.c File Reference
#include "bauhaus/bauhaus.h"
#include "chart/common.h"
#include "develop/imageop_gui.h"
#include "dtgtk/drawingarea.h"
#include "common/chromatic_adaptation.h"
#include "common/colorspaces_inline_conversions.h"
#include "common/colorchecker.h"
#include "common/opencl.h"
#include "common/illuminants.h"
#include "common/imagebuf.h"
#include "common/iop_profile.h"
#include "control/control.h"
#include "develop/imageop_math.h"
#include "develop/openmp_maths.h"
#include "gui/color_picker_proxy.h"
#include "gui/gtk.h"
#include "gui/presets.h"
#include "iop/iop_api.h"
#include "gaussian_elimination.h"
#include <assert.h>
#include <gtk/gtk.h>
#include <inttypes.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
+ Include dependency graph for channelmixerrgb.c:

Data Structures

struct  dt_iop_channelmixer_rgb_params_t
 
struct  dt_iop_channelmixer_rgb_gui_data_t
 
struct  dt_iop_channelmixer_rbg_data_t
 
struct  dt_iop_channelmixer_rgb_global_data_t
 
struct  extraction_result_t
 

Macros

#define CHANNEL_SIZE   4
 
#define INVERSE_SQRT_3   0.5773502691896258f
 
#define COLOR_MIN   -2.0
 
#define COLOR_MAX   2.0
 
#define ILLUM_X_MAX   360.0
 
#define ILLUM_Y_MAX   300.0
 
#define LIGHTNESS_MAX   100.0
 
#define HUE_MAX   360.0
 
#define CHROMA_MAX   128.0
 
#define TEMP_MIN   1667.
 
#define TEMP_MAX   25000.
 
#define SHF(ii, jj, c)   ((i + ii) * width + j + jj) * ch + c
 
#define OFF   4
 
#define DEG_TO_RAD(x)   (x * M_PI / 180.f)
 
#define RAD_TO_DEG(x)   (x * 180.f / M_PI)
 
#define GET_WEIGHT
 
#define NOTEBOOK_PAGE(var, short, label, tooltip, section, swap)
 

Typedefs

typedef enum dt_iop_channelmixer_rgb_version_t dt_iop_channelmixer_rgb_version_t
 
typedef struct dt_iop_channelmixer_rgb_params_t dt_iop_channelmixer_rgb_params_t
 
typedef enum dt_solving_strategy_t dt_solving_strategy_t
 
typedef enum dt_spot_mode_t dt_spot_mode_t
 
typedef struct dt_iop_channelmixer_rgb_gui_data_t dt_iop_channelmixer_rgb_gui_data_t
 
typedef struct dt_iop_channelmixer_rbg_data_t dt_iop_channelmixer_rbg_data_t
 
typedef struct dt_iop_channelmixer_rgb_global_data_t dt_iop_channelmixer_rgb_global_data_t
 

Enumerations

enum  dt_iop_channelmixer_rgb_version_t {
  CHANNELMIXERRGB_V_1 = 0 ,
  CHANNELMIXERRGB_V_2 = 1 ,
  CHANNELMIXERRGB_V_3 = 2
}
 
enum  dt_solving_strategy_t {
  DT_SOLVE_OPTIMIZE_NONE = 0 ,
  DT_SOLVE_OPTIMIZE_LOW_SAT = 1 ,
  DT_SOLVE_OPTIMIZE_HIGH_SAT = 2 ,
  DT_SOLVE_OPTIMIZE_SKIN = 3 ,
  DT_SOLVE_OPTIMIZE_FOLIAGE = 4 ,
  DT_SOLVE_OPTIMIZE_SKY = 5 ,
  DT_SOLVE_OPTIMIZE_AVG_DELTA_E = 6 ,
  DT_SOLVE_OPTIMIZE_MAX_DELTA_E = 7
}
 
enum  dt_spot_mode_t {
  DT_SPOT_MODE_CORRECT = 0 ,
  DT_SPOT_MODE_MEASURE = 1 ,
  DT_SPOT_MODE_LAST
}
 

Functions

void _auto_set_illuminant (dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe)
 
const char * name ()
 
const char * aliases ()
 
const char ** description (struct dt_iop_module_t *self)
 
int flags ()
 
int default_group ()
 
int default_colorspace (dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
 
int legacy_params (dt_iop_module_t *self, const void *const old_params, const int old_version, void *new_params, const int new_version)
 
void init_presets (dt_iop_module_so_t *self)
 
static int get_white_balance_coeff (struct dt_iop_module_t *self, dt_aligned_pixel_t custom_wb)
 
static void gamut_mapping (const dt_aligned_pixel_t input, const float compression, const int clip, dt_aligned_pixel_t output)
 
static void luma_chroma (const dt_aligned_pixel_t input, const dt_aligned_pixel_t saturation, const dt_aligned_pixel_t lightness, dt_aligned_pixel_t output, const dt_iop_channelmixer_rgb_version_t version)
 
static void loop_switch (const float *const restrict in, float *const restrict out, const size_t width, const size_t height, const size_t ch, const dt_colormatrix_t XYZ_to_RGB, const dt_colormatrix_t RGB_to_XYZ, const dt_colormatrix_t MIX, const dt_aligned_pixel_t illuminant, const dt_aligned_pixel_t saturation, const dt_aligned_pixel_t lightness, const dt_aligned_pixel_t grey, const float p, const float gamut, const int clip, const int apply_grey, const dt_adaptation_t kind, const dt_iop_channelmixer_rgb_version_t version)
 
static void auto_detect_WB (const float *const restrict in, dt_illuminant_t illuminant, const size_t width, const size_t height, const size_t ch, const dt_colormatrix_t RGB_to_XYZ, dt_aligned_pixel_t xyz)
 
static void declare_cat_on_pipe (struct dt_iop_module_t *self, gboolean preset)
 
static gboolean _is_another_module_cat_on_pipe (struct dt_iop_module_t *self)
 
static void update_illuminants (struct dt_iop_module_t *self)
 
static void update_approx_cct (struct dt_iop_module_t *self)
 
static void update_illuminant_color (struct dt_iop_module_t *self)
 
static void paint_temperature_background (struct dt_iop_module_t *self)
 
static void check_if_close_to_daylight (const float x, const float y, float *temperature, dt_illuminant_t *illuminant, dt_adaptation_t *adaptation)
 
static void compute_patches_delta_E (const float *const restrict patches, const dt_color_checker_t *const checker, float *const restrict delta_E, float *const restrict avg_delta_E, float *const restrict max_delta_E)
 
static const extraction_result_t _extract_patches (const float *const restrict in, const dt_iop_roi_t *const roi_in, dt_iop_channelmixer_rgb_gui_data_t *g, const dt_colormatrix_t RGB_to_XYZ, const dt_colormatrix_t XYZ_to_CAM, float *const restrict patches, const gboolean normalize_exposure)
 
void extract_color_checker (const float *const restrict in, float *const restrict out, const dt_iop_roi_t *const roi_in, dt_iop_channelmixer_rgb_gui_data_t *g, const dt_colormatrix_t RGB_to_XYZ, const dt_colormatrix_t XYZ_to_RGB, const dt_colormatrix_t XYZ_to_CAM, const dt_adaptation_t kind)
 
void validate_color_checker (const float *const restrict in, const dt_iop_roi_t *const roi_in, dt_iop_channelmixer_rgb_gui_data_t *g, const dt_colormatrix_t RGB_to_XYZ, const dt_colormatrix_t XYZ_to_RGB, const dt_colormatrix_t XYZ_to_CAM)
 
void process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const restrict ivoid, void *const restrict ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
 
static void update_bounding_box (dt_iop_channelmixer_rgb_gui_data_t *g, const float x_increment, const float y_increment)
 
static void init_bounding_box (dt_iop_channelmixer_rgb_gui_data_t *g, const float width, const float height)
 
int mouse_moved (struct dt_iop_module_t *self, double x, double y, double pressure, int which)
 
int button_pressed (struct dt_iop_module_t *self, double x, double y, double pressure, int which, int type, uint32_t state)
 
int button_released (struct dt_iop_module_t *self, double x, double y, int which, uint32_t state)
 
void gui_post_expose (struct dt_iop_module_t *self, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery)
 
static void optimize_changed_callback (GtkWidget *widget, gpointer user_data)
 
static void checker_changed_callback (GtkWidget *widget, gpointer user_data)
 
static void safety_changed_callback (GtkWidget *widget, gpointer user_data)
 
static void start_profiling_callback (GtkWidget *togglebutton, dt_iop_module_t *self)
 
static void run_profile_callback (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
 
static void run_validation_callback (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
 
static void commit_profile_callback (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
 
static void _develop_ui_pipe_finished_callback (gpointer instance, gpointer user_data)
 
static void _preview_pipe_finished_callback (gpointer instance, gpointer user_data)
 
void commit_params (struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
 
static void update_xy_color (dt_iop_module_t *self)
 
static void paint_hue (dt_iop_module_t *self)
 
static void _convert_GUI_colors (dt_iop_channelmixer_rgb_params_t *p, const struct dt_iop_order_iccprofile_info_t *const work_profile, const dt_aligned_pixel_t LMS, dt_aligned_pixel_t RGB)
 
static void _update_RGB_slider_stop (dt_iop_channelmixer_rgb_params_t *p, const struct dt_iop_order_iccprofile_info_t *const work_profile, GtkWidget *w, float stop, float c, float r, float g, float b)
 
static void _update_RGB_colors (dt_iop_module_t *self, float r, float g, float b, gboolean normalize, float *a, GtkWidget *w_r, GtkWidget *w_g, GtkWidget *w_b)
 
static gboolean illuminant_color_draw (GtkWidget *widget, cairo_t *crf, gpointer user_data)
 
static gboolean target_color_draw (GtkWidget *widget, cairo_t *crf, gpointer user_data)
 
static gboolean origin_color_draw (GtkWidget *widget, cairo_t *crf, gpointer user_data)
 
static void illum_xy_callback (GtkWidget *slider, gpointer user_data)
 
void init_pipe (struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
 
void cleanup_pipe (struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
 
void gui_reset (dt_iop_module_t *self)
 
void gui_update (struct dt_iop_module_t *self)
 
void init (dt_iop_module_t *module)
 
void reload_defaults (dt_iop_module_t *module)
 
static void _spot_settings_changed_callback (GtkWidget *slider, dt_iop_module_t *self)
 
void gui_changed (dt_iop_module_t *self, GtkWidget *w, void *previous)
 
void color_picker_apply (dt_iop_module_t *self, GtkWidget *picker, dt_dev_pixelpipe_iop_t *piece)
 
void gui_init (struct dt_iop_module_t *self)
 
void gui_cleanup (struct dt_iop_module_t *self)
 

Macro Definition Documentation

◆ CHANNEL_SIZE

#define CHANNEL_SIZE   4

Note : we use finite-math-only and fast-math because divisions by zero are manually avoided in the code fp-contract=fast enables hardware-accelerated Fused Multiply-Add the rest is loop reorganization and vectorization optimization

◆ CHROMA_MAX

#define CHROMA_MAX   128.0

◆ COLOR_MAX

#define COLOR_MAX   2.0

◆ COLOR_MIN

#define COLOR_MIN   -2.0

◆ DEG_TO_RAD

#define DEG_TO_RAD (   x)    (x * M_PI / 180.f)

◆ GET_WEIGHT

#define GET_WEIGHT
Value:
float hue = atan2f(reference[2], reference[1]); \
const float chroma = hypotf(reference[2], reference[1]); \
float delta_hue = hue - ref_hue; \
if(chroma == 0.f) \
delta_hue = 0.f; \
else if(fabsf(delta_hue) <= M_PI) \
; \
else if(fabsf(delta_hue) > M_PI && (hue <= ref_hue)) \
delta_hue += 2.f * M_PI; \
else if(fabsf(delta_hue) > M_PI && (hue > ref_hue)) \
delta_hue -= 2.f * M_PI; \
w = sqrtf(expf(-sqf(delta_hue) / 2.f));
static float sqf(const float x)
Definition math.h:215
#define M_PI
Definition math.h:37

◆ HUE_MAX

#define HUE_MAX   360.0

◆ ILLUM_X_MAX

#define ILLUM_X_MAX   360.0

◆ ILLUM_Y_MAX

#define ILLUM_Y_MAX   300.0

◆ INVERSE_SQRT_3

#define INVERSE_SQRT_3   0.5773502691896258f

◆ LIGHTNESS_MAX

#define LIGHTNESS_MAX   100.0

◆ NOTEBOOK_PAGE

#define NOTEBOOK_PAGE (   var,
  short,
  label,
  tooltip,
  section,
  swap 
)
Value:
self->widget = dt_ui_notebook_page(g->notebook, label, _(tooltip)); \
\
first = dt_bauhaus_slider_from_params(self, swap ? #var "[2]" : #var "[0]");\
dt_bauhaus_slider_set_digits(first, 3); \
dt_bauhaus_widget_set_label(first, N_("input R")); \
\
second = dt_bauhaus_slider_from_params(self, #var "[1]"); \
dt_bauhaus_slider_set_digits(second, 3); \
dt_bauhaus_widget_set_label(second, N_("input G")); \
\
third = dt_bauhaus_slider_from_params(self, swap ? #var "[0]" : #var "[2]");\
dt_bauhaus_slider_set_digits(third, 3); \
dt_bauhaus_widget_set_label(third, N_("input B")); \
\
g->scale_##var##_R = swap ? third : first; \
g->scale_##var##_G = second; \
g->scale_##var##_B = swap ? first : third; \
\
g->normalize_##short = dt_bauhaus_toggle_from_params(self, "normalize_" #short);
const char * tooltip
Definition common/image.h:163
GtkWidget * dt_ui_notebook_page(GtkNotebook *notebook, const char *text, const char *tooltip)
Definition gtk.c:1391
GtkWidget * dt_bauhaus_toggle_from_params(dt_iop_module_t *self, const char *param)
Definition imageop_gui.c:244
GtkWidget * dt_bauhaus_slider_from_params(dt_iop_module_t *self, const char *param)
Definition imageop_gui.c:75
static void swap(float *x, float *y)
Definition lightroom.c:1042

◆ OFF

#define OFF   4

◆ RAD_TO_DEG

#define RAD_TO_DEG (   x)    (x * 180.f / M_PI)

◆ SHF

#define SHF (   ii,
  jj,
 
)    ((i + ii) * width + j + jj) * ch + c

◆ TEMP_MAX

#define TEMP_MAX   25000.

◆ TEMP_MIN

#define TEMP_MIN   1667.

Typedef Documentation

◆ dt_iop_channelmixer_rbg_data_t

◆ dt_iop_channelmixer_rgb_global_data_t

◆ dt_iop_channelmixer_rgb_gui_data_t

◆ dt_iop_channelmixer_rgb_params_t

◆ dt_iop_channelmixer_rgb_version_t

◆ dt_solving_strategy_t

◆ dt_spot_mode_t

Enumeration Type Documentation

◆ dt_iop_channelmixer_rgb_version_t

Enumerator
CHANNELMIXERRGB_V_1 
CHANNELMIXERRGB_V_2 
CHANNELMIXERRGB_V_3 

◆ dt_solving_strategy_t

Enumerator
DT_SOLVE_OPTIMIZE_NONE 
DT_SOLVE_OPTIMIZE_LOW_SAT 
DT_SOLVE_OPTIMIZE_HIGH_SAT 
DT_SOLVE_OPTIMIZE_SKIN 
DT_SOLVE_OPTIMIZE_FOLIAGE 
DT_SOLVE_OPTIMIZE_SKY 
DT_SOLVE_OPTIMIZE_AVG_DELTA_E 
DT_SOLVE_OPTIMIZE_MAX_DELTA_E 

◆ dt_spot_mode_t

Enumerator
DT_SPOT_MODE_CORRECT 
DT_SPOT_MODE_MEASURE 
DT_SPOT_MODE_LAST 

Function Documentation

◆ _auto_set_illuminant()

◆ _convert_GUI_colors()

◆ _develop_ui_pipe_finished_callback()

◆ _extract_patches()

static const extraction_result_t _extract_patches ( const float *const restrict  in,
const dt_iop_roi_t *const  roi_in,
dt_iop_channelmixer_rgb_gui_data_t g,
const dt_colormatrix_t  RGB_to_XYZ,
const dt_colormatrix_t  XYZ_to_CAM,
float *const restrict  patches,
const gboolean  normalize_exposure 
)
static

◆ _is_another_module_cat_on_pipe()

static gboolean _is_another_module_cat_on_pipe ( struct dt_iop_module_t self)
inlinestatic

◆ _preview_pipe_finished_callback()

static void _preview_pipe_finished_callback ( gpointer  instance,
gpointer  user_data 
)
static

◆ _spot_settings_changed_callback()

◆ _update_RGB_colors()

static void _update_RGB_colors ( dt_iop_module_t self,
float  r,
float  g,
float  b,
gboolean  normalize,
float *  a,
GtkWidget *  w_r,
GtkWidget *  w_g,
GtkWidget *  w_b 
)
static

◆ _update_RGB_slider_stop()

static void _update_RGB_slider_stop ( dt_iop_channelmixer_rgb_params_t p,
const struct dt_iop_order_iccprofile_info_t *const  work_profile,
GtkWidget *  w,
float  stop,
float  c,
float  r,
float  g,
float  b 
)
static

◆ aliases()

const char * aliases ( )

◆ auto_detect_WB()

static void auto_detect_WB ( const float *const restrict  in,
dt_illuminant_t  illuminant,
const size_t  width,
const size_t  height,
const size_t  ch,
const dt_colormatrix_t  RGB_to_XYZ,
dt_aligned_pixel_t  xyz 
)
inlinestatic

Detect the chromaticity of the illuminant based on the grey edges hypothesis. So we compute a laplacian filter and get the weighted average of its chromaticities

Inspired by : A Fast White Balance Algorithm Based on Pixel Greyness, Ba Thai·Guang Deng·Robert Ross https://www.researchgate.net/profile/Ba_Son_Thai/publication/308692177_A_Fast_White_Balance_Algorithm_Based_on_Pixel_Greyness/

Edge-Based Color Constancy, Joost van de Weijer, Theo Gevers, Arjan Gijsenij https://hal.inria.fr/inria-00548686/document

References dot_product(), DT_ALIGNED_PIXEL, dt_alloc_sse_ps(), dt_fast_hypotf(), dt_free_align, DT_ILLUMINANT_DETECT_EDGES, DT_ILLUMINANT_DETECT_SURFACES, for_each_channel, height, NORM_MIN, OFF, SHF, sqf(), weight(), and width.

Referenced by process().

◆ button_pressed()

◆ button_released()

◆ check_if_close_to_daylight()

◆ checker_changed_callback()

◆ cleanup_pipe()

◆ color_picker_apply()

void color_picker_apply ( dt_iop_module_t self,
GtkWidget *  picker,
dt_dev_pixelpipe_iop_t piece 
)

◆ commit_params()

◆ commit_profile_callback()

◆ compute_patches_delta_E()

static void compute_patches_delta_E ( const float *const restrict  patches,
const dt_color_checker_t *const  checker,
float *const restrict  delta_E,
float *const restrict  avg_delta_E,
float *const restrict  max_delta_E 
)
inlinestatic

◆ declare_cat_on_pipe()

◆ default_colorspace()

int default_colorspace ( dt_iop_module_t self,
dt_dev_pixelpipe_t pipe,
dt_dev_pixelpipe_iop_t piece 
)

References IOP_CS_RGB.

◆ default_group()

int default_group ( )

References IOP_GROUP_COLOR.

◆ description()

const char ** description ( struct dt_iop_module_t self)

◆ extract_color_checker()

◆ flags()

◆ gamut_mapping()

static void gamut_mapping ( const dt_aligned_pixel_t  input,
const float  compression,
const int  clip,
dt_aligned_pixel_t  output 
)
inlinestatic

◆ get_white_balance_coeff()

◆ gui_changed()

◆ gui_cleanup()

◆ gui_init()

void gui_init ( struct dt_iop_module_t self)

References _develop_ui_pipe_finished_callback(), _preview_pipe_finished_callback(), _spot_settings_changed_callback(), B, darktable_t::bauhaus, checker_changed_callback(), CHROMA_MAX, commit_profile_callback(), darktable, dt_bauhaus_combobox_from_params(), DT_BAUHAUS_COMBOBOX_NEW_FULL, dt_bauhaus_slider_from_params(), dt_bauhaus_slider_new_with_range(), dt_bauhaus_slider_new_with_range_and_feedback(), dt_bauhaus_slider_set_default(), dt_bauhaus_slider_set_digits(), dt_bauhaus_slider_set_format(), dt_bauhaus_slider_set_hard_max(), dt_bauhaus_slider_set_soft_max(), dt_bauhaus_slider_set_soft_range(), DT_BAUHAUS_SPACE, dt_bauhaus_toggle_from_params(), dt_bauhaus_widget_set_label(), DT_COLOR_PICKER_AREA, dt_color_picker_new(), dt_conf_get_int(), DT_DEBUG_CONTROL_SIGNAL_CONNECT, DT_GUI_MODULE, dt_gui_new_collapsible_section(), DT_PIXEL_APPLY_DPI, DT_SIGNAL_DEVELOP_PREVIEW_PIPE_FINISHED, DT_SIGNAL_DEVELOP_UI_PIPE_FINISHED, dt_ui_label_new(), dt_ui_notebook_new(), dt_ui_notebook_page(), dt_ui_section_label_new(), dtgtk_button_new(), dtgtk_cairo_paint_check_mark(), dtgtk_cairo_paint_refresh(), dtgtk_cairo_paint_softproof(), FALSE, dt_iop_order_iccprofile_info_t::grey, HUE_MAX, ILLUM_X_MAX, illum_xy_callback(), ILLUM_Y_MAX, illuminant_color_draw(), IOP_GUI_ALLOC, LIGHTNESS_MAX, NOTEBOOK_PAGE, optimize_changed_callback(), origin_color_draw(), dt_bauhaus_t::quad_width, R, run_profile_callback(), run_validation_callback(), safety_changed_callback(), darktable_t::signals, start_profiling_callback(), target_color_draw(), TRUE, and dt_iop_module_t::widget.

◆ gui_post_expose()

◆ gui_reset()

◆ gui_update()

◆ illum_xy_callback()

◆ illuminant_color_draw()

static gboolean illuminant_color_draw ( GtkWidget *  widget,
cairo_t *  crf,
gpointer  user_data 
)
static

◆ init()

◆ init_bounding_box()

static void init_bounding_box ( dt_iop_channelmixer_rgb_gui_data_t g,
const float  width,
const float  height 
)
inlinestatic

◆ init_pipe()

◆ init_presets()

◆ legacy_params()

int legacy_params ( dt_iop_module_t self,
const void *const  old_params,
const int  old_version,
void new_params,
const int  new_version 
)

◆ loop_switch()

static void loop_switch ( const float *const restrict  in,
float *const restrict  out,
const size_t  width,
const size_t  height,
const size_t  ch,
const dt_colormatrix_t  XYZ_to_RGB,
const dt_colormatrix_t  RGB_to_XYZ,
const dt_colormatrix_t  MIX,
const dt_aligned_pixel_t  illuminant,
const dt_aligned_pixel_t  saturation,
const dt_aligned_pixel_t  lightness,
const dt_aligned_pixel_t  grey,
const float  p,
const float  gamut,
const int  clip,
const int  apply_grey,
const dt_adaptation_t  kind,
const dt_iop_channelmixer_rgb_version_t  version 
)
inlinestatic

◆ luma_chroma()

static void luma_chroma ( const dt_aligned_pixel_t  input,
const dt_aligned_pixel_t  saturation,
const dt_aligned_pixel_t  lightness,
dt_aligned_pixel_t  output,
const dt_iop_channelmixer_rgb_version_t  version 
)
inlinestatic

◆ mouse_moved()

◆ name()

const char * name ( )

◆ optimize_changed_callback()

static void optimize_changed_callback ( GtkWidget *  widget,
gpointer  user_data 
)
static

◆ origin_color_draw()

static gboolean origin_color_draw ( GtkWidget *  widget,
cairo_t *  crf,
gpointer  user_data 
)
static

◆ paint_hue()

◆ paint_temperature_background()

◆ process()

void process ( struct dt_iop_module_t self,
dt_dev_pixelpipe_iop_t piece,
const void *const restrict  ivoid,
void *const restrict  ovoid,
const dt_iop_roi_t *const  roi_in,
const dt_iop_roi_t *const  roi_out 
)

References dt_iop_channelmixer_rbg_data_t::adaptation, dt_iop_channelmixer_rbg_data_t::apply_grey, auto_detect_WB(), dt_iop_channelmixer_rbg_data_t::clip, dt_dev_pixelpipe_iop_t::colors, convert_any_XYZ_to_LMS(), dt_dev_pixelpipe_iop_t::data, declare_cat_on_pipe(), dt_iop_module_t::dev, DT_ADAPTATION_CAT16, DT_ADAPTATION_FULL_BRADFORD, DT_ADAPTATION_LAST, DT_ADAPTATION_LINEAR_BRADFORD, DT_ADAPTATION_RGB, DT_ADAPTATION_XYZ, dt_control_log(), DT_DEV_PIXELPIPE_FULL, DT_DEV_PIXELPIPE_PREVIEW, DT_ILLUMINANT_CAMERA, DT_ILLUMINANT_DETECT_EDGES, DT_ILLUMINANT_DETECT_SURFACES, dt_iop_gui_enter_critical_section(), dt_iop_gui_leave_critical_section(), dt_iop_have_required_input_format(), dt_iop_image_copy_by_size(), dt_iop_set_cache_bypass(), dt_ioppr_get_pipe_current_profile_info(), dt_ioppr_get_pipe_input_profile_info(), extract_color_checker(), FALSE, find_temperature_from_raw_coeffs(), dt_iop_channelmixer_rbg_data_t::gamut, get_white_balance_coeff(), dt_iop_channelmixer_rbg_data_t::grey, dt_develop_t::gui_attached, dt_iop_module_t::gui_data, dt_iop_roi_t::height, dt_iop_channelmixer_rbg_data_t::illuminant, dt_iop_channelmixer_rbg_data_t::illuminant_type, illuminant_xy_to_XYZ(), dt_develop_t::image_storage, dt_iop_channelmixer_rbg_data_t::lightness, loop_switch(), dt_iop_order_iccprofile_info_t::matrix_in, dt_iop_order_iccprofile_info_t::matrix_out, dt_iop_channelmixer_rbg_data_t::MIX, dt_iop_channelmixer_rbg_data_t::p, dt_dev_pixelpipe_iop_t::pipe, dt_iop_channelmixer_rbg_data_t::saturation, TRUE, validate_color_checker(), dt_iop_channelmixer_rbg_data_t::version, and dt_iop_roi_t::width.

◆ reload_defaults()

◆ run_profile_callback()

◆ run_validation_callback()

◆ safety_changed_callback()

◆ start_profiling_callback()

◆ target_color_draw()

static gboolean target_color_draw ( GtkWidget *  widget,
cairo_t *  crf,
gpointer  user_data 
)
static

◆ update_approx_cct()

◆ update_bounding_box()

static void update_bounding_box ( dt_iop_channelmixer_rgb_gui_data_t g,
const float  x_increment,
const float  y_increment 
)
inlinestatic

◆ update_illuminant_color()

static void update_illuminant_color ( struct dt_iop_module_t self)
static

◆ update_illuminants()

◆ update_xy_color()

static void update_xy_color ( dt_iop_module_t self)
static

DOCUMENTATION

The illuminant is stored in params as a set of x and y coordinates, describing its chrominance in xyY color space. xyY is a normalized XYZ space, derivated from the retina cone sensors. By definition, for an illuminant, Y = 1, so we only really care about (x, y).

Using (x, y) is a robust and interoperable way to describe an illuminant, since it is all the actual pixel code needs to perform the chromatic adaptation. This (x, y) can be computed in many different ways or taken from databases, and possibly from other software, so storing only the result let us room to improve the computation in the future, without losing compatibility with older versions.

However, it's not a great GUI since x and y are not perceptually scaled. So the g->illum_x and g->illum_y actually display respectively hue and chroma, in LCh color space, which is designed for illuminants and preceptually spaced. This gives UI controls which effect feels more even to the user.

But that makes things a bit tricky, API-wise, since a set of (x, y) depends on a set of (hue, chroma), so they always need to be handled together, but also because the back-and-forth computations Lch <-> xyY need to be done anytime we read or write from/to params from/to GUI.

Also, the R, G, B sliders have a background color gradient that shows the actual R, G, B sensors used by the selected chromatic adaptation. Each chromatic adaptation method uses a different RGB space, called LMS in the literature (but it's only a special-purpose RGB space for all we care here), which primaries are projected to sRGB colors, to be displayed in the GUI, so users may get a feeling of what colors they will get.

References DT_BAUHAUS_SLIDER_MAX_STOPS, dt_bauhaus_slider_set_stop(), dt_Lch_to_xyY(), dt_xyY_to_Lch(), dt_iop_module_t::gui_data, ILLUM_X_MAX, ILLUM_Y_MAX, illuminant_xy_to_RGB(), M_PI, and dt_iop_module_t::params.

Referenced by update_illuminant_color().

◆ validate_color_checker()

void validate_color_checker ( const float *const restrict  in,
const dt_iop_roi_t *const  roi_in,
dt_iop_channelmixer_rgb_gui_data_t g,
const dt_colormatrix_t  RGB_to_XYZ,
const dt_colormatrix_t  XYZ_to_RGB,
const dt_colormatrix_t  XYZ_to_CAM 
)