121#ifdef GDK_WINDOWING_QUARTZ
125#include <gdk/gdkkeysyms.h>
131#include <sys/types.h>
136#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f))
145 double full_delta[2];
149#define DARKROOM_EDGE_PAN_INTERVAL_MS 64
150#define DARKROOM_EDGE_PAN_MARGIN_PX DT_PIXEL_APPLY_DPI(100)
151#define DARKROOM_EDGE_PAN_SPEED_PX_PER_S 360.0f
182 if(module && module->show_popup)
183 module->show_popup(module);
204 running ? _(
"Autoset is running on selected modules")
205 : _(
"Run autoset on selected modules\nRight click for options"));
215 return _(
"Darkroom");
258 "darkroom-cleanup-autoset-manager");
285 const int fd = GPOINTER_TO_INT(closure);
286 ssize_t res = write(fd, data, length);
288 return CAIRO_STATUS_WRITE_ERROR;
289 return CAIRO_STATUS_SUCCESS;
299 return !is_primary_sample && selected_sample && !display_samples;
313 memcpy(box, sample->
box,
sizeof(
float) * 4);
330 int32_t
width, int32_t
height, int32_t pozx, int32_t pozy,
331 GSList *samples, gboolean is_primary_sample)
343 const double lw = 1.0 / scale;
344 const double dashes[1] = {
lw * 4.0 };
349 cairo_set_line_cap(cri, CAIRO_LINE_CAP_SQUARE);
352 const gboolean only_selected_sample
356 for( ; samples; samples = g_slist_next(samples))
359 if(only_selected_sample && (sample != selected_sample))
366 double half_px = 0.5;
367 const double min_half_px_device = 4.0;
369 gboolean show_preview_pixel_scale =
TRUE;
374 float image_box[4] = { 0.0f };
376 double x = image_box[0] * wd, y = image_box[1] * ht,
377 w = image_box[2] * wd, h = image_box[3] * ht;
378 cairo_user_to_device(cri, &
x, &y);
379 cairo_user_to_device(cri, &w, &h);
384 cairo_device_to_user(cri, &
x, &y);
385 cairo_device_to_user(cri, &w, &h);
386 cairo_rectangle(cri,
x, y, w -
x, h - y);
387 if(is_primary_sample)
390 const double hw = 5. / scale;
391 cairo_rectangle(cri,
x - hw, y - hw, 2. * hw, 2. * hw);
392 cairo_rectangle(cri,
x - hw, h - hw, 2. * hw, 2. * hw);
393 cairo_rectangle(cri, w - hw, y - hw, 2. * hw, 2. * hw);
394 cairo_rectangle(cri, w - hw, h - hw, 2. * hw, 2. * hw);
400 float image_point[2] = { 0.0f };
402 double x = image_point[0] * wd;
403 double y = image_point[1] * ht;
404 cairo_user_to_device(cri, &
x, &y);
408 half_px = round(half_px * scale);
409 if(half_px < min_half_px_device)
411 half_px = min_half_px_device;
412 show_preview_pixel_scale =
FALSE;
415 double crosshair = (is_primary_sample ? 4. : 5.) * half_px;
416 if(sample == selected_sample) crosshair *= 2;
417 cairo_device_to_user(cri, &
x, &y);
418 cairo_device_to_user_distance(cri, &crosshair, &half_px);
421 if(is_primary_sample)
422 cairo_arc(cri,
x, y, crosshair, 0., 2. *
M_PI);
424 cairo_move_to(cri,
x - crosshair, y);
425 cairo_line_to(cri,
x + crosshair, y);
426 cairo_move_to(cri,
x, y - crosshair);
427 cairo_line_to(cri,
x, y + crosshair);
432 const double line_scale = (sample == selected_sample ? 2.0 : 1.0);
433 cairo_set_line_width(cri,
lw * 3.0 * line_scale);
434 cairo_set_source_rgba(cri, 0.0, 0.0, 0.0, 0.4);
435 cairo_stroke_preserve(cri);
437 const gboolean draw_dashed = !is_primary_sample
438 && sample != selected_sample
440 cairo_set_line_width(cri,
lw * line_scale);
441 cairo_set_dash(cri, dashes, draw_dashed, 0.0);
443 cairo_set_source_rgba(cri, 1.0, 1.0, 1.0, 0.8);
455 float image_point[2] = { 0.0f };
457 if(sample == selected_sample)
458 cairo_arc(cri, image_point[0] * wd, image_point[1] * ht, half_px * 2., 0., 2. *
M_PI);
459 else if(show_preview_pixel_scale)
460 cairo_rectangle(cri, image_point[0] * wd - half_px, image_point[1] * ht - half_px, half_px * 2., half_px * 2.);
462 cairo_arc(cri, image_point[0] * wd, image_point[1] * ht, half_px, 0., 2. *
M_PI);
483 cairo_rectangle(cr, -border * .5f, -border * .5f,
width + border,
height + border);
484 cairo_set_source_rgb(cr, 1., 1., 1.);
495#ifndef DARKROOM_EXPOSE_DUMB_DEBUG
496#define DARKROOM_EXPOSE_DUMB_DEBUG 0
499#if DARKROOM_EXPOSE_DUMB_DEBUG
502static void _darkroom_debug_restart_cache_wait(gpointer user_data)
514 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
525 &_darkroom_main_debug_wait,
526 _darkroom_debug_restart_cache_wait, dev))
533 if(bw <= 0 || bh <= 0)
539 const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, bw);
540 const size_t required_size = (size_t)stride * (
size_t)bh;
548 cairo_surface_t *surface = cairo_image_surface_create_for_data((
unsigned char *)data, CAIRO_FORMAT_RGB24,
550 if(
IS_NULL_PTR(surface) || cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS)
552 if(surface) cairo_surface_destroy(surface);
557 float image_box[4] = { 0.0f };
559 const int wd = image_box[2];
560 const int ht = image_box[3];
561 cairo_translate(cr, image_box[0], image_box[1]);
564 cairo_rectangle(cr, 0, 0, wd, ht);
565 cairo_set_source_surface(cr, surface, 0, 0);
568 cairo_surface_destroy(surface);
601 cairo_surface_destroy(locked->
surface);
608 locked->
entry = NULL;
643#if DARKROOM_EXPOSE_DUMB_DEBUG
650 const gboolean keep_previous_on_fail,
const gboolean lock_read)
655 const char *wait_owner =
"darkroom-unknown";
656 if(pipe == dev->
pipe)
659 wait_owner =
"darkroom-main";
664 wait_owner =
"darkroom-preview";
676 void *live_data = NULL;
680 && live_entry == locked->
entry && live_data == locked->
data)
707 const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24,
width);
708 const size_t required_size = (size_t)stride * (
size_t)
height;
720 locked->
entry = entry;
725 cairo_surface_t *surface = cairo_image_surface_create_for_data(
data, CAIRO_FORMAT_RGB24,
width,
height, stride);
726 if(
IS_NULL_PTR(surface) || cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS)
728 if(!
IS_NULL_PTR(surface)) cairo_surface_destroy(surface);
739 locked->
entry = entry;
745 const int width,
const int height,
const int border,
751 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
754 int wd = locked->
width;
756 if(wd <= 0 || ht <= 0)
return FALSE;
760 cairo_translate(cr, .5f * (
width - wd), .5f * (
height - ht));
766 cairo_rectangle(cr, 0, 0, wd, ht);
767 cairo_set_source_surface(cr, locked->
surface, 0, 0);
793 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
795 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
801 const float preview_wd = wd / ppd;
802 const float preview_ht = ht / ppd;
804 float image_box[4] = { 0.0f };
811 if(image_box[2] > 0 && image_box[3] > 0)
814 cairo_translate(cr, image_box[0], image_box[1]);
826 const float roi_width = fminf(
width, preview_wd * preview_scale);
827 const float roi_height = fminf(
height, preview_ht * preview_scale);
828 const float rec_x = fmaxf(border, (
width - roi_width) * 0.5f);
829 const float rec_y = fmaxf(border, (
height - roi_height) * 0.5f);
830 const float rec_w = fminf(
width - 2 * border, roi_width);
831 const float rec_h = fminf(
height - 2 * border, roi_height);
832 cairo_rectangle(cr, rec_x, rec_y, rec_w, rec_h);
835 const float tx = 0.5f *
width - dev->
roi.
x * preview_wd * preview_scale;
836 const float ty = 0.5f *
height - dev->
roi.
y * preview_ht * preview_scale;
837 cairo_translate(cr, tx, ty);
838 cairo_scale(cr, preview_scale, preview_scale);
839 cairo_rectangle(cr, 0, 0, preview_wd, preview_ht);
859static void _paint_all(cairo_t *cri, cairo_t *cr, cairo_surface_t *image_surface)
863 cairo_set_source_surface(cri, image_surface, 0, 0);
900 &&
state->main_zoom_hash == zoom_hash;
909 state->main_zoom_hash = 0;
957#if DARKROOM_EXPOSE_DUMB_DEBUG
963 _render_main_direct_debug(cri, dev,
width,
height, border, bg_color_dbg);
970 .image_surface_height = 0,
972 .image_surface_has_main =
FALSE,
992 const gboolean main_backbuf_is_newer
994 const gboolean main_ready_for_current_view
996 const gboolean preview_matches_full_image
998 && full_width > 0 && full_height > 0
1001 const gboolean full_image_backbuf_ready = main_ready_for_current_view || preview_matches_full_image;
1004 const char *draw_source =
"background only";
1006 gboolean drawn =
FALSE;
1007 gboolean drawn_from_main =
FALSE;
1015 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
1033 if(full_image_backbuf_ready)
1040 if(main_ready_for_current_view)
1052 drawn_from_main =
TRUE;
1053 draw_source =
"fresh main backbuf";
1056 else if(main_backbuf_is_newer && expose_state.
pending_main_hash != main_backbuf_hash)
1072 if(!drawn && preview_matches_full_image)
1084 drawn_from_main =
TRUE;
1085 draw_source =
"fresh full-size preview backbuf";
1093 if(!drawn && roi_changed && !full_image_backbuf_ready && preview_has_backbuf)
1102 drawn_from_main =
FALSE;
1103 draw_source =
"fresh preview fallback";
1111 if(!drawn && roi_changed && !full_image_backbuf_ready
1118 drawn_from_main =
FALSE;
1119 draw_source =
"reused preview fallback";
1132 drawn_from_main =
TRUE;
1133 draw_source =
"reused last main backbuf";
1145 draw_source, draw_hash);
1153 :
"reused last preview surface";
1157 draw_source, draw_hash);
1163 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
1167 draw_source, draw_hash);
1242 cairo_set_source_rgba(cri, 0.5, 0.5, 0.5, 0.5);
1243 PangoLayout *layout;
1246 pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
1247 layout = pango_cairo_create_layout(cri);
1248 pango_font_description_set_absolute_size(desc,
DT_PIXEL_APPLY_DPI(20) * PANGO_SCALE);
1249 pango_layout_set_font_description(layout, desc);
1250 pango_layout_set_text(layout, label, -1);
1251 pango_layout_get_pixel_extents(layout, &ink, NULL);
1252 cairo_move_to(cri, ink.height * 2,
height - (ink.height * 3));
1253 pango_cairo_layout_path(cri, layout);
1254 cairo_set_source_rgb(cri, 0.7, 0.7, 0.7);
1255 cairo_fill_preserve(cri);
1256 cairo_set_line_width(cri, 0.7);
1257 cairo_set_source_rgb(cri, 0.3, 0.3, 0.3);
1259 pango_font_description_free(desc);
1260 g_object_unref(layout);
1279 dt_control_log(_(
"Could not read image information from the database."));
1291 if(request_id == 0)
return;
1354 else if(num_selected > 1)
1356 dt_control_log(_(
"The current selection contains more than one image, which is ambiguous.\n"
1357 "Select exactly one image to enter the darkroom."));
1363 "Select exactly one image to enter the darkroom."));
1410 GtkPopover *popover = GTK_POPOVER(user_data);
1412 GtkWidget *button = gtk_popover_get_relative_to(popover);
1413 GdkRectangle button_rect = { 0 };
1415 GdkDevice *pointer = gdk_seat_get_pointer(gdk_display_get_default_seat(gdk_display_get_default()));
1418 GdkWindow *pointer_window = gdk_device_get_window_at_position(pointer, &
x, &y);
1419 gpointer pointer_widget = NULL;
1421 gdk_window_get_user_data(pointer_window, &pointer_widget);
1423 gtk_popover_set_relative_to(popover, anchor ? anchor : button);
1425 GdkRectangle
rect = { button_rect.
x + button_rect.width / 2, button_rect.y, 1, 1 };
1427 if(pointer_widget == anchor)
1432 else if(pointer_widget && anchor && pointer_widget != anchor)
1434 gtk_widget_translate_coordinates(pointer_widget, anchor,
x, y, &
rect.
x, &
rect.
y);
1437 gtk_popover_set_pointing_to(popover, &
rect);
1445 gtk_widget_show_all(GTK_WIDGET(popover));
1458 guint keyval, GdkModifierType modifier,
1462 if(
IS_NULL_PTR(button) || !gtk_widget_is_visible(button) || !gtk_widget_is_sensitive(button))
return FALSE;
1464 gtk_button_clicked(GTK_BUTTON(button));
1469 guint keyval, GdkModifierType modifier,
1473 if(
IS_NULL_PTR(button) || !gtk_widget_is_visible(button) || !gtk_widget_is_sensitive(button))
return FALSE;
1475 GtkWidget *popover = g_object_get_data(G_OBJECT(button),
"dt-darkroom-toolbox-popover");
1476 if(
IS_NULL_PTR(popover) || !gtk_widget_is_sensitive(popover))
return FALSE;
1478 gtk_widget_grab_focus(button);
1479 gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
1486 if(
d->iso_12646.enabled)
1492 const int main_dim =
MIN(
d->roi.orig_width,
d->roi.orig_height);
1493 d->roi.border_size = 0.125 * main_dim;
1500 dt_dev_configure(
d,
d->roi.orig_width - 2 *
d->roi.border_size,
d->roi.orig_height - 2 *
d->roi.border_size);
1507 if(!
d->gui_attached)
return;
1566 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &color);
1568 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker1/green", color.green);
1569 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker1/blue", color.blue);
1578 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &color);
1580 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker2/green", color.green);
1581 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker2/blue", color.blue);
1597 dt_conf_set_bool(
"plugins/darkroom/colorbalancergb/mask_preview/greyscaled",
1598 gtk_toggle_button_get_active(toggle));
1622 if(
d->overexposed.enabled ==
FALSE)
1623 gtk_button_clicked(GTK_BUTTON(
d->overexposed.button));
1632 if(
d->overexposed.enabled ==
FALSE)
1633 gtk_button_clicked(GTK_BUTTON(
d->overexposed.button));
1642 if(
d->overexposed.enabled ==
FALSE)
1643 gtk_button_clicked(GTK_BUTTON(
d->overexposed.button));
1652 if(
d->overexposed.enabled ==
FALSE)
1653 gtk_button_clicked(GTK_BUTTON(
d->overexposed.button));
1670 if(
d->rawoverexposed.enabled ==
FALSE)
1671 gtk_button_clicked(GTK_BUTTON(
d->rawoverexposed.button));
1680 if(
d->rawoverexposed.enabled ==
FALSE)
1681 gtk_button_clicked(GTK_BUTTON(
d->rawoverexposed.button));
1690 if(
d->rawoverexposed.enabled ==
FALSE)
1691 gtk_button_clicked(GTK_BUTTON(
d->rawoverexposed.button));
1779static void _overlay_cycle_callback(dt_action_t *action)
1782 const int nextval = (currentval + 1) % 6;
1788static void _toggle_mask_visibility_callback(dt_action_t *action)
1797 if(mod && strcmp(mod->
so->
op,
"spots") != 0 && strcmp(mod->
so->
op,
"retouch") != 0)
1813 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->masks_edit), bd->masks_shown !=
DT_MASKS_EDIT_OFF);
1818 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->masks_shapes[
n]),
FALSE);
1830 static guint start_time = 0;
1833 g_object_get(gtk_settings_get_default(),
"gtk-long-press-time", &delay, NULL);
1835 if((event->type == GDK_BUTTON_PRESS && event->button == 3) ||
1836 (event->type == GDK_BUTTON_RELEASE && event->time - start_time > delay))
1838 gtk_popover_set_relative_to(GTK_POPOVER(popover), button);
1839 g_object_set(G_OBJECT(popover),
"transitions-enabled",
FALSE, NULL);
1846 start_time =
event->time;
1858 GdkModifierType modifier, gpointer data)
1865 GdkModifierType modifier, gpointer data)
1871 GList *current_item = g_list_find(current_collection, GINT_TO_POINTER(current_img));
1873 if(current_item && current_item->next)
1875 int32_t next_img = GPOINTER_TO_INT(current_item->next->data);
1876 g_list_free(current_collection);
1877 current_collection = NULL;
1882 g_list_free(current_collection);
1883 current_collection = NULL;
1890 GdkModifierType modifier, gpointer data)
1896 GList *current_item = g_list_find(current_collection, GINT_TO_POINTER(current_img));
1898 if(current_item && current_item->prev)
1900 int32_t prev_img = GPOINTER_TO_INT(current_item->prev->data);
1901 g_list_free(current_collection);
1902 current_collection = NULL;
1907 g_list_free(current_collection);
1908 current_collection = NULL;
1918 const gboolean autoset_running_before
1935 const gboolean autoset_running_after
1940 if(cache_ready && !autoset_running_after)
1942 const gboolean autoset_just_finished = autoset_running_before && !autoset_running_after;
1943 if(!autoset_running_before || autoset_just_finished)
1968 fprintf(stdout,
"lauching autoset\n");
1974 gchar *label = g_strdup_printf(
"%s (%i)", clean_name, module->
multi_priority);
1990 for(GList *child = children; child; child = g_list_next(child))
1991 gtk_widget_destroy(GTK_WIDGET(child->data));
1992 g_list_free(children);
1994 GtkWidget *title = gtk_label_new(_(
"Module instances to autoset"));
1998 for(GList *modules = g_list_last(dev->
iop); modules; modules = g_list_previous(modules))
2004 GtkWidget *toggle = gtk_check_button_new_with_label(label);
2028 N_(
"Switch to the next picture"), GDK_KEY_Right, GDK_MOD1_MASK, _(
"Triggers the action"));
2030 N_(
"Switch to the previous picture"), GDK_KEY_Left, GDK_MOD1_MASK, _(
"Triggers the action"));
2113 _(
"toggle ISO 12646 color assessment conditions"));
2117 N_(
"Darkroom/Toolbox"),
2118 N_(
"Toggle ISO 12646 color assessment conditions"), 0, 0,
2119 _(
"Triggers the action"));
2125 gtk_widget_set_tooltip_text(dev->
display.
button, _(
"Picture display options"));
2132 g_object_set_data(G_OBJECT(dev->
display.
button),
"dt-darkroom-toolbox-popover",
2135 N_(
"Darkroom/Toolbox"),
2136 N_(
"Focus picture display options"), 0, 0,
2137 _(
"Shows the options popover"));
2149 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(brightness),
TRUE,
TRUE, 0);
2156 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(borders),
TRUE,
TRUE, 0);
2160 N_(
"Rendering size"),
2161 _(
"Choose at what size the main preview is rendered.\n"
2162 "Full resolution renders the pipeline at the raw original resolution.\n"
2163 "It is pixel-perfect, especially regarding denoising and deblurring, but very slow.\n"
2164 "Scaled renders at screen resolution and is the best trade-off.\n"
2165 "Pixel-level accuracy is guaranteed only when zoomed-in at 100%."),
2168 N_(
"full resolution (slow)"),
2169 N_(
"scaled (default)")
2171 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(rendering),
TRUE,
TRUE, 0);
2177 GtkWidget *checker_1 = gtk_color_button_new();
2178 GdkRGBA checker_color = {
2184 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(checker_1), &checker_color);
2185 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(checker_1),
FALSE);
2186 gtk_color_button_set_title(GTK_COLOR_BUTTON(checker_1),
2187 _(
"Select color of the checkerboard from a swatch"));
2189 gtk_box_pack_start(GTK_BOX(checker_1_row), checker_1,
FALSE,
FALSE, 0);
2190 gtk_box_pack_start(GTK_BOX(vbox), checker_1_row,
FALSE,
FALSE, 0);
2194 GtkWidget *checker_2 = gtk_color_button_new();
2195 checker_color.red =
dt_conf_get_float(
"plugins/darkroom/colorbalancergb/checker2/red");
2196 checker_color.green =
dt_conf_get_float(
"plugins/darkroom/colorbalancergb/checker2/green");
2197 checker_color.blue =
dt_conf_get_float(
"plugins/darkroom/colorbalancergb/checker2/blue");
2198 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(checker_2), &checker_color);
2199 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(checker_2),
FALSE);
2200 gtk_color_button_set_title(GTK_COLOR_BUTTON(checker_2),
2201 _(
"Select color of the checkerboard from a swatch"));
2203 gtk_box_pack_start(GTK_BOX(checker_2_row), checker_2,
FALSE,
FALSE, 0);
2204 gtk_box_pack_start(GTK_BOX(vbox), checker_2_row,
FALSE,
FALSE, 0);
2212 g_signal_connect(G_OBJECT(checker_size),
"value-changed",
2214 gtk_box_pack_start(GTK_BOX(vbox), checker_size,
TRUE,
TRUE, 0);
2216 GtkWidget *black_and_white = gtk_check_button_new_with_label(_(
"Show a greyscaled mask image"));
2217 gtk_toggle_button_set_active(
2218 GTK_TOGGLE_BUTTON(black_and_white),
2219 dt_conf_get_bool(
"plugins/darkroom/colorbalancergb/mask_preview/greyscaled"));
2220 g_signal_connect(G_OBJECT(black_and_white),
"toggled",
2222 gtk_box_pack_start(GTK_BOX(vbox), black_and_white,
FALSE,
FALSE, 0);
2231 N_(
"Darkroom/Toolbox"),
2232 N_(
"Show the pipeline node graph"), 0, 0,
2233 _(
"Triggers the action"));
2242 _(
"toggle raw over exposed indication\nright click for options"));
2254 N_(
"Darkroom/Toolbox"),
2255 N_(
"Toggle raw over exposed indication"), 0, 0,
2256 _(
"Triggers the action"));
2258 N_(
"Darkroom/Toolbox"),
2259 N_(
"Focus raw over exposed indication options"), 0, 0,
2260 _(
"Shows the options popover"));
2268 _(
"select how to mark the clipped pixels"),
2270 N_(
"mark with CFA color"), N_(
"mark with solid color"), N_(
"false color"));
2271 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mode),
TRUE,
TRUE, 0);
2282 gtk_widget_set_tooltip_text(
2284 _(
"select the solid color to indicate over exposure.\nwill only be used if mode = mark with solid color"));
2286 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(colorscheme),
TRUE,
TRUE, 0);
2292 gtk_widget_set_tooltip_text(
2293 threshold, _(
"threshold of what shall be considered overexposed\n1.0 - white level\n0.0 - black level"));
2297 gtk_widget_show_all(vbox);
2305 _(
"toggle clipping indication\nright click for options"));
2314 g_object_set_data(G_OBJECT(dev->
overexposed.
button),
"dt-darkroom-toolbox-popover",
2317 N_(
"Darkroom/Toolbox"),
2318 N_(
"Toggle clipping indication"), 0, 0,
2319 _(
"Triggers the action"));
2321 N_(
"Darkroom/Toolbox"),
2322 N_(
"Focus clipping indication options"), 0, 0,
2323 _(
"Shows the options popover"));
2331 _(
"select the metric you want to preview\nfull gamut is the combination of all other modes"),
2333 N_(
"full gamut"), N_(
"any RGB channel"), N_(
"luminance only"), N_(
"saturation only"));
2334 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mode),
TRUE,
TRUE, 0);
2338 _(
"select colors to indicate clipping"),
2340 N_(
"black & white"), N_(
"red & blue"), N_(
"purple & green"));
2341 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(colorscheme),
TRUE,
TRUE, 0);
2348 gtk_widget_set_tooltip_text(lower, _(
"clipping threshold for the black point,\n"
2349 "in EV, relatively to white (0 EV).\n"
2350 "8 bits sRGB clips blacks at -12.69 EV,\n"
2351 "8 bits Adobe RGB clips blacks at -19.79 EV,\n"
2352 "16 bits sRGB clips blacks at -20.69 EV,\n"
2353 "typical fine-art mat prints produce black at -5.30 EV,\n"
2354 "typical color glossy prints produce black at -8.00 EV,\n"
2355 "typical B&W glossy prints produce black at -9.00 EV."
2357 g_signal_connect(G_OBJECT(lower),
"value-changed", G_CALLBACK(
lower_callback), dev);
2358 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(lower),
TRUE,
TRUE, 0);
2366 gtk_widget_set_tooltip_text(upper, _(
"clipping threshold for the white point.\n"
2367 "100% is peak medium luminance."));
2368 g_signal_connect(G_OBJECT(upper),
"value-changed", G_CALLBACK(
upper_callback), dev);
2369 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(upper),
TRUE,
TRUE, 0);
2371 gtk_widget_show_all(vbox);
2379 _(
"toggle softproofing\nright click for profile options"));
2388 _(
"toggle gamut checking\nright click for profile options"));
2404 N_(
"Toggle softproofing"), 0, 0,
2405 _(
"Triggers the action"));
2408 N_(
"Focus softproof options"), 0, 0,
2409 _(
"Shows the options popover"));
2412 N_(
"Toggle gamut checking"), 0, 0,
2413 _(
"Triggers the action"));
2416 N_(
"Focus gamut checking options"), 0, 0,
2417 _(
"Shows the options popover"));
2431 gtk_box_pack_start(GTK_BOX(vbox), softproof_profile,
TRUE,
TRUE, 0);
2447 char *system_profile_dir = g_build_filename(datadir,
"color",
"out", NULL);
2448 char *user_profile_dir = g_build_filename(confdir,
"color",
"out", NULL);
2449 char *
tooltip = g_strdup_printf(_(
"softproof ICC profiles in %s or %s"), user_profile_dir, system_profile_dir);
2450 gtk_widget_set_tooltip_text(softproof_profile,
tooltip);
2459 gtk_widget_show_all(vbox);
2467 _(
"toggle guide lines\nright click for guides options"));
2479 N_(
"Toggle guide lines"), 0, 0,
2480 _(
"Triggers the action"));
2483 N_(
"Focus guide lines options"), 0, 0,
2484 _(
"Shows the options popover"));
2495 gtk_widget_set_tooltip_text(
_darkroom_autoset_button, _(
"Run autoset on selected modules\nRight click for options"));
2539 GtkAccelKey
key = { 0 };
2540 return gtk_accel_map_lookup_entry(accel_path, &
key)
2584 for(
const GList *modules = g_list_first(dev->
iop); modules; modules = g_list_next(modules))
2594 if(module->multi_priority == 0)
2596 snprintf(option,
sizeof(option),
"plugins/darkroom/%s/expanded", module->op);
2597 module->expanded = dt_conf_get_bool(option);
2600 if(active_plugin && !strcmp(module->op, active_plugin))
2649 "darkroom-leave-autoset");
2671 for(GList *
m = dev->
iop;
m;
m = g_list_next(
m))
2674 if(mod && mod->quiesce) mod->quiesce(mod);
2758 dev->
iop = g_list_delete_link(dev->
iop, dev->
iop);
2833 gboolean handled =
FALSE;
2863 float image_box[4] = { 0.0f };
2866 return _is_in_frame(image_box[2], image_box[3], round(
x - image_box[0]), round(y - image_box[1]));
2921 if(near_edge <= 0.0)
return 0.0f;
2923 const float edge_distance =
CLAMPF(near_edge / margin, 0.0f, 1.0f);
2924 const float velocity = 0.10f + 0.90f * edge_distance * edge_distance;
2925 return position < margin ? -velocity : velocity;
2947 const double pointer_x,
2948 const double pointer_y,
2968 float image_box[4] = { 0.0f };
2970 const double image_x = pointer_x - image_box[0];
2971 const double image_y = pointer_y - image_box[1];
2977 && image_box[2] > 0.0f && image_box[3] > 0.0f;
2978 edge->
margin = inside_action_area
2983 && (image_x < edge->
margin
2985 || image_y < edge->margin
2986 || image_y > (
double)image_box[3] - edge->
margin);
3002 const double pointer_x,
3003 const double pointer_y,
3049 const gint64 now_us = g_get_monotonic_time();
3067 if(dev->
roi.
x != roi[0] || dev->
roi.
y != roi[1])
3069 dev->
roi.
x = roi[0];
3070 dev->
roi.
y = roi[1];
3097 GdkWindow *window =
IS_NULL_PTR(center) ? NULL : gtk_widget_get_window(center);
3098 GdkDisplay *display =
IS_NULL_PTR(window) ? NULL : gdk_window_get_display(window);
3099 GdkSeat *seat =
IS_NULL_PTR(display) ? NULL : gdk_display_get_default_seat(display);
3100 GdkDevice *pointer =
IS_NULL_PTR(seat) ? NULL : gdk_seat_get_pointer(seat);
3103 GtkAllocation allocation = { 0 };
3112 gdk_window_get_device_position(window, pointer, &pointer_x, &pointer_y, NULL);
3113 gtk_widget_get_allocation(center, &allocation);
3128 gboolean handled =
FALSE;
3136 gboolean sample_changed =
FALSE;
3137 float mouse_point[2] = { (float)
x, (
float)y };
3139 const float delta[2] = {
3146 float anchor[2] = { 0.0f };
3148 const float box[4] = {
3149 fmaxf(0.0,
MIN(anchor[0], mouse_point[0]) -
delta[0]),
3150 fmaxf(0.0,
MIN(anchor[1], mouse_point[1]) -
delta[1]),
3151 fminf(1.0,
MAX(anchor[0], mouse_point[0]) +
delta[0]),
3152 fminf(1.0,
MAX(anchor[1], mouse_point[1]) +
delta[1])
3157 for(
int k = 0;
k < 4;
k++)
3158 sample_changed |= (image_box[
k] != box[
k]);
3165 float image_point[2] = { 0.0f };
3167 sample_changed = memcmp(image_point, mouse_point,
sizeof(mouse_point)) != 0;
3174 else if(picker_active)
3252 dev->
roi.
x = roi[0];
3253 dev->
roi.
y = roi[1];
3286 dev->
roi.
x = roi[0];
3287 dev->
roi.
y = roi[1];
3350 which,
type,
x, y, pressure);
3362 float point[2] = { (float)
x, (
float)y };
3366 float handle[2] = { 6.0f, 6.0f };
3376 const float delta_x = 0.01f;
3386 memcpy(sample->
point, raw_point,
sizeof(raw_point));
3392 gboolean on_corner_prev_box =
TRUE;
3393 float opposite[2] = { 0.0f };
3395 if(fabsf(
point[0] - image_box[0]) <= handle[0])
3396 opposite[0] = image_box[2];
3397 else if(fabsf(
point[0] - image_box[2]) <= handle[0])
3398 opposite[0] = image_box[0];
3400 on_corner_prev_box =
FALSE;
3402 if(fabsf(
point[1] - image_box[1]) <= handle[1])
3403 opposite[1] = image_box[3];
3404 else if(fabsf(
point[1] - image_box[3]) <= handle[1])
3405 opposite[1] = image_box[1];
3407 on_corner_prev_box =
FALSE;
3409 if(on_corner_prev_box)
3411 float raw_opposite[2] = { opposite[0], opposite[1] };
3413 memcpy(sample->
point, raw_opposite,
sizeof(raw_opposite));
3418 fmaxf(0.0,
point[0] - delta_x),
3419 fmaxf(0.0,
point[1] - delta_y),
3420 fminf(1.0,
point[0] + delta_x),
3421 fminf(1.0,
point[1] + delta_y)
3451 if(
point[0] < live_box[0] ||
point[0] > live_box[2]
3452 ||
point[1] < live_box[1] ||
point[1] > live_box[3])
3460 MAX(26.0f, roundf(3.0f * zoom_scale)),
3461 MAX(26.0f, roundf(3.0f * zoom_scale))
3466 float live_point[2] = { live_sample->
point[0], live_sample->
point[1] };
3468 if(fabsf(
point[0] - live_point[0]) > slop[0]
3469 || fabsf(
point[1] - live_point[1]) > slop[1])
3515 float new_scale = 1.f;
3523 const float point[2] = {
x, y };
3535 const float epsilon = fabsf(old_scaling - new_scaling);
3536 if(fabsf(new_scaling - 1.0f) < epsilon)
3544 float center[2] = { 0.0f };
3545 float mouse_offset[2] = {
point[0],
point[1] };
3547 mouse_offset[0] -= center[0];
3548 mouse_offset[1] -= center[1];
3555 if(old_zoom <= 1e-6f || new_zoom <= 1e-6f)
3562 int proc_w = 0.f, proc_h = 0.f;
3564 dev->
roi.
x += mouse_offset[0] * (1.f / old_zoom - 1.f / new_zoom) / proc_w;
3565 dev->
roi.
y += mouse_offset[1] * (1.f / old_zoom - 1.f / new_zoom) / proc_h;
3584 const float step = 1.02f;
3585 const float new_scaling = dev->
roi.
scaling * powf(step, (
float)-flow);
3586 const float point[2] = {
x, y };
3598 up,
x, y,
state, delta_y);
3649 const gboolean shift =
dt_modifier_is(event->state, GDK_SHIFT_MASK);
3650 const gboolean ctrl =
dt_modifier_is(event->state, GDK_CONTROL_MASK);
3656 const float zoom_step = 1.1f;
3657 float center[2] = { 0.0f };
3669 float multiplier = (shift) ? 4.f :
3673 float delta[2] = { 10.f * multiplier, 10.f * multiplier };
3702 case GDK_KEY_Escape:
void dt_accels_connect_accels(dt_accels_t *accels)
Actually enable accelerators after having loaded user config.
void dt_accels_connect_active_group(dt_accels_t *accels, const gchar *group)
Connect the contextual active accels group to the window. Views can declare their own set of contextu...
void dt_accels_disconnect_active_group(dt_accels_t *accels)
Disconnect the contextual active accels group from the window.
void dt_accels_new_virtual_shortcut(dt_accels_t *accels, GtkAccelGroup *accel_group, const gchar *accel_path, GtkWidget *widget, guint key_val, GdkModifierType accel_mods)
Add a new virtual shortcut. Virtual shortcuts are immutable, read-only and don't trigger any action....
gchar * dt_accels_build_path(const gchar *scope, const gchar *feature)
void dt_accels_attach_scroll_handler(dt_accels_t *accels, gboolean(*callback)(GdkEventScroll event, void *data), void *data)
Attach a new global scroll event callback. So far this is used in darkroom to redirect scroll events ...
void dt_accels_detach_scroll_handler(dt_accels_t *accels)
void dt_atomic_set_int(dt_atomic_int *var, int value)
int dt_atomic_add_int(dt_atomic_int *var, int incr)
float dt_bauhaus_slider_get(GtkWidget *widget)
int dt_bauhaus_combobox_get(GtkWidget *widget)
void dt_bauhaus_combobox_set_entries_ellipsis(GtkWidget *widget, PangoEllipsizeMode ellipis)
const char * dt_bauhaus_combobox_get_text(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)
static void set_color(cairo_t *cr, GdkRGBA color)
#define DT_BAUHAUS_COMBOBOX_NEW_FULL(bauhaus, widget, action, label, tip, pos, callback, data,...)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
static const float scaling
GList * dt_collection_get_all(const dt_collection_t *collection, int limit)
void dt_iop_color_picker_init(void)
void dt_iop_color_picker_cleanup(void)
void dt_iop_color_picker_reset(dt_iop_module_t *module, gboolean keep)
gboolean dt_iop_color_picker_is_visible(const dt_develop_t *dev)
static void profile_changed(GtkWidget *widget, gpointer user_data)
@ DT_LIB_COLORPICKER_SIZE_POINT
@ DT_LIB_COLORPICKER_SIZE_BOX
@ DT_COLORSPACES_PROFILE_TYPE_SOFTPROOF
static dt_aligned_pixel_t XYZ
static dt_aligned_pixel_t Lab
static dt_aligned_pixel_t RGB
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_image_check_camera_missing_sample(const struct dt_image_t *img)
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
void dt_conf_set_float(const char *name, float val)
float dt_conf_get_float(const char *name)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
void dt_ctl_switch_mode_to(const char *mode)
int32_t dt_control_get_mouse_over_id()
void dt_control_set_mouse_over_id(int32_t value)
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_log_busy_leave()
void dt_control_commit_cursor()
void dt_control_queue_cursor_by_name(const char *curs_str)
Queue a GTK named cursor for the next cursor commit.
void dt_control_set_keyboard_over_id(int32_t value)
#define dt_control_change_cursor(cursor)
#define dt_control_queue_cursor(cursor)
#define dt_control_set_cursor_visible(visible)
static gboolean _quickbutton_press_release(GtkWidget *button, GdkEventButton *event, GtkWidget *popover)
void init(dt_view_t *self)
static void _overexposed_quickbutton_clicked(GtkWidget *w, gpointer user_data)
static dt_darkroom_layout_t _lib_darkroom_get_layout(dt_view_t *self)
static gboolean _darkroom_autoset_button_is_running
static gboolean mouse_in_actionarea(dt_view_t *self, double x, double y)
static gboolean _darkroom_edge_pan_tick(gpointer user_data)
Move the darkroom ROI while a drag stays in the center-widget edge band.
static void _darkroom_ioporder_quickbutton_clicked(GtkButton *button, gpointer user_data)
void leave(dt_view_t *self)
static void _darkroom_sample_raw_point_to_image_norm(const dt_colorpicker_sample_t *const sample, float point[2])
static uint64_t _darkroom_preview_fallback_backbuf_hash
static void _darkroom_image_loaded_callback(gpointer instance, guint request_id, guint result, gpointer user_data)
#define DARKROOM_EDGE_PAN_SPEED_PX_PER_S
static int _darkroom_preview_fallback_height
static dt_dev_pixelpipe_cache_wait_t _darkroom_preview_wait
static gboolean _is_scroll_captured_by_widget()
void connect_button_press_release(GtkWidget *w, GtkWidget *p)
int button_pressed(dt_view_t *self, double x, double y, double pressure, int which, int type, uint32_t state)
static void _release_expose_source_caches(void)
static void display_borders_callback(GtkWidget *slider, gpointer user_data)
static void rawoverexposed_threshold_callback(GtkWidget *slider, gpointer user_data)
static void display_brightness_callback(GtkWidget *slider, gpointer user_data)
static void _guides_quickbutton_clicked(GtkWidget *widget, gpointer user_data)
gboolean _switch_to_prev_picture(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static gboolean _darkroom_toolbox_button_activate_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
void cleanup(dt_view_t *self)
static dt_iop_module_t * _darkroom_pending_focus_module
#define DARKROOM_EDGE_PAN_INTERVAL_MS
static cairo_status_t _write_snapshot_data(void *closure, const unsigned char *data, unsigned int length)
static void display_mask_checker_1_callback(GtkColorButton *widget, gpointer user_data)
Persist the global mask-preview appearance and resynchronize every node using it.
static darkroom_locked_surface_t _darkroom_preview_locked
static gboolean _darkroom_is_only_selected_sample(gboolean is_primary_sample, dt_colorpicker_sample_t *selected_sample, gboolean display_samples)
static void display_mask_black_and_white_callback(GtkToggleButton *toggle, gpointer user_data)
static gboolean mouse_in_imagearea(dt_view_t *self, double x, double y)
static gboolean _is_in_frame(const int width, const int height, const int x, const int y)
static darkroom_locked_surface_t _darkroom_main_locked
static int _darkroom_preview_fallback_width
void reset(dt_view_t *self)
static gboolean _darkroom_locked_main_valid_for_zoom(const darkroom_expose_state_t *state, const uint64_t zoom_hash)
static void display_mask_checker_2_callback(GtkColorButton *widget, gpointer user_data)
static gboolean _render_preview_fallback_surface(cairo_t *cr)
#define DARKROOM_EDGE_PAN_MARGIN_PX
static void _render_iso12646(cairo_t *cr, double width, double height, int border)
static void _dev_change_image(dt_view_t *self, const int32_t imgid)
static GtkWidget * _darkroom_ioporder_button
static void _darkroom_set_default_cursor(dt_view_t *self, double x, double y)
static gboolean _darkroom_edge_pan_apply(dt_view_t *self, const double pointer_x, const double pointer_y, const int width, const int height)
Apply one edge-pan step when the current drag is still eligible.
static gboolean _toolbar_show_popup(gpointer user_data)
static void _preview_pipe_finished(gpointer instance, gpointer user_data)
static void _darkroom_edge_pan_update_state(dt_view_t *self, const double pointer_x, const double pointer_y, const int width, const int height, darkroom_edge_pan_test_t *edge)
Test every condition that allows edge-pan for the current pointer.
static gboolean _lock_pipe_surface(dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, darkroom_locked_surface_t *locked, const gboolean keep_previous_on_fail, const gboolean lock_read)
static void upper_callback(GtkWidget *slider, gpointer user_data)
int scrolled(dt_view_t *self, double x, double y, int up, int state, int delta_y)
static gboolean _build_preview_fallback_surface(dt_develop_t *dev, const int width, const int height, const int border, const dt_aligned_pixel_t bg_color, const uint64_t zoom_hash)
static void colorscheme_callback(GtkWidget *combo, gpointer user_data)
static void _delayed_history_commit(gpointer data)
int key_pressed(dt_view_t *self, GdkEventKey *event)
static GtkWidget * _darkroom_autoset_popover
static uint64_t _darkroom_preview_fallback_zoom_hash
static void _key_scroll(dt_develop_t *dev)
static void _release_preview_fallback_surface(void)
gboolean _focus_main_image(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static gboolean _center_view_free_zoom(dt_view_t *self, double x, double y, int up, int state, int flow)
void mouse_leave(dt_view_t *self)
static void _darkroom_reset_expose_state(darkroom_expose_state_t *state)
static void _darkroom_restart_cache_wait(gpointer user_data)
void mouse_moved(dt_view_t *self, double x, double y, double pressure, int which)
static gboolean _darkroom_toolbox_button_focus_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static void rawoverexposed_colorscheme_callback(GtkWidget *combo, gpointer user_data)
void configure(dt_view_t *self, int wd, int ht)
static void _softproof_quickbutton_clicked(GtkWidget *w, gpointer user_data)
uint32_t view(const dt_view_t *self)
static void lower_callback(GtkWidget *slider, gpointer user_data)
static void _darkroom_log_image_load_error(const int ret)
int button_released(dt_view_t *self, double x, double y, int which, uint32_t state)
static void _view_darkroom_filmstrip_activate_callback(gpointer instance, int32_t imgid, gpointer user_data)
static dt_autoset_manager_t * _autoset_manager
static void _reset_edge_pan()
static void _guides_view_changed(gpointer instance, dt_view_t *old_view, dt_view_t *new_view, dt_lib_module_t *self)
void enter(dt_view_t *self)
static void _darkroom_change_rendering_size(GtkWidget *combobox, gpointer user_data)
static cairo_surface_t * _darkroom_preview_fallback_surface
static gboolean _render_main_locked_surface(cairo_t *cr, dt_develop_t *dev, darkroom_locked_surface_t *locked, const int width, const int height, const int border, const dt_aligned_pixel_t bg_color)
static void display_mask_checker_size_callback(GtkWidget *slider, gpointer user_data)
static float _darkroom_edge_pan_velocity(const double position, const double size, const float margin)
static GtkWidget * _darkroom_autoset_list
static void _darkroom_autoset_popover_rebuild(dt_develop_t *dev)
static void _darkroom_autoset_quickbutton_clicked(GtkButton *button, gpointer user_data)
static void rawoverexposed_mode_callback(GtkWidget *combo, gpointer user_data)
static void _gamut_quickbutton_clicked(GtkWidget *w, gpointer user_data)
static dt_dev_pixelpipe_cache_wait_t _darkroom_main_wait
static void _display_quickbutton_clicked(GtkWidget *w, gpointer user_data)
void expose(dt_view_t *self, cairo_t *cri, int32_t width, int32_t height, int32_t pointerx, int32_t pointery)
static void _rawoverexposed_quickbutton_clicked(GtkWidget *w, gpointer user_data)
static void _darkroom_sample_raw_box_to_image_norm(const dt_colorpicker_sample_t *const sample, float box[4])
static int _change_scaling(dt_develop_t *dev, const float point[2], const float new_scaling)
gboolean _switch_to_next_picture(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static gchar * _darkroom_autoset_label(const dt_iop_module_t *module)
static int32_t _darkroom_preview_fallback_imgid
static void _get_final_size_with_iso_12646(dt_develop_t *d)
static gboolean _darkroom_edge_pan_enable_check(dt_develop_t *dev)
static void _paint_all(cairo_t *cri, cairo_t *cr, cairo_surface_t *image_surface)
static void _darkroom_autoset_popover_refresh(gpointer instance, gpointer user_data)
void gui_init(dt_view_t *self)
static void _darkroom_autoset_button_set_running(const gboolean running)
Reflect autoset processing state on the darkroom quick button.
static void _update_softproof_gamut_checking(dt_develop_t *d)
static GtkWidget * _darkroom_autoset_button
gboolean _scroll_on_focus(GdkEventScroll event, void *data)
static void softproof_profile_callback(GtkWidget *combo, gpointer user_data)
int try_enter(dt_view_t *self)
void mouse_enter(dt_view_t *self)
static int32_t _darkroom_pending_imgid
static void _darkroom_autoset_module_toggled(GtkToggleButton *toggle, gpointer user_data)
static void _release_locked_surface(darkroom_locked_surface_t *locked)
static void mode_callback(GtkWidget *slider, gpointer user_data)
static gboolean _darkroom_center_pan_drag
static void _darkroom_prepare_image_surface(dt_develop_t *dev, const int width, const int height, darkroom_expose_state_t *state)
static void _iso_12646_quickbutton_clicked(GtkWidget *w, gpointer user_data)
static void _darkroom_pickers_draw(dt_view_t *self, cairo_t *cri, int32_t width, int32_t height, int32_t pozx, int32_t pozy, GSList *samples, gboolean is_primary_sample)
Draw colorpicker samples overlays in darkroom view.
void _colormanage_ui_color(const float L, const float a, const float b, dt_aligned_pixel_t RGB)
static gboolean _darkroom_preview_fallback_valid(const dt_develop_t *dev, const int width, const int height, const uint64_t zoom_hash)
void dt_show_times_f(const dt_times_t *start, const char *prefix, const char *suffix,...)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
static gboolean dt_modifiers_include(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
float dt_boundingbox_t[4]
#define DT_MODULE(MODVER)
static void dt_get_times(dt_times_t *t)
static uint64_t dt_hash(uint64_t hash, const char *str, size_t size)
static double dt_get_wtime(void)
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...
void dt_dev_history_free_history(dt_develop_t *dev)
Free the whole history list attached to dev->history.
void dt_dev_pop_history_items(dt_develop_t *dev)
Thread-safe wrapper around dt_dev_pop_history_items_ext(), then update GUI.
void dt_dev_history_gui_update(dt_develop_t *dev)
Apply history-loaded params to module GUIs.
#define dt_dev_add_history_item(dev, module, enable, redraw)
void dt_dev_pixelpipe_cache_wait_cleanup(dt_dev_pixelpipe_cache_wait_t *wait, const char *reason)
Cancel one pending GUI cache wait request and clear its runtime state.
gboolean dt_dev_pixelpipe_is_backbufer_valid(dt_dev_pixelpipe_t *pipe)
void dt_dev_pixelpipe_cache_wait_dump_pending(const char *reason)
Dump pending GUI cache wait requests for lifecycle debugging.
void dt_dev_pixelpipe_change_zoom_main(dt_develop_t *dev)
void dt_dev_pixelpipe_cache_wait_set_owner(dt_dev_pixelpipe_cache_wait_t *wait, const char *owner_tag, gpointer owner_object)
Attach debug ownership metadata to one cache wait request.
gboolean dt_dev_pixelpipe_cache_peek_gui(dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, void **data, dt_pixel_cache_entry_t **cache_entry, dt_dev_pixelpipe_cache_wait_t *wait, dt_dev_pixelpipe_cache_ready_callback_t restart, gpointer restart_data)
#define dt_dev_pixelpipe_rebuild_all(dev)
#define dt_dev_pixelpipe_resync_history_main(dev)
#define dt_dev_pixelpipe_update_history_main(dev)
#define dt_dev_pixelpipe_update_history_preview(dev)
void dt_dev_get_processed_size(const dt_develop_t *dev, int *procw, int *proch)
int dt_dev_get_thumbnail_size(dt_develop_t *dev)
void dt_dev_get_image_box_in_widget(const dt_develop_t *dev, const int32_t width, const int32_t height, float *box)
Get the displayed image rectangle in darkroom widget coordinates.
void dt_dev_get_widget_center(const dt_develop_t *dev, float *point)
Get the center of the darkroom widget in logical coordinates.
void dt_dev_cleanup(dt_develop_t *dev)
float dt_dev_get_overlay_scale(dt_develop_t *dev)
Get the overlay scale factor in GUI logical coordinates.
dt_dev_image_storage_t dt_dev_load_image(dt_develop_t *dev, const int32_t imgid)
void dt_dev_init(dt_develop_t *dev, int32_t gui_attached)
void dt_dev_undo_start_record(dt_develop_t *dev)
void dt_dev_coordinates_raw_norm_to_image_norm(dt_develop_t *dev, float *points, size_t num_points)
void dt_dev_check_zoom_pos_bounds(dt_develop_t *dev, float *dev_x, float *dev_y, float *box_w, float *box_h)
Ensure that the current ROI position is within allowed bounds .
gboolean dt_dev_check_zoom_scale_bounds(dt_develop_t *dev)
Ensure that the current zoom level is within allowed bounds (for scrolling).
void dt_dev_reset_roi(dt_develop_t *dev)
GList * dt_dev_load_modules(dt_develop_t *dev)
void dt_dev_set_backbuf(dt_backbuf_t *backbuf, const int width, const int height, const size_t bpp, const int64_t hash, const int64_t history_hash)
float dt_dev_get_widget_zoom_scale(const dt_develop_t *dev, const float scaling)
Convert a darkroom scaling factor to GUI logical zoom.
void dt_dev_coordinates_image_norm_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
gboolean dt_dev_pipelines_share_preview_output(dt_develop_t *dev)
Tell whether the darkroom main and preview pipes currently target the same GUI output.
void dt_dev_masks_update_hash(dt_develop_t *dev)
gboolean dt_dev_clip_roi(dt_develop_t *dev, cairo_t *cr, int32_t width, int32_t height)
Clip the view to the ROI. WARNING: this must be done before any translation.
void dt_dev_undo_end_record(dt_develop_t *dev)
gboolean dt_dev_rescale_roi(dt_develop_t *dev, cairo_t *cr, int32_t width, int32_t height)
Scale the ROI to fit within given width/height, centered.
void dt_dev_coordinates_widget_delta_to_image_delta(dt_develop_t *dev, float *points, size_t num_points)
Convert a widget-space distance to processed-image pixels.
float dt_dev_get_fit_scale(dt_develop_t *dev)
Get the scale factor that maps preview-buffer pixels to GUI coordinates.
void dt_dev_coordinates_widget_to_image_norm(dt_develop_t *dev, float *points, size_t num_points)
Coordinate conversion helpers between widget, normalized image, and absolute image spaces.
gchar * dt_history_item_get_name(const struct dt_iop_module_t *module)
void dt_dev_start_all_pipelines(dt_develop_t *dev)
@ DT_DEV_IMAGE_STORAGE_DB_NOT_READ
@ DT_DEV_IMAGE_STORAGE_MIPMAP_NOT_FOUND
#define dt_dev_configure(dev, wd, ht)
void dtgtk_cairo_paint_bulb(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_overexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_gamut_check(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_grid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_flowchart(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
Paint the flowchart icon using normalized 0..1 coordinates.
void dtgtk_cairo_paint_rawoverexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_softproof(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_wand(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_display(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
#define dt_pthread_rwlock_wrlock
#define dt_pthread_rwlock_unlock
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
static guint dt_keys_mainpad_alternatives(const guint key_val)
Remap keypad keys to usual mainpad ones.
void dt_gui_remove_class(GtkWidget *widget, const gchar *class_name)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
GtkWidget * dt_gui_get_popup_relative_widget(GtkWidget *widget, GdkRectangle *rect)
Resolve the widget used as parent for nested popups on Wayland.
void dt_gui_refocus_center()
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
GtkWidget * dt_ui_center(dt_ui_t *ui)
get the center drawable widget
static cairo_surface_t * dt_cairo_image_surface_create(cairo_format_t format, int width, int height)
#define dt_accels_new_darkroom_action(a, b, c, d, e, f, g)
static GtkWidget * dt_ui_section_label_new(const gchar *str)
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
static GtkWidget * dt_ui_label_new(const gchar *str)
void dt_gui_throttle_cancel(gpointer source)
void dt_gui_throttle_queue(gpointer source, dt_gui_throttle_callback_t callback, gpointer user_data)
void dt_guides_draw(cairo_t *cr, const float left, const float top, const float width, const float height, const float zoom_scale)
void dt_guides_update_popover_values()
void dt_guides_set_overlay_colors()
GtkWidget * dt_guides_popover(dt_view_t *self, GtkWidget *button)
void dt_guides_button_toggled(gboolean active)
void dt_guides_update_button_state()
void dt_iop_gui_cleanup_module(dt_iop_module_t *module)
void dt_iop_gui_set_expander(dt_iop_module_t *module)
void dt_iop_gui_init(dt_iop_module_t *module)
void dt_iop_cleanup_module(dt_iop_module_t *module)
void dt_iop_gui_update_expanded(dt_iop_module_t *module)
void dt_iop_request_focus(dt_iop_module_t *module)
gboolean dt_iop_is_hidden(dt_iop_module_t *module)
void dt_bauhaus_value_changed_default_callback(GtkWidget *widget)
@ IOP_FLAGS_GUIDES_SPECIAL_DRAW
int dt_iop_autoset_advance(struct dt_develop_t *dev, dt_autoset_manager_t *manager)
gboolean dt_iop_autoset_module_is_enabled(const dt_iop_module_t *module)
void dt_iop_autoset_build_list(struct dt_develop_t *dev, dt_autoset_manager_t *manager)
void dt_iop_autoset_module_set_enabled(const dt_iop_module_t *module, const gboolean enabled)
void dt_control_flush_jobs_queue(dt_control_t *control, dt_job_queue_t queue_id)
void dt_lib_colorpicker_set_box_area(dt_lib_t *lib, const dt_boundingbox_t box)
gboolean dt_lib_gui_get_expanded(dt_lib_module_t *module)
void dt_lib_colorpicker_set_point(dt_lib_t *lib, const float pos[2])
dt_lib_module_t * dt_lib_get_module(const char *name)
float *const restrict const size_t k
void dt_masks_events_post_expose(struct dt_iop_module_t *module, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery)
int dt_masks_events_key_pressed(struct dt_iop_module_t *module, GdkEventKey *event)
void dt_masks_free_form(dt_masks_form_t *form)
void dt_masks_gui_init(struct dt_develop_t *dev)
int dt_masks_events_button_released(struct dt_iop_module_t *module, double x, double y, int which, uint32_t state)
int dt_masks_events_mouse_moved(struct dt_iop_module_t *module, double x, double y, double pressure, int which)
int dt_masks_events_mouse_scrolled(struct dt_iop_module_t *module, double x, double y, int up, uint32_t state, int delta_y)
int dt_masks_events_mouse_leave(struct dt_iop_module_t *module)
int dt_masks_events_button_pressed(struct dt_iop_module_t *module, double x, double y, double pressure, int which, int type, uint32_t state)
int dt_masks_events_mouse_enter(struct dt_iop_module_t *module)
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
#define DEVELOP_MASKS_NB_SHAPES
void dt_masks_gui_cleanup(struct dt_develop_t *dev)
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)
#define CLAMPF(a, mn, mx)
dt_mipmap_size_t dt_mipmap_cache_get_fitting_size(const dt_mipmap_cache_t *cache, const int32_t width, const int32_t height, const uint32_t imgid)
#define dt_mipmap_cache_get(A, B, C, D, E, F)
#define dt_mipmap_cache_release(A, B)
float dt_aligned_pixel_t[4]
void * dt_pixel_cache_entry_get_data(dt_pixel_cache_entry_t *entry)
void dt_dev_pixelpipe_cache_unref_hash(dt_dev_pixelpipe_cache_t *cache, const uint64_t hash)
Find the entry matching hash, and decrease its ref_count if found.
void dt_dev_pixelpipe_cache_flush_clmem_for_pipe(dt_dev_pixelpipe_cache_t *cache, const int devid)
Like dt_dev_pixelpipe_cache_flush_clmem(), for callers that do not hold darktable....
size_t dt_pixel_cache_entry_get_size(dt_pixel_cache_entry_t *entry)
Peek the size (in bytes) reserved for the host buffer of a cache entry.
void dt_dev_pixelpipe_cache_rdlock_entry(dt_dev_pixelpipe_cache_t *cache, gboolean lock, dt_pixel_cache_entry_t *cache_entry)
Lock or release the read lock on the entry.
#define DT_PIXELPIPE_CACHE_HASH_INVALID
void dt_dev_pixelpipe_cleanup_nodes(dt_dev_pixelpipe_t *pipe)
static void dt_dev_backbuf_set_hash(dt_backbuf_t *backbuf, const uint64_t hash)
static uint64_t dt_dev_backbuf_get_hash(const dt_backbuf_t *backbuf)
int32_t dt_selection_get_first_id(struct dt_selection_t *selection)
int dt_selection_get_length(struct dt_selection_t *selection)
void dt_selection_clear(dt_selection_t *selection)
void dt_selection_select_single(dt_selection_t *selection, int32_t imgid)
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_DEVELOP_INITIALIZE
This signal is raised when darktable.develop is initialized.
@ DT_SIGNAL_VIEWMANAGER_THUMBTABLE_ACTIVATE
@ DT_SIGNAL_DEVELOP_HISTORY_CHANGE
This signal is raised when develop history is changed no param, no returned value.
@ DT_SIGNAL_DEVELOP_IMAGE_CHANGED
This signal is raised when image is changed in darkroom.
@ DT_SIGNAL_CONTROL_PROFILE_USER_CHANGED
This signal is raised when a profile is changed by the user 1 uint32_t : the profile type that has ch...
@ DT_SIGNAL_DEVELOP_PREVIEW_PIPE_FINISHED
This signal is raised when develop preview pipe process is finished no param, no returned value.
@ DT_SIGNAL_DARKROOM_UI_CHANGED
Signal that the darkroom GUI color changed.
@ DT_SIGNAL_DEVELOP_MODULE_REMOVE
This signal is raised when a module is removed from the history stack 1 module no returned value.
@ DT_SIGNAL_VIEWMANAGER_VIEW_CHANGED
This signal is raised by viewmanager when a view has changed. 1 : dt_view_t * the old view 2 : dt_vie...
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
struct _GtkWidget GtkWidget
const float uint32_t state[4]
unsigned __int64 uint64_t
uint64_t pending_main_hash
uint64_t image_surface_hash
int32_t image_surface_imgid
gboolean image_surface_has_main
struct dt_pixel_cache_entry_t * entry
cairo_surface_t * surface
struct dt_dev_pixelpipe_cache_t * pixelpipe_cache
struct dt_gui_gtk_t * gui
struct dt_colorspaces_t * color_profiles
struct dt_collection_t * collection
struct dt_mipmap_cache_t * mipmap_cache
struct dt_selection_t * selection
struct dt_control_signal_t * signals
struct dt_bauhaus_t * bauhaus
struct dt_develop_t * develop
struct dt_view_manager_t * view_manager
struct dt_control_t * control
GtkAccelGroup * darkroom_accels
gboolean progress_cursor_active
void(* default_value_changed_callback)(GtkWidget *widget)
PangoFontDescription * pango_font_desc
dt_lib_colorpicker_size_t size
dt_colorspaces_color_profile_type_t type
dt_colorspaces_color_profile_type_t softproof_type
cmsHTRANSFORM transform_xyz_to_display
dt_colorspaces_color_mode_t mode
char softproof_filename[512]
dt_pthread_mutex_t busy_mutex
cairo_surface_t * image_surface
struct dt_develop_t::@25 profile
struct dt_develop_t::@19 color_picker
Authoritative darkroom color-picker state.
struct dt_develop_t::@23 display
struct dt_colorpicker_sample_t * primary_sample
dt_backbuf_t display_histogram
dt_backbuf_t output_histogram
struct dt_develop_t::@24 iso_12646
struct dt_iop_module_t * gui_module
dt_pthread_rwlock_t history_mutex
dt_clipping_preview_mode_t mode
struct dt_develop_t::@20::@27 snapshot
GtkWidget * floating_window
struct dt_dev_pixelpipe_t * preview_pipe
gboolean pipelines_started
struct dt_dev_pixelpipe_t * virtual_pipe
dt_aligned_pixel_t wb_coeffs
struct dt_iop_module_t *struct dt_iop_color_picker_t * picker
dt_dev_overexposed_colorscheme_t colorscheme
dt_backbuf_t raw_histogram
struct dt_masks_form_gui_t * form_gui
struct dt_develop_t::@17 roi
struct dt_colorpicker_sample_t * selected_sample
struct dt_develop_t::@20 proxy
dt_pthread_rwlock_t masks_mutex
struct dt_develop_t::@22 rawoverexposed
struct dt_dev_pixelpipe_t * pipe
GtkWidget * softproof_button
struct dt_develop_t::@21 overexposed
gboolean block_normal_pan
struct dt_gui_gtk_t::@47 mouse
GtkWidget * has_scroll_focus
struct dt_gui_gtk_t::@46 pan_edge
dt_iop_module_t *dt_iop_color_picker_kind_t kind
GModule *dt_dev_operation_t op
struct dt_develop_blend_params_t * blend_params
GModule *dt_dev_operation_t op
dt_thumbtable_t * thumbtable_lighttable
dt_thumbtable_t * thumbtable_filmstrip
struct dt_view_manager_t::@67 proxy
GtkWidget * guides_popover
dt_darkroom_layout_t(* get_layout)(struct dt_view_t *view)
void(* set_default_cursor)(struct dt_view_t *view, double x, double y)
GtkWidget * guides_toggle
struct dt_view_manager_t::@67::@70 darkroom
typedef double((*spd)(unsigned long int wavelength, double TempK))
int dt_thumbtable_scroll_to_selection(dt_thumbtable_t *table)
Scroll to show selected content.
void dt_thumbtable_update_parent(dt_thumbtable_t *table)
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit)
static void dt_thumbtable_show(dt_thumbtable_t *table)
Show the thumbnail table widget.
static void dt_thumbtable_hide(dt_thumbtable_t *table)
Hide the thumbnail table widget.
void dt_undo_clear(dt_undo_t *self, uint32_t filter)
char * dt_get_help_url(char *name)
void dt_view_manager_module_toolbox_add(dt_view_manager_t *vm, GtkWidget *tool, dt_view_type_flags_t views)
void dt_view_active_images_add(int32_t imgid, gboolean raise)
void dt_view_active_images_reset(gboolean raise)
int dt_view_manager_switch(dt_view_manager_t *vm, const char *view_name)
void dt_view_image_info_update(int32_t imgid)
int32_t dt_view_active_images_get_first()
const dt_view_t * dt_view_manager_get_current_view(dt_view_manager_t *vm)
@ DT_DARKROOM_LAYOUT_EDITING