119 return _(
"split-toning (legacy)");
140 "create a linear toning effect between them up to a pivot."),
142 _(
"linear, RGB, scene-referred"),
144 _(
"linear, RGB, scene-referred"));
156 _(
"authentic sepia"), self->
op, self->version(),
165 _(
"authentic cyanotype"), self->
op, self->version(),
174 _(
"authentic platinotype"), self->
op, self->version(),
183 _(
"chocolate brown"), self->
op, self->version(),
197 const float compress = (data->
compress / 110.0) / 2.0;
199 const float *
const restrict in =
DT_IS_ALIGNED((
float*)ivoid);
201 const int npixels = roi_out->
width * roi_out->
height;
203 for(
int k = 0;
k < 4 * npixels;
k += 4)
207 if(l < data->balance - compress)
212 const float ra =
CLIP((data->
balance - compress - l) * 2.0f);
213 const float la = (1.0f - ra);
216 out[
k+c] =
CLIP(in[
k+c] * la + mixrgb[c] * ra);
218 else if(l > data->
balance + compress)
223 const float ra =
CLIP((l - (data->
balance + compress)) * 2.0f);
224 const float la = (1.0f - ra);
227 out[
k+c] =
CLIP(in[
k+c] * la + mixrgb[c] * ra);
244 GdkRGBA color = (GdkRGBA){.red =
rgb[0], .green =
rgb[1], .blue =
rgb[2], .alpha = 1.0 };
245 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorpicker), &color);
266 if(highlight_hue != -1)
272 gtk_widget_queue_draw(GTK_WIDGET(slider));
280 if(w ==
g->shadow_sat_gslider || w ==
g->shadow_hue_gslider)
284 if(w ==
g->shadow_hue_gslider)
289 gtk_widget_queue_draw(GTK_WIDGET(
g->shadow_sat_gslider));
292 else if(w ==
g->highlight_sat_gslider || w ==
g->highlight_hue_gslider)
296 if(w ==
g->highlight_hue_gslider)
301 gtk_widget_queue_draw(GTK_WIDGET(
g->highlight_sat_gslider));
316 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &c);
322 if (GTK_WIDGET(widget) ==
g->shadow_colorpick)
335 gtk_widget_queue_draw(GTK_WIDGET(
g->balance_scale));
345 float *p_hue, *p_saturation;
349 float H = .0f,
S = .0f,
L = .0f;
352 if(picker ==
g->highlight_hue_gslider)
354 p_hue = &
p->highlight_hue;
355 p_saturation = &
p->highlight_saturation;
356 hue =
g->highlight_hue_gslider;
357 sat =
g->highlight_sat_gslider;
358 colorpicker =
g->highlight_colorpick;
363 p_hue = &
p->shadow_hue;
364 p_saturation = &
p->shadow_saturation;
365 hue =
g->shadow_hue_gslider;
366 sat =
g->shadow_sat_gslider;
367 colorpicker =
g->shadow_colorpick;
371 if(fabsf(*p_hue -
H) < 0.0001f && fabsf(*p_saturation -
S) < 0.0001f)
387 gtk_widget_queue_draw(GTK_WIDGET(
g->balance_scale));
398 d->shadow_hue =
p->shadow_hue;
399 d->highlight_hue =
p->highlight_hue;
400 d->shadow_saturation =
p->shadow_saturation;
401 d->highlight_saturation =
p->highlight_saturation;
402 d->balance =
p->balance;
403 d->compress =
p->compress;
454 gtk_widget_set_tooltip_text(hue, _(
"select the hue tone"));
460 gtk_widget_set_tooltip_text(saturation, _(
"select the saturation tone"));
462 *picker = gtk_color_button_new();
463 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(*picker),
FALSE);
464 gtk_color_button_set_title(GTK_COLOR_BUTTON(*picker), _(
"select tone color"));
465 g_signal_connect(G_OBJECT(*picker),
"color-set", G_CALLBACK(
colorpick_callback), self);
468 gtk_box_pack_start(GTK_BOX(hbox), slider_box,
TRUE,
TRUE, 0);
469 gtk_box_pack_end(GTK_BOX(hbox), *picker,
FALSE,
FALSE, 0);
492 gui_init_section(self, N_(
"shadows"), shadows_box,
g->shadow_hue_gslider,
g->shadow_sat_gslider, &
g->shadow_colorpick,
TRUE);
494 gui_init_section(self, N_(
"highlights"), highlights_box,
g->highlight_hue_gslider,
g->highlight_sat_gslider, &
g->highlight_colorpick,
FALSE);
506 gtk_widget_set_tooltip_text(
g->balance_scale, _(
"the balance of center of split-toning"));
510 gtk_widget_set_tooltip_text(
g->compress_scale, _(
"compress the effect on highlights/shadows and\npreserve mid-tones"));
void dt_bauhaus_slider_set_digits(GtkWidget *widget, int val)
void dt_bauhaus_slider_set_stop(GtkWidget *widget, float stop, float r, float g, float b)
void dt_bauhaus_slider_set_feedback(GtkWidget *widget, int feedback)
void dt_bauhaus_slider_set_offset(GtkWidget *widget, float offset)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_widget_set_label(GtkWidget *widget, const char *label)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
void dt_bauhaus_slider_set_factor(GtkWidget *widget, float factor)
@ DEVELOP_BLEND_CS_RGB_DISPLAY
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
GtkWidget * dt_color_picker_new(dt_iop_module_t *module, dt_iop_color_picker_kind_t kind, GtkWidget *w)
void rgb2hsl(const dt_aligned_pixel_t rgb, float *h, float *s, float *l)
void hsl2rgb(dt_aligned_pixel_t rgb, float h, float s, float l)
static dt_aligned_pixel_t rgb
const dt_colormatrix_t dt_aligned_pixel_t out
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
static void copy_pixel(float *const __restrict__ out, const float *const __restrict__ in)
#define for_each_channel(_var,...)
#define DT_MODULE_INTROSPECTION(MODVER, PARAMSTYPE)
#define __DT_CLONE_TARGETS__
#define __OMP_PARALLEL_FOR__(...)
#define dt_database_start_transaction(db)
#define dt_database_release_transaction(db)
#define dt_dev_add_history_item(dev, module, enable, redraw)
static GtkWidget * dt_ui_section_label_new(const gchar *str)
#define DT_GUI_BOX_SPACING
void dt_gui_presets_add_generic(const char *name, dt_dev_operation_t op, const int32_t version, const void *params, const int32_t params_size, const int32_t enabled, const dt_develop_blend_colorspace_t blend_cst)
const char ** dt_iop_set_description(dt_iop_module_t *module, const char *main_text, const char *purpose, const char *input, const char *process, const char *output)
@ IOP_FLAGS_INCLUDE_IN_STYLES
@ IOP_FLAGS_SUPPORTS_BLENDING
#define IOP_GUI_ALLOC(module)
GtkWidget * dt_bauhaus_slider_from_params(dt_iop_module_t *self, const char *param)
float *const restrict const size_t k
float dt_aligned_pixel_t[4]
struct _GtkWidget GtkWidget
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)
const char ** description(struct dt_iop_module_t *self)
__DT_CLONE_TARGETS__ int process(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid)
static void update_colorpicker_color(GtkWidget *colorpicker, float hue, float sat)
static void colorpick_callback(GtkColorButton *widget, dt_iop_module_t *self)
void init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void gui_update(struct dt_iop_module_t *self)
Refresh GUI controls from current params and configuration.
void gui_init(struct dt_iop_module_t *self)
void gui_changed(dt_iop_module_t *self, GtkWidget *w, void *previous)
static void update_balance_slider_colors(GtkWidget *slider, float shadow_hue, float highlight_hue)
int default_colorspace(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
void init_presets(dt_iop_module_so_t *self)
void cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void gui_init_section(struct dt_iop_module_t *self, char *section, GtkWidget *slider_box, GtkWidget *hue, GtkWidget *saturation, GtkWidget **picker, gboolean top)
static void update_saturation_slider_end_color(GtkWidget *slider, float hue)
void color_picker_apply(dt_iop_module_t *self, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
struct dt_gui_gtk_t * gui
const struct dt_database_t * db
struct dt_develop_t * develop
struct dt_iop_module_t *void * data
GModule *dt_dev_operation_t op
dt_iop_gui_data_t * gui_data
dt_aligned_pixel_t picked_color
Region of interest passed through the pixelpipe.
float highlight_saturation
GtkWidget * shadow_sat_gslider
GtkWidget * highlight_sat_gslider
GtkWidget * highlight_hue_gslider
GtkWidget * balance_scale
GtkWidget * shadow_hue_gslider
GtkWidget * compress_scale
GtkWidget * shadow_colorpick
GtkWidget * highlight_colorpick
float highlight_saturation