void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_splittoning_gui_data_t)); dt_iop_splittoning_gui_data_t *g = (dt_iop_splittoning_gui_data_t *)self->gui_data; dt_iop_splittoning_params_t *p = (dt_iop_splittoning_params_t *)self->params; self->widget = GTK_WIDGET(gtk_vbox_new(FALSE, DT_BAUHAUS_SPACE)); // Shadows gui_init_tab(self, _("shadows"), &g->colorpick1, &g->gslider1, &g->gslider2); // Highlights gui_init_tab(self, _("highlights"), &g->colorpick2, &g->gslider3, &g->gslider4); // Additional parameters GtkWidget* hbox=GTK_WIDGET(gtk_hbox_new(FALSE, 0)); GtkWidget* vbox = GTK_WIDGET(gtk_vbox_new(FALSE, 0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); g->scale1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0, 100.0, 0.1, p->balance*100.0, 2, 0); dt_bauhaus_slider_set_format(g->scale1, "%.2f"); dt_bauhaus_slider_set_stop(g->scale1, 0.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_slider_set_stop(g->scale1, 1.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_widget_set_label(g->scale1, NULL, _("balance")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale1), TRUE, TRUE, 0); g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compress, 2); dt_bauhaus_slider_set_format(g->scale2, "%.2f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compress")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale2), TRUE, TRUE, 0); g_object_set(G_OBJECT(g->scale1), "tooltip-text", _("the balance of center of splittoning"), (char *)NULL); g_object_set(G_OBJECT(g->scale2), "tooltip-text", _("compress the effect on highlights/shadows and\npreserve midtones"), (char *)NULL); g_signal_connect (G_OBJECT (g->gslider1), "value-changed", G_CALLBACK (hue_callback), self); g_signal_connect (G_OBJECT (g->gslider3), "value-changed", G_CALLBACK (hue_callback), self); g_signal_connect (G_OBJECT (g->gslider2), "value-changed", G_CALLBACK (saturation_callback), self); g_signal_connect (G_OBJECT (g->gslider4), "value-changed", G_CALLBACK (saturation_callback), self); g_signal_connect (G_OBJECT (g->scale1), "value-changed", G_CALLBACK (balance_callback), self); g_signal_connect (G_OBJECT (g->scale2), "value-changed", G_CALLBACK (compress_callback), self); g_signal_connect (G_OBJECT (g->colorpick1), "clicked", G_CALLBACK (colorpick_callback), self); g_signal_connect (G_OBJECT (g->colorpick2), "clicked", G_CALLBACK (colorpick_callback), self); }
static inline void update_balance_slider_colors(GtkWidget *slider, float hue1, float hue2) { float rgb[3]; if(hue1 != -1) { hsl2rgb(rgb, hue1, 1.0, 0.5); dt_bauhaus_slider_set_stop(slider, 0.0, rgb[0], rgb[1], rgb[2]); } if(hue2 != -1) { hsl2rgb(rgb, hue2, 1.0, 0.5); dt_bauhaus_slider_set_stop(slider, 1.0, rgb[0], rgb[1], rgb[2]); } }
static inline void update_saturation_slider_end_color( GtkWidget* slider, float hue) { float rgb[3]; hsl2rgb(rgb, hue, 1.0, 0.5); dt_bauhaus_slider_set_stop(slider, 1.0, rgb[0], rgb[1], rgb[2]); }
static inline void gui_init_tab( struct dt_iop_module_t *self, const char* name, GtkDarktableButton** ppcolor, GtkWidget** pphue, GtkWidget** ppsaturation) { gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(dtgtk_label_new(name,DARKTABLE_LABEL_TAB|DARKTABLE_LABEL_ALIGN_RIGHT)), FALSE, FALSE, 5); // color button GtkDarktableButton* color; *ppcolor = color = DTGTK_BUTTON(dtgtk_button_new(dtgtk_cairo_paint_color,CPF_IGNORE_FG_STATE|CPF_STYLE_FLAT|CPF_DO_NOT_USE_BORDER)); gtk_widget_set_size_request(GTK_WIDGET(color),32,32); // hue slider GtkWidget* hue; *pphue = hue =( dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0f, 1.0f, 0.01f, 0.0f, 2, 0)); dt_bauhaus_slider_set_stop(hue, 0.0f, 1.0f, 0.0f, 0.0f); dt_bauhaus_widget_set_label(hue, NULL, _("hue")); dt_bauhaus_slider_set_stop(hue, 0.166f, 1.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(hue, 0.322f, 0.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(hue, 0.498f, 0.0f, 1.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 0.664f, 0.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 0.830f, 1.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 1.0f, 1.0f, 0.0f, 0.0f); g_object_set(G_OBJECT(hue), "tooltip-text", _("select the hue tone"), (char *)NULL); // saturation slider GtkWidget* saturation; *ppsaturation = saturation = dt_bauhaus_slider_new_with_range(self, 0.0f, 1.0f, 0.01f, 0.0f, 2); dt_bauhaus_widget_set_label(saturation, NULL, _("saturation")); dt_bauhaus_slider_set_stop(saturation, 0.0f, 0.2f, 0.2f, 0.2f); dt_bauhaus_slider_set_stop(saturation, 1.0f, 1.0f, 1.0f, 1.0f); g_object_set(G_OBJECT(saturation), "tooltip-text", _("select the saturation tone"), (char *)NULL); // pack the widgets GtkWidget* vbox = gtk_vbox_new(FALSE, DT_BAUHAUS_SPACE); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hue), FALSE, TRUE, 0); gtk_box_pack_end(GTK_BOX(vbox), GTK_WIDGET(saturation), FALSE, TRUE, 0); GtkWidget* hbox = GTK_WIDGET(gtk_hbox_new(FALSE, 0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(hbox), GTK_WIDGET(color),FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); }
static inline void gui_init_tab(struct dt_iop_module_t *self, const char *name, GtkWidget **ppcolor, const GdkRGBA *c, GtkWidget **pphue, GtkWidget **ppsaturation) { gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(name), FALSE, FALSE, 5); // color button GtkWidget *color; *ppcolor = color = gtk_color_button_new_with_rgba(c); gtk_widget_set_size_request(GTK_WIDGET(color), DT_PIXEL_APPLY_DPI(32), DT_PIXEL_APPLY_DPI(32)); gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(color), FALSE); gtk_color_button_set_title(GTK_COLOR_BUTTON(color), _("select tone color")); // hue slider GtkWidget *hue; *pphue = hue = (dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0f, 1.0f, 0.01f, 0.0f, 2, 0)); dt_bauhaus_slider_set_stop(hue, 0.0f, 1.0f, 0.0f, 0.0f); dt_bauhaus_widget_set_label(hue, NULL, _("hue")); dt_bauhaus_slider_set_stop(hue, 0.166f, 1.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(hue, 0.322f, 0.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(hue, 0.498f, 0.0f, 1.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 0.664f, 0.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 0.830f, 1.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 1.0f, 1.0f, 0.0f, 0.0f); g_object_set(G_OBJECT(hue), "tooltip-text", _("select the hue tone"), (char *)NULL); // saturation slider GtkWidget *saturation; *ppsaturation = saturation = dt_bauhaus_slider_new_with_range(self, 0.0f, 1.0f, 0.01f, 0.0f, 2); dt_bauhaus_widget_set_label(saturation, NULL, _("saturation")); dt_bauhaus_slider_set_stop(saturation, 0.0f, 0.2f, 0.2f, 0.2f); dt_bauhaus_slider_set_stop(saturation, 1.0f, 1.0f, 1.0f, 1.0f); g_object_set(G_OBJECT(saturation), "tooltip-text", _("select the saturation tone"), (char *)NULL); // pack the widgets GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hue), FALSE, TRUE, 0); gtk_box_pack_end(GTK_BOX(vbox), GTK_WIDGET(saturation), FALSE, TRUE, 0); GtkWidget *hbox = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(hbox), GTK_WIDGET(color), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); }
static inline int gui_init_tab(struct dt_iop_module_t *self, int line, const char *name, GtkWidget **ppcolor, const GdkRGBA *c, GtkWidget **pphue, GtkWidget **ppsaturation) { GtkGrid *grid = GTK_GRID(self->widget); gtk_grid_attach(grid, dt_ui_section_label_new(name), 0, line++, 2, 1); // color button GtkWidget *color; *ppcolor = color = gtk_color_button_new_with_rgba(c); gtk_widget_set_size_request(GTK_WIDGET(color), DT_PIXEL_APPLY_DPI(32), DT_PIXEL_APPLY_DPI(32)); gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(color), FALSE); gtk_color_button_set_title(GTK_COLOR_BUTTON(color), _("select tone color")); // hue slider GtkWidget *hue; *pphue = hue = (dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0f, 1.0f, 0.01f, 0.0f, 2, 0)); dt_bauhaus_slider_set_stop(hue, 0.0f, 1.0f, 0.0f, 0.0f); dt_bauhaus_widget_set_label(hue, NULL, _("hue")); dt_bauhaus_slider_set_stop(hue, 0.166f, 1.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(hue, 0.322f, 0.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(hue, 0.498f, 0.0f, 1.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 0.664f, 0.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 0.830f, 1.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(hue, 1.0f, 1.0f, 0.0f, 0.0f); g_object_set(G_OBJECT(hue), "tooltip-text", _("select the hue tone"), (char *)NULL); // saturation slider GtkWidget *saturation; *ppsaturation = saturation = dt_bauhaus_slider_new_with_range(self, 0.0f, 1.0f, 0.01f, 0.0f, 2); dt_bauhaus_widget_set_label(saturation, NULL, _("saturation")); dt_bauhaus_slider_set_stop(saturation, 0.0f, 0.2f, 0.2f, 0.2f); dt_bauhaus_slider_set_stop(saturation, 1.0f, 1.0f, 1.0f, 1.0f); g_object_set(G_OBJECT(saturation), "tooltip-text", _("select the saturation tone"), (char *)NULL); // pack the widgets gtk_widget_set_hexpand(hue, TRUE); // make sure that the color picker doesn't become HUGE gtk_grid_attach(grid, hue, 0, line, 1, 1); gtk_grid_attach(grid, color, 1, line++, 1, 2); gtk_grid_attach(grid, saturation, 0, line++, 1, 1); return line; }
static inline void update_colorpicker_color(GtkWidget *colorpicker, float hue, float sat) { float rgb[3]; hsl2rgb(rgb, hue, sat, 0.5); GdkRGBA color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorpicker), &color); } static inline void update_saturation_slider_end_color(GtkWidget *slider, float hue) { float rgb[3]; hsl2rgb(rgb, hue, 1.0, 0.5); dt_bauhaus_slider_set_stop(slider, 1.0, rgb[0], rgb[1], rgb[2]); }
static void hue_callback(GtkWidget *slider, gpointer user_data) { dt_iop_module_t *self = (dt_iop_module_t *)user_data; dt_iop_graduatednd_params_t *p = (dt_iop_graduatednd_params_t *)self->params; dt_iop_graduatednd_gui_data_t *g = (dt_iop_graduatednd_gui_data_t *)self->gui_data; const float hue = dt_bauhaus_slider_get(g->gslider1); //fprintf(stderr," hue: %f, saturation: %f\n",hue,dtgtk_gradient_slider_get_value(g->gslider2)); float saturation = 1.0f; float color[3]; hsl2rgb(color, hue, saturation, 0.5f); dt_bauhaus_slider_set_stop(g->gslider2, 1.0f, color[0], color[1], color[2]); // Update saturation end color if(self->dt->gui->reset) return; gtk_widget_draw(GTK_WIDGET(g->gslider2),NULL); p->hue = hue; dt_dev_add_history_item(darktable.develop, self, TRUE); }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_splittoning_gui_data_t)); dt_iop_splittoning_gui_data_t *g = (dt_iop_splittoning_gui_data_t *)self->gui_data; dt_iop_splittoning_params_t *p = (dt_iop_splittoning_params_t *)self->params; self->widget = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE)); float rgb[3]; // Shadows hsl2rgb(rgb, p->shadow_hue, p->shadow_saturation, 0.5f); GdkRGBA sh_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; gui_init_tab(self, _("shadows"), &g->colorpick1, &sh_color, &g->gslider1, &g->gslider2); // Highlights hsl2rgb(rgb, p->highlight_hue, p->highlight_saturation, 0.5f); GdkRGBA hi_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; gui_init_tab(self, _("highlights"), &g->colorpick2, &hi_color, &g->gslider3, &g->gslider4); // Additional parameters GtkWidget *hbox = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); GtkWidget *vbox = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); g->scale1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0, 100.0, 0.1, p->balance * 100.0, 2, 0); dt_bauhaus_slider_set_format(g->scale1, "%.2f"); dt_bauhaus_slider_set_stop(g->scale1, 0.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_slider_set_stop(g->scale1, 1.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_widget_set_label(g->scale1, NULL, _("balance")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale1), TRUE, TRUE, 0); g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compress, 2); dt_bauhaus_slider_set_format(g->scale2, "%.2f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compress")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale2), TRUE, TRUE, 0); g_object_set(G_OBJECT(g->scale1), "tooltip-text", _("the balance of center of splittoning"), (char *)NULL); g_object_set(G_OBJECT(g->scale2), "tooltip-text", _("compress the effect on highlights/shadows and\npreserve midtones"), (char *)NULL); g_signal_connect(G_OBJECT(g->gslider1), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider3), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider2), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->gslider4), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->scale1), "value-changed", G_CALLBACK(balance_callback), self); g_signal_connect(G_OBJECT(g->scale2), "value-changed", G_CALLBACK(compress_callback), self); g_signal_connect(G_OBJECT(g->colorpick1), "color-set", G_CALLBACK(colorpick_callback), self); g_signal_connect(G_OBJECT(g->colorpick2), "color-set", G_CALLBACK(colorpick_callback), self); } void gui_cleanup(struct dt_iop_module_t *self) { free(self->gui_data); self->gui_data = NULL; }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_graduatednd_gui_data_t)); dt_iop_graduatednd_gui_data_t *g = (dt_iop_graduatednd_gui_data_t *)self->gui_data; dt_iop_graduatednd_params_t *p = (dt_iop_graduatednd_params_t *)self->params; self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE); /* density */ g->scale1 = dt_bauhaus_slider_new_with_range(self, -8.0, 8.0, 0.1, p->density, 2); dt_bauhaus_slider_set_format(g->scale1, "%.2fev"); dt_bauhaus_widget_set_label(g->scale1, NULL, _("density")); gtk_widget_set_tooltip_text(g->scale1, _("the density in EV for the filter")); g_signal_connect(G_OBJECT(g->scale1), "value-changed", G_CALLBACK(density_callback), self); /* compression */ g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compression, 0); dt_bauhaus_slider_set_format(g->scale2, "%.0f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compression")); /* xgettext:no-c-format */ gtk_widget_set_tooltip_text(g->scale2, _("compression of graduation:\n0% = soft, 100% = hard")); g_signal_connect(G_OBJECT(g->scale2), "value-changed", G_CALLBACK(compression_callback), self); /* rotation */ g->scale3 = dt_bauhaus_slider_new_with_range(self, -180, 180, 0.5, p->rotation, 2); dt_bauhaus_widget_set_label(g->scale3, NULL, _("rotation")); dt_bauhaus_slider_set_format(g->scale3, "%.2f°"); gtk_widget_set_tooltip_text(g->scale3, _("rotation of filter -180 to 180 degrees")); g_signal_connect(G_OBJECT(g->scale3), "value-changed", G_CALLBACK(rotation_callback), self); /* add widgets to ui */ gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(g->scale1), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(g->scale2), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(g->scale3), TRUE, TRUE, 0); /* hue slider */ g->gslider1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0f, 1.0f, 0.01f, 0.0f, 2, 0); dt_bauhaus_slider_set_stop(g->gslider1, 0.0f, 1.0f, 0.0f, 0.0f); // dt_bauhaus_slider_set_format(g->gslider1, ""); dt_bauhaus_widget_set_label(g->gslider1, NULL, _("hue")); dt_bauhaus_slider_set_stop(g->gslider1, 0.166f, 1.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(g->gslider1, 0.322f, 0.0f, 1.0f, 0.0f); dt_bauhaus_slider_set_stop(g->gslider1, 0.498f, 0.0f, 1.0f, 1.0f); dt_bauhaus_slider_set_stop(g->gslider1, 0.664f, 0.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(g->gslider1, 0.830f, 1.0f, 0.0f, 1.0f); dt_bauhaus_slider_set_stop(g->gslider1, 1.0f, 1.0f, 0.0f, 0.0f); gtk_widget_set_tooltip_text(g->gslider1, _("select the hue tone of filter")); g_signal_connect(G_OBJECT(g->gslider1), "value-changed", G_CALLBACK(hue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gslider1, TRUE, TRUE, 0); /* saturation slider */ g->gslider2 = dt_bauhaus_slider_new_with_range(self, 0.0f, 1.0f, 0.01f, 0.0f, 2); dt_bauhaus_widget_set_label(g->gslider2, NULL, _("saturation")); dt_bauhaus_slider_set_stop(g->gslider2, 0.0f, 0.2f, 0.2f, 0.2f); dt_bauhaus_slider_set_stop(g->gslider2, 1.0f, 1.0f, 1.0f, 1.0f); gtk_widget_set_tooltip_text(g->gslider2, _("select the saturation of filter")); g_signal_connect(G_OBJECT(g->gslider2), "value-changed", G_CALLBACK(saturation_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gslider2, TRUE, TRUE, 0); g->selected = 0; g->dragging = 0; g->define = 0; }
void gui_init(dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_colorbalance_gui_data_t)); dt_iop_colorbalance_gui_data_t *g = (dt_iop_colorbalance_gui_data_t *)self->gui_data; dt_iop_colorbalance_params_t *p = (dt_iop_colorbalance_params_t *)self->params; self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE); GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DT_BAUHAUS_SPACE); gtk_box_pack_start(GTK_BOX(self->widget), hbox, FALSE, FALSE, 0); #ifdef SHOW_COLOR_WHEELS GtkWidget *area = dtgtk_drawing_area_new_with_aspect_ratio(1.0); gtk_box_pack_start(GTK_BOX(hbox), area, TRUE, TRUE, 0); // gtk_widget_add_events(g->area, // GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | // GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(dt_iop_area_draw), self); // g_signal_connect (G_OBJECT (area), "button-press-event", // G_CALLBACK (dt_iop_colorbalance_button_press), self); // g_signal_connect (G_OBJECT (area), "motion-notify-event", // G_CALLBACK (dt_iop_colorbalance_motion_notify), self); // g_signal_connect (G_OBJECT (area), "leave-notify-event", // G_CALLBACK (dt_iop_colorbalance_leave_notify), self); area = dtgtk_drawing_area_new_with_aspect_ratio(1.0); gtk_box_pack_start(GTK_BOX(hbox), area, TRUE, TRUE, 0); // gtk_widget_add_events(g->area, // GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | // GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(dt_iop_area_draw), self); // g_signal_connect (G_OBJECT (area), "button-press-event", // G_CALLBACK (dt_iop_colorbalance_button_press), self); // g_signal_connect (G_OBJECT (area), "motion-notify-event", // G_CALLBACK (dt_iop_colorbalance_motion_notify), self); // g_signal_connect (G_OBJECT (area), "leave-notify-event", // G_CALLBACK (dt_iop_colorbalance_leave_notify), self); area = dtgtk_drawing_area_new_with_aspect_ratio(1.0); gtk_box_pack_start(GTK_BOX(hbox), area, TRUE, TRUE, 0); // gtk_widget_add_events(g->area, // GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | // GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(dt_iop_area_draw), self); // g_signal_connect (G_OBJECT (area), "button-press-event", // G_CALLBACK (dt_iop_colorbalance_button_press), self); // g_signal_connect (G_OBJECT (area), "motion-notify-event", // G_CALLBACK (dt_iop_colorbalance_motion_notify), self); // g_signal_connect (G_OBJECT (area), "leave-notify-event", // G_CALLBACK (dt_iop_colorbalance_leave_notify), self); #endif /* lift */ gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(_("lift")), FALSE, FALSE, 5); g->lift_factor = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_FACTOR] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_factor, 0.0, 0.0, 0.0, 0.0); dt_bauhaus_slider_set_stop(g->lift_factor, 1.0, 1.0, 1.0, 1.0); g_object_set(g->lift_factor, "tooltip-text", _("factor of lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_factor, _("lift"), _("factor")); g_signal_connect(G_OBJECT(g->lift_factor), "value-changed", G_CALLBACK(lift_factor_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_factor, TRUE, TRUE, 0); g->lift_r = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_RED] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_r, 0.0, 0.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_r, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_r, 1.0, 1.0, 0.0, 0.0); g_object_set(g->lift_r, "tooltip-text", _("factor of red for lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_r, _("lift"), _("red")); g_signal_connect(G_OBJECT(g->lift_r), "value-changed", G_CALLBACK(lift_red_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_r, TRUE, TRUE, 0); g->lift_g = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_GREEN] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_g, 0.0, 1.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_g, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_g, 1.0, 0.0, 1.0, 0.0); g_object_set(g->lift_g, "tooltip-text", _("factor of green for lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_g, _("lift"), _("green")); g_signal_connect(G_OBJECT(g->lift_g), "value-changed", G_CALLBACK(lift_green_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_g, TRUE, TRUE, 0); g->lift_b = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_BLUE] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_b, 0.0, 1.0, 1.0, 0.0); dt_bauhaus_slider_set_stop(g->lift_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_b, 1.0, 0.0, 0.0, 1.0); g_object_set(g->lift_b, "tooltip-text", _("factor of blue for lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_b, _("lift"), _("blue")); g_signal_connect(G_OBJECT(g->lift_b), "value-changed", G_CALLBACK(lift_blue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_b, TRUE, TRUE, 0); /* gamma */ gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(_("gamma")), FALSE, FALSE, 5); g->gamma_factor = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_FACTOR] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_factor, 0.0, 0.0, 0.0, 0.0); dt_bauhaus_slider_set_stop(g->gamma_factor, 1.0, 1.0, 1.0, 1.0); g_object_set(g->gamma_factor, "tooltip-text", _("factor of gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_factor, _("gamma"), _("factor")); g_signal_connect(G_OBJECT(g->gamma_factor), "value-changed", G_CALLBACK(gamma_factor_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_factor, TRUE, TRUE, 0); g->gamma_r = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_RED] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_r, 0.0, 0.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_r, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_r, 1.0, 1.0, 0.0, 0.0); g_object_set(g->gamma_r, "tooltip-text", _("factor of red for gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_r, _("gamma"), _("red")); g_signal_connect(G_OBJECT(g->gamma_r), "value-changed", G_CALLBACK(gamma_red_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_r, TRUE, TRUE, 0); g->gamma_g = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_GREEN] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_g, 0.0, 1.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_g, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_g, 1.0, 0.0, 1.0, 0.0); g_object_set(g->gamma_g, "tooltip-text", _("factor of green for gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_g, _("gamma"), _("green")); g_signal_connect(G_OBJECT(g->gamma_g), "value-changed", G_CALLBACK(gamma_green_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_g, TRUE, TRUE, 0); g->gamma_b = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_BLUE] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_b, 0.0, 1.0, 1.0, 0.0); dt_bauhaus_slider_set_stop(g->gamma_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_b, 1.0, 0.0, 0.0, 1.0); g_object_set(g->gamma_b, "tooltip-text", _("factor of blue for gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_b, _("gamma"), _("blue")); g_signal_connect(G_OBJECT(g->gamma_b), "value-changed", G_CALLBACK(gamma_blue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_b, TRUE, TRUE, 0); /* gain */ gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(_("gain")), FALSE, FALSE, 5); g->gain_factor = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_FACTOR] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_factor, 0.0, 0.0, 0.0, 0.0); dt_bauhaus_slider_set_stop(g->gain_factor, 1.0, 1.0, 1.0, 1.0); g_object_set(g->gain_factor, "tooltip-text", _("factor of gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_factor, _("gain"), _("factor")); g_signal_connect(G_OBJECT(g->gain_factor), "value-changed", G_CALLBACK(gain_factor_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_factor, TRUE, TRUE, 0); g->gain_r = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_RED] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_r, 0.0, 0.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_r, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_r, 1.0, 1.0, 0.0, 0.0); g_object_set(g->gain_r, "tooltip-text", _("factor of red for gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_r, _("gain"), _("red")); g_signal_connect(G_OBJECT(g->gain_r), "value-changed", G_CALLBACK(gain_red_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_r, TRUE, TRUE, 0); g->gain_g = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_GREEN] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_g, 0.0, 1.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_g, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_g, 1.0, 0.0, 1.0, 0.0); g_object_set(g->gain_g, "tooltip-text", _("factor of green for gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_g, _("gain"), _("green")); g_signal_connect(G_OBJECT(g->gain_g), "value-changed", G_CALLBACK(gain_green_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_g, TRUE, TRUE, 0); g->gain_b = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_BLUE] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_b, 0.0, 1.0, 1.0, 0.0); dt_bauhaus_slider_set_stop(g->gain_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_b, 1.0, 0.0, 0.0, 1.0); g_object_set(g->gain_b, "tooltip-text", _("factor of blue for gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_b, _("gain"), _("blue")); g_signal_connect(G_OBJECT(g->gain_b), "value-changed", G_CALLBACK(gain_blue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_b, TRUE, TRUE, 0); }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_splittoning_gui_data_t)); dt_iop_splittoning_gui_data_t *g = (dt_iop_splittoning_gui_data_t *)self->gui_data; dt_iop_splittoning_params_t *p = (dt_iop_splittoning_params_t *)self->params; int line = 0; self->widget = gtk_grid_new(); GtkGrid *grid = GTK_GRID(self->widget); gtk_grid_set_row_spacing(grid, DT_BAUHAUS_SPACE); gtk_grid_set_column_spacing(grid, DT_BAUHAUS_SPACE); gtk_grid_set_column_homogeneous(grid, FALSE); float rgb[3]; // Shadows hsl2rgb(rgb, p->shadow_hue, p->shadow_saturation, 0.5f); GdkRGBA sh_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; line = gui_init_tab(self, line, _("shadows"), &g->colorpick1, &sh_color, &g->gslider1, &g->gslider2); // Highlights hsl2rgb(rgb, p->highlight_hue, p->highlight_saturation, 0.5f); GdkRGBA hi_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; line = gui_init_tab(self, line, _("highlights"), &g->colorpick2, &hi_color, &g->gslider3, &g->gslider4); // Additional parameters g->scale1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0, 100.0, 0.1, p->balance * 100.0, 2, 0); dt_bauhaus_slider_set_format(g->scale1, "%.2f"); dt_bauhaus_slider_set_stop(g->scale1, 0.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_slider_set_stop(g->scale1, 1.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_widget_set_label(g->scale1, NULL, _("balance")); gtk_widget_set_margin_top(g->scale1, 6 * DT_BAUHAUS_SPACE); gtk_grid_attach(grid, g->scale1, 0, line++, 2, 1); g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compress, 2); dt_bauhaus_slider_set_format(g->scale2, "%.2f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compress")); gtk_grid_attach(grid, g->scale2, 0, line++, 2, 1); g_object_set(G_OBJECT(g->scale1), "tooltip-text", _("the balance of center of splittoning"), (char *)NULL); g_object_set(G_OBJECT(g->scale2), "tooltip-text", _("compress the effect on highlights/shadows and\npreserve midtones"), (char *)NULL); g_signal_connect(G_OBJECT(g->gslider1), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider3), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider2), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->gslider4), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->scale1), "value-changed", G_CALLBACK(balance_callback), self); g_signal_connect(G_OBJECT(g->scale2), "value-changed", G_CALLBACK(compress_callback), self); g_signal_connect(G_OBJECT(g->colorpick1), "color-set", G_CALLBACK(colorpick_callback), self); g_signal_connect(G_OBJECT(g->colorpick2), "color-set", G_CALLBACK(colorpick_callback), self); } void gui_cleanup(struct dt_iop_module_t *self) { free(self->gui_data); self->gui_data = NULL; }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_colorchecker_gui_data_t)); dt_iop_colorchecker_gui_data_t *g = (dt_iop_colorchecker_gui_data_t *)self->gui_data; dt_iop_colorchecker_params_t *p = (dt_iop_colorchecker_params_t *)self->params; self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE); // custom 24-patch widget in addition to combo box g->area = dtgtk_drawing_area_new_with_aspect_ratio(4.0/6.0); gtk_box_pack_start(GTK_BOX(self->widget), g->area, TRUE, TRUE, 0); gtk_widget_add_events(GTK_WIDGET(g->area), GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_SCROLL_MASK); g_signal_connect(G_OBJECT(g->area), "draw", G_CALLBACK(checker_draw), self); g_signal_connect(G_OBJECT(g->area), "button-press-event", G_CALLBACK(checker_button_press), self); g_signal_connect(G_OBJECT(g->area), "motion-notify-event", G_CALLBACK(checker_motion_notify), self); g_signal_connect(G_OBJECT(g->area), "leave-notify-event", G_CALLBACK(checker_leave_notify), self); g->patch = 0; g->drawn_patch = -1; g->combobox_patch = dt_bauhaus_combobox_new(self); dt_bauhaus_widget_set_label(g->combobox_patch, NULL, _("patch")); gtk_widget_set_tooltip_text(g->combobox_patch, _("color checker patch")); char cboxentry[1024]; for(int k=0;k<p->num_patches;k++) { snprintf(cboxentry, sizeof(cboxentry), _("patch #%d"), k); dt_bauhaus_combobox_add(g->combobox_patch, cboxentry); } self->request_color_pick = DT_REQUEST_COLORPICK_OFF; dt_bauhaus_widget_set_quad_paint(g->combobox_patch, dtgtk_cairo_paint_colorpicker, CPF_ACTIVE); g->scale_L = dt_bauhaus_slider_new_with_range(self, -100.0, 100.0, 1.0, 0.0f, 2); gtk_widget_set_tooltip_text(g->scale_L, _("lightness offset")); dt_bauhaus_widget_set_label(g->scale_L, NULL, _("lightness")); g->scale_a = dt_bauhaus_slider_new_with_range(self, -256.0, 256.0, 1.0, 0.0f, 2); gtk_widget_set_tooltip_text(g->scale_a, _("chroma offset green/red")); dt_bauhaus_widget_set_label(g->scale_a, NULL, _("green/red")); dt_bauhaus_slider_set_stop(g->scale_a, 0.0, 0.0, 1.0, 0.2); dt_bauhaus_slider_set_stop(g->scale_a, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->scale_a, 1.0, 1.0, 0.0, 0.2); g->scale_b = dt_bauhaus_slider_new_with_range(self, -256.0, 256.0, 1.0, 0.0f, 2); gtk_widget_set_tooltip_text(g->scale_b, _("chroma offset blue/yellow")); dt_bauhaus_widget_set_label(g->scale_b, NULL, _("blue/yellow")); dt_bauhaus_slider_set_stop(g->scale_b, 0.0, 0.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->scale_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->scale_b, 1.0, 1.0, 1.0, 0.0); g->scale_C = dt_bauhaus_slider_new_with_range(self, -128.0, 128.0, 1.0f, 0.0f, 2); gtk_widget_set_tooltip_text(g->scale_C, _("saturation offset")); dt_bauhaus_widget_set_label(g->scale_C, NULL, _("saturation")); gtk_box_pack_start(GTK_BOX(self->widget), g->combobox_patch, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), g->scale_L, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), g->scale_a, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), g->scale_b, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), g->scale_C, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(g->combobox_patch), "value-changed", G_CALLBACK(patch_callback), self); g_signal_connect(G_OBJECT(g->combobox_patch), "quad-pressed", G_CALLBACK(picker_callback), self); g_signal_connect(G_OBJECT(g->scale_L), "value-changed", G_CALLBACK(target_L_callback), self); g_signal_connect(G_OBJECT(g->scale_a), "value-changed", G_CALLBACK(target_a_callback), self); g_signal_connect(G_OBJECT(g->scale_b), "value-changed", G_CALLBACK(target_b_callback), self); g_signal_connect(G_OBJECT(g->scale_C), "value-changed", G_CALLBACK(target_C_callback), self); cmsHPROFILE hsRGB = dt_colorspaces_get_profile(DT_COLORSPACE_SRGB, "", DT_PROFILE_DIRECTION_IN)->profile; cmsHPROFILE hLab = dt_colorspaces_get_profile(DT_COLORSPACE_LAB, "", DT_PROFILE_DIRECTION_ANY)->profile; g->xform = cmsCreateTransform(hLab, TYPE_Lab_DBL, hsRGB, TYPE_RGB_DBL, INTENT_PERCEPTUAL, 0); // cmsFLAGS_NOTPRECALC); }