78#define NEUTRAL_GRAY 0.5
79#define BLEND_MASKMODE_CONF_KEY "plugins/darkroom/blending/mask_mode_tab"
124 = { { NC_(
"blendoperation",
"normal"), 0 },
137 = { { N_(
"None"), 0 },
138 { N_(
"Uniform"), 1 },
139 { N_(
"Parametric mask"), 2 },
140 { N_(
"Drawn mask"), 3 },
141 { N_(
"Drawn & parametric mask"), 4 },
142 { N_(
"Reuse an existing mask"), 5 },
165 = { { 0.0f, { 0, 0, 0, 1.0 } },
174 { 0.000f, { 0.0112790f, 0.7500000f, 0.5609999f, 1.0f } },
175 { 0.250f, { 0.2888855f, 0.7500000f, 0.6318934f, 1.0f } },
176 { 0.375f, { 0.4872486f, 0.7500000f, 0.6825501f, 1.0f } },
177 { 0.500f, { 0.7500000f, 0.7499399f, 0.7496052f, 1.0f } },
178 { 0.625f, { 0.7500000f, 0.5054633f, 0.5676756f, 1.0f } },
179 { 0.750f, { 0.7500000f, 0.3423850f, 0.4463195f, 1.0f } },
180 { 1.000f, { 0.7500000f, 0.1399815f, 0.2956989f, 1.0f } },
186 { 0.000f, { 0.0162050f, 0.1968228f, 0.7500000f, 1.0f } },
187 { 0.250f, { 0.2027354f, 0.3168822f, 0.7500000f, 1.0f } },
188 { 0.375f, { 0.3645722f, 0.4210476f, 0.7500000f, 1.0f } },
189 { 0.500f, { 0.6167146f, 0.5833379f, 0.7500000f, 1.0f } },
190 { 0.625f, { 0.7500000f, 0.6172369f, 0.5412091f, 1.0f } },
191 { 0.750f, { 0.7500000f, 0.5590797f, 0.3071980f, 1.0f } },
192 { 1.000f, { 0.7500000f, 0.4963975f, 0.0549797f, 1.0f } },
196 = { { 0.0f, { 0, 0, 0, 1.0 } },
203 { 0.000f, { 0.0000000f, 0.0000000f, 0.0000000f, 1.0f } },
204 { 0.125f, { 0.0937500f, 0.0000000f, 0.0000000f, 1.0f } },
205 { 0.250f, { 0.1875000f, 0.0000000f, 0.0000000f, 1.0f } },
206 { 0.500f, { 0.3750000f, 0.0000000f, 0.0000000f, 1.0f } },
207 { 1.000f, { 0.7500000f, 0.0000000f, 0.0000000f, 1.0f } }
211 { 0.000f, { 0.0000000f, 0.0000000f, 0.0000000f, 1.0f } },
212 { 0.125f, { 0.0000000f, 0.0937500f, 0.0000000f, 1.0f } },
213 { 0.250f, { 0.0000000f, 0.1875000f, 0.0000000f, 1.0f } },
214 { 0.500f, { 0.0000000f, 0.3750000f, 0.0000000f, 1.0f } },
215 { 1.000f, { 0.0000000f, 0.7500000f, 0.0000000f, 1.0f } }
219 { 0.000f, { 0.0000000f, 0.0000000f, 0.0000000f, 1.0f } },
220 { 0.125f, { 0.0000000f, 0.0000000f, 0.0937500f, 1.0f } },
221 { 0.250f, { 0.0000000f, 0.0000000f, 0.1875000f, 1.0f } },
222 { 0.500f, { 0.0000000f, 0.0000000f, 0.3750000f, 1.0f } },
223 { 1.000f, { 0.0000000f, 0.0000000f, 0.7500000f, 1.0f } }
228 { 0.000f, { 0.5000000f, 0.5000000f, 0.5000000f, 1.0f } },
229 { 0.125f, { 0.5000000f, 0.4375000f, 0.5000000f, 1.0f } },
230 { 0.250f, { 0.5000000f, 0.3750000f, 0.5000000f, 1.0f } },
231 { 0.500f, { 0.5000000f, 0.2500000f, 0.5000000f, 1.0f } },
232 { 1.000f, { 0.5000000f, 0.0000000f, 0.5000000f, 1.0f } }
239 { 0.000f, { 0.7500000f, 0.2200405f, 0.4480174f, 1.0f } },
240 { 0.104f, { 0.7500000f, 0.2475123f, 0.2488547f, 1.0f } },
241 { 0.200f, { 0.7500000f, 0.3921083f, 0.2017670f, 1.0f } },
242 { 0.295f, { 0.7500000f, 0.7440329f, 0.3011876f, 1.0f } },
243 { 0.377f, { 0.3813996f, 0.7500000f, 0.3799668f, 1.0f } },
244 { 0.503f, { 0.0747526f, 0.7500000f, 0.7489037f, 1.0f } },
245 { 0.650f, { 0.0282981f, 0.3736209f, 0.7500000f, 1.0f } },
246 { 0.803f, { 0.2583821f, 0.2591069f, 0.7500000f, 1.0f } },
247 { 0.928f, { 0.7500000f, 0.2788102f, 0.7492077f, 1.0f } },
248 { 1.000f, { 0.7500000f, 0.2200405f, 0.4480174f, 1.0f } },
255 { 0.000f, { 0.7500000f, 0.2500000f, 0.2500000f, 1.0f } },
256 { 0.167f, { 0.7500000f, 0.7500000f, 0.2500000f, 1.0f } },
257 { 0.333f, { 0.2500000f, 0.7500000f, 0.2500000f, 1.0f } },
258 { 0.500f, { 0.2500000f, 0.7500000f, 0.7500000f, 1.0f } },
259 { 0.667f, { 0.2500000f, 0.2500000f, 0.7500000f, 1.0f } },
260 { 0.833f, { 0.7500000f, 0.2500000f, 0.7500000f, 1.0f } },
261 { 1.000f, { 0.7500000f, 0.2500000f, 0.2500000f, 1.0f } },
268 { 0.000f, { 0.7500000f, 0.1946971f, 0.3697612f, 1.0f } },
269 { 0.082f, { 0.7500000f, 0.2278141f, 0.2291548f, 1.0f } },
270 { 0.150f, { 0.7500000f, 0.3132381f, 0.1653960f, 1.0f } },
271 { 0.275f, { 0.7483232f, 0.7500000f, 0.1939316f, 1.0f } },
272 { 0.378f, { 0.2642865f, 0.7500000f, 0.2642768f, 1.0f } },
273 { 0.570f, { 0.0233180f, 0.7493543f, 0.7500000f, 1.0f } },
274 { 0.650f, { 0.1119025f, 0.5116763f, 0.7500000f, 1.0f } },
275 { 0.762f, { 0.3331225f, 0.3337235f, 0.7500000f, 1.0f } },
276 { 0.883f, { 0.7464700f, 0.2754816f, 0.7500000f, 1.0f } },
277 { 1.000f, { 0.7500000f, 0.1946971f, 0.3697612f, 1.0f } },
350 return exp2f(data->module->blend_params->blendif_boost_factors[data->
channel[channel].
param_channels[in_out]]);
372 work_profile->unbounded_coeffs_in,
418 work_profile->unbounded_coeffs_in,
447 if(
value < 0.0001f) digits = 0;
448 else if(
value < 0.01f) digits = 2;
449 else if(
value < 0.999f) digits = 1;
458 if(fabsf(
value) < 10.0f) digits = 1;
466 const float scaled = (
value * 256.0f - 128.0f) * boost_factor;
472 snprintf(
string,
n,
"%-5.0f",
value * 360.0f);
477 const float scaled =
value * boost_factor;
488 const uint32_t active_channels = blend->
blendif & mask;
489 const uint32_t inverted_channels = (blend->
blendif >> 16) ^ (mask_inclusive ? mask : 0);
490 const uint32_t cancel_channels = inverted_channels & ~blend->blendif & mask;
491 return active_channels || cancel_channels;
499 gboolean changed =
FALSE;
509 const uint32_t old_blendif =
d->
blendif;
512 d->blendif = (
d->blendif & ~(mask | (mask << 16))) | need_inversion;
514 changed = (
d->blendif != old_blendif);
519 && (
d->blendif_parameters[
ch * 4 + 0] != 0.0f
520 ||
d->blendif_parameters[
ch * 4 + 1] != 0.0f
521 ||
d->blendif_parameters[
ch * 4 + 2] != 1.0f
522 ||
d->blendif_parameters[
ch * 4 + 3] != 1.0f))
525 d->blendif_parameters[
ch * 4 + 0] = 0.0f;
526 d->blendif_parameters[
ch * 4 + 1] = 0.0f;
527 d->blendif_parameters[
ch * 4 + 2] = 1.0f;
528 d->blendif_parameters[
ch * 4 + 3] = 1.0f;
537 data->module->blend_params->mask_mode = mask_mode;
591 d->mask_combine |= combine;
597 const uint32_t unused_channels = mask & ~d->blendif;
598 d->blendif &= ~(unused_channels << 16);
601 d->blendif |= unused_channels << 16;
614 const gboolean active = gtk_toggle_button_get_active(togglebutton);
618 data->module->blend_params->mask_combine &= ~DEVELOP_COMBINE_INV;
632 const int in_out = (slider == data->
filter[1].
slider) ? 1 : 0;
636 if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->
colorpicker))
649 for(
int k = 0;
k < 4;
k++)
652 (channel->
scale_print)(parameters[
k], boost_factor, text,
sizeof(text));
653 gtk_label_set_text(label[
k], text);
657 if(parameters[1] == 0.0f && parameters[2] == 1.0f)
675 const int in_out = (slider == data->
filter[1].
slider) ? 1 : 0;
693 int active = gtk_toggle_button_get_active(togglebutton);
699 const int in_out = (GTK_WIDGET(togglebutton) == data->
filter[1].
polarity) ? 1 : 0;
725 const float tiny = 1.0e-4f;
729 outval = (log10(CLAMP(inval, 0.0001f, 1.0f)) + 4.0f) / 4.0f;
732 outval = CLAMP(exp(
M_LN10 * (4.0f * inval - 4.0f)), 0.0f, 1.0f);
733 if(outval <= tiny) outval = 0.0f;
734 if(outval >= 1.0f - tiny) outval = 1.0f;
746 const float range = 6.0f;
747 const float invrange = 1.0f/range;
748 const float scale = tanh(range * 0.5f);
749 const float invscale = 1.0f/scale;
750 const float eps = 1.0e-6f;
751 const float tiny = 1.0e-4f;
755 outval = (invscale * tanh(range * (CLAMP(inval, 0.0f, 1.0f) - 0.5f)) + 1.0f) * 0.5f;
756 if(outval <= tiny) outval = 0.0f;
757 if(outval >= 1.0f - tiny) outval = 1.0f;
760 outval = invrange * atanh((2.0f * CLAMP(inval,
eps, 1.0f -
eps) - 1.0f) * scale) + 0.5f;
761 if(outval <= tiny) outval = 0.0f;
762 if(outval >= 1.0f - tiny) outval = 1.0f;
771 float (*scale_callback)(
GtkWidget*,
float,
int),
const char *label)
776 int in_out = (slider == data->
filter[1].
slider) ? 1 : 0;
779 gchar *text = g_strdup_printf(
"%s%s",
780 (in_out == 0) ? _(
"input") : _(
"output"),
781 (mode == 1) ? label :
"");
782 gtk_label_set_text(data->
filter[in_out].
head, text);
785 return (mode == 1) ? 1 : 0;
818 const int in_out = GTK_WIDGET(button) == data->
filter[1].
log_scale ? 1 : 0;
822 const gboolean active = gtk_toggle_button_get_active(button);
823 gtk_button_set_label(GTK_BUTTON(button), active ? _(
"Linear scale") : _(
"Log scale"));
825 const int requested_mode = active ? 1 : 0;
863 if(
value < 10.0f) digits = 2;
881 float *raw_mean, *raw_min, *raw_max;
885 for(
int in_out = 1; in_out >= 0; in_out--)
889 raw_mean =
module->picked_output_color;
890 raw_min =
module->picked_output_color_min;
891 raw_max =
module->picked_output_color_max;
895 raw_mean =
module->picked_color;
896 raw_min =
module->picked_color_min;
897 raw_max =
module->picked_color_max;
900 if((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->
colorpicker)) ||
902 (raw_min[0] != INFINITY))
904 float picker_mean[8], picker_min[8], picker_max[8];
913 _blendif_scale(data, cst, raw_mean, picker_mean, work_profile, in_out);
914 _blendif_scale(data, cst, raw_min, picker_min, work_profile, in_out);
915 _blendif_scale(data, cst, raw_max, picker_max, work_profile, in_out);
922 CLAMP(picker_mean[data->
tab], 0.0f, 1.0f),
923 CLAMP(picker_min[data->
tab], 0.0f, 1.0f),
924 CLAMP(picker_max[data->
tab], 0.0f, 1.0f));
945 const float epsilon = 1e-6f;
951 for(
int in_out = 1; in_out >= 0; in_out--)
959 const int polarity = !(bp->
blendif & (1 << (
ch + 16)));
961 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sl->
polarity), polarity);
977 for(
int k = 0;
k < 4;
k++)
985 for(
int k = 0;
k < 4;
k++)
988 channel->
scale_print(parameters[
k], boost_factor, text,
sizeof(text));
989 gtk_label_set_text(sl->
label[
k], text);
1006 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sl->
log_scale), data->
altmode[tab][in_out] == 1);
1007 gtk_button_set_label(GTK_BUTTON(sl->
log_scale),
1008 data->
altmode[tab][in_out] == 1 ? _(
"Linear scale") : _(
"Log scale"));
1013 data->
altmode[tab][in_out] = 0;
1014 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sl->
log_scale),
FALSE);
1015 gtk_button_set_label(GTK_BUTTON(sl->
log_scale), _(
"Log scale"));
1023 float boost_factor = 0.0f;
1024 if(boost_factor_enabled)
1033 gboolean modified =
FALSE;
1036 for(
int in_out = 0; in_out < 2 && !modified; in_out++)
1042 for(
int k = 0;
k < 4;
k++)
1044 if(fabsf(params[
k] - defaults[
k]) > epsilon)
1053 GtkWidget *label = GTK_IS_WIDGET(page) ? gtk_notebook_get_tab_label(data->
channel_tabs, page) : NULL;
1054 if(GTK_IS_LABEL(label))
1056 gchar *tab_title = modified
1057 ? g_markup_printf_escaped(
"<b>%s</b>", _(page_channel->
label))
1058 : g_markup_printf_escaped(
"%s", _(page_channel->
label));
1059 gtk_label_set_markup(GTK_LABEL(label), tab_title);
1066 const gboolean output
1067 = (
module->request_mask_display & DT_DEV_PIXELPIPE_DISPLAY_OUTPUT) != 0;
1069 =
module->request_mask_display & ~DT_DEV_PIXELPIPE_DISPLAY_ANY;
1075 module->request_mask_display = new_request_mask_display;
1093 data->
tab = page_num;
1096 && (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->
colorpicker))
1126 const int tab = data->
tab;
1129 for(
int in_out = 1; in_out >= 0; in_out--)
1140 const float factor = exp2f(old_value) / exp2f(new_value);
1142 if(parameters[0] > 0.0f) parameters[0] =
clamp_range_f((parameters[0] - off) *
factor + off, 0.0f, 1.0f);
1143 if(parameters[1] > 0.0f) parameters[1] =
clamp_range_f((parameters[1] - off) *
factor + off, 0.0f, 1.0f);
1144 if(parameters[2] < 1.0f) parameters[2] =
clamp_range_f((parameters[2] - off) *
factor + off, 0.0f, 1.0f);
1145 if(parameters[3] < 1.0f) parameters[3] =
clamp_range_f((parameters[3] - off) *
factor + off, 0.0f, 1.0f);
1146 if(parameters[1] == 0.0f && parameters[2] == 1.0f)
1166 const float oldval = bp->
details;
1171 if((oldval == 0.0f) && (bp->
details != 0.0f))
1199 if(event->button == 1)
1201 const int has_mask_display =
module->request_mask_display & (DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL);
1203 module->request_mask_display
1204 &= ~(DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL
1205 | DT_DEV_PIXELPIPE_DISPLAY_ANY | DT_DEV_PIXELPIPE_DISPLAY_STICKY);
1207 if(
dt_modifier_is(event->state, GDK_CONTROL_MASK | GDK_SHIFT_MASK))
1208 module->request_mask_display |= (DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL);
1210 module->request_mask_display |= DT_DEV_PIXELPIPE_DISPLAY_CHANNEL;
1212 module->request_mask_display |= DT_DEV_PIXELPIPE_DISPLAY_MASK;
1214 module->request_mask_display |= (has_mask_display ? 0 : DT_DEV_PIXELPIPE_DISPLAY_MASK);
1216 gtk_toggle_button_set_active(button,
1219 module->enabled = TRUE;
1220 if(module->
off) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(module->
off),
TRUE);
1225 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(module->
mask_indicator),
1244 const unsigned int bit = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(togglebutton),
"mask-bit"));
1249 uint32_t mask_mode =
module->blend_params->mask_mode;
1250 const gboolean active = gtk_toggle_button_get_active(togglebutton);
1254 const gboolean enable_bit = is_disable_toggle ? !active : active;
1262 mask_mode &= ~DEVELOP_MASK_ENABLED;
1269 mask_mode &= ~DEVELOP_MASK_RASTER;
1276 mask_mode &= ~DEVELOP_MASK_SHAPE;
1283 mask_mode &= ~DEVELOP_MASK_PARAMETRIC;
1300 module->blend_params->blendif = module->default_blendop_params->blendif;
1303 module->blend_params->details = module->default_blendop_params->details;
1319 unsigned int toggle_mask = 0;
1336 module->blend_params->blendif ^= toggle_mask;
1337 module->blend_params->mask_combine ^= DEVELOP_COMBINE_MASKS_POS;
1338 module->blend_params->mask_combine ^= DEVELOP_COMBINE_INCL;
1357 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->
masks_edit),
FALSE);
1366 if(event->button == 1)
1376 const gboolean control_button_pressed =
dt_modifier_is(event->state, GDK_CONTROL_MASK);
1418 const int active = !gtk_toggle_button_get_active(togglebutton);
1419 gtk_toggle_button_set_active(togglebutton, active);
1469 int new_form_id = 100;
1475 mask_form->
formid = new_form_id++;
1480 form_node = g_list_next(form_node);
1493 gchar *module_label = g_strdup(module->
multi_name);
1494 if(g_strcmp0(module_label,
"") == 0)
1499 g_snprintf(group_form->
name,
sizeof(group_form->
name),
"%s %s", _(
"Mask"), module_label);
1504 module->blend_params->mask_id = group_form->formid;
1515 int group_index = 0;
1516 for(GList *group_node = group_form->
points; group_node; group_node = g_list_next(group_node))
1519 if(group_entry->
formid == formid)
1521 if(index) *index = group_index;
1581 if(g_list_length(mask_form->
points) != 1)
return FALSE;
1600 for(
const GList *group_node = mask_form->
points; group_node; group_node = g_list_next(group_node))
1615 GtkTreeIter *parent_iter,
1624 char display_name[256] =
"";
1625 if(group_entry->
opacity != 1.0f)
1626 g_snprintf(display_name,
sizeof(display_name),
"%s %d%%", mask_form->
name,
1627 (
int)(group_entry->
opacity * 100));
1629 g_strlcpy(display_name, mask_form->
name,
sizeof(display_name));
1631 gtk_tree_store_append(tree_store, &iter, parent_iter);
1661 for(
const GList *group_node = parent_group->
points; group_node; group_node = g_list_next(group_node))
1675 for(
const GList *group_node = parent_group->
points; group_node; group_node = g_list_next(group_node))
1693 const int formid_col,
const int formid)
1697 gboolean valid = gtk_tree_model_get_iter_first(
model, iter);
1700 int current_formid = -1;
1701 gtk_tree_model_get(
model, iter, formid_col, ¤t_formid, -1);
1702 if(current_formid == formid)
return TRUE;
1703 valid = gtk_tree_model_iter_next(
model, iter);
1728 GtkTreeModel *all_model = gtk_tree_view_get_model(GTK_TREE_VIEW(bd->
masks_treeview));
1730 if(!GTK_IS_LIST_STORE(all_model))
return;
1731 if(!GTK_IS_TREE_STORE(group_model))
return;
1734 GtkTreeSelection *all_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bd->
masks_treeview));
1735 GtkTreeSelection *group_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bd->
masks_group_treeview));
1741 gtk_list_store_clear(GTK_LIST_STORE(all_model));
1742 gtk_tree_store_clear(GTK_TREE_STORE(group_model));
1747 for(
const GList *form_node =
darktable.
develop->
forms; form_node; form_node = g_list_next(form_node))
1759 gtk_list_store_append(GTK_LIST_STORE(all_model), &iter);
1760 gchar *display_markup = g_markup_printf_escaped(
"%s", mask_form->
name);
1767 g_free(display_markup);
1771 for(
const GList *form_node =
darktable.
develop->
forms; form_node; form_node = g_list_next(form_node))
1780 gboolean sensitive =
TRUE;
1781 const gchar *locked_group_name = NULL;
1784 for(
const GList *parent_node =
darktable.
develop->
forms; parent_node; parent_node = g_list_next(parent_node))
1793 locked_group_name = parent_form->
name;
1798 const gboolean display_active = active || !sensitive;
1799 gchar *display_markup = NULL;
1800 gchar *status_markup = NULL;
1801 display_markup = g_markup_printf_escaped(
"%s", mask_form->
name);
1803 if(!sensitive && !
IS_NULL_PTR(locked_group_name) && *locked_group_name)
1805 gchar *already_in = g_strdup_printf(_(
"Already in '%s'"), locked_group_name);
1806 status_markup = g_markup_printf_escaped(
"<i>%s</i>", already_in);
1810 status_markup = g_strdup(
"");
1813 gtk_list_store_append(GTK_LIST_STORE(all_model), &iter);
1819 g_free(display_markup);
1820 g_free(status_markup);
1855 gchar *text = (new_text && *new_text) ? g_strdup(new_text) : g_strdup(mask_default_name);
1856 g_free(mask_default_name);
1858 g_strlcpy(group_form->
name, text,
sizeof(group_form->
name));
1869 if(!GTK_IS_ENTRY(entry))
return;
1877 if(GTK_IS_ENTRY(widget))
1891 if(!GTK_IS_TREE_MODEL(
model))
return;
1894 if(!gtk_tree_model_get_iter_from_string(
model, &iter, path_string))
return;
1901 const gchar *text = (new_text && *new_text) ? new_text :
" ";
1902 g_strlcpy(mask_form->
name, text,
sizeof(mask_form->
name));
1916 GtkTreeModel *
model = NULL;
1918 if(!gtk_tree_selection_get_selected(selection, &
model, &iter))
return;
1919 if(!GTK_IS_TREE_MODEL(
model))
return;
1923 if(formid <= 0)
return;
1934 module->dev->form_gui->group_selected = 0;
1935 module->dev->form_gui->form_selected = TRUE;
1949 if(!GTK_IS_TREE_MODEL(
model))
return;
1952 if(!gtk_tree_model_get_iter_from_string(
model, &iter, path_string))
return;
1954 gboolean active =
FALSE;
1955 gboolean sensitive =
TRUE;
1961 if(!sensitive)
return;
1967 const int parentid_before = group_form ? group_form->
formid : 0;
1990 const gboolean new_active = !active;
1991 GtkTreeIter search_iter;
1992 gboolean valid = gtk_tree_model_get_iter_first(
model, &search_iter);
1996 int child_formid = -1;
2003 gtk_list_store_set(GTK_LIST_STORE(
model), &search_iter,
2007 valid = gtk_tree_model_iter_next(
model, &search_iter);
2013 const int parentid_after = group_form ? group_form->
formid : parentid_before;
2015 active ? parentid_before : parentid_after,
2023 const int formid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-formid"));
2037 const int formid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-formid"));
2049 const int formid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-formid"));
2052 GtkTreeModel *
model = gtk_tree_view_get_model(
view);
2053 if(!GTK_IS_TREE_MODEL(
model))
return;
2058 GtkTreePath *path = gtk_tree_model_get_path(
model, &iter);
2059 GtkTreeViewColumn *column = gtk_tree_view_get_column(
view, 1);
2060 GtkCellRenderer *renderer = g_object_get_data(G_OBJECT(
view),
"blendop-masks-name-renderer");
2061 if(path && column && renderer)
2062 gtk_tree_view_set_cursor_on_cell(
view, path, column, renderer,
TRUE);
2063 if(path) gtk_tree_path_free(path);
2075 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
2077 if(!gtk_tree_model_get_iter(
model, &iter, path))
return FALSE;
2079 gboolean sensitive =
TRUE;
2084 if(formid <= 0)
return FALSE;
2088 gtk_tree_path_free(path);
2093 gchar *path_string = gtk_tree_path_to_string(path);
2096 gtk_tree_path_free(path);
2105 GtkTreePath *path = NULL;
2106 GtkTreeViewColumn *column = NULL;
2107 if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), (gint)event->x, (gint)event->y, &path,
2108 &column, NULL, NULL))
2112 if(event->button == GDK_BUTTON_PRIMARY && !
IS_NULL_PTR(column))
2119 if(event->button != GDK_BUTTON_SECONDARY)
2121 gtk_tree_path_free(path);
2125 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
2126 gtk_tree_selection_unselect_all(selection);
2127 gtk_tree_selection_select_path(selection, path);
2129 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
2132 if(gtk_tree_model_get_iter(
model, &iter, path))
2134 gtk_tree_path_free(path);
2135 if(formid <= 0)
return TRUE;
2138 GtkWidget *item = gtk_menu_item_new_with_label(_(
"Delete"));
2139 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2141 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2143 item = gtk_menu_item_new_with_label(_(
"Duplicate"));
2144 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2146 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2148 item = gtk_menu_item_new_with_label(_(
"Rename"));
2149 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2151 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2153 gtk_widget_show_all(menu);
2154 gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event);
2163 const int formid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-formid"));
2164 const int parentid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-parentid"));
2165 const dt_masks_state_t state = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-state"));
2170 const int old_state = group_entry->
state;
2172 if(group_entry->
state == old_state)
return;
2185 GtkTreeModel *
model = NULL;
2187 if(!gtk_tree_selection_get_selected(selection, &
model, &iter))
return;
2188 if(!GTK_IS_TREE_MODEL(
model))
return;
2192 if(formid <= 0)
return;
2200 dt_masks_form_t *visible_form =
module->dev ? dt_masks_get_visible_form(module->dev) : NULL;
2218 gui =
module->dev->form_gui;
2221 if(selected_index >= 0)
2242 const gboolean move_up)
2246 if(index < 0)
return FALSE;
2248 const guint length = g_list_length(group_form->
points);
2249 if(length == 0 || (guint)index >= length)
return FALSE;
2250 if(move_up && index == 0)
return FALSE;
2251 if(!move_up && (guint)index >= length - 1)
return FALSE;
2256 const int new_index = move_up ? index - 1 : index + 1;
2257 group_form->
points = g_list_remove(group_form->
points, entry);
2258 group_form->
points = g_list_insert(group_form->
points, entry, new_index);
2266 const int parentid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-parentid"));
2267 const int index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-index"));
2268 const gboolean move_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item),
"blend-move-up"));
2281 if(!GTK_IS_TOGGLE_BUTTON(togglebutton))
return;
2286 const gboolean edit_mode = gtk_toggle_button_get_active(togglebutton);
2289 gtk_button_set_label(GTK_BUTTON(togglebutton), _(
"OK"));
2291 gtk_button_set_label(GTK_BUTTON(togglebutton), _(
"Attach shapes"));
2294 gtk_stack_set_visible_child_name(GTK_STACK(bd->
lists_stack), edit_mode ?
"all" :
"group");
2306 .creation_module = module,
2309 .action_section =
"blend_shapes",
2325 const int formid,
const int parentid,
const int state,
2326 const int index,
const int list_length)
2334 gtk_style_context_add_class(gtk_widget_get_style_context(menu),
"dt-masks-context-menu");
2336 GtkWidget *op_item = gtk_menu_item_new_with_label(_(
"Operation"));
2338 gtk_menu_item_set_submenu(GTK_MENU_ITEM(op_item), op_submenu);
2339 gtk_menu_shell_append(GTK_MENU_SHELL(menu), op_item);
2346 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2347 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2350 gtk_menu_shell_append(GTK_MENU_SHELL(op_submenu), gtk_separator_menu_item_new());
2355 gtk_widget_set_sensitive(item, index > 0);
2356 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2357 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2363 gtk_widget_set_sensitive(item, index > 0);
2364 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2365 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2371 gtk_widget_set_sensitive(item, index > 0);
2372 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2373 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2379 gtk_widget_set_sensitive(item, index > 0);
2380 g_object_set_data(G_OBJECT(item),
"blend-formid", GINT_TO_POINTER(formid));
2381 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2384 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
2386 item = gtk_menu_item_new_with_label(_(
"Move Up"));
2387 gtk_widget_set_sensitive(item, index > 0);
2388 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2389 g_object_set_data(G_OBJECT(item),
"blend-index", GINT_TO_POINTER(index));
2390 g_object_set_data(G_OBJECT(item),
"blend-move-up", GINT_TO_POINTER(
TRUE));
2392 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2394 item = gtk_menu_item_new_with_label(_(
"Move Down"));
2395 gtk_widget_set_sensitive(item, index >= 0 && index < list_length - 1);
2396 g_object_set_data(G_OBJECT(item),
"blend-parentid", GINT_TO_POINTER(parentid));
2397 g_object_set_data(G_OBJECT(item),
"blend-index", GINT_TO_POINTER(index));
2398 g_object_set_data(G_OBJECT(item),
"blend-move-up", GINT_TO_POINTER(
FALSE));
2400 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2430 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
2431 GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
2432 _(
"Permanently delete the shape '%s'?"), form_name);
2433 gtk_message_dialog_format_secondary_text(
2434 GTK_MESSAGE_DIALOG(dialog),
"%s",
2435 _(
"It will be detached from this mask and removed from the list of available shapes."));
2436 gtk_dialog_add_button(GTK_DIALOG(dialog), _(
"Cancel"), GTK_RESPONSE_CANCEL);
2437 gtk_dialog_add_button(GTK_DIALOG(dialog), _(
"Delete"), GTK_RESPONSE_YES);
2438 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
2440 const int response = gtk_dialog_run(GTK_DIALOG(dialog));
2441 gtk_widget_destroy(dialog);
2442 return response == GTK_RESPONSE_YES;
2476 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
2478 if(!gtk_tree_model_get_iter(
model, &iter, path))
return TRUE;
2484 if(formid <= 0 || parentid <= 0)
return TRUE;
2499 GtkTreePath *path = NULL;
2500 GtkTreeViewColumn *column = NULL;
2501 if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), (gint)event->x, (gint)event->y, &path,
2502 &column, NULL, NULL))
2506 if(event->button == GDK_BUTTON_PRIMARY)
2509 gtk_tree_path_free(path);
2513 if(event->button != GDK_BUTTON_SECONDARY)
2515 gtk_tree_path_free(path);
2519 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
2520 gtk_tree_selection_unselect_all(selection);
2521 gtk_tree_selection_select_path(selection, path);
2523 GtkTreeModel *
model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
2529 if(gtk_tree_model_get_iter(
model, &iter, path))
2534 gtk_tree_path_free(path);
2536 if(formid <= 0 || parentid <= 0)
return TRUE;
2541 ? g_list_length(parent_group->
points)
2546 gtk_widget_show_all(menu);
2547 gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event);
2559 gint bx = 0, by = 0;
2560 gtk_tree_view_convert_widget_to_bin_window_coords(GTK_TREE_VIEW(treeview),
x, y, &bx, &by);
2562 GtkTreePath *path = NULL;
2563 GtkTreeViewColumn *column = NULL;
2564 if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), bx, by, &path, &column, NULL, NULL))
2566 gtk_tree_path_free(path);
2568 const char *text = NULL;
2570 text = _(
"Detach this shape from the mask. The shape is kept and stays available for reuse.");
2572 text = _(
"Permanently delete this shape. It is detached from the mask and removed from the list of available shapes.");
2576 gtk_tooltip_set_text(
tooltip, text);
2582 const int formid,
const int parentid, GtkTreeIter *
out)
2585 gboolean valid = gtk_tree_model_iter_children(
model, &iter, parent);
2592 if(fid == formid && pid == parentid)
2597 if(gtk_tree_model_iter_has_child(
model, &iter)
2600 valid = gtk_tree_model_iter_next(
model, &iter);
2613 if(!GTK_IS_TREE_STORE(
model))
return;
2624 char display_name[256] =
"";
2626 g_snprintf(display_name,
sizeof(display_name),
"%s %d%%", form->
name, (
int)(entry->
opacity * 100));
2628 g_strlcpy(display_name, form->
name,
sizeof(display_name));
2661 const int tab = data->
tab;
2670 for(
size_t i = 0;
i < 4;
i++)
2672 raw_min[
i] =
module->picked_output_color_min[i];
2673 raw_max[
i] =
module->picked_output_color_max[i];
2678 for(
size_t i = 0;
i < 4;
i++)
2680 raw_min[
i] =
module->picked_color_min[i];
2681 raw_max[
i] =
module->picked_color_max[i];
2697 gboolean reverse_hues =
FALSE;
2700 if((raw_max[3] - raw_min[3]) < (raw_max[0] - raw_min[0]) && raw_min[3] < 0.5f && raw_max[3] > 0.5f)
2702 raw_max[0] = raw_max[3] < 0.5f ? raw_max[3] + 0.5f : raw_max[3] - 0.5f;
2703 raw_min[0] = raw_min[3] < 0.5f ? raw_min[3] + 0.5f : raw_min[3] - 0.5f;
2704 reverse_hues =
TRUE;
2709 if((raw_max[3] - raw_min[3]) < (raw_max[2] - raw_min[2]) && raw_min[3] < 0.5f && raw_max[3] > 0.5f)
2711 raw_max[2] = raw_max[3] < 0.5f ? raw_max[3] + 0.5f : raw_max[3] - 0.5f;
2712 raw_min[2] = raw_min[3] < 0.5f ? raw_min[3] + 0.5f : raw_min[3] - 0.5f;
2713 reverse_hues =
TRUE;
2717 _blendif_scale(data, cst, raw_max, picker_max, work_profile, in_out);
2719 gboolean picker_box_changed =
FALSE;
2725 picker_box_changed =
TRUE;
2729 const float epsilon = 1e-6f;
2730 for(
int k = 0;
k < 4;
k++)
2734 picker_box_changed =
TRUE;
2740 if(picker_box_changed)
2767 const float picker_margin = 0.02f;
2768 const float boost_step = 0.25f;
2769 const int max_boost_iters = 64;
2772 const float target_max = (picker_max[tab] > (1.0f - picker_margin)) ? 1.0f : (1.0f - picker_margin);
2774 gboolean within_bounds = picker_max[tab] <= target_max;
2778 for(
int iter = 0; iter < max_boost_iters && trial < boost_max; iter++)
2780 trial = fminf(trial + boost_step, boost_max);
2782 _blendif_scale(data, cst, raw_max, picker_max, work_profile, in_out);
2783 within_bounds = picker_max[tab] <= target_max;
2784 if(within_bounds)
break;
2790 for(
int iter = 0; iter < max_boost_iters && trial > boost_min; iter++)
2792 const float candidate = fmaxf(trial - boost_step, boost_min);
2794 _blendif_scale(data, cst, raw_max, picker_max, work_profile, in_out);
2795 if(picker_max[tab] > target_max)
2802 _blendif_scale(data, cst, raw_max, picker_max, work_profile, in_out);
2805 _blendif_scale(data, cst, raw_min, picker_min, work_profile, in_out);
2807 const float feather = 0.01f;
2809 if(picker_min[tab] > picker_max[tab])
2811 const float tmp = picker_min[tab];
2812 picker_min[tab] = picker_max[tab];
2813 picker_max[tab] = tmp;
2816 picker_values[0] = CLAMP(picker_min[tab] - feather, 0.f, 1.f);
2817 picker_values[1] = CLAMP(picker_min[tab] + feather, 0.f, 1.f);
2818 picker_values[2] = CLAMP(picker_max[tab] - feather, 0.f, 1.f);
2819 picker_values[3] = CLAMP(picker_max[tab] + feather, 0.f, 1.f);
2821 if(picker_values[1] > picker_values[2])
2823 picker_values[1] = CLAMP(picker_min[tab], 0.f, 1.f);
2824 picker_values[2] = CLAMP(picker_max[tab], 0.f, 1.f);
2827 picker_values[0] = CLAMP(picker_values[0], 0.f, picker_values[1]);
2828 picker_values[3] = CLAMP(picker_values[3], picker_values[2], 1.f);
2831 for(
int k = 0;
k < 4;
k++)
2839 for(
int k = 0;
k < 4;
k++)
2843 text,
sizeof(text));
2844 gtk_label_set_text(sl->
label[
k], text);
2851 for(
int k = 0;
k < 4;
k++)
2856 if(parameters[1] == 0.0f && parameters[2] == 1.0f)
2903 for(
const GList *history = g_list_last(
darktable.
develop->
history); history; history = g_list_previous(history))
2926 (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bd->
colorpicker)) ||
2943 gtk_widget_queue_draw(module->
widget);
2975 if(event->button != 1 && event->button != 2)
return;
2981 if(menu) gtk_widget_destroy(GTK_WIDGET(menu));
2992 mi = gtk_menu_item_new_with_label(_(
"reset to default blend colorspace"));
2995 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3001 mi = gtk_check_menu_item_new_with_label(_(
"Lab"));
3005 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi),
TRUE);
3008 g_object_set_data_full(G_OBJECT(mi),
"dt-blend-cst", GINT_TO_POINTER(
DEVELOP_BLEND_CS_LAB), NULL);
3010 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3013 mi = gtk_check_menu_item_new_with_label(_(
"RGB (display)"));
3017 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi),
TRUE);
3022 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3024 mi = gtk_check_menu_item_new_with_label(_(
"RGB (scene)"));
3028 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi),
TRUE);
3033 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3035 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
3039 mi = gtk_menu_item_new_with_label(_(
"reset and hide output channels"));
3041 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3045 mi = gtk_menu_item_new_with_label(_(
"show output channels"));
3047 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3090 new_request_mask_display &= ~DT_DEV_PIXELPIPE_DISPLAY_ANY;
3091 new_request_mask_display |= channel;
3097 module->request_mask_display = new_request_mask_display;
3132 new_request_mask_display &= ~mode;
3134 new_request_mask_display |= mode;
3143 new_request_mask_display &= ~DT_DEV_PIXELPIPE_DISPLAY_ANY;
3153 new_request_mask_display &= ~DT_DEV_PIXELPIPE_DISPLAY_ANY;
3154 new_request_mask_display |= channel;
3159 module->request_mask_display = new_request_mask_display;
3179 const gboolean channel_active
3180 = (
module->request_mask_display & DT_DEV_PIXELPIPE_DISPLAY_CHANNEL) != 0;
3181 const gboolean output_active
3182 = channel_active && (
module->request_mask_display & DT_DEV_PIXELPIPE_DISPLAY_OUTPUT) != 0;
3187 channel_active && !output_active);
3210 const gboolean active = gtk_toggle_button_get_active(button);
3214 if(active && GTK_IS_TOGGLE_BUTTON(other_button))
3215 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(other_button),
FALSE);
3219 =
module->request_mask_display
3220 & ~(DT_DEV_PIXELPIPE_DISPLAY_CHANNEL | DT_DEV_PIXELPIPE_DISPLAY_OUTPUT
3221 | DT_DEV_PIXELPIPE_DISPLAY_ANY | DT_DEV_PIXELPIPE_DISPLAY_STICKY);
3240 module->request_mask_display = new_request_mask_display;
3277 if(
dt_modifier_is(event->state, GDK_SHIFT_MASK | GDK_CONTROL_MASK))
3300 data->
save_for_leave =
module->request_mask_display & ~DT_DEV_PIXELPIPE_DISPLAY_STICKY;
3311 gtk_widget_grab_focus(widget);
3346 module->request_mask_display = bd->save_for_leave & ~DT_DEV_PIXELPIPE_DISPLAY_STICKY;
3350 bd->timeout_handle = 0;
3384 gboolean handled =
FALSE;
3386 switch(event->keyval)
3401#define COLORSTOPS(gradient) sizeof(gradient) / sizeof(dt_iop_gui_blendif_colorstop_t), gradient
3477const char *
slider_tooltip[] = { N_(
"adjustment based on input received by this module:\n* range defined by upper markers: "
3478 "blend fully\n* range defined by lower markers: do not blend at all\n* range between "
3479 "adjacent upper/lower markers: blend gradually"),
3480 N_(
"adjustment based on unblended output of this module:\n* range defined by upper "
3481 "markers: blend fully\n* range defined by lower markers: do not blend at all\n* range "
3482 "between adjacent upper/lower markers: blend gradually") };
3517 module->request_mask_display = bd->save_for_leave & ~DT_DEV_PIXELPIPE_DISPLAY_STICKY;
3559 gtk_widget_show_all(GTK_WIDGET(gtk_notebook_get_nth_page(bd->
channel_tabs, index)));
3563 gtk_notebook_set_current_page(GTK_NOTEBOOK(bd->
channel_tabs), bd->
tab);
3587 gtk_widget_set_name(header,
"blendif-pickers");
3594 gtk_notebook_set_action_widget(GTK_NOTEBOOK(bd->
channel_tabs), header, GTK_PACK_END);
3598 gtk_widget_set_tooltip_text(bd->
colorpicker, _(
"pick GUI color from image\nctrl+click or right-click to select an area"));
3604 gtk_widget_set_tooltip_text(bd->
colorpicker_set_values, _(
"set the range based on an area from the image\n"
3605 "drag to use the input image\n"
3606 "ctrl+drag to use the output image"));
3612 gtk_widget_show_all(header);
3614 for(
int in_out = 1; in_out >= 0; in_out--)
3621 in_out ?
"blend-upper" :
"blend-lower"));
3622 gtk_box_pack_start(GTK_BOX(slider_box), GTK_WIDGET(sl->
slider),
TRUE,
TRUE, 0);
3627 gtk_widget_set_tooltip_text(sl->
polarity, _(
"toggle polarity. best seen by enabling 'display mask'"));
3631 gtk_grid_set_column_homogeneous(GTK_GRID(label_box),
TRUE);
3634 gtk_grid_attach(GTK_GRID(label_box), GTK_WIDGET(sl->
head), 0, 0, 1, 1);
3637 gtk_grid_attach(GTK_GRID(label_box), overlay, 1, 0, 3, 1);
3640 gtk_widget_set_name(GTK_WIDGET(sl->
picker_label),
"blend-data");
3643 gtk_container_add(GTK_CONTAINER(overlay), GTK_WIDGET(sl->
picker_label));
3645 for(
int k = 0;
k < 4;
k++)
3647 sl->
label[
k] = GTK_LABEL(gtk_label_new(NULL));
3648 gtk_widget_set_name(GTK_WIDGET(sl->
label[
k]),
"blend-data");
3649 gtk_label_set_xalign(sl->
label[
k], .35 +
k * .65/3);
3650 gtk_label_set_yalign(sl->
label[
k],
k % 2);
3651 gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(sl->
label[
k]));
3654 gtk_widget_set_tooltip_text(GTK_WIDGET(sl->
slider),
3655 _(
"double-click to reset.\npress 'm' to toggle mask view."));
3667 sl->
box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
3668 gtk_box_pack_start(GTK_BOX(sl->
box), GTK_WIDGET(label_box),
FALSE,
FALSE, 0);
3669 gtk_box_pack_start(GTK_BOX(sl->
box), GTK_WIDGET(slider_box),
FALSE,
FALSE, 0);
3673 sl->
log_scale = gtk_toggle_button_new_with_label(_(
"Log scale"));
3674 gtk_widget_set_tooltip_text(
3676 _(
"toggle the alternative logarithmic or magnified scale for this channel"));
3677 g_signal_connect(G_OBJECT(sl->
log_scale),
"toggled",
3682 gtk_widget_set_tooltip_text(
3684 in_out ? _(
"display the current channel from the unblended module output")
3685 : _(
"display the current channel from the module input"));
3690 gtk_box_pack_start(GTK_BOX(sl->
box), display_controls,
FALSE,
FALSE, 0);
3718 gchar *markup = g_markup_printf_escaped(
3719 _(
"<i>Parametric masking is disabled because the <b>%s</b> module does not provide compatible color channels.</i>"),
3722 gtk_label_set_markup(GTK_LABEL(label), markup);
3723 gtk_label_set_xalign(GTK_LABEL(label), 0.0f);
3724 gtk_label_set_line_wrap(GTK_LABEL(label),
TRUE);
3758 ? visible_form->
type
3765 if(has_group_shapes)
3768 const guint
n = g_list_length(grp->
points);
3769 snprintf(txt,
sizeof(txt), ngettext(
"%d shape used",
"%d shapes used",
n),
n);
3780 if(!has_group_shapes)
3790 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->
masks_edit),
3794 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->
masks_polarity),
3803 if(module_creation && (creation_type & bd->
masks_type[
n]))
3833 GtkCellRenderer *renderer = NULL;
3834 GtkTreeSelection *selection = NULL;
3839 gtk_entry_set_placeholder_text(GTK_ENTRY(bd->
group_shapes_label), group_placeholder);
3840 g_free(group_placeholder);
3841 gtk_widget_set_tooltip_text(bd->
group_shapes_label, _(
"Edit current module mask name"));
3857 N_(
"show and edit in restricted mode"),
3866 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT,
3867 G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
3876 renderer = gtk_cell_renderer_pixbuf_new();
3880 renderer = gtk_cell_renderer_pixbuf_new();
3884 renderer = gtk_cell_renderer_text_new();
3891 renderer = gtk_cell_renderer_pixbuf_new();
3892 g_object_set(renderer,
"icon-name",
"list-remove-symbolic",
"stock-size", GTK_ICON_SIZE_MENU, NULL);
3894 gtk_tree_view_column_set_sizing(bd->
group_unlink_col, GTK_TREE_VIEW_COLUMN_FIXED);
3899 renderer = gtk_cell_renderer_pixbuf_new();
3900 g_object_set(renderer,
"icon-name",
"user-trash-symbolic",
"stock-size", GTK_ICON_SIZE_MENU, NULL);
3902 gtk_tree_view_column_set_sizing(bd->
group_delete_col, GTK_TREE_VIEW_COLUMN_FIXED);
3910 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
3931 gtk_widget_set_tooltip_text(bd->
wire_shape_toggle, _(
"Show all shapes and groups to choose which ones to connect to or disconnect from the mask."));
3942 G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN,
3943 G_TYPE_STRING, G_TYPE_STRING);
3949 renderer = gtk_cell_renderer_toggle_new();
3950 g_object_set(renderer,
"activatable",
TRUE, NULL);
3956 GtkTreeViewColumn *all_shapes_name_col = gtk_tree_view_column_new();
3957 gtk_tree_view_append_column(GTK_TREE_VIEW(bd->
masks_treeview), all_shapes_name_col);
3959 renderer = gtk_cell_renderer_text_new();
3960 g_object_set(renderer,
"editable",
TRUE, NULL);
3962 gtk_tree_view_column_pack_start(all_shapes_name_col, renderer,
TRUE);
3965 g_object_set_data(G_OBJECT(bd->
masks_treeview),
"blendop-masks-name-renderer", renderer);
3967 GtkTreeViewColumn *all_shapes_status_col = gtk_tree_view_column_new();
3968 gtk_tree_view_append_column(GTK_TREE_VIEW(bd->
masks_treeview), all_shapes_status_col);
3970 renderer = gtk_cell_renderer_text_new();
3971 g_object_set(renderer,
"xalign", 1.0f, NULL);
3972 gtk_tree_view_column_pack_end(all_shapes_status_col, renderer,
TRUE);
3973 gtk_tree_view_column_add_attribute(all_shapes_status_col, renderer,
"markup",
3975 gtk_tree_view_column_add_attribute(all_shapes_status_col, renderer,
"sensitive",
3978 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bd->
masks_treeview));
3979 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
3991 gtk_stack_set_transition_type(GTK_STACK(bd->
lists_stack), GTK_STACK_TRANSITION_TYPE_NONE);
4010 "plugins/darkroom/masks/wacom",
4026 gchar *markup = g_markup_printf_escaped(
4027 _(
"<i>Drawn masking is disabled because the <b>%s</b> module manages drawn shapes internally.</i>"),
4030 gtk_label_set_markup(GTK_LABEL(label), markup);
4031 gtk_label_set_xalign(GTK_LABEL(label), 0.0f);
4032 gtk_label_set_line_wrap(GTK_LABEL(label),
TRUE);
4064 GHashTableIter masks_iter;
4068 while(g_hash_table_iter_next(&masks_iter, &
key, &
value))
4070 const int id = GPOINTER_TO_INT(
key);
4071 const char *modulename = (
char *)
value;
4073 entry->module = iop;
4097 module->raster_mask.sink.source = entry->module;
4098 module->raster_mask.sink.id = entry->id;
4107 g_hash_table_insert(entry->module->raster_mask.source.users, module,
4108 GINT_TO_POINTER(entry->
id));
4112 module->blend_params->raster_mask_instance = entry->module->multi_priority;
4113 module->blend_params->raster_mask_id = entry->id;
4118 module->blend_params->raster_mask_instance = 0;
4119 module->blend_params->raster_mask_id = 0;
4167 g_signal_connect(G_OBJECT(bd->
raster_combo),
"value-changed",
4174 gtk_widget_set_tooltip_text(bd->
raster_polarity, _(
"toggle polarity of raster mask"));
4202 module->blend_data = NULL;
4210 if(bm->value == mode)
4232 gtk_widget_set_tooltip_text(combo,
tooltip);
4233 for(; *list->
name; list++)
4235 GUINT_TO_POINTER(list->
value), NULL,
TRUE);
4243 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, tab);
4244 gtk_container_child_set(GTK_CONTAINER(notebook), page,
"tab-expand",
TRUE,
"tab-fill",
TRUE, NULL);
4252 GtkWidget *toggle = gtk_check_button_new_with_label(is_disable_toggle ? _(
"Disable") : _(
"Enable"));
4253 g_object_set_data(G_OBJECT(toggle),
"mask-bit", GUINT_TO_POINTER(mask_bit));
4266 const char *multi_name =
module->multi_name[0] ? module->multi_name : "0";
4267 gchar *multi_name_dup = ((g_strcmp0(multi_name,
"0") == 0) || (g_strcmp0(multi_name,
"") == 0)) ? g_strdup(
"") : g_strdup_printf(
" (%s)", multi_name);
4269 gchar *label = g_markup_printf_escaped(_(
"Enable in <b>%s%s</b>"), clean_name, multi_name_dup);
4270 if(GTK_IS_LABEL(child))
4272 gtk_label_set_markup(GTK_LABEL(child), label);
4273 gtk_label_set_line_wrap(GTK_LABEL(child),
TRUE);
4274 gtk_label_set_xalign(GTK_LABEL(child), 0.0f);
4287 gtk_container_add(GTK_CONTAINER(page), *content);
4300 gtk_container_add(GTK_CONTAINER(page), vbox);
4304 gtk_box_pack_start(GTK_BOX(header), *toggle,
FALSE,
FALSE, 0);
4305 gtk_box_pack_start(GTK_BOX(vbox), header,
FALSE,
FALSE, 0);
4308 gtk_box_pack_start(GTK_BOX(vbox), *content,
TRUE,
TRUE, 0);
4316 if(GTK_IS_TOGGLE_BUTTON(toggle))
4318 const unsigned int bit = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(toggle),
"mask-bit"));
4322 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), is_disable_toggle ? !enabled : enabled);
4327 const gboolean enabled,
GtkWidget *content)
4330 if(GTK_IS_WIDGET(toggle))
4331 gtk_widget_set_sensitive(toggle, available);
4332 if(GTK_IS_WIDGET(content))
4333 gtk_widget_set_sensitive(content, available && enabled);
4359 bd->
csp =
module->blend_params->blend_cst;
4362 bd->
csp = default_csp;
4461 dt_control_log(
"unknown blend mode '%d' in module '%s'", blend_mode, module->
op);
4462 module->blend_params->blend_mode = DEVELOP_BLEND_NORMAL2;
4469 gboolean blend_mode_reversed = (
module->blend_params->blend_mode & DEVELOP_BLEND_REVERSE) == DEVELOP_BLEND_REVERSE;
4477 module->blend_params->blend_parameter = 0.0f;
4507 uint32_t mask_mode =
module->blend_params->mask_mode;
4512 const gboolean bottom_enabled = top_enabled && ((bd->
masks_inited && masks_enabled)
4521 gtk_widget_set_sensitive(bd->
blending_box, top_enabled);
4523 gtk_widget_set_sensitive(bd->
showmask, top_enabled);
4537 gtk_widget_set_sensitive(
4558 if(module->blend_colorspace(module, NULL, NULL) ==
IOP_CS_RAW)
4560 module->request_mask_display = DT_DEV_PIXELPIPE_DISPLAY_NONE;
4563 gtk_widget_hide(GTK_WIDGET(bd->
showmask));
4579 gtk_widget_show(GTK_WIDGET(bd->
showmask));
4589 const gboolean show_details = (
module->blend_params->details != 0.0f);
4595 module->request_mask_display = DT_DEV_PIXELPIPE_DISPLAY_NONE;
4648 const int has_mask_display =
module->request_mask_display & (DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL);
4655 module->request_mask_display = DT_DEV_PIXELPIPE_DISPLAY_NONE;
4680 if (has_mask_display)
4784 module->fusion_slider = NULL;
4808 gtk_widget_set_name(display_box,
"blending-main-switch");
4817 gtk_widget_set_tooltip_text(bd->
showmask, _(
"display mask and/or color channel. ctrl+click to display mask, "
4818 "shift+click to display channel. hover over parametric mask slider to "
4819 "select channel for display"));
4822 gtk_widget_show_all(display_box);
4844 GINT_TO_POINTER(0), NULL,
TRUE);
4846 GINT_TO_POINTER(1), NULL,
TRUE);
4849 gtk_widget_set_tooltip_text(bd->
blend_modes_blend_order, _(
"choose compositing order: which layer is placed on top"));
4871 _(
"how to combine drawn and parametric masks"));
4879 gtk_widget_set_tooltip_text(bd->
masks_invert_combo, _(
"invert the resulting mask (apply mask in inverted mode)"));
4892 module->fusion_slider = bd->opacity_slider;
4893 gtk_widget_set_tooltip_text(bd->
opacity_slider, _(
"set the opacity of the blending"));
4894 g_object_set_data(G_OBJECT(bd->
opacity_slider),
"dt-blendop-header-update", GINT_TO_POINTER(
TRUE));
4903 gtk_widget_set_tooltip_text(bd->
details_slider, _(
"adjust the threshold for the details mask, "
4904 "\npositive values selects areas with strong details, "
4905 "\nnegative values select flat areas"));
4916 gtk_widget_set_tooltip_text(bd->
blur_radius_slider, _(
"radius for gaussian blur of blend mask"));
4921 _(
"choose to guide mask by input or output image and"
4922 "\nchoose to apply feathering before or after mask blur"));
4942 gtk_widget_set_tooltip_text(bd->
brightness_slider, _(
"shifts and tilts the tone curve of the blend mask to adjust its "
4943 "brightness without affecting fully transparent/fully opaque "
4945 g_object_set_data(G_OBJECT(bd->
brightness_slider),
"dt-blendop-header-update", GINT_TO_POINTER(
TRUE));
4954 gtk_widget_set_tooltip_text(bd->
contrast_slider, _(
"gives the tone curve of the blend mask an s-like shape to "
4955 "adjust its contrast"));
4956 g_object_set_data(G_OBJECT(bd->
contrast_slider),
"dt-blendop-header-update", GINT_TO_POINTER(
TRUE));
4959 GtkWidget *blend_separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
4960 gtk_widget_set_name(blend_separator,
"blending-separator");
4964 gtk_widget_set_tooltip_text(presets_button, _(
"blending options"));
4968 gtk_widget_set_sensitive(GTK_WIDGET(presets_button),
FALSE);
4973 gtk_notebook_set_action_widget(GTK_NOTEBOOK(bd->
blending_notebook), presets_button, GTK_PACK_END);
4974 gtk_widget_show(presets_button);
4999 const unsigned int mask_mode =
module->blend_params->mask_mode;
5011 const int page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(bd->
blending_notebook));
5016 page = CLAMP(page, 0, page_count - 1);
5027 module->blend_data = g_malloc0(sizeof(dt_iop_gui_blend_data_t));
5030 bd->module =
module;
5037 bd->
masks_support = !(
module->flags() & IOP_FLAGS_NO_MASKS);
uint32_t container(dt_lib_module_t *self)
void dt_bauhaus_slider_set_soft_range(GtkWidget *widget, float soft_min, float soft_max)
void dt_bauhaus_combobox_clear(GtkWidget *widget)
float dt_bauhaus_slider_get(GtkWidget *widget)
gboolean dt_bauhaus_combobox_set_from_value(GtkWidget *widget, int value)
void dt_bauhaus_widget_set_field(GtkWidget *widget, gpointer field, dt_introspection_type_t field_type)
GtkWidget * dt_bauhaus_combobox_from_conf(dt_bauhaus_t *bh, dt_gui_module_t *self, const char *confkey)
void dt_bauhaus_disable_module_list(GtkWidget *widget)
void dt_bauhaus_set_use_default_callback(GtkWidget *widget)
Tell the widget to use the globally-defined default callback in the bauhaus structure This callback n...
void dt_bauhaus_combobox_add_full(GtkWidget *widget, const char *text, dt_bauhaus_combobox_alignment_t align, gpointer data, void(free_func)(void *data), gboolean sensitive)
gpointer dt_bauhaus_combobox_get_data(GtkWidget *widget)
void dt_bauhaus_combobox_add_populate_fct(GtkWidget *widget, void(*fct)(GtkWidget *w, void *module))
void dt_bauhaus_disable_accels(GtkWidget *widget)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
void dt_bauhaus_widget_set_label(GtkWidget *widget, const char *label)
GtkWidget * dt_bauhaus_slider_new_with_range(dt_bauhaus_t *bh, dt_gui_module_t *self, float min, float max, float step, float defval, int digits)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
@ DT_BAUHAUS_COMBOBOX_ALIGN_RIGHT
dt_develop_blend_colorspace_t dt_develop_blend_default_module_blend_colorspace(dt_iop_module_t *module)
void dt_develop_blend_init_blendif_parameters(dt_develop_blend_params_t *blend_params, dt_develop_blend_colorspace_t cst)
gboolean blend_color_picker_apply(dt_iop_module_t *module, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
@ DEVELOP_MASK_GUIDE_OUT_BEFORE_BLUR
@ DEVELOP_MASK_GUIDE_IN_AFTER_BLUR
@ DEVELOP_MASK_GUIDE_OUT_AFTER_BLUR
@ DEVELOP_MASK_GUIDE_IN_BEFORE_BLUR
dt_develop_blend_colorspace_t
@ DEVELOP_BLEND_CS_RGB_SCENE
@ DEVELOP_BLEND_CS_RGB_DISPLAY
@ DEVELOP_COMBINE_MASKS_POS
@ DEVELOP_COMBINE_NORM_INCL
@ DEVELOP_COMBINE_INV_INCL
@ DEVELOP_COMBINE_INV_EXCL
@ DEVELOP_COMBINE_NORM_EXCL
dt_develop_blendif_channels_t
@ DEVELOP_BLENDIF_GRAY_out
@ DEVELOP_BLENDIF_GREEN_in
@ DEVELOP_BLENDIF_RED_out
@ DEVELOP_BLENDIF_Lab_MASK
@ DEVELOP_BLENDIF_OUTPUT_MASK
@ DEVELOP_BLENDIF_BLUE_in
@ DEVELOP_BLENDIF_BLUE_out
@ DEVELOP_BLENDIF_RGB_MASK
@ DEVELOP_BLENDIF_GRAY_in
@ DEVELOP_BLENDIF_GREEN_out
@ DEVELOP_BLEND_CHROMATICITY
@ DEVELOP_BLEND_DIFFERENCE
@ DEVELOP_BLEND_LIGHTNESS
@ DEVELOP_BLEND_MODE_MASK
@ DEVELOP_BLEND_DIVIDE_INVERSE
@ DEVELOP_BLEND_HARDLIGHT
@ DEVELOP_BLEND_LAB_COLOR
@ DEVELOP_BLEND_HSV_COLOR
@ DEVELOP_BLEND_HARMONIC_MEAN
@ DEVELOP_BLEND_HSV_VALUE
@ DEVELOP_BLEND_LINEARLIGHT
@ DEVELOP_BLEND_VIVIDLIGHT
@ DEVELOP_BLEND_GEOMETRIC_MEAN
@ DEVELOP_BLEND_SOFTLIGHT
@ DEVELOP_BLEND_COLORADJUST
@ DEVELOP_BLEND_LAB_LIGHTNESS
@ DEVELOP_BLEND_DIFFERENCE2
@ DEVELOP_BLEND_SUBTRACT_INVERSE
@ DEVELOP_MASK_PARAMETRIC
static int _blendop_blendif_disp_alternative_worker(GtkWidget *widget, dt_iop_module_t *module, int mode, float(*scale_callback)(GtkWidget *, float, int), const char *label)
static void _blendop_blendif_update_tab(dt_iop_module_t *module, const int tab)
static void _blendop_masks_group_selection_changed(GtkTreeSelection *selection, dt_iop_module_t *module)
const dt_iop_gui_blendif_colorstop_t _gradient_HSL_hue[]
const dt_iop_gui_blendif_colorstop_t _gradient_JzCzhz_hue[]
static gboolean _blendop_masks_is_group_with_shapes(const dt_masks_form_t *mask_form)
static const GdkPixbuf * _blendop_masks_get_inverse_icon(const dt_iop_gui_blend_data_t *bd, const int state)
static void _blendop_masks_mode_changed(GtkToggleButton *togglebutton, dt_iop_module_t *module)
const dt_iop_gui_blendif_colorstop_t _gradient_blue[]
void dt_iop_gui_init_masks(GtkBox *blendw, dt_iop_module_t *module)
static void _blendop_masks_all_selection_changed(GtkTreeSelection *selection, dt_iop_module_t *module)
static void _blendif_scale_print_default(float value, float boost_factor, char *string, int n)
void dt_iop_gui_init_blending(dt_iop_module_t *module)
static void _blendif_hide_output_channels(GtkMenuItem *menuitem, dt_iop_module_t *module)
static gboolean _blendop_masks_confirm_delete(const char *form_name)
static GtkWidget * _blendop_masks_group_ctx_menu(dt_iop_gui_blend_data_t *bd, dt_iop_module_t *module, const int formid, const int parentid, const int state, const int index, const int list_length)
static int _blendif_print_digits_picker(float value)
static gboolean _blendop_masks_group_handle_action_click(GtkWidget *treeview, GtkTreePath *path, GtkTreeViewColumn *column, dt_iop_module_t *module)
#define BLEND_MASKMODE_CONF_KEY
void dt_iop_gui_init_raster(GtkBox *blendw, dt_iop_module_t *module)
static void _blendif_cook(dt_iop_colorspace_type_t cst, const float *in, float *out, const dt_iop_order_iccprofile_info_t *const work_profile)
static GtkWidget * _blendop_create_enable_toggle(dt_iop_module_t *module, const unsigned int mask_bit)
static void _blendif_select_colorspace(GtkMenuItem *menuitem, dt_iop_module_t *module)
static void _blendop_masks_group_name_commit(dt_iop_module_t *module, const gchar *new_text)
static void _blendop_masks_all_rename_callback(GtkWidget *menu_item, dt_iop_module_t *module)
static gboolean _blendif_clean_output_channels(dt_iop_module_t *module)
static gboolean _blendop_blendif_invert(GtkButton *button, GdkEventButton *event, dt_iop_module_t *module)
const dt_develop_name_value_t dt_develop_invert_mask_names[]
const dt_develop_name_value_t dt_develop_mask_mode_names[]
static void _blendop_masks_handler_callback(gpointer instance, const int formid, const int parentid, const dt_masks_event_t event, dt_iop_module_t *module)
static dt_masks_form_group_t * _blendop_masks_find_group_entry(dt_masks_form_t *group_form, const int formid, int *index)
static int _blendop_masks_group_tree_append(const dt_iop_gui_blend_data_t *bd, GtkTreeStore *tree_store, GtkTreeIter *parent_iter, const dt_masks_form_t *parent_group)
static void _blendif_options_callback(GtkButton *button, GdkEventButton *event, dt_iop_module_t *module)
static void _blendif_show_output_channels(GtkMenuItem *menuitem, dt_iop_module_t *module)
_blendop_masks_all_cols_t
@ BLENDOP_MASKS_ALL_COL_STATUS_MARKUP
@ BLENDOP_MASKS_ALL_COL_MARKUP
@ BLENDOP_MASKS_ALL_COL_SENSITIVE
@ BLENDOP_MASKS_ALL_COL_NAME
@ BLENDOP_MASKS_ALL_COL_COUNT
@ BLENDOP_MASKS_ALL_COL_FORMID
@ BLENDOP_MASKS_ALL_COL_ACTIVE
static gboolean _blendop_masks_group_move_by_index(dt_masks_form_t *group_form, const int index, const gboolean move_up)
void dt_iop_gui_init_blendif(GtkBox *blendw, dt_iop_module_t *module, GtkWidget *blendif_header)
static void _blendop_sync_toggle_state(GtkWidget *toggle, const gboolean available, const gboolean enabled, GtkWidget *content)
static void _blendop_blendif_channel_display_toggled(GtkToggleButton *button, dt_iop_module_t *module)
Persistently display the current parametric input or output channel.
static gboolean _blendop_blendif_enter(GtkWidget *widget, GdkEventCrossing *event, dt_iop_module_t *module)
static void _blendop_masks_mode_callback(const unsigned int mask_mode, dt_iop_gui_blend_data_t *data)
static GtkWidget * _combobox_new_from_list(dt_iop_module_t *module, const gchar *label, const dt_develop_name_value_t *list, uint32_t *field, const gchar *tooltip)
static gboolean _blendop_masks_group_button_pressed(GtkWidget *treeview, GdkEventButton *event, dt_iop_module_t *module)
static GtkWidget * _blendop_create_toggle_page(GtkWidget *notebook, const gchar *label, gchar *help_url, dt_iop_module_t *module, const unsigned int mask_bit, GtkWidget **toggle, GtkWidget **content)
void dt_iop_gui_init_blending_body(GtkWidget *container, dt_iop_module_t *module)
static void _blendop_masks_init_icons(dt_iop_gui_blend_data_t *bd)
static GtkWidget * _blendop_create_notebook_page(GtkWidget *notebook, const gchar *label, gchar *help_url, GtkWidget **content)
static void _blendop_blendif_details_callback(GtkWidget *slider, dt_iop_gui_blend_data_t *data)
static int _blendop_masks_group_tree_append_entry(const dt_iop_gui_blend_data_t *bd, GtkTreeStore *tree_store, GtkTreeIter *parent_iter, const dt_masks_form_group_t *group_entry, const dt_masks_form_t *mask_form, const int index)
static void _blendif_scale(dt_iop_gui_blend_data_t *data, dt_iop_colorspace_type_t cst, const float *in, float *out, const dt_iop_order_iccprofile_info_t *work_profile, int in_out)
static void _blendop_blendif_channel_mask_view_toggle(GtkWidget *widget, dt_iop_module_t *module, dt_dev_pixelpipe_display_mask_t mode)
static void _blendop_masks_combine_callback(GtkWidget *combo, dt_iop_gui_blend_data_t *data)
static gboolean _blendop_masks_show_and_edit(GtkWidget *widget, GdkEventButton *event, dt_iop_module_t *self)
const dt_iop_gui_blendif_colorstop_t _gradient_green[]
static void _raster_polarity_callback(GtkToggleButton *togglebutton, dt_iop_module_t *self)
const char * slider_tooltip[]
static void _blendop_blendif_log_scale_toggled(GtkToggleButton *button, dt_iop_module_t *module)
Toggle the alternative scale of one parametric-mask slider.
static void _blendop_blendif_sync_channel_display_buttons(dt_iop_module_t *module)
Synchronize input/output channel toggles from the active preview request.
static gboolean _blendop_blendif_leave_delayed(gpointer data)
#define COLORSTOPS(gradient)
static gboolean _blendop_blendif_leave(GtkWidget *widget, GdkEventCrossing *event, dt_iop_module_t *module)
const dt_iop_gui_blendif_channel_t rgb_channels[]
static gboolean _blendop_masks_all_button_pressed(GtkWidget *treeview, GdkEventButton *event, dt_iop_module_t *module)
static gboolean _blendop_masks_group_query_tooltip(GtkWidget *treeview, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, dt_iop_module_t *module)
static void _blendop_compositing_changed(GtkWidget *combobox, dt_iop_gui_blend_data_t *data)
static gboolean _blendif_are_output_channels_used(const dt_develop_blend_params_t *const blend, const dt_develop_blend_colorspace_t cst)
static void _blendop_masks_group_name_activate(GtkEntry *entry, dt_iop_module_t *module)
const dt_iop_gui_blendif_colorstop_t _gradient_b[]
static gboolean _blendop_masks_find_iter_by_formid(GtkTreeModel *model, GtkTreeIter *iter, const int formid_col, const int formid)
static void _blendop_masks_group_operation_callback(GtkWidget *menu_item, gpointer user_data)
static gboolean _blendop_blendif_key_press(GtkWidget *widget, GdkEventKey *event, dt_iop_module_t *module)
static void _blendop_blendif_sliders_reset_callback(GtkDarktableGradientSlider *slider, dt_iop_gui_blend_data_t *data)
static void _blendop_masks_invert_toggled(GtkToggleButton *togglebutton, dt_iop_gui_blend_data_t *data)
_blendop_masks_group_cols_t
@ BLENDOP_MASKS_GROUP_COL_INDEX
@ BLENDOP_MASKS_GROUP_COL_OP_ICON
@ BLENDOP_MASKS_GROUP_COL_STATE
@ BLENDOP_MASKS_GROUP_COL_COUNT
@ BLENDOP_MASKS_GROUP_COL_FORMID
@ BLENDOP_MASKS_GROUP_COL_NAME
@ BLENDOP_MASKS_GROUP_COL_INV_ICON
@ BLENDOP_MASKS_GROUP_COL_PARENTID
static void _raster_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module)
static void _blendop_masks_all_toggled(GtkCellRendererToggle *cell, gchar *path_string, dt_iop_module_t *module)
static void _blendop_blendif_polarity_callback(GtkToggleButton *togglebutton, dt_iop_gui_blend_data_t *data)
static void _blendif_scale_print_hue(float value, float boost_factor, char *string, int n)
static gboolean _blendop_masks_shape_can_start(GtkWidget *button, dt_iop_module_t *module, dt_masks_type_t type, gpointer user_data)
static gboolean _blendif_blend_parameter_enabled(dt_develop_blend_colorspace_t csp, dt_develop_blend_mode_t mode)
static gboolean _blendop_masks_polarity_callback(GtkToggleButton *togglebutton, GdkEventButton *event, dt_iop_module_t *self)
static gboolean _blendop_masks_all_handle_left_click(GtkWidget *treeview, GtkTreePath *path, GtkTreeViewColumn *column, dt_iop_module_t *module)
static void _blendop_blendif_tab_switch(GtkNotebook *notebook, GtkWidget *page, guint page_num, dt_iop_gui_blend_data_t *data)
static GtkWidget * _blendop_masks_create_shape_buttons(dt_iop_module_t *module, dt_iop_gui_blend_data_t *bd)
const dt_iop_gui_blendif_channel_t Lab_channels[]
static float magnifier_scale_callback(GtkWidget *self, float inval, int dir)
static void _blendop_masks_all_name_edited(GtkCellRendererText *cell, gchar *path_string, gchar *new_text, dt_iop_module_t *module)
void dt_iop_gui_update_blending(dt_iop_module_t *module)
const dt_iop_gui_blendif_colorstop_t _gradient_chroma[]
static void _blendop_blend_mode_callback(GtkWidget *combo, dt_iop_gui_blend_data_t *data)
static float log10_scale_callback(GtkWidget *self, float inval, int dir)
const dt_develop_name_value_t dt_develop_blend_colorspace_names[]
static dt_iop_colorspace_type_t _blendop_blendif_get_picker_colorspace(dt_iop_gui_blend_data_t *bd)
static int _blendif_print_digits_default(float value)
static void _blendop_masks_apply_and_commit(dt_iop_module_t *module)
static int _blendif_print_digits_ab(float value)
static void _update_gradient_slider_pickers(GtkWidget *callback_dummy, dt_iop_module_t *module)
const dt_iop_gui_blendif_channel_t rgbj_channels[]
static gboolean _add_blendmode_combo(GtkWidget *combobox, dt_develop_blend_mode_t mode)
void dt_iop_gui_blending_lose_focus(dt_iop_module_t *module)
static void _blendop_masks_check_id(dt_masks_form_t *mask_form)
static void _blendop_masks_all_duplicate_callback(GtkWidget *menu_item, dt_iop_module_t *module)
static gboolean _blendif_change_blend_colorspace(dt_iop_module_t *module, dt_develop_blend_colorspace_t cst)
const dt_iop_gui_blendif_colorstop_t _gradient_L[]
const dt_iop_gui_blendif_colorstop_t _gradient_LCh_hue[]
static dt_masks_form_t * _blendop_masks_group_create(dt_iop_module_t *module)
static int _blendop_blendif_disp_alternative_log(GtkWidget *widget, dt_iop_module_t *module, int mode)
static int _blendop_blendif_disp_alternative_mag(GtkWidget *widget, dt_iop_module_t *module, int mode)
static gboolean _blendop_masks_is_single_group_wrapper(const dt_masks_form_t *mask_form)
void dt_masks_iop_update(dt_iop_module_t *module)
static float _get_boost_factor(const dt_iop_gui_blend_data_t *data, const int channel, const int in_out)
const dt_develop_name_value_t dt_develop_blend_mode_flag_names[]
static void _blendop_masks_all_delete_callback(GtkWidget *menu_item, dt_iop_module_t *module)
static const GdkPixbuf * _blendop_masks_get_op_icon(const dt_iop_gui_blend_data_t *bd, const int state, const int index)
static gboolean _blendop_blendif_showmask_clicked(GtkToggleButton *button, GdkEventButton *event, dt_iop_module_t *module)
static void _blendop_masks_edit_list_toggle(GtkToggleButton *togglebutton, dt_iop_module_t *module)
static void _blendop_masks_group_update_row(dt_iop_module_t *module, const int formid, const int parentid)
static void _blendop_blendif_channel_mask_view(GtkWidget *widget, dt_iop_module_t *module, dt_dev_pixelpipe_display_mask_t mode)
static void _raster_combo_populate(GtkWidget *w, void *m)
void dt_iop_gui_cleanup_blending_body(dt_iop_module_t *module)
const dt_develop_name_value_t dt_develop_combine_masks_names[]
const dt_develop_name_value_t dt_develop_blend_mode_names[]
static void _blendop_blendif_disp_alternative_reset(GtkWidget *widget, dt_iop_module_t *module)
static void _blendop_update_top_enable_label(dt_iop_module_t *module)
void dt_iop_gui_update_raster(dt_iop_module_t *module)
static void _blendop_masks_group_delete(dt_iop_module_t *module, const int formid, const int parentid)
static void _blendop_masks_refresh_lists(dt_iop_module_t *module)
static void _notebook_append_full_width_page(GtkWidget *notebook, GtkWidget *page, const gchar *label)
void dt_iop_gui_cleanup_blending(dt_iop_module_t *module)
const dt_iop_gui_blendif_colorstop_t _gradient_gray[]
static gboolean _blendop_masks_group_name_focus_out(GtkWidget *widget, GdkEventFocus *event, dt_iop_module_t *module)
void dt_iop_gui_blending_reload_defaults(dt_iop_module_t *module)
static dt_iop_colorspace_type_t _blendif_colorpicker_cst(dt_iop_gui_blend_data_t *data)
const dt_develop_name_value_t dt_develop_feathering_guide_names[]
const dt_iop_gui_blendif_colorstop_t _gradient_red[]
void dt_iop_gui_init_contours(GtkBox *blendw, dt_iop_module_t *module)
const dt_iop_gui_blendif_colorstop_t _gradient_a[]
static void _blendop_blendif_boost_factor_callback(GtkWidget *slider, dt_iop_gui_blend_data_t *data)
static dt_masks_form_t * _blendop_masks_group_from_module(dt_iop_module_t *module)
static void _blendop_blending_notebook_switch(GtkNotebook *notebook, GtkWidget *page, guint page_num, dt_iop_gui_blend_data_t *data)
Persist the active blending notebook tab in anselrc.
static gboolean _blendop_masks_group_find_row(GtkTreeModel *model, GtkTreeIter *parent, const int formid, const int parentid, GtkTreeIter *out)
static gboolean _blendop_blendif_reset(GtkButton *button, GdkEventButton *event, dt_iop_module_t *module)
static void _blendop_blendif_sliders_callback(GtkDarktableGradientSlider *slider, dt_iop_gui_blend_data_t *data)
static void _blendif_scale_print_ab(float value, float boost_factor, char *string, int n)
static void _blendop_masks_group_move_callback(GtkWidget *menu_item, dt_iop_module_t *module)
static void _blendop_toggle_button_set_active(GtkWidget *toggle, const gboolean enabled)
static void _blendop_masks_group_unlink(dt_iop_module_t *module, const int formid, const int parentid)
void dt_iop_gui_update_blendif(dt_iop_module_t *module)
void dt_iop_color_picker_reset(dt_iop_module_t *module, gboolean keep)
void dt_iop_color_picker_set_cst(dt_iop_module_t *module, const dt_iop_colorspace_type_t picker_cst)
GtkWidget * dt_color_picker_new(dt_iop_module_t *module, dt_iop_color_picker_kind_t kind, GtkWidget *w)
dt_iop_colorspace_type_t dt_iop_color_picker_get_active_cst(dt_iop_module_t *module)
@ DT_COLOR_PICKER_POINT_AREA
@ DT_LIB_COLORPICKER_SIZE_BOX
const dt_colormatrix_t dt_aligned_pixel_t out
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
void dt_control_log(const char *msg,...)
void dt_control_queue_redraw_center()
request redraw of center window. This redraws the center view within a gdk critical section to preven...
void dt_control_queue_redraw_widget(GtkWidget *widget)
threadsafe request of redraw of specific widget. Use this function if you need to redraw a specific w...
void dt_control_hinter_message(const struct dt_control_t *s, const char *message)
uint32_t view(const dt_view_t *self)
static gchar * delete_underscore(const char *s)
static const dt_aligned_pixel_simd_t value
static gboolean dt_modifier_is(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_dev_add_history_item(dev, module, enable, redraw)
#define dt_dev_pixelpipe_update_history_main(dev)
#define dt_dev_pixelpipe_update_zoom_main(dev)
#define dt_dev_pixelpipe_update_history_all(dev)
void dt_dev_masks_selection_change(dt_develop_t *dev, struct dt_iop_module_t *module, const int selectid, const int throw_event)
gchar * dt_dev_get_masks_group_name(const struct dt_iop_module_t *module)
gchar * dt_history_item_get_name(const struct dt_iop_module_t *module)
dt_dev_pixelpipe_display_mask_t
@ DT_DEV_PIXELPIPE_DISPLAY_a
@ DT_DEV_PIXELPIPE_DISPLAY_OUTPUT
@ DT_DEV_PIXELPIPE_DISPLAY_G
@ DT_DEV_PIXELPIPE_DISPLAY_L
@ DT_DEV_PIXELPIPE_DISPLAY_CHANNEL
@ DT_DEV_PIXELPIPE_DISPLAY_LCH_h
@ DT_DEV_PIXELPIPE_DISPLAY_JzCzhz_hz
@ DT_DEV_PIXELPIPE_DISPLAY_HSL_H
@ DT_DEV_PIXELPIPE_DISPLAY_HSL_S
@ DT_DEV_PIXELPIPE_DISPLAY_JzCzhz_Cz
@ DT_DEV_PIXELPIPE_DISPLAY_LCH_C
@ DT_DEV_PIXELPIPE_DISPLAY_b
@ DT_DEV_PIXELPIPE_DISPLAY_STICKY
@ DT_DEV_PIXELPIPE_DISPLAY_MASK
@ DT_DEV_PIXELPIPE_DISPLAY_JzCzhz_Jz
@ DT_DEV_PIXELPIPE_DISPLAY_NONE
@ DT_DEV_PIXELPIPE_DISPLAY_HSL_l
@ DT_DEV_PIXELPIPE_DISPLAY_GRAY
@ DT_DEV_PIXELPIPE_DISPLAY_B
@ DT_DEV_PIXELPIPE_DISPLAY_R
static GdkPixbuf * dt_draw_get_pixbuf_from_cairo(DTGTKCairoPaintIconFunc paint, const int width, const int height)
void dtgtk_cairo_paint_masks_inverse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_difference(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_presets(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_showmask(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_union(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_colorpicker(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_exclusion(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_eye_toggle(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_reset(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_intersection(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_invert(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_edit(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dtgtk_gradient_slider_multivalue_set_resetvalue(GtkDarktableGradientSlider *gslider, gdouble value, gint pos)
void dtgtk_gradient_slider_multivalue_set_value(GtkDarktableGradientSlider *gslider, gdouble value, gint pos)
void dtgtk_gradient_slider_multivalue_set_increment(GtkDarktableGradientSlider *gslider, gdouble value)
void dtgtk_gradient_slider_multivalue_set_picker(GtkDarktableGradientSlider *gslider, gdouble value)
gdouble dtgtk_gradient_slider_multivalue_get_value(GtkDarktableGradientSlider *gslider, gint pos)
void dtgtk_gradient_slider_multivalue_set_picker_meanminmax(GtkDarktableGradientSlider *gslider, gdouble mean, gdouble min, gdouble max)
void dtgtk_gradient_slider_multivalue_clear_stops(GtkDarktableGradientSlider *gslider)
void dtgtk_gradient_slider_multivalue_set_scale_callback(GtkDarktableGradientSlider *gslider, float(*callback)(GtkWidget *self, float value, int dir))
void dtgtk_gradient_slider_multivalue_set_stop(GtkDarktableGradientSlider *gslider, gfloat position, GdkRGBA color)
void dtgtk_gradient_slider_multivalue_set_marker(GtkDarktableGradientSlider *gslider, gint mark, gint pos)
GtkWidget * dtgtk_gradient_slider_multivalue_new_with_name(gint positions, gchar *name)
#define DTGTK_GRADIENT_SLIDER_MULTIVALUE(obj)
@ GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG
@ GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG
@ GRADIENT_SLIDER_MARKER_UPPER_OPEN_BIG
@ GRADIENT_SLIDER_MARKER_LOWER_FILLED_BIG
void dt_gui_menu_popup(GtkMenu *menu, GtkWidget *button, GdkGravity widget_anchor, GdkGravity menu_anchor)
void dt_gui_new_collapsible_section(dt_gui_collapsible_section_t *cs, const char *confname, const char *label, GtkBox *parent, GtkPackType pack)
Create a collapsible section and pack it into the parent box.
GtkWidget * dt_ui_notebook_page(GtkNotebook *notebook, const char *text, const char *tooltip)
void dt_gui_update_collapsible_section(dt_gui_collapsible_section_t *cs)
GdkModifierType dt_key_modifier_state()
void dt_gui_container_destroy_children(GtkContainer *container)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
GtkWidget * dt_ui_scroll_wrap(GtkWidget *w, gint min_size, char *config_str, dt_ui_resize_mode_t mode)
Wrap a scrollable content widget in a recessed, vertically resizable scrolled window.
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
static GtkWidget * dt_ui_label_new(const gchar *str)
void dt_iop_add_remove_mask_indicator(dt_iop_module_t *module)
void dt_iop_gui_update(dt_iop_module_t *module)
void dt_iop_gui_update_header(dt_iop_module_t *module)
void dt_iop_request_focus(dt_iop_module_t *module)
void dt_iop_set_cache_bypass(dt_iop_module_t *module, gboolean state)
void dt_iop_set_mask_mode(dt_iop_module_t *module, int mask_mode)
static gboolean dt_iop_colorspace_is_rgb(const dt_iop_colorspace_type_t cst)
@ IOP_FLAGS_SUPPORTS_BLENDING
GtkWidget * dt_iop_togglebutton_new_no_register(dt_iop_module_t *self, const char *section, const gchar *label, const gchar *ctrl_label, GCallback callback, gboolean local, guint accel_key, GdkModifierType mods, DTGTKCairoPaintIconFunc paint, GtkWidget *box)
@ DT_INTROSPECTION_TYPE_ENUM
@ DT_INTROSPECTION_TYPE_FLOAT
dt_iop_order_iccprofile_info_t * dt_ioppr_get_pipe_current_profile_info(dt_iop_module_t *module, const struct dt_dev_pixelpipe_t *pipe)
dt_iop_order_iccprofile_info_t * dt_ioppr_get_iop_work_profile_info(struct dt_iop_module_t *module, GList *iop_list)
#define DEVELOP_BLENDIF_SIZE
float *const restrict const size_t k
float *const restrict const size_t const size_t ch
void apply_operation(struct dt_masks_form_group_t *pt, const dt_masks_state_t apply_state)
Apply a mask state operation on a group entry.
dt_masks_form_group_t * dt_masks_group_add_form(dt_masks_form_t *grp, dt_masks_form_t *form)
void dt_masks_change_form_gui(dt_masks_form_t *newform)
@ DT_MASKS_EDIT_RESTRICTED
@ DT_MASKS_STATE_DIFFERENCE
@ DT_MASKS_STATE_INTERSECTION
@ DT_MASKS_STATE_EXCLUSION
void dt_masks_shape_buttons_deactivate_all(GtkWidget *active_button)
GtkWidget * dt_masks_shape_buttons_create(const dt_masks_shape_buttons_config_t *config)
Build a synchronized toolbar for creating masks shapes.
int dt_masks_group_index_from_formid(const dt_masks_form_t *group_form, int formid)
int dt_masks_center_view_on_form(struct dt_develop_t *dev, const struct dt_masks_form_t *form)
dt_masks_form_t * dt_masks_create(dt_masks_type_t type)
@ DT_MASKS_SHAPE_BUTTONS_ALL
@ DT_MASKS_SHAPE_BUTTONS_POLYGON
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
void dt_masks_append_form(dt_develop_t *dev, dt_masks_form_t *form)
void dt_masks_form_delete(struct dt_iop_module_t *module, dt_masks_form_t *grp, dt_masks_form_t *form)
#define DEVELOP_MASKS_NB_SHAPES
dt_masks_form_t * dt_masks_get_visible_form(const struct dt_develop_t *dev)
void dt_masks_set_edit_mode(struct dt_iop_module_t *module, dt_masks_edit_mode_t value)
dt_masks_form_group_t * dt_masks_form_group_from_parentid(int parentid, int formid)
Return the group entry for a (parent, form) pair.
int dt_masks_form_duplicate(dt_develop_t *dev, int formid)
static float clamp_range_f(const float x, const float low, const float high)
float dt_aligned_pixel_t[4]
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_DEVELOP_MASKS_GUI_CHANGED
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
struct _GtkWidget GtkWidget
const float uint32_t state[4]
struct dt_gui_gtk_t * gui
struct dt_control_signal_t * signals
struct dt_bauhaus_t * bauhaus
struct dt_develop_t * develop
struct dt_control_t * control
dt_lib_colorpicker_size_t size
struct dt_develop_blend_params_t * blend_params
uint32_t feathering_guide
dt_dev_operation_t raster_mask_source
float blendif_parameters[4 *DEVELOP_BLENDIF_SIZE]
float blendif_boost_factors[DEVELOP_BLENDIF_SIZE]
gboolean raster_mask_invert
struct dt_masks_form_gui_t * form_gui
struct dt_dev_pixelpipe_t * pipe
GtkMenu * presets_popup_menu
GtkWidget * raster_enable
GtkWidget * blendif_enable
GtkWidget * masks_content
GtkWidget * masks_treeview
GtkWidget * channel_boost_factor_slider
GtkWidget * opacity_slider
GtkWidget * raster_polarity
GtkWidget * all_shapes_sw
GtkWidget * blur_radius_slider
GdkPixbuf * masks_ic_intersection
GtkWidget * feathering_radius_slider
GtkWidget * details_slider
dt_iop_gui_blendif_filter_t filter[2]
GtkWidget * all_shapes_buttons
GtkWidget * colorpicker_set_values
GdkPixbuf * masks_ic_union
GdkPixbuf * masks_ic_inverse
GtkWidget * masks_group_treeview
int masks_type[DEVELOP_MASKS_NB_SHAPES]
GdkPixbuf * masks_ic_difference
GtkTreeViewColumn * group_shapes_col
dt_boundingbox_t picker_set_values_box
GtkWidget * contrast_slider
GtkWidget * blend_modes_blend_order
GtkWidget * masks_combine_combo
dt_develop_blend_colorspace_t channel_tabs_csp
gboolean picker_set_values_manual_boost_lock
GtkWidget * blend_mode_parameter_slider
GtkWidget * group_shapes_label
GtkWidget * masks_feathering_guide_combo
const dt_iop_gui_blendif_channel_t * channel
GtkWidget * brightness_slider
GtkWidget * masks_shapes[DEVELOP_MASKS_NB_SHAPES]
GtkWidget * raster_content
GtkWidget * blend_modes_combo
GtkWidget * contours_content
dt_develop_blend_colorspace_t csp
dt_iop_module_t *GtkWidget * blending_box
GtkTreeViewColumn * group_delete_col
GtkWidget * group_shapes_sw
dt_gui_collapsible_section_t masks_cs
GtkWidget * blending_notebook
GtkWidget * blendif_content
GtkWidget * masks_invert_combo
gboolean output_channels_shown
GdkPixbuf * masks_ic_exclusion
GtkListStore * all_shapes_store
GtkWidget * masks_polarity
GtkTreeViewColumn * all_shapes_col
GtkTreeStore * group_shapes_store
dt_dev_pixelpipe_display_mask_t save_for_leave
GtkWidget * wire_shape_toggle
GtkNotebook * channel_tabs
gboolean picker_set_values_box_valid
dt_develop_blend_colorspace_t blend_modes_csp
GtkTreeViewColumn * group_unlink_col
gboolean boost_factor_enabled
const dt_iop_gui_blendif_colorstop_t * colorstops
void(* scale_print)(float value, float boost_factor, char *string, int n)
int(* altdisplay)(GtkWidget *, dt_iop_module_t *, int)
float boost_factor_offset
dt_develop_blendif_channels_t param_channels[2]
dt_dev_pixelpipe_display_mask_t display_channel
GtkWidget * channel_display
GtkDarktableGradientSlider * slider
GtkDarktableToggleButton * off
struct dt_develop_blend_params_t * blend_params
struct dt_iop_module_t::@31 raster_mask
struct dt_develop_t * dev
struct dt_iop_module_t::@31::@32 source
GtkWidget * mask_indicator
GModule *dt_dev_operation_t op
struct dt_iop_module_t::@31::@33 sink
struct dt_develop_blend_params_t * default_blendop_params
dt_colormatrix_t matrix_in
char * dt_get_help_url(char *name)