void dt_iop_gui_update_blendif(dt_iop_module_t *module) { dt_iop_gui_blend_data_t *data = module->blend_data; dt_develop_blend_params_t *bp = module->blend_params; dt_develop_blend_params_t *dp = module->default_blendop_params; if (!data->blendif_support) return; float *iparameters = &(bp->blendif_parameters[4*data->channel]); float *oparameters = &(bp->blendif_parameters[16+4*data->channel]); float *idefaults = &(dp->blendif_parameters[4*data->channel]); float *odefaults = &(dp->blendif_parameters[16+4*data->channel]); char text[256]; int reset = darktable.gui->reset; darktable.gui->reset = 1; for(int k=0; k < 4; k++) { dtgtk_gradient_slider_multivalue_set_value(data->lower_slider, iparameters[k], k); dtgtk_gradient_slider_multivalue_set_value(data->upper_slider, oparameters[k], k); dtgtk_gradient_slider_multivalue_set_resetvalue(data->lower_slider, idefaults[k], k); dtgtk_gradient_slider_multivalue_set_resetvalue(data->upper_slider, odefaults[k], k); } for(int k=0; k < 4 ; k++) { (data->scale_print[data->channel])(iparameters[k], text, 256); gtk_label_set_text(data->lower_label[k], text); (data->scale_print[data->channel])(oparameters[k], text, 256); gtk_label_set_text(data->upper_label[k], text); } dtgtk_gradient_slider_multivalue_set_stop(data->lower_slider, 0.0f, data->colors[data->channel][0]); dtgtk_gradient_slider_multivalue_set_stop(data->lower_slider, 0.5f, data->colors[data->channel][1]); dtgtk_gradient_slider_multivalue_set_stop(data->lower_slider, 1.0f, data->colors[data->channel][2]); dtgtk_gradient_slider_multivalue_set_stop(data->upper_slider, 0.0f, data->colors[data->channel][0]); dtgtk_gradient_slider_multivalue_set_stop(data->upper_slider, 0.5f, data->colors[data->channel][1]); dtgtk_gradient_slider_multivalue_set_stop(data->upper_slider, 1.0f, data->colors[data->channel][2]); dtgtk_gradient_slider_multivalue_set_increment(data->lower_slider, data->increments[data->channel]); dtgtk_gradient_slider_multivalue_set_increment(data->upper_slider, data->increments[data->channel]); darktable.gui->reset = reset; }
void dtgtk_gradient_slider_set_stop(GtkDarktableGradientSlider *gslider,gfloat position,GdkColor color) { dtgtk_gradient_slider_multivalue_set_stop(gslider, position, color); }
void dt_iop_gui_update_blendif(dt_iop_module_t *module) { dt_iop_gui_blend_data_t *data = module->blend_data; dt_develop_blend_params_t *bp = module->blend_params; dt_develop_blend_params_t *dp = module->default_blendop_params; if (!data || !data->blendif_support || !data->blendif_inited) return; int tab = data->tab; int in_ch = data->channels[tab][0]; int out_ch = data->channels[tab][1]; float *iparameters = &(bp->blendif_parameters[4*in_ch]); float *oparameters = &(bp->blendif_parameters[4*out_ch]); float *idefaults = &(dp->blendif_parameters[4*in_ch]); float *odefaults = &(dp->blendif_parameters[4*out_ch]); int ipolarity = !(bp->blendif & (1<<(in_ch+16))); int opolarity = !(bp->blendif & (1<<(out_ch+16))); char text[256]; int reset = darktable.gui->reset; darktable.gui->reset = 1; dt_bauhaus_combobox_set(data->blendif_enable, (module->blend_params->blendif & (1<<DEVELOP_BLENDIF_active)) ? 1 : 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->lower_polarity), ipolarity); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->upper_polarity), opolarity); dtgtk_gradient_slider_multivalue_set_marker(data->lower_slider, ipolarity ? GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG : GRADIENT_SLIDER_MARKER_UPPER_OPEN_BIG, 0); dtgtk_gradient_slider_multivalue_set_marker(data->lower_slider, ipolarity ? GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG : GRADIENT_SLIDER_MARKER_LOWER_FILLED_BIG, 1); dtgtk_gradient_slider_multivalue_set_marker(data->lower_slider, ipolarity ? GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG : GRADIENT_SLIDER_MARKER_LOWER_FILLED_BIG, 2); dtgtk_gradient_slider_multivalue_set_marker(data->lower_slider, ipolarity ? GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG : GRADIENT_SLIDER_MARKER_UPPER_OPEN_BIG, 3); dtgtk_gradient_slider_multivalue_set_marker(data->upper_slider, opolarity ? GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG : GRADIENT_SLIDER_MARKER_UPPER_OPEN_BIG, 0); dtgtk_gradient_slider_multivalue_set_marker(data->upper_slider, opolarity ? GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG : GRADIENT_SLIDER_MARKER_LOWER_FILLED_BIG, 1); dtgtk_gradient_slider_multivalue_set_marker(data->upper_slider, opolarity ? GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG : GRADIENT_SLIDER_MARKER_LOWER_FILLED_BIG, 2); dtgtk_gradient_slider_multivalue_set_marker(data->upper_slider, opolarity ? GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG : GRADIENT_SLIDER_MARKER_UPPER_OPEN_BIG, 3); for(int k=0; k < 4; k++) { dtgtk_gradient_slider_multivalue_set_value(data->lower_slider, iparameters[k], k); dtgtk_gradient_slider_multivalue_set_value(data->upper_slider, oparameters[k], k); dtgtk_gradient_slider_multivalue_set_resetvalue(data->lower_slider, idefaults[k], k); dtgtk_gradient_slider_multivalue_set_resetvalue(data->upper_slider, odefaults[k], k); } for(int k=0; k < 4 ; k++) { (data->scale_print[tab])(iparameters[k], text, 256); gtk_label_set_text(data->lower_label[k], text); (data->scale_print[tab])(oparameters[k], text, 256); gtk_label_set_text(data->upper_label[k], text); } dtgtk_gradient_slider_multivalue_clear_stops(data->lower_slider); dtgtk_gradient_slider_multivalue_clear_stops(data->upper_slider); for(int k=0; k < data->numberstops[tab]; k++) { dtgtk_gradient_slider_multivalue_set_stop(data->lower_slider, (data->colorstops[tab])[k].stoppoint, (data->colorstops[tab])[k].color); dtgtk_gradient_slider_multivalue_set_stop(data->upper_slider, (data->colorstops[tab])[k].stoppoint, (data->colorstops[tab])[k].color); } dtgtk_gradient_slider_multivalue_set_increment(data->lower_slider, data->increments[tab]); dtgtk_gradient_slider_multivalue_set_increment(data->upper_slider, data->increments[tab]); dt_bauhaus_slider_set(data->radius_slider, bp->radius); darktable.gui->reset = reset; }
void dt_iop_gui_init_blendif(GtkVBox *blendw, dt_iop_module_t *module) { dt_iop_gui_blend_data_t *bd = (dt_iop_gui_blend_data_t*)module->blend_data; /* create and add blendif support if module supports it */ if (bd->blendif_support) { int lightness=32768; char *Lab_labels[3] = { " L ", " a ", " b " }; char *Lab_tooltips[3] = { _("sliders for L channel"), _("sliders for a channel"), _("sliders for b channel") }; char *rgb_labels[4] = { _(" gray "), _(" red "), _(" green "), _(" blue ") }; char *rgb_tooltips[4] = { _("sliders for gray value"), _("sliders for red channel"), _("sliders for green channel"), _("sliders for blue channel") }; GdkColor Lab_colors[4][3] = { { /* L channel */ (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,lightness/2,lightness/2,lightness/2 }, (GdkColor){ 0,lightness,lightness,lightness } }, { /* a channel */ (GdkColor){ 0,0,0.34*lightness*2,0.27*lightness*2 }, (GdkColor){ 0,lightness,lightness,lightness }, (GdkColor){ 0,0.53*lightness*2,0.08*lightness*2,0.28*lightness*2 } }, { /* b channel */ (GdkColor){ 0,0,0.27*lightness*2,0.58*lightness*2 }, (GdkColor){ 0,lightness,lightness,lightness }, (GdkColor){ 0,0.81*lightness*2,0.66*lightness*2,0 } }, { /* not used */ (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,0,0,0 } } }; GdkColor rgb_colors[4][3] = { { /* gray channel */ (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,lightness/2,lightness/2,lightness/2 }, (GdkColor){ 0,lightness,lightness,lightness } }, { /* red channel */ (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,lightness/2,0,0 }, (GdkColor){ 0,lightness,0,0 } }, { /* green channel */ (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,0,lightness/2,0 }, (GdkColor){ 0,0,lightness,0 } }, { /* blue channel */ (GdkColor){ 0,0,0,0 }, (GdkColor){ 0,0,0,lightness/2 }, (GdkColor){ 0,0,0,lightness } } }; char *ttinput = _("adjustment based on input received by this module:\n* range between inner markers (upper filled triangles): blend fully\n* range outside of outer markers (lower open triangles): do not blend at all\n* range between adjacent inner/outer markers: blend gradually"); char *ttoutput = _("adjustment based on unblended output of this module:\n* range between inner markers (upper filled triangles): blend fully\n* range outside of outer markers (lower open triangles): do not blend at all\n* range between adjacent inner/outer markers: blend gradually"); bd->channel = 0; int maxchannels = 0; char **labels = NULL; char **tooltips = NULL; switch(bd->csp) { case iop_cs_Lab: maxchannels = 3; labels = Lab_labels; tooltips = Lab_tooltips; memcpy(bd->colors, Lab_colors, sizeof(rgb_colors)); bd->scale_print[0] = _blendif_scale_print_L; bd->scale_print[1] = _blendif_scale_print_ab; bd->scale_print[2] = _blendif_scale_print_ab; bd->scale_print[3] = NULL; bd->increments[0] = 1.0f/100.0f; bd->increments[1] = 1.0f/256.0f; bd->increments[2] = 1.0f/256.0f; bd->increments[3] = 1.0f; break; case iop_cs_rgb: maxchannels = 4; labels = rgb_labels; tooltips = rgb_tooltips; memcpy(bd->colors, rgb_colors, sizeof(rgb_colors)); bd->scale_print[0] = _blendif_scale_print_rgb; bd->scale_print[1] = _blendif_scale_print_rgb; bd->scale_print[2] = _blendif_scale_print_rgb; bd->scale_print[3] = _blendif_scale_print_rgb; bd->increments[0] = 1.0f/255.0f; bd->increments[1] = 1.0f/255.0f; bd->increments[2] = 1.0f/255.0f; bd->increments[3] = 1.0f/255.0f; break; default: assert(FALSE); // blendif not supported for RAW, which is already catched upstream; we should not get here } bd->blendif_box = GTK_VBOX(gtk_vbox_new(FALSE,DT_GUI_IOP_MODULE_CONTROL_SPACING)); GtkWidget *uplabel = gtk_hbox_new(FALSE,0); GtkWidget *lowlabel = gtk_hbox_new(FALSE,0); GtkWidget *notebook = gtk_hbox_new(FALSE,0); bd->blendif_enable = dt_bauhaus_combobox_new(module); dt_bauhaus_widget_set_label(bd->blendif_enable, _("blend")); dt_bauhaus_combobox_add(bd->blendif_enable, _("uniformly")); dt_bauhaus_combobox_add(bd->blendif_enable, _("only, if..")); bd->channel_tabs = GTK_NOTEBOOK(gtk_notebook_new()); for(int ch=0; ch<maxchannels; ch++) { gtk_notebook_append_page(GTK_NOTEBOOK(bd->channel_tabs), GTK_WIDGET(gtk_hbox_new(FALSE,0)), gtk_label_new(labels[ch])); g_object_set(G_OBJECT(gtk_notebook_get_tab_label(bd->channel_tabs, gtk_notebook_get_nth_page(bd->channel_tabs, -1))), "tooltip-text", tooltips[ch], NULL); } gtk_widget_show_all(GTK_WIDGET(gtk_notebook_get_nth_page(bd->channel_tabs, bd->channel))); gtk_notebook_set_current_page(GTK_NOTEBOOK(bd->channel_tabs), bd->channel); g_object_set(G_OBJECT(bd->channel_tabs), "homogeneous", TRUE, (char *)NULL); GtkWidget *tb = dtgtk_togglebutton_new(dtgtk_cairo_paint_colorpicker, CPF_STYLE_FLAT); g_object_set(G_OBJECT(tb), "tooltip-text", _("pick gui color from image"), (char *)NULL); GtkWidget *sm = dtgtk_togglebutton_new(dtgtk_cairo_paint_showmask, CPF_STYLE_FLAT); g_object_set(G_OBJECT(sm), "tooltip-text", _("display mask"), (char *)NULL); gtk_box_pack_start(GTK_BOX(notebook), GTK_WIDGET(bd->channel_tabs), FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(notebook), GTK_WIDGET(tb), FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(notebook), GTK_WIDGET(sm), FALSE, FALSE, 0); bd->lower_slider = DTGTK_GRADIENT_SLIDER_MULTIVALUE(dtgtk_gradient_slider_multivalue_new(4)); bd->upper_slider = DTGTK_GRADIENT_SLIDER_MULTIVALUE(dtgtk_gradient_slider_multivalue_new(4)); dtgtk_gradient_slider_multivalue_set_marker(bd->lower_slider, GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG, 0); dtgtk_gradient_slider_multivalue_set_marker(bd->lower_slider, GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG, 1); dtgtk_gradient_slider_multivalue_set_marker(bd->lower_slider, GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG, 2); dtgtk_gradient_slider_multivalue_set_marker(bd->lower_slider, GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG, 3); dtgtk_gradient_slider_multivalue_set_marker(bd->upper_slider, GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG, 0); dtgtk_gradient_slider_multivalue_set_marker(bd->upper_slider, GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG, 1); dtgtk_gradient_slider_multivalue_set_marker(bd->upper_slider, GRADIENT_SLIDER_MARKER_UPPER_FILLED_BIG, 2); dtgtk_gradient_slider_multivalue_set_marker(bd->upper_slider, GRADIENT_SLIDER_MARKER_LOWER_OPEN_BIG, 3); dtgtk_gradient_slider_multivalue_set_stop(bd->lower_slider, 0.0f, bd->colors[bd->channel][0]); dtgtk_gradient_slider_multivalue_set_stop(bd->lower_slider, 0.5f, bd->colors[bd->channel][1]); dtgtk_gradient_slider_multivalue_set_stop(bd->lower_slider, 1.0f, bd->colors[bd->channel][2]); dtgtk_gradient_slider_multivalue_set_stop(bd->upper_slider, 0.0f, bd->colors[bd->channel][0]); dtgtk_gradient_slider_multivalue_set_stop(bd->upper_slider, 0.5f, bd->colors[bd->channel][1]); dtgtk_gradient_slider_multivalue_set_stop(bd->upper_slider, 1.0f, bd->colors[bd->channel][2]); GtkWidget *output = gtk_label_new(_("output")); bd->upper_picker_label = GTK_LABEL(gtk_label_new("")); gtk_box_pack_start(GTK_BOX(uplabel), GTK_WIDGET(output), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(uplabel), GTK_WIDGET(bd->upper_picker_label), TRUE, TRUE, 0); for(int k=0; k < 4 ; k++) { bd->upper_label[k] = GTK_LABEL(gtk_label_new(NULL)); gtk_label_set_width_chars(bd->upper_label[k], 6); gtk_box_pack_start(GTK_BOX(uplabel), GTK_WIDGET(bd->upper_label[k]), FALSE, FALSE, 0); } GtkWidget *input = gtk_label_new(_("input")); bd->lower_picker_label = GTK_LABEL(gtk_label_new("")); gtk_box_pack_start(GTK_BOX(lowlabel), GTK_WIDGET(input), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(lowlabel), GTK_WIDGET(bd->lower_picker_label), TRUE, TRUE, 0); for(int k=0; k < 4 ; k++) { bd->lower_label[k] = GTK_LABEL(gtk_label_new(NULL)); gtk_label_set_width_chars(bd->lower_label[k], 6); gtk_box_pack_start(GTK_BOX(lowlabel), GTK_WIDGET(bd->lower_label[k]), FALSE, FALSE, 0); } gtk_object_set(GTK_OBJECT(bd->blendif_enable), "tooltip-text", _("enable conditional blending"), (char *)NULL); gtk_object_set(GTK_OBJECT(bd->lower_slider), "tooltip-text", _("double click to reset"), (char *)NULL); gtk_object_set(GTK_OBJECT(bd->upper_slider), "tooltip-text", _("double click to reset"), (char *)NULL); gtk_object_set(GTK_OBJECT(output), "tooltip-text", ttoutput, (char *)NULL); gtk_object_set(GTK_OBJECT(input), "tooltip-text", ttinput, (char *)NULL); g_signal_connect (G_OBJECT (bd->lower_slider), "expose-event", G_CALLBACK (_blendop_blendif_expose), module); g_signal_connect (G_OBJECT (bd->upper_slider), "expose-event", G_CALLBACK (_blendop_blendif_expose), module); g_signal_connect (G_OBJECT (bd->blendif_enable), "value-changed", G_CALLBACK (_blendop_blendif_callback), bd); g_signal_connect(G_OBJECT (bd->channel_tabs), "switch_page", G_CALLBACK (_blendop_blendif_tab_switch), bd); g_signal_connect (G_OBJECT (bd->upper_slider), "value-changed", G_CALLBACK (_blendop_blendif_upper_callback), bd); g_signal_connect (G_OBJECT (bd->lower_slider), "value-changed", G_CALLBACK (_blendop_blendif_lower_callback), bd); g_signal_connect (G_OBJECT(tb), "toggled", G_CALLBACK (_blendop_blendif_pick_toggled), module); g_signal_connect (G_OBJECT(sm), "toggled", G_CALLBACK (_blendop_blendif_showmask_toggled), module); gtk_box_pack_start(GTK_BOX(bd->blendif_box), GTK_WIDGET(notebook), TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(bd->blendif_box), GTK_WIDGET(uplabel), TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(bd->blendif_box), GTK_WIDGET(bd->upper_slider), TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(bd->blendif_box), GTK_WIDGET(lowlabel), TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(bd->blendif_box), GTK_WIDGET(bd->lower_slider), TRUE, FALSE, 0); gtk_box_pack_end(GTK_BOX(blendw), GTK_WIDGET(bd->blendif_box),TRUE,TRUE,0); gtk_box_pack_end(GTK_BOX(blendw), GTK_WIDGET(bd->blendif_enable),TRUE,TRUE,0); } }