124#ifdef GDK_WINDOWING_QUARTZ
128#include <gdk/gdkkeysyms.h>
134#include <sys/types.h>
139#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f))
148 double full_delta[2];
152#define DARKROOM_EDGE_PAN_INTERVAL_MS 64
153#define DARKROOM_EDGE_PAN_MARGIN_PX DT_PIXEL_APPLY_DPI(50)
154#define DARKROOM_EDGE_PAN_SPEED_PX_PER_S 360.0f
183 if(module && module->show_popup)
184 module->show_popup(module);
205 running ? _(
"Autoset is running on selected modules")
206 : _(
"Run autoset on selected modules\nRight click for options"));
216 return _(
"Darkroom");
259 "darkroom-cleanup-autoset-manager");
286 const int fd = GPOINTER_TO_INT(closure);
287 ssize_t res = write(fd, data, length);
289 return CAIRO_STATUS_WRITE_ERROR;
290 return CAIRO_STATUS_SUCCESS;
300 return !is_primary_sample && selected_sample && !display_samples;
314 memcpy(box, sample->
box,
sizeof(
float) * 4);
331 int32_t
width, int32_t
height, int32_t pozx, int32_t pozy,
332 GSList *samples, gboolean is_primary_sample)
344 const double lw = 1.0 / scale;
345 const double dashes[1] = {
lw * 4.0 };
350 cairo_set_line_cap(cri, CAIRO_LINE_CAP_SQUARE);
353 const gboolean only_selected_sample
357 for( ; samples; samples = g_slist_next(samples))
360 if(only_selected_sample && (sample != selected_sample))
367 double half_px = 0.5;
368 const double min_half_px_device = 4.0;
370 gboolean show_preview_pixel_scale =
TRUE;
375 float image_box[4] = { 0.0f };
377 double x = image_box[0] * wd, y = image_box[1] * ht,
378 w = image_box[2] * wd, h = image_box[3] * ht;
379 cairo_user_to_device(cri, &
x, &y);
380 cairo_user_to_device(cri, &w, &h);
385 cairo_device_to_user(cri, &
x, &y);
386 cairo_device_to_user(cri, &w, &h);
387 cairo_rectangle(cri,
x, y, w -
x, h - y);
388 if(is_primary_sample)
391 const double hw = 5. / scale;
392 cairo_rectangle(cri,
x - hw, y - hw, 2. * hw, 2. * hw);
393 cairo_rectangle(cri,
x - hw, h - hw, 2. * hw, 2. * hw);
394 cairo_rectangle(cri, w - hw, y - hw, 2. * hw, 2. * hw);
395 cairo_rectangle(cri, w - hw, h - hw, 2. * hw, 2. * hw);
401 float image_point[2] = { 0.0f };
403 double x = image_point[0] * wd;
404 double y = image_point[1] * ht;
405 cairo_user_to_device(cri, &
x, &y);
409 half_px = round(half_px * scale);
410 if(half_px < min_half_px_device)
412 half_px = min_half_px_device;
413 show_preview_pixel_scale =
FALSE;
416 double crosshair = (is_primary_sample ? 4. : 5.) * half_px;
417 if(sample == selected_sample) crosshair *= 2;
418 cairo_device_to_user(cri, &
x, &y);
419 cairo_device_to_user_distance(cri, &crosshair, &half_px);
422 if(is_primary_sample)
423 cairo_arc(cri,
x, y, crosshair, 0., 2. *
M_PI);
425 cairo_move_to(cri,
x - crosshair, y);
426 cairo_line_to(cri,
x + crosshair, y);
427 cairo_move_to(cri,
x, y - crosshair);
428 cairo_line_to(cri,
x, y + crosshair);
433 const double line_scale = (sample == selected_sample ? 2.0 : 1.0);
434 cairo_set_line_width(cri,
lw * 3.0 * line_scale);
435 cairo_set_source_rgba(cri, 0.0, 0.0, 0.0, 0.4);
436 cairo_stroke_preserve(cri);
438 const gboolean draw_dashed = !is_primary_sample
439 && sample != selected_sample
441 cairo_set_line_width(cri,
lw * line_scale);
442 cairo_set_dash(cri, dashes, draw_dashed, 0.0);
444 cairo_set_source_rgba(cri, 1.0, 1.0, 1.0, 0.8);
456 float image_point[2] = { 0.0f };
458 if(sample == selected_sample)
459 cairo_arc(cri, image_point[0] * wd, image_point[1] * ht, half_px * 2., 0., 2. *
M_PI);
460 else if(show_preview_pixel_scale)
461 cairo_rectangle(cri, image_point[0] * wd - half_px, image_point[1] * ht - half_px, half_px * 2., half_px * 2.);
463 cairo_arc(cri, image_point[0] * wd, image_point[1] * ht, half_px, 0., 2. *
M_PI);
480#ifndef DARKROOM_EXPOSE_DUMB_DEBUG
481#define DARKROOM_EXPOSE_DUMB_DEBUG 0
484#if DARKROOM_EXPOSE_DUMB_DEBUG
487static void _darkroom_debug_restart_cache_wait(gpointer user_data)
499 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
510 &_darkroom_main_debug_wait,
511 _darkroom_debug_restart_cache_wait, dev))
518 if(bw <= 0 || bh <= 0)
524 const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, bw);
525 const size_t required_size = (size_t)stride * (
size_t)bh;
533 cairo_surface_t *surface = cairo_image_surface_create_for_data((
unsigned char *)data, CAIRO_FORMAT_RGB24,
535 if(
IS_NULL_PTR(surface) || cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS)
537 if(surface) cairo_surface_destroy(surface);
542 float image_box[4] = { 0.0f };
544 const int wd = image_box[2];
545 const int ht = image_box[3];
546 cairo_translate(cr, image_box[0], image_box[1]);
549 cairo_rectangle(cr, 0, 0, wd, ht);
550 cairo_set_source_surface(cr, surface, 0, 0);
553 cairo_surface_destroy(surface);
591#if DARKROOM_EXPOSE_DUMB_DEBUG
616 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
618 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
624 const float preview_wd = wd / ppd;
625 const float preview_ht = ht / ppd;
627 float image_box[4] = { 0.0f };
634 if(image_box[2] > 0 && image_box[3] > 0)
637 cairo_translate(cr, image_box[0], image_box[1]);
649 const float roi_width = fminf(
width, preview_wd * preview_scale);
650 const float roi_height = fminf(
height, preview_ht * preview_scale);
651 const float rec_x = fmaxf(border, (
width - roi_width) * 0.5f);
652 const float rec_y = fmaxf(border, (
height - roi_height) * 0.5f);
653 const float rec_w = fminf(
width - 2 * border, roi_width);
654 const float rec_h = fminf(
height - 2 * border, roi_height);
655 cairo_rectangle(cr, rec_x, rec_y, rec_w, rec_h);
658 const float tx = 0.5f *
width - dev->
roi.
x * preview_wd * preview_scale;
659 const float ty = 0.5f *
height - dev->
roi.
y * preview_ht * preview_scale;
660 cairo_translate(cr, tx, ty);
661 cairo_scale(cr, preview_scale, preview_scale);
662 cairo_rectangle(cr, 0, 0, preview_wd, preview_ht);
682static void _paint_all(cairo_t *cri, cairo_t *cr, cairo_surface_t *image_surface)
686 cairo_set_source_surface(cri, image_surface, 0, 0);
723 &&
state->main_zoom_hash == zoom_hash;
732 state->main_zoom_hash = 0;
780#if DARKROOM_EXPOSE_DUMB_DEBUG
783 _render_main_direct_debug(cri, dev,
width,
height, border, bg_color_dbg);
790 .image_surface_height = 0,
792 .image_surface_has_main =
FALSE,
812 const gboolean main_backbuf_is_newer
814 const gboolean main_ready_for_current_view
816 const gboolean preview_matches_full_image
818 && full_width > 0 && full_height > 0
821 const gboolean full_image_backbuf_ready = main_ready_for_current_view || preview_matches_full_image;
824 const char *draw_source =
"background only";
826 gboolean drawn =
FALSE;
827 gboolean drawn_from_main =
FALSE;
831 cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
849 if(full_image_backbuf_ready)
856 if(main_ready_for_current_view)
868 drawn_from_main =
TRUE;
869 draw_source =
"fresh main backbuf";
872 else if(main_backbuf_is_newer && expose_state.
pending_main_hash != main_backbuf_hash)
888 if(!drawn && preview_matches_full_image)
891 "darkroom-preview",
FALSE)
901 drawn_from_main =
TRUE;
902 draw_source =
"fresh full-size preview backbuf";
910 if(!drawn && roi_changed && !full_image_backbuf_ready && preview_has_backbuf)
913 "darkroom-preview",
TRUE)
920 drawn_from_main =
FALSE;
921 draw_source =
"fresh preview fallback";
929 if(!drawn && roi_changed && !full_image_backbuf_ready
936 drawn_from_main =
FALSE;
937 draw_source =
"reused preview fallback";
950 drawn_from_main =
TRUE;
951 draw_source =
"reused last main backbuf";
963 draw_source, draw_hash);
971 :
"reused last preview surface";
975 draw_source, draw_hash);
981 cairo_set_source_rgb(cr, bg_color[0], bg_color[1], bg_color[2]);
985 draw_source, draw_hash);
1075 dt_control_log(_(
"Could not read image information from the database."));
1087 if(request_id == 0)
return;
1150 else if(num_selected > 1)
1152 dt_control_log(_(
"The current selection contains more than one image, which is ambiguous.\n"
1153 "Select exactly one image to enter the darkroom."));
1159 "Select exactly one image to enter the darkroom."));
1245 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &color);
1247 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker1/green", color.green);
1248 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker1/blue", color.blue);
1257 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &color);
1259 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker2/green", color.green);
1260 dt_conf_set_float(
"plugins/darkroom/colorbalancergb/checker2/blue", color.blue);
1276 dt_conf_set_bool(
"plugins/darkroom/colorbalancergb/mask_preview/greyscaled",
1277 gtk_toggle_button_get_active(toggle));
1293static void _overlay_cycle_callback(dt_action_t *action)
1296 const int nextval = (currentval + 1) % 6;
1302static void _toggle_mask_visibility_callback(dt_action_t *action)
1311 if(mod && strcmp(mod->
so->
op,
"spots") != 0 && strcmp(mod->
so->
op,
"retouch") != 0)
1327 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->masks_edit), bd->masks_shown !=
DT_MASKS_EDIT_OFF);
1332 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bd->masks_shapes[
n]),
FALSE);
1343 GdkModifierType modifier, gpointer data)
1350 GdkModifierType modifier, gpointer data)
1356 GList *current_item = g_list_find(current_collection, GINT_TO_POINTER(current_img));
1358 if(current_item && current_item->next)
1360 int32_t next_img = GPOINTER_TO_INT(current_item->next->data);
1361 g_list_free(current_collection);
1362 current_collection = NULL;
1367 g_list_free(current_collection);
1368 current_collection = NULL;
1375 GdkModifierType modifier, gpointer data)
1381 GList *current_item = g_list_find(current_collection, GINT_TO_POINTER(current_img));
1383 if(current_item && current_item->prev)
1385 int32_t prev_img = GPOINTER_TO_INT(current_item->prev->data);
1386 g_list_free(current_collection);
1387 current_collection = NULL;
1392 g_list_free(current_collection);
1393 current_collection = NULL;
1403 const gboolean autoset_running_before
1420 const gboolean autoset_running_after
1425 if(cache_ready && !autoset_running_after)
1427 const gboolean autoset_just_finished = autoset_running_before && !autoset_running_after;
1428 if(!autoset_running_before || autoset_just_finished)
1453 fprintf(stdout,
"lauching autoset\n");
1459 gchar *label = g_strdup_printf(
"%s (%i)", clean_name, module->
multi_priority);
1475 for(GList *child = children; child; child = g_list_next(child))
1476 gtk_widget_destroy(GTK_WIDGET(child->data));
1477 g_list_free(children);
1479 GtkWidget *title = gtk_label_new(_(
"Module instances to autoset"));
1483 for(GList *modules = g_list_last(dev->
iop); modules; modules = g_list_previous(modules))
1489 GtkWidget *toggle = gtk_check_button_new_with_label(label);
1513 N_(
"Switch to the next picture"), GDK_KEY_Right, GDK_MOD1_MASK, _(
"Triggers the action"));
1515 N_(
"Switch to the previous picture"), GDK_KEY_Left, GDK_MOD1_MASK, _(
"Triggers the action"));
1599 G_N_ELEMENTS(darkroom_toolbox_buttons));
1601 darkroom_toolbox_buttons, G_N_ELEMENTS(darkroom_toolbox_buttons));
1612 N_(
"Rendering size"),
1613 _(
"Choose at what size the main preview is rendered.\n"
1614 "Full resolution renders the pipeline at the raw original resolution.\n"
1615 "It is pixel-perfect, especially regarding denoising and deblurring, but very slow.\n"
1616 "Scaled renders at screen resolution and is the best trade-off.\n"
1617 "Pixel-level accuracy is guaranteed only when zoomed-in at 100%."),
1620 N_(
"full resolution (slow)"),
1621 N_(
"scaled (default)")
1623 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(rendering),
TRUE,
TRUE, 0);
1629 GtkWidget *checker_1 = gtk_color_button_new();
1630 GdkRGBA checker_color = {
1636 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(checker_1), &checker_color);
1637 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(checker_1),
FALSE);
1638 gtk_color_button_set_title(GTK_COLOR_BUTTON(checker_1),
1639 _(
"Select color of the checkerboard from a swatch"));
1641 gtk_box_pack_start(GTK_BOX(checker_1_row), checker_1,
FALSE,
FALSE, 0);
1642 gtk_box_pack_start(GTK_BOX(vbox), checker_1_row,
FALSE,
FALSE, 0);
1646 GtkWidget *checker_2 = gtk_color_button_new();
1647 checker_color.red =
dt_conf_get_float(
"plugins/darkroom/colorbalancergb/checker2/red");
1648 checker_color.green =
dt_conf_get_float(
"plugins/darkroom/colorbalancergb/checker2/green");
1649 checker_color.blue =
dt_conf_get_float(
"plugins/darkroom/colorbalancergb/checker2/blue");
1650 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(checker_2), &checker_color);
1651 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(checker_2),
FALSE);
1652 gtk_color_button_set_title(GTK_COLOR_BUTTON(checker_2),
1653 _(
"Select color of the checkerboard from a swatch"));
1655 gtk_box_pack_start(GTK_BOX(checker_2_row), checker_2,
FALSE,
FALSE, 0);
1656 gtk_box_pack_start(GTK_BOX(vbox), checker_2_row,
FALSE,
FALSE, 0);
1664 g_signal_connect(G_OBJECT(checker_size),
"value-changed",
1666 gtk_box_pack_start(GTK_BOX(vbox), checker_size,
TRUE,
TRUE, 0);
1668 GtkWidget *black_and_white = gtk_check_button_new_with_label(_(
"Show a greyscaled mask image"));
1669 gtk_toggle_button_set_active(
1670 GTK_TOGGLE_BUTTON(black_and_white),
1671 dt_conf_get_bool(
"plugins/darkroom/colorbalancergb/mask_preview/greyscaled"));
1672 g_signal_connect(G_OBJECT(black_and_white),
"toggled",
1674 gtk_box_pack_start(GTK_BOX(vbox), black_and_white,
FALSE,
FALSE, 0);
1676 gtk_widget_show_all(vbox);
1685 N_(
"Darkroom/Toolbox"),
1686 N_(
"Show the pipeline node graph"), 0, 0,
1687 _(
"Triggers the action"));
1694 _(
"toggle guide lines\nright click for guides options"));
1707 N_(
"Toggle guide lines"), 0, 0,
1708 _(
"Triggers the action"));
1711 N_(
"Focus guide lines options"), 0, 0,
1712 _(
"Shows the options popover"));
1723 gtk_widget_set_tooltip_text(
_darkroom_autoset_button, _(
"Run autoset on selected modules\nRight click for options"));
1768 GtkAccelKey
key = { 0 };
1769 return gtk_accel_map_lookup_entry(accel_path, &
key)
1813 for(
const GList *modules = g_list_first(dev->
iop); modules; modules = g_list_next(modules))
1823 if(module->multi_priority == 0)
1825 snprintf(option,
sizeof(option),
"plugins/darkroom/%s/expanded", module->op);
1826 module->expanded = dt_conf_get_bool(option);
1829 if(active_plugin && !strcmp(module->op, active_plugin))
1878 "darkroom-leave-autoset");
1916 for(GList *
m = dev->
iop;
m;
m = g_list_next(
m))
1919 if(mod && mod->quiesce) mod->quiesce(mod);
2003 dev->
iop = g_list_delete_link(dev->
iop, dev->
iop);
2083 gboolean handled =
FALSE;
2113 float image_box[4] = { 0.0f };
2116 return _is_in_frame(image_box[2], image_box[3], round(
x - image_box[0]), round(y - image_box[1]));
2170 if(near_edge <= 0.0)
return 0.0f;
2172 const float edge_distance =
CLAMPF(near_edge / margin, 0.0f, 1.0f);
2173 const float velocity = 0.10f + 0.90f * edge_distance * edge_distance;
2174 return position < margin ? -velocity : velocity;
2186 return creating_shape_mode || mouse_action;
2197 const double pointer_x,
2198 const double pointer_y,
2218 float image_box[4] = { 0.0f };
2220 const double image_x = pointer_x - image_box[0];
2221 const double image_y = pointer_y - image_box[1];
2227 && image_box[2] > 0.0f && image_box[3] > 0.0f;
2228 edge->
margin = inside_action_area
2233 && (image_x < edge->
margin
2235 || image_y < edge->margin
2236 || image_y > (
double)image_box[3] - edge->
margin);
2252 const double pointer_x,
2253 const double pointer_y,
2299 const gint64 now_us = g_get_monotonic_time();
2317 if(dev->
roi.
x != roi[0] || dev->
roi.
y != roi[1])
2319 dev->
roi.
x = roi[0];
2320 dev->
roi.
y = roi[1];
2349 GdkSeat *seat =
IS_NULL_PTR(display) ? NULL : gdk_display_get_default_seat(display);
2350 GdkDevice *pointer =
IS_NULL_PTR(seat) ? NULL : gdk_seat_get_pointer(seat);
2353 GtkAllocation allocation = { 0 };
2362 gdk_window_get_device_position(
window, pointer, &pointer_x, &pointer_y, NULL);
2363 gtk_widget_get_allocation(center, &allocation);
2378 gboolean handled =
FALSE;
2386 gboolean sample_changed =
FALSE;
2387 float mouse_point[2] = { (float)
x, (
float)y };
2389 const float delta[2] = {
2396 float anchor[2] = { 0.0f };
2398 const float box[4] = {
2399 fmaxf(0.0,
MIN(anchor[0], mouse_point[0]) -
delta[0]),
2400 fmaxf(0.0,
MIN(anchor[1], mouse_point[1]) -
delta[1]),
2401 fminf(1.0,
MAX(anchor[0], mouse_point[0]) +
delta[0]),
2402 fminf(1.0,
MAX(anchor[1], mouse_point[1]) +
delta[1])
2407 for(
int k = 0;
k < 4;
k++)
2408 sample_changed |= (image_box[
k] != box[
k]);
2415 float image_point[2] = { 0.0f };
2417 sample_changed = memcmp(image_point, mouse_point,
sizeof(mouse_point)) != 0;
2424 else if(picker_active)
2502 dev->
roi.
x = roi[0];
2503 dev->
roi.
y = roi[1];
2536 dev->
roi.
x = roi[0];
2537 dev->
roi.
y = roi[1];
2602 which,
type,
x, y, pressure);
2616 float point[2] = { (float)
x, (
float)y };
2620 float handle[2] = { 6.0f, 6.0f };
2630 const float delta_x = 0.01f;
2640 memcpy(sample->
point, raw_point,
sizeof(raw_point));
2646 gboolean on_corner_prev_box =
TRUE;
2647 float opposite[2] = { 0.0f };
2649 if(fabsf(
point[0] - image_box[0]) <= handle[0])
2650 opposite[0] = image_box[2];
2651 else if(fabsf(
point[0] - image_box[2]) <= handle[0])
2652 opposite[0] = image_box[0];
2654 on_corner_prev_box =
FALSE;
2656 if(fabsf(
point[1] - image_box[1]) <= handle[1])
2657 opposite[1] = image_box[3];
2658 else if(fabsf(
point[1] - image_box[3]) <= handle[1])
2659 opposite[1] = image_box[1];
2661 on_corner_prev_box =
FALSE;
2663 if(on_corner_prev_box)
2665 float raw_opposite[2] = { opposite[0], opposite[1] };
2667 memcpy(sample->
point, raw_opposite,
sizeof(raw_opposite));
2672 fmaxf(0.0,
point[0] - delta_x),
2673 fmaxf(0.0,
point[1] - delta_y),
2674 fminf(1.0,
point[0] + delta_x),
2675 fminf(1.0,
point[1] + delta_y)
2705 if(
point[0] < live_box[0] ||
point[0] > live_box[2]
2706 ||
point[1] < live_box[1] ||
point[1] > live_box[3])
2714 MAX(26.0f, roundf(3.0f * zoom_scale)),
2715 MAX(26.0f, roundf(3.0f * zoom_scale))
2720 float live_point[2] = { live_sample->
point[0], live_sample->
point[1] };
2722 if(fabsf(
point[0] - live_point[0]) > slop[0]
2723 || fabsf(
point[1] - live_point[1]) > slop[1])
2765 float new_scale = 1.f;
2773 const float point[2] = {
x, y };
2785 const float epsilon = fabsf(old_scaling - new_scaling);
2786 if(fabsf(new_scaling - 1.0f) < epsilon)
2794 float center[2] = { 0.0f };
2795 float mouse_offset[2] = {
point[0],
point[1] };
2797 mouse_offset[0] -= center[0];
2798 mouse_offset[1] -= center[1];
2805 if(old_zoom <= 1e-6f || new_zoom <= 1e-6f)
2812 int proc_w = 0.f, proc_h = 0.f;
2814 dev->
roi.
x += mouse_offset[0] * (1.f / old_zoom - 1.f / new_zoom) / proc_w;
2815 dev->
roi.
y += mouse_offset[1] * (1.f / old_zoom - 1.f / new_zoom) / proc_h;
2834 const float step = 1.02f;
2835 const float new_scaling = dev->
roi.
scaling * powf(step, (
float)-flow);
2836 const float point[2] = {
x, y };
2848 up,
x, y,
state, delta_y);
2901 const gboolean shift =
dt_modifier_is(event->state, GDK_SHIFT_MASK);
2902 const gboolean ctrl =
dt_modifier_is(event->state, GDK_CONTROL_MASK);
2908 const float zoom_step = 1.1f;
2909 float center[2] = { 0.0f };
2921 float multiplier = (shift) ? 4.f :
2925 float delta[2] = { 10.f * multiplier, 10.f * multiplier };
2954 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_get_int(dt_atomic_int *var)
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_slider_set(GtkWidget *widget, float 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)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
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 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)
@ DT_LIB_COLORPICKER_SIZE_POINT
@ DT_LIB_COLORPICKER_SIZE_BOX
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_mouse_is_dragging(gboolean state)
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_mouse_is_painting(gboolean state)
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)
void init(dt_view_t *self)
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()
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 _autoset_popover_preshow(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)
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 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 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 dt_dev_locked_surface_t _darkroom_preview_locked
static gboolean _render_preview_fallback_surface(cairo_t *cr)
#define DARKROOM_EDGE_PAN_MARGIN_PX
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 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.
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 dt_dev_locked_surface_t _darkroom_main_locked
static void _delayed_history_commit(gpointer data)
static void _guides_popover_preshow(gpointer user_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)
void mouse_moved(dt_view_t *self, double x, double y, double pressure, int which)
void configure(dt_view_t *self, int wd, int ht)
uint32_t view(const dt_view_t *self)
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 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 dt_dev_pixelpipe_cache_wait_t _darkroom_main_wait
void expose(dt_view_t *self, cairo_t *cri, int32_t width, int32_t height, int32_t pointerx, int32_t pointery)
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 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 GtkWidget * _darkroom_autoset_button
gboolean _scroll_on_focus(GdkEventScroll event, void *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 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 _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.
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)
#define dt_gui_freeze_begin()
#define dt_gui_freeze_end()
float dt_boundingbox_t[4]
#define DT_MODULE(MODVER)
void void void gboolean dt_gui_widgets_suppressed(void)
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_draw_iso12646_border(cairo_t *cr, double width, double height, int border)
gboolean dt_dev_lock_pipe_surface(dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, dt_dev_locked_surface_t *locked, dt_dev_pixelpipe_cache_wait_t *wait, const char *wait_owner_tag, gboolean keep_previous_on_fail)
gboolean dt_dev_render_locked_surface(cairo_t *cr, const dt_develop_t *dev, dt_dev_locked_surface_t *locked, const int width, const int height, const int border, const dt_aligned_pixel_t bg_color)
void dt_dev_get_background_color(const dt_develop_t *dev, dt_aligned_pixel_t bg_color)
void dt_dev_release_locked_surface(dt_dev_locked_surface_t *locked)
void dt_dev_draw_profile_mode_label(cairo_t *cri, int height)
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_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
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_wand(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
static int dt_pthread_rwlock_unlock(dt_pthread_rwlock_t *rwlock)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_rwlock_wrlock(dt_pthread_rwlock_t *rwlock)
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_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_nap(int32_t usec)
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_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)
void dt_masks_form_unref(dt_masks_form_t *form)
#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_DEVELOP_PREVIEW_PIPE_FINISHED
This signal is raised when develop preview pipe process is finished no param, no returned value.
@ 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_dev_pixelpipe_cache_t * pixelpipe_cache
struct dt_gui_gtk_t * gui
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)
dt_lib_colorpicker_size_t size
struct dt_pixel_cache_entry_t * entry
cairo_surface_t * surface
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
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_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
struct dt_develop_t::@21 overexposed
gboolean block_normal_pan
GtkWidget * has_scroll_focus
struct dt_gui_gtk_t::@49 mouse
struct dt_gui_gtk_t::@48 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
GtkWidget * guides_popover
dt_darkroom_layout_t(* get_layout)(struct dt_view_t *view)
struct dt_view_manager_t::@69 proxy
void(* set_default_cursor)(struct dt_view_t *view, double x, double y)
GtkWidget * guides_toggle
struct dt_view_manager_t::@69::@72 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)
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