Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
masks_gui.h
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2013-2014, 2016, 2019, 2021 Aldric Renaudin.
4 Copyright (C) 2013, 2018, 2020-2021 Pascal Obry.
5 Copyright (C) 2013 Simon Spannagel.
6 Copyright (C) 2013-2014, 2016-2018 Tobias Ellinghaus.
7 Copyright (C) 2013-2017, 2019-2020 Ulrich Pegelow.
8 Copyright (C) 2014-2016 Roman Lebedev.
9 Copyright (C) 2017-2019 Edgardo Hoszowski.
10 Copyright (C) 2021 Hanno Schwalm.
11 Copyright (C) 2021 Hubert Kowalski.
12 Copyright (C) 2021 luzpaz.
13 Copyright (C) 2021 Philipp Lutz.
14 Copyright (C) 2021 Ralf Brown.
15 Copyright (C) 2022 Martin Bařinka.
16 Copyright (C) 2023, 2025-2026 Aurélien PIERRE.
17 Copyright (C) 2023 Luca Zulberti.
18 Copyright (C) 2025 Alynx Zhou.
19 Copyright (C) 2025-2026 Guillaume Stutin.
20
21 darktable is free software: you can redistribute it and/or modify
22 it under the terms of the GNU General Public License as published by
23 the Free Software Foundation, either version 3 of the License, or
24 (at your option) any later version.
25
26 darktable is distributed in the hope that it will be useful,
27 but WITHOUT ANY WARRANTY; without even the implied warranty of
28 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 GNU General Public License for more details.
30
31 You should have received a copy of the GNU General Public License
32 along with darktable. If not, see <http://www.gnu.org/licenses/>.
33*/
34
47#ifndef DT_DEVELOP_MASKS_GUI_H
48#define DT_DEVELOP_MASKS_GUI_H
49
50#include "develop/masks.h"
51#include "widgets/draw.h"
52
53#include <gtk/gtk.h>
54
55#ifdef __cplusplus
56extern "C" {
57#endif
58struct dt_masks_form_t;
60struct dt_develop_t;
63{
64 float *points; // points in absolute coordinates in output image space
66 float *border; // border points in absolute coordinates in output image space
68 // Self-intersection cuts of `border', out-of-band -- see dt_masks_skip_range_t. NULL/0 for
69 // every shape whose border cannot fold over itself (all but polygon today).
72 float *source; // source point in absolute coordinates in output image space
74 gboolean clockwise;
75 /* The box every sample above spans -- points, border and source alike, in the same space --
76 * so a hit test can answer "nothing here" without walking them: minx, maxx, miny, maxy; empty
77 * (min above max) when there is no sample. dt_masks_gui_points_update_bbox() fills it. */
78 float bbox[4];
80
83static inline gboolean dt_masks_gui_points_reach(const dt_masks_form_gui_points_t *gp, const float x,
84 const float y, const float reach)
85{
86 return x >= gp->bbox[0] - reach && x <= gp->bbox[1] + reach && y >= gp->bbox[2] - reach
87 && y <= gp->bbox[3] + reach;
88}
89
92
93
95typedef struct dt_masks_form_gui_t
96{
97 // Owning develop instance, set once at init. Mask GUI code must use this (or an explicit
98 // dev/module argument) instead of the darktable.develop global: shape handlers can run with
99 // module == NULL (shape manager editing), and reaching for the global both couples every
100 // shape file to the whole application and hides which develop instance the code mutates.
102
104 // currently visible form when editing masks (GUI-only; may be a temporary copy)
106 // points used to draw the form
107 GList *points; // list of dt_masks_form_gui_points_t
108
109 // points used to sample mouse moves
112
113 // values for mouse positions, etc...
114
115 // Mouse position in absolute coordinates in final image space
116 // This is used to map input event handlers to *_post_expose() drawing functions
117 // and to record drag & drop starting coordinates.
118 float pos[2];
119
120 // Mouse position in normalized coordinates in output image space.
121 // This is cached once per top-level event and replaces ad-hoc pzx/pzy recomputation.
122 float rel_pos[2];
123
124 // Mouse position in absolute coordinates in raw input image space.
125 // This is cached once per top-level event so nested handlers can reuse it.
126 float raw_pos[2];
127
128 // delta movement of the mouse in absolute coordinates in final image space
129 // This is used to map input event handlers to *_post_expose() drawing functions
130 float delta[2];
131
132 // scroll offset
134
135 // Position of a clone mask's source point (in what coordinates space ?)
136 float pos_source[2];
137
139
140 int node_hovered; // this is the index of the node, refreshed on mouse_moved when a a group is selected
141 int handle_hovered; // this is the index of the node, refreshed on mouse_moved when a a group is selected
142 int seg_hovered; // this is the index of the segment, refreshed on mouse_moved when a a group is selected
143 int handle_border_hovered; // this is the index of the node, refreshed on mouse_moved when a a group is selected
144
145 gboolean node_selected; // this is the state of the node referenced by node_hovered
146 gboolean handle_selected; // this is the state of the handle referenced by handle_hovered
147 gboolean seg_selected; // this is the state of the segment referenced by segment_hovered
148 gboolean handle_border_selected; // this is the state of the border handle referenced by handle_border_hovered
149 int node_selected_idx; // stable selected node index, distinct from current hover
150
155
157
159
169
170 // Throttle GUI rebuilds while dragging to avoid heavy border recomputation.
174
175 // Throttle handle hit-testing when cursor barely moves.
177
178 gboolean creation;
181 // Shape type reused to create the next temporary form in a continuous creation session.
183 // Form ids completed during the active creation session; only these are drawn while creation stays active.
185 // Last completed form id, selected when the creation session is disabled.
187
189
190 // ids
192 /* Which composed geometry the cached outlines in ::points were built against
193 * (dt_geometry_chain_generation()). Zero means "nothing cached".
194 *
195 * This used to be the PREVIEW PIPE'S BACKBUFFER HASH, which made it a pixel identity standing in
196 * for a geometric one: every republished preview frame invalidated outlines whose inputs had not
197 * changed, and while a brush is dragged the preview republishes continuously. That is #1158 --
198 * the outlines of every shape in the group rebuilt on every mouse move, and the 1/60 s throttle
199 * in dt_masks_gui_form_create_throttled() bypassed by its own force_rebuild clause. */
201 /* The sampling density of the outlines, in image pixels between consecutive samples. The
202 * expose publishes the density the view shows, from what one device pixel spans, into the
203 * dev's own GUI state (dt_masks_gui_set_outline_density()), and every build reads it from
204 * there through dt_masks_gui_outline_step() -- so on any other GUI state, the creation
205 * session's for one, ::outline_step is not consulted. ::outline_step_built is the density the
206 * outlines in ::points were built at, on every state that holds outlines; a difference from
207 * the density in force is a rebuild, like a geometry move. An outline sampled finer than the
208 * screen can show costs its whole build, its transform, its boundary pass and its hit test for
209 * nothing: at fit zoom on a 24 Mpx raw that was five samples per device pixel. */
213
223void dt_masks_gui_init(struct dt_develop_t *dev);
224void dt_masks_gui_cleanup(struct dt_develop_t *dev);
228
229// Test wether the form, the border, the source or the pivot is selected
231{
232 return gui && (gui->form_selected || gui->border_selected || gui->source_selected || gui->pivot_selected);
233}
234
236{
237 return (gui && gui->node_selected) ? gui->node_selected_idx : -1;
238}
239
241{
242 return (gui && gui->handle_selected) ? gui->handle_hovered : -1;
243}
244
246{
247 return (gui && gui->handle_border_selected) ? gui->handle_border_hovered : -1;
248}
249
251{
252 return (gui) ? gui->seg_hovered : -1;
253}
254
256 const int index)
257{
258 if(IS_NULL_PTR(gui)) return TRUE;
259
261 return selected_node < 0 || selected_node == index;
262}
263
264static inline float dt_masks_get_form_size_from_nodes(const GList *points)
265{
266 if(IS_NULL_PTR(points) || IS_NULL_PTR(points->data)) return 0.0f;
267
268 // Brush and polygon node payloads both start with `float node[2]`.
269 const float *first = (const float *)points->data;
270 float min_x = first[0];
271 float max_x = first[0];
272 float min_y = first[1];
273 float max_y = first[1];
274
276 {
277 const float *node = (const float *)point_node->data;
278 if(IS_NULL_PTR(node)) continue;
279 min_x = fminf(min_x, node[0]);
280 max_x = fmaxf(max_x, node[0]);
281 min_y = fminf(min_y, node[1]);
282 max_y = fmaxf(max_y, node[1]);
283 }
284
285 return fmaxf(max_x - min_x, max_y - min_y);
286}
287
289{
290 const float hit_thresh = DT_GUI_MOUSE_EFFECT_RADIUS * 0.5f;
291 const float dx = gui->pos[0] - gui->last_hit_test_pos[0];
292 const float dy = gui->pos[1] - gui->last_hit_test_pos[1];
293 if(gui->last_hit_test_pos[0] < 0.0f || (dx * dx + dy * dy) > (hit_thresh * hit_thresh))
294 {
295 gui->last_hit_test_pos[0] = gui->pos[0];
296 gui->last_hit_test_pos[1] = gui->pos[1];
297 return TRUE;
298 }
299 return FALSE;
300}
301
302// High-level mask event dispatchers cache the current cursor in raw absolute coordinates.
303// Reuse that cache for current-cursor conversions instead of backtransforming `gui->pos` again.
304static inline void dt_masks_gui_cursor_to_raw_norm(dt_develop_t *dev, const dt_masks_form_gui_t *gui, float point[2])
305{
306 point[0] = gui->raw_pos[0];
307 point[1] = gui->raw_pos[1];
309}
310
311// Reuse the cached absolute output-image cursor and drag delta to derive a raw-normalized point.
312static inline void dt_masks_gui_delta_to_raw_norm(dt_develop_t *dev, const dt_masks_form_gui_t *gui, float point[2])
313{
314 point[0] = gui->pos[0] + gui->delta[0];
315 point[1] = gui->pos[1] + gui->delta[1];
317}
318
319static inline void dt_masks_gui_delta_to_image_abs(const dt_masks_form_gui_t *gui, float point[2])
320{
321 point[0] = gui->pos[0] + gui->delta[0];
322 point[1] = gui->pos[1] + gui->delta[1];
323}
324
325// Drag branches need the same "cursor + drag delta" converted back to raw space.
326// Keep that conversion in one place so all shapes use the same anchor semantics.
328 const float anchor[2], float *delta_x, float *delta_y)
329{
330 float point[2];
332 *delta_x = point[0] - anchor[0];
333 *delta_y = point[1] - anchor[1];
334}
335
336gboolean dt_masks_node_is_cusp(const dt_masks_form_gui_points_t *gpt, const int index);
338 struct dt_iop_module_t *module);
339
340// Brush and polygon nodes share the same node/control-point edit semantics.
344 const int form_index,
346 const int node_index,
347 float node[2], float ctrl1[2], float ctrl2[2],
349
350
354 const int form_index,
356 const int node_index,
358
359
360// Brush and polygon border handles both constrain the cursor to the node->handle axis.
361static inline void dt_masks_project_on_line(const float cursor[2], const float node[2],
362 const float handle[2], float point[2])
363{
364 const float dx_line = handle[0] - node[0];
365 const float dy_line = handle[1] - node[1];
366
367 if(fabsf(dx_line) < 1e-6f)
368 {
369 point[0] = node[0];
370 point[1] = cursor[1];
371 }
372 else
373 {
374 const float a = dy_line / dx_line;
375 const float b = node[1] - a * node[0];
376 const float denom = a * a + 1.0f;
377 const float xproj = (a * cursor[1] + cursor[0] - b * a) / denom;
378
379 point[0] = xproj;
380 point[1] = a * xproj + b;
381 }
382}
383
384// Border handles store normalized raw-space radii, but hit/drag code works in image space.
385// Convert both ends once here so all shapes derive border thickness the same way.
386static inline float dt_masks_border_from_projected_handle(dt_develop_t *dev, const float node[2],
387 const float projected_image_pos[2],
388 const float scale_ref)
389{
391 float node_raw[2] = { node[0], node[1] };
394
395 const float delta_x = projected_raw[0] - node_raw[0];
396 const float delta_y = projected_raw[1] - node_raw[1];
398}
399
400// Circle, ellipse and gradient creation previews all follow the same drawing sequence:
401// optional save/restore, draw the shape, then draw the border preview if present.
407void dt_masks_draw_outline_runs(cairo_t *cr, const float *const points, const int first, const int last,
408 const dt_masks_skip_range_t *skips, const int skip_count);
409
410static inline void dt_masks_draw_preview_shape(struct dt_develop_t *dev, cairo_t *cr, const float zoom_scale,
411 const int num_points,
412 float *points, const int points_count,
413 float *border, const int border_count,
414 const shape_draw_function_t *draw_shape,
417 const gboolean save_restore,
418 const gboolean source)
419{
420 if(save_restore) cairo_save(cr);
421 if(points && points_count > 0)
422 dt_draw_shape_lines(dev, DT_MASKS_NO_DASH, source, cr, num_points, FALSE, zoom_scale, points, points_count,
423 draw_shape, shape_cap, NULL, 0);
424 if(border && border_count > 0)
425 /* a creation preview is drawn while the shape is still being placed: it has no cuts yet */
426 dt_draw_shape_lines(dev, DT_MASKS_DASH_STICK, source, cr, num_points, FALSE, zoom_scale, border, border_count,
427 draw_shape, border_cap, NULL, 0);
429}
430
431// Shared scratch buffers for creation previews. Keeping them grouped makes the shape
432// preview helpers return a single value and centralizes cleanup.
442
449
451{
452 struct
453 {
454 float x;
455 float y;
457
458 struct
459 {
460 float x;
461 float y;
465void dt_masks_remove_node(struct dt_iop_module_t *module, dt_masks_form_t *form, int parentid,
466 dt_masks_form_gui_t *gui, int index, int node_index);
467
482
504 dt_masks_type_t type, gpointer user_data);
506 gpointer user_data);
508 dt_masks_type_t type, gpointer user_data);
509
530
536
543 GCallback activate_callback, gpointer user_data);
544
545int dt_masks_events_mouse_moved(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, double pressure,
546 int which);
547int dt_masks_events_button_released(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, int which,
548 uint32_t state);
549int dt_masks_events_button_pressed(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, double pressure,
550 int which, int type, uint32_t state);
551int dt_masks_events_mouse_scrolled(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, int up, uint32_t state, int delta_y);
552
565gboolean dt_masks_node_is_cusp(const dt_masks_form_gui_points_t *gpt, const int index);
566
577void dt_masks_draw_source(cairo_t *cr, dt_masks_form_gui_t *gui, const int index, const int nb,
579void dt_masks_draw_path_seg_by_seg(cairo_t *cr, dt_masks_form_gui_t *gui, const int index, const float *points,
580 const int points_count, const int node_count, const float zoom_scale,
581 const gboolean round_ends);
582
602
605 int32_t width, int32_t height, int32_t pointerx, int32_t pointery,
607
612
613void dt_masks_events_post_expose(dt_develop_t *dev, struct dt_iop_module_t *module, cairo_t *cr, int32_t width, int32_t height,
614 int32_t pointerx, int32_t pointery);
617
620 struct dt_iop_module_t *module);
622 struct dt_iop_module_t *module, float posx, float posy);
623
634gboolean dt_masks_gui_remove(struct dt_iop_module_t *module, dt_masks_form_t *form, dt_masks_form_gui_t *gui, const int parentid);
635
647 dt_masks_form_gui_t *mask_gui, int form_id);
648
656 dt_masks_form_gui_t *mask_gui, int form_id);
657
665 dt_masks_form_gui_t *mask_gui, int form_id);
666
667// Remove a mask
669
672
686
705 dt_masks_form_t *form, int parentid,
706 dt_masks_state_t state, float opacity);
707
712
717 const float initial_ypos, const float xpos, const float ypos, float *px,
718 float *py, const int adding);
719static inline void dt_masks_draw_source_preview(cairo_t *cr, const float zoom_scale, dt_masks_form_gui_t *gui,
720 const float initial_xpos, const float initial_ypos,
721 const float xpos, const float ypos, const int adding)
722{
723 float source_pos[2] = { 0.0f, 0.0f };
725 &source_pos[0], &source_pos[1], adding);
727}
738float dt_masks_rotate_with_anchor(dt_develop_t *dev, const float anchor[2], const float center[2], dt_masks_form_gui_t *gui);
739
759 const struct dt_masks_form_gui_t *gui);
760
781
784
787
791
803
810
813
816
826 const struct dt_masks_form_gui_t *gui);
827float dt_masks_form_get_interaction_value(dt_develop_t *dev, int group_id, int formid,
828 dt_masks_interaction_t interaction);
829gboolean dt_masks_form_get_gravity_center(dt_develop_t *dev, const struct dt_masks_form_t *form, float center[2], float *area);
835int dt_masks_center_view_on_form(struct dt_develop_t *dev, const struct dt_masks_form_t *form);
836float dt_masks_form_set_interaction_value(dt_develop_t *dev, int group_id, int formid,
837 dt_masks_interaction_t interaction,
838 float value, dt_masks_increment_t increment, int flow,
839 struct dt_masks_form_gui_t *gui, struct dt_iop_module_t *module);
840
853float dt_masks_get_set_conf_value(dt_masks_form_t *form, char *feature, float new_value, float v_min, float v_max,
854 dt_masks_increment_t increment, const int flow);
861float dt_masks_get_set_conf_value_with_toast(dt_masks_form_t *form, const char *feature, float amount,
862 float v_min, float v_max, dt_masks_increment_t increment, int flow,
863 const char *toast_fmt, float toast_scale);
864
868float dt_masks_apply_increment(float current, float amount, dt_masks_increment_t increment, int flow);
869
873float dt_masks_apply_increment_precomputed(float current, float amount, float scale_amount, float offset_amount,
874 dt_masks_increment_t increment);
875
881 dt_masks_form_gui_t *gui, int pos);
884
895gboolean dt_masks_point_is_within_radius(const float px, const float py,
896 const float cx, const float cy,
897 const float radius);
898
904typedef gboolean (*dt_masks_border_handle_fn)(const dt_masks_form_gui_points_t *gui_points, int node_count,
905 int node_index, float *handle_x, float *handle_y, void *user_data);
912 float *handle_x, float *handle_y, void *user_data);
919 float *node_x, float *node_y, void *user_data);
926typedef void (*dt_masks_distance_fn)(float pointer_x, float pointer_y, float cursor_radius,
927 dt_masks_form_gui_t *mask_gui, int form_index, int node_count,
928 int *inside, int *inside_border, int *near_handle, int *inside_source, float *dist,
929 void *user_data);
934 int inside_source, void *user_data);
935
951 void *user_data);
952
955
958#define menu_item_set_fake_accel(menu_item, keyval, mods) \
959 \
960{ \
961 GtkWidget *child = gtk_bin_get_child(GTK_BIN(menu_item)); \
962 if(GTK_IS_ACCEL_LABEL(child)) \
963 gtk_accel_label_set_accel(GTK_ACCEL_LABEL(child), keyval, mods); \
964}
965
966void _masks_gui_delete_node_callback(GtkWidget *menu, gpointer user_data);
967
969
971 const float pzx, const float pzy);
972
980 int group_id, int formid,
981 dt_masks_interaction_t interaction, dt_masks_increment_t increment,
982 float min, float max, float step, float value, int digits,
983 const char *format, float factor,
985
994 int group_id,
996
997int dt_masks_gui_confirm_delete_form_dialog(const char *form_name);
998
1005gboolean dt_masks_gui_confirm_permanent_delete(const char *form_name);
1006
1009
1010#ifdef __cplusplus
1011}
1012#endif
1013
1014#endif // DT_DEVELOP_MASKS_GUI_H
static double dist(double x1, double y1, double x2, double y2)
Definition ashift_lsd.c:250
#define TRUE
Definition ashift_lsd.c:162
#define FALSE
Definition ashift_lsd.c:158
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
static void transform(float *x, float *o, const float *m, const float t_h, const float t_v)
Definition clipping.c:487
static const float x
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
Definition colorspaces.h:98
static const float const float const float min
const float max
void dt_dev_coordinates_raw_norm_to_raw_abs(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:1275
int dt_dev_coordinates_image_abs_to_raw_abs(dt_develop_t *dev, float *points, size_t points_count)
Definition develop.c:1790
void dt_dev_coordinates_raw_abs_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:1257
void dt_dev_coordinates_image_abs_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:1305
static void dt_draw_cross(cairo_t *cr, const float zoom_scale, const float x, const float y)
Definition draw.h:1061
void(* shape_draw_function_t)(struct dt_develop_t *dev, cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source, const struct dt_masks_skip_range_t *skips, const int skip_count)
Definition draw.h:815
@ DT_MASKS_DASH_STICK
Definition draw.h:135
@ DT_MASKS_NO_DASH
Definition draw.h:134
static void dt_draw_shape_lines(struct dt_develop_t *dev, const dt_draw_dash_type_t dash_type, const gboolean source, cairo_t *cr, const int nb, const gboolean selected, const float zoom_scale, const float *points, const int points_count, const shape_draw_function_t *draw_shape_func, const cairo_line_cap_t line_cap, const struct dt_masks_skip_range_t *skips, const int skip_count)
Draw the lines of a mask shape.
Definition draw.h:831
_lib_location_type_t type
Definition location.c:1
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
Definition macros.h:96
dt_masks_pressure_sensitivity_t
Definition masks.h:171
dt_masks_points_states_t
Definition masks.h:155
GdkModifierType dt_masks_get_accel_mods(dt_masks_interaction_t interaction)
static void dt_masks_gui_delta_to_image_abs(const dt_masks_form_gui_t *gui, float point[2])
Definition masks_gui.h:319
gboolean dt_masks_remove_or_delete(struct dt_iop_module_t *module, dt_masks_form_t *sel, int parent_id, dt_masks_form_gui_t *mask_gui, int form_id)
If the form to remove is used once, ask to the user if he wants to delete it from the list or just re...
Definition masks_gui.c:2214
dt_masks_form_group_t * dt_masks_group_add_form(dt_develop_t *dev, dt_masks_form_t *grp, dt_masks_form_t *form)
Definition masks_gui.c:5347
void dt_masks_group_ungroup(dt_develop_t *dev, dt_masks_form_t *dest_grp, dt_masks_form_t *grp)
Definition masks_gui.c:5356
void dt_masks_gui_form_remove(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index)
Definition masks_gui.c:2433
static int dt_masks_gui_selected_segment_index(const dt_masks_form_gui_t *gui)
Definition masks_gui.h:250
dt_masks_type_t(* dt_masks_shape_buttons_type_f)(dt_iop_module_t *module, dt_masks_type_t type, gpointer user_data)
Definition masks_gui.h:505
gboolean(* dt_masks_shape_buttons_start_f)(GtkWidget *button, dt_iop_module_t *module, dt_masks_type_t type, gpointer user_data)
Definition masks_gui.h:503
static int dt_masks_gui_selected_node_index(const dt_masks_form_gui_t *gui)
Definition masks_gui.h:235
void dt_masks_gui_set_dragging(dt_masks_form_gui_t *gui)
Definition masks_gui.c:1449
static int dt_masks_gui_selected_handle_index(const dt_masks_form_gui_t *gui)
Definition masks_gui.h:240
void dt_masks_calculate_source_pos_origin(dt_masks_form_gui_t *gui, const float initial_xpos, const float initial_ypos, const float xpos, const float ypos, float *px, float *py, const int adding)
Compute preview-space source position for drawing the clone indicator.
Definition masks_gui.c:5642
void dt_masks_change_form_gui(dt_develop_t *dev, dt_masks_form_t *newform)
Definition masks_gui.c:4840
void dt_masks_remove_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition masks_gui.c:2515
dt_masks_shape_button_index_t
Definition masks_gui.h:475
@ DT_MASKS_SHAPE_INDEX_BRUSH
Definition masks_gui.h:480
@ DT_MASKS_SHAPE_INDEX_ELLIPSE
Definition masks_gui.h:478
@ DT_MASKS_SHAPE_INDEX_CIRCLE
Definition masks_gui.h:479
@ DT_MASKS_SHAPE_INDEX_GRADIENT
Definition masks_gui.h:476
@ DT_MASKS_SHAPE_INDEX_POLYGON
Definition masks_gui.h:477
void dt_masks_gui_form_create(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index, struct dt_iop_module_t *module)
Definition masks_gui.c:1914
void dt_masks_scroll_mapping_set(dt_masks_scroll_modifier_t modifier, dt_masks_interaction_t interaction)
Definition masks_gui.c:3140
void dt_masks_creation_mode_quit(dt_masks_form_gui_t *gui)
Exit mask creation mode, restoring cursor visibility and resetting GUI state.
Definition masks_gui.c:5750
gboolean dt_masks_reset_bezier_ctrl_points(struct dt_iop_module_t *module, struct dt_masks_form_t *mask_form, struct dt_masks_form_gui_t *mask_gui, const int form_index, const struct dt_masks_form_gui_points_t *gui_points, const int node_index, dt_masks_points_states_t *state)
Definition masks_gui.c:1123
gboolean dt_masks_gui_remove(struct dt_iop_module_t *module, dt_masks_form_t *form, dt_masks_form_gui_t *gui, const int parentid)
remove a mask shape or node form from the GUI. This function is used with a popupmenu "Delete" action...
Definition masks_gui.c:2378
void dt_masks_events_post_expose(dt_develop_t *dev, struct dt_iop_module_t *module, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery)
Definition masks_gui.c:4017
gboolean dt_masks_node_is_cusp(const dt_masks_form_gui_points_t *gpt, const int index)
returns wether a node is a corner or not. A node is a corner if its 2 control handles are at the same...
Definition masks_gui.c:3282
GtkWidget * dt_masks_shape_menu_item_new(GtkWidget *menu, const dt_masks_type_t type, GCallback activate_callback, gpointer user_data)
Append a menu entry for one shape type: its toolbar icon, then its toolbar label.
Definition masks_gui.c:210
int dt_masks_events_button_pressed(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, double pressure, int which, int type, uint32_t state)
Definition masks_gui.c:2961
gboolean dt_masks_toggle_bezier_node_type(struct dt_iop_module_t *module, struct dt_masks_form_t *mask_form, struct dt_masks_form_gui_t *mask_gui, const int form_index, const struct dt_masks_form_gui_points_t *gui_points, const int node_index, float node[2], float ctrl1[2], float ctrl2[2], dt_masks_points_states_t *state)
Definition masks_gui.c:1095
void dt_masks_gui_points_update_bbox(dt_masks_form_gui_points_t *gp)
Definition masks_gui.c:2421
static void dt_masks_draw_source_preview(cairo_t *cr, const float zoom_scale, dt_masks_form_gui_t *gui, const float initial_xpos, const float initial_ypos, const float xpos, const float ypos, const int adding)
Definition masks_gui.h:719
void dt_masks_draw_path_seg_by_seg(cairo_t *cr, dt_masks_form_gui_t *gui, const int index, const float *points, const int points_count, const int node_count, const float zoom_scale, const gboolean round_ends)
Definition masks_gui.c:3483
void dt_masks_gui_reset_dragging(dt_masks_form_gui_t *gui)
Definition masks_gui.c:1463
void dt_masks_init_form_gui(dt_develop_t *dev, dt_masks_form_gui_t *gui)
Definition masks_gui.c:1847
void dt_masks_gui_init(struct dt_develop_t *dev)
Definition masks_gui.c:1420
void dt_group_events_post_expose_except(cairo_t *cr, float zoom_scale, dt_masks_form_t *form, dt_masks_form_gui_t *gui, int except_pos)
Definition group.c:164
void(* dt_masks_post_select_fn)(dt_masks_form_gui_t *mask_gui, int inside, int inside_border, int inside_source, void *user_data)
Optional hook to customize selection flags after inside/border/source resolution.
Definition masks_gui.h:933
gboolean dt_masks_gui_confirm_permanent_delete(const char *form_name)
Ask the user to confirm a permanent shape deletion, gated by the "ask_before_delete_mask_shape" pref....
Definition masks_gui.c:602
void dt_masks_gui_set_outline_density(dt_masks_form_gui_t *gui, double image_px_per_device_px)
Definition masks_gui.c:1901
dt_masks_form_group_t * dt_masks_form_group_from_parentid(dt_develop_t *dev, int parentid, int formid)
Return the group entry for a (parent, form) pair.
Definition masks_gui.c:1489
gboolean dt_masks_is_anything_selected(const dt_masks_form_gui_t *mask_gui)
Definition masks_gui.c:2658
const char * dt_masks_interaction_alias_name(dt_masks_interaction_t interaction)
The other word for a property, when a shape family spells it its own way.
Definition masks_gui.c:3183
void(* dt_masks_distance_fn)(float pointer_x, float pointer_y, float cursor_radius, dt_masks_form_gui_t *mask_gui, int form_index, int node_count, int *inside, int *inside_border, int *near_handle, int *inside_source, float *dist, void *user_data)
Shape-specific callback for inside/border/segment hit testing.
Definition masks_gui.h:926
static float dt_masks_get_form_size_from_nodes(const GList *points)
Definition masks_gui.h:264
int dt_masks_events_mouse_moved(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, double pressure, int which)
Definition masks_gui.c:2824
dt_masks_scroll_modifier_t
Definition masks_gui.h:774
@ DT_MASKS_SCROLL_SHIFT
Definition masks_gui.h:776
@ DT_MASKS_SCROLL_PRIMARY
Definition masks_gui.h:777
@ DT_MASKS_SCROLL_PLAIN
Definition masks_gui.h:775
@ DT_MASKS_SCROLL_PRIMARY_SHIFT
Definition masks_gui.h:778
@ DT_MASKS_SCROLL_MODIFIER_LAST
Definition masks_gui.h:779
gboolean dt_masks_gui_form_create_throttled(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index, struct dt_iop_module_t *module, float posx, float posy)
Definition masks_gui.c:1976
const char * dt_masks_interaction_name(dt_masks_interaction_t interaction)
Definition masks_gui.c:3165
void dt_masks_events_post_expose_with(dt_develop_t *dev, struct dt_iop_module_t *module, cairo_t *cr, int32_t width, int32_t height, int32_t pointerx, int32_t pointery, const dt_masks_overlay_transform_t *transform)
Draw the mask overlay with an explicit mapping; transform NULL means the viewport's.
Definition masks_gui.c:4663
void dt_masks_gui_form_save_creation(dt_develop_t *dev, struct dt_iop_module_t *module, dt_masks_form_t *form, dt_masks_form_gui_t *gui)
Save the form creation right after a shape has been finished drawing.
Definition masks_gui.c:2525
void dt_masks_shape_buttons_deactivate_all(GtkWidget *active_button)
Definition masks_gui.c:113
void dt_masks_select_form(dt_develop_t *dev, struct dt_iop_module_t *module, dt_masks_form_t *sel)
Select or clear the current mask form, notifying the owning module if needed.
Definition masks_gui.c:5527
static int dt_masks_gui_selected_handle_border_index(const dt_masks_form_gui_t *gui)
Definition masks_gui.h:245
GtkWidget * dt_masks_shape_buttons_create(const dt_masks_shape_buttons_config_t *config)
Build a synchronized toolbar for creating masks shapes.
Definition masks_gui.c:308
float dt_masks_get_set_conf_value(dt_masks_form_t *form, char *feature, float new_value, float v_min, float v_max, dt_masks_increment_t increment, const int flow)
Change a numerical property of a mask shape, either by in/de-crementing the current value or setting ...
Definition masks_gui.c:5275
void dt_masks_clear_form_gui(dt_develop_t *dev)
Definition masks_gui.c:4777
gboolean dt_masks_form_exit_creation(dt_iop_module_t *module, dt_masks_form_gui_t *gui)
Definition masks_gui.c:2250
void dt_masks_draw_source(cairo_t *cr, dt_masks_form_gui_t *gui, const int index, const int nb, const float zoom_scale, struct dt_masks_gui_center_point_t *center_point, const shape_draw_function_t *draw_shape_func)
Draw the source for a correction mask.
Definition masks_gui.c:3368
GtkWidget * dt_masks_gui_add_interaction_slider(GtkWidget *menu, const char *label, dt_develop_t *dev, int group_id, int formid, dt_masks_interaction_t interaction, dt_masks_increment_t increment, float min, float max, float step, float value, int digits, const char *format, float factor, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module)
Append a bauhaus-slider menu item to a mask context menu, bound to one shape interaction (size,...
Definition masks_gui.c:519
gboolean(* dt_masks_border_handle_fn)(const dt_masks_form_gui_points_t *gui_points, int node_count, int node_index, float *handle_x, float *handle_y, void *user_data)
Shape-specific callback to fetch a node's border handle in GUI space.
Definition masks_gui.h:904
int dt_masks_group_index_from_formid(const dt_masks_form_t *group_form, int formid)
Find any group that currently references formid, searching every top-level group in dev->forms and th...
Definition masks_gui.c:1388
void _masks_gui_delete_node_callback(GtkWidget *menu, gpointer user_data)
Definition masks_gui.c:679
static void dt_masks_gui_cursor_to_raw_norm(dt_develop_t *dev, const dt_masks_form_gui_t *gui, float point[2])
Definition masks_gui.h:304
int dt_masks_center_view_on_form(struct dt_develop_t *dev, const struct dt_masks_form_t *form)
dt_masks_form_group_t * dt_masks_form_get_selected_group(const struct dt_masks_form_t *form, const struct dt_masks_form_gui_t *gui)
static void dt_masks_draw_preview_shape(struct dt_develop_t *dev, cairo_t *cr, const float zoom_scale, const int num_points, float *points, const int points_count, float *border, const int border_count, const shape_draw_function_t *draw_shape, const cairo_line_cap_t shape_cap, const cairo_line_cap_t border_cap, const gboolean save_restore, const gboolean source)
Definition masks_gui.h:410
static float dt_masks_border_from_projected_handle(dt_develop_t *dev, const float node[2], const float projected_image_pos[2], const float scale_ref)
Definition masks_gui.h:386
int dt_masks_events_mouse_leave(struct dt_iop_module_t *module)
Definition masks_gui.c:2648
void dt_masks_form_invalidate_gravity_center(struct dt_masks_form_t *form)
Definition masks.c:1343
float dt_masks_form_set_interaction_value(dt_develop_t *dev, int group_id, int formid, dt_masks_interaction_t interaction, float value, dt_masks_increment_t increment, int flow, struct dt_masks_form_gui_t *gui, struct dt_iop_module_t *module)
Definition masks_gui.c:5196
void(* dt_masks_shape_buttons_notify_f)(GtkWidget *button, dt_iop_module_t *module, dt_masks_type_t type, gpointer user_data)
Definition masks_gui.h:507
gboolean dt_masks_gui_is_dragging(const dt_masks_form_gui_t *gui)
Definition masks_gui.c:1475
gboolean dt_masks_remove_shape_from_group(struct dt_iop_module_t *module, dt_masks_form_t *sel, int parent_id, dt_masks_form_gui_t *mask_gui, int form_id)
Remove the form from its current group only, keeping it around unused for potential reuse....
Definition masks_gui.c:2235
void dt_masks_reset_show_masks_icons(dt_develop_t *dev)
Definition masks_gui.c:4909
gboolean dt_masks_point_is_within_radius(const float px, const float py, const float cx, const float cy, const float radius)
Check if a point (px,py) is inside a radius from a center point (cx,cy)
Definition masks_gui.c:1157
static void dt_masks_preview_buffers_cleanup(dt_masks_preview_buffers_t *buffers)
Definition masks_gui.h:443
float dt_masks_form_get_interaction_value(dt_develop_t *dev, int group_id, int formid, dt_masks_interaction_t interaction)
Definition masks_gui.c:5135
static gboolean dt_masks_gui_was_anything_selected(const dt_masks_form_gui_t *gui)
Definition masks_gui.h:230
int dt_masks_gui_confirm_delete_form_dialog(const char *form_name)
Definition masks_gui.c:578
void dt_masks_shape_buttons_sync_all(void)
Make every shape toolbar show the shape currently being created, if any.
Definition masks_gui.c:176
static gboolean dt_masks_gui_change_affects_selected_node_or_all(const dt_masks_form_gui_t *gui, const int index)
Definition masks_gui.h:255
dt_masks_form_group_t * dt_masks_group_add_form_with_state(dt_develop_t *dev, dt_masks_form_t *grp, dt_masks_form_t *form, int parentid, dt_masks_state_t state, float opacity)
Definition masks_gui.c:5317
static gboolean dt_masks_gui_should_hit_test(dt_masks_form_gui_t *gui)
Definition masks_gui.h:288
static void dt_masks_gui_delta_from_raw_anchor(dt_develop_t *dev, const dt_masks_form_gui_t *gui, const float anchor[2], float *delta_x, float *delta_y)
Definition masks_gui.h:327
void dt_masks_gui_populate_interaction_sliders(GtkWidget *menu, dt_develop_t *dev, dt_masks_form_t *form, int group_id, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module)
Append the full set of shape-parameter sliders (size/fading/rotation or curvature/fade/rotation depen...
Definition masks_gui.c:798
const char * dt_masks_scroll_modifier_name(dt_masks_scroll_modifier_t modifier)
Definition masks_gui.c:3149
int dt_masks_events_mouse_scrolled(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, int up, uint32_t state, int delta_y)
Definition masks_gui.c:3218
float dt_masks_apply_increment(float current, float amount, dt_masks_increment_t increment, int flow)
Apply a scroll increment to a scalar value.
Definition masks_gui.c:5246
float dt_masks_get_set_conf_value_with_toast(dt_masks_form_t *form, const char *feature, float amount, float v_min, float v_max, dt_masks_increment_t increment, int flow, const char *toast_fmt, float toast_scale)
Update a mask configuration value and emit a toast message.
Definition masks_gui.c:5305
int dt_masks_events_mouse_enter(struct dt_iop_module_t *module)
Definition masks_gui.c:2653
float dt_masks_rotate_with_anchor(dt_develop_t *dev, const float anchor[2], const float center[2], dt_masks_form_gui_t *gui)
Rotate a mask shape around its center. WARNING: gui->delta will be updated with the new position afte...
Definition masks_gui.c:5706
dt_masks_shape_buttons_flags_t
Definition masks_gui.h:484
@ DT_MASKS_SHAPE_BUTTONS_GRADIENT
Definition masks_gui.h:496
@ DT_MASKS_SHAPE_BUTTONS_NONE
Definition masks_gui.h:486
@ DT_MASKS_SHAPE_BUTTONS_CIRCLE
Definition masks_gui.h:488
@ DT_MASKS_SHAPE_BUTTONS_BRUSH
Definition masks_gui.h:494
@ DT_MASKS_SHAPE_BUTTONS_ALL
Definition masks_gui.h:498
@ DT_MASKS_SHAPE_BUTTONS_ELLIPSE
Definition masks_gui.h:490
@ DT_MASKS_SHAPE_BUTTONS_POLYGON
Definition masks_gui.h:492
float dt_masks_apply_increment_precomputed(float current, float amount, float scale_amount, float offset_amount, dt_masks_increment_t increment)
Apply a scroll increment using precomputed scale/offset factors.
Definition masks_gui.c:5260
void dt_masks_draw_outline_runs(cairo_t *cr, const float *const points, const int first, const int last, const dt_masks_skip_range_t *skips, const int skip_count)
Definition masks_gui.c:6049
dt_masks_form_group_t * dt_masks_form_group_find_entry(dt_masks_form_t *group_form, int formid, int *out_index)
Find the group-membership entry for formid inside group_form's own points list (not recursive into su...
Definition masks_gui.c:1368
void dt_group_events_post_expose_only(cairo_t *cr, float zoom_scale, dt_masks_form_t *form, dt_masks_form_gui_t *gui, int pos)
Definition group.c:172
int dt_masks_events_button_released(dt_develop_t *dev, struct dt_iop_module_t *module, double x, double y, int which, uint32_t state)
Definition masks_gui.c:2906
gboolean dt_masks_delete_shape(struct dt_iop_module_t *module, dt_masks_form_t *sel, int parent_id, dt_masks_form_gui_t *mask_gui, int form_id)
Permanently delete the form from every group and from dev->forms. Gated by dt_masks_gui_confirm_perma...
Definition masks_gui.c:2242
void dt_masks_reset_form_gui(dt_develop_t *dev)
Definition masks_gui.c:4894
void dt_masks_append_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition masks_gui.c:2505
void dt_masks_soft_reset_form_gui(dt_masks_form_gui_t *gui)
Definition masks_gui.c:1877
dt_masks_form_group_t * dt_masks_form_get_selected_group_live(const struct dt_masks_form_t *form, const struct dt_masks_form_gui_t *gui)
Return the currently selected group entry, resolving to the live form group when the GUI is operating...
void dt_masks_set_source_pos_initial_value(dt_masks_form_gui_t *gui, dt_masks_form_t *form)
Initialize the clone source position based on current GUI state.
Definition masks_gui.c:5570
int dt_masks_events_key_pressed(dt_develop_t *dev, struct dt_iop_module_t *module, GdkEventKey *event)
Definition masks_gui.c:3040
void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module)
Definition masks_gui.c:5065
GtkWidget * dt_masks_create_menu(dt_masks_form_gui_t *gui, dt_masks_form_t *form, const dt_masks_form_group_t *fpt, const float pzx, const float pzy)
Definition masks_gui.c:865
void dt_masks_overlay_queue_redraw(GtkWidget *widget)
Definition masks_gui.c:4550
void dt_masks_gui_cleanup(struct dt_develop_t *dev)
Definition masks_gui.c:1436
dt_masks_interaction_t dt_masks_scroll_get_interaction(uint32_t key_state)
Resolve a wheel event's key state into the property it edits.
Definition masks_gui.c:3196
gboolean dt_masks_creation_mode_enter(dt_develop_t *dev, dt_iop_module_t *module, const dt_masks_type_t type)
Enter mask creation mode for a given shape type.
Definition masks_gui.c:5762
static void dt_masks_project_on_line(const float cursor[2], const float node[2], const float handle[2], float point[2])
Definition masks_gui.h:361
void dt_masks_gui_form_test_create(dt_masks_form_t *form, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module)
Definition masks_gui.c:2456
void(* dt_masks_node_position_fn)(const dt_masks_form_gui_points_t *gui_points, int node_index, float *node_x, float *node_y, void *user_data)
Shape-specific callback to fetch a node's position in GUI space.
Definition masks_gui.h:918
gboolean dt_masks_is_anything_hovered(const dt_masks_form_gui_t *mask_gui)
Definition masks_gui.c:2668
int dt_masks_find_closest_handle_common(dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int form_index, int node_count_override, dt_masks_border_handle_fn border_handle_cb, dt_masks_curve_handle_fn curve_handle_cb, dt_masks_node_position_fn node_position_cb, dt_masks_distance_fn distance_cb, dt_masks_post_select_fn post_select_cb, void *user_data)
Shared selection logic for node/handle/segment hit testing.
Definition masks_gui.c:1183
gboolean dt_masks_form_get_gravity_center(dt_develop_t *dev, const struct dt_masks_form_t *form, float center[2], float *area)
static gboolean dt_masks_gui_points_reach(const dt_masks_form_gui_points_t *gp, const float x, const float y, const float reach)
Definition masks_gui.h:83
void dt_masks_form_update_gravity_center(dt_develop_t *dev, struct dt_masks_form_t *form)
Definition masks.c:1325
void dt_masks_group_update_name(dt_iop_module_t *module)
Definition masks_gui.c:4968
dt_masks_form_t * dt_masks_get_visible_form(const struct dt_develop_t *dev)
void dt_masks_remove_node(struct dt_iop_module_t *module, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index, int node_index)
Definition masks_gui.c:2020
void dt_group_events_post_expose(cairo_t *cr, float zoom_scale, dt_masks_form_t *form, dt_masks_form_gui_t *gui)
Definition group.c:179
void(* dt_masks_curve_handle_fn)(const dt_masks_form_gui_points_t *gui_points, int node_index, float *handle_x, float *handle_y, void *user_data)
Shape-specific callback to fetch a node's curve handle in GUI space.
Definition masks_gui.h:911
dt_masks_interaction_t dt_masks_scroll_mapping_get(dt_masks_scroll_modifier_t modifier)
Definition masks_gui.c:3127
static void dt_masks_gui_delta_to_raw_norm(dt_develop_t *dev, const dt_masks_form_gui_t *gui, float point[2])
Definition masks_gui.h:312
void dt_masks_set_source_pos_initial_state(dt_masks_form_gui_t *gui, const uint32_t state)
Decide initial source positioning mode for clone masks.
Definition masks_gui.c:5545
void dt_masks_iop_combo_populate(GtkWidget *w, void *module)
Definition masks_gui.c:4981
void dt_masks_set_visible_form(struct dt_develop_t *dev, dt_masks_form_t *form)
Definition masks_gui.c:1414
dt_masks_edit_mode_t
dt_masks_state_t
Definition masks_types.h:87
dt_masks_type_t
Definition masks_types.h:62
dt_masks_interaction_t
dt_masks_increment_t
uint32_t width
Definition mipmap_cache.c:0
uint32_t height
Definition mipmap_cache.c:1
const float factor
Definition pdf.h:91
#define dt_pixelpipe_cache_free_align(mem)
static const dt_aligned_pixel_simd_t value
Definition simd.h:144
const float uint32_t state[4]
unsigned __int64 uint64_t
Definition strptime.c:75
dt_masks_skip_range_t * border_skips
Definition masks_gui.h:70
gboolean rebuild_pending
Definition masks_gui.h:173
gboolean node_selected
Definition masks_gui.h:145
gboolean handle_border_selected
Definition masks_gui.h:148
gboolean border_toggling
Definition masks_gui.h:163
dt_masks_dynbuf_t * guipoints_payload
Definition masks_gui.h:110
gboolean source_selected
Definition masks_gui.h:153
dt_masks_type_t creation_type
Definition masks_gui.h:182
uint64_t geometry_generation
Definition masks_gui.h:200
gboolean source_dragging
Definition masks_gui.h:161
dt_masks_edit_mode_t edit_mode
Definition masks_gui.h:138
dt_iop_module_t * creation_module
Definition masks_gui.h:180
gboolean creation_closing_form
Definition masks_gui.h:179
GList * creation_formids
Definition masks_gui.h:184
dt_masks_pressure_sensitivity_t pressure_sensitivity
Definition masks_gui.h:188
gboolean seg_selected
Definition masks_gui.h:147
gboolean form_dragging
Definition masks_gui.h:160
gboolean gradient_toggling
Definition masks_gui.h:164
dt_masks_type_t type
Definition masks_gui.h:103
dt_masks_form_t * form_visible
Definition masks_gui.h:105
gboolean form_selected
Definition masks_gui.h:151
gboolean handle_selected
Definition masks_gui.h:146
gboolean form_rotating
Definition masks_gui.h:162
dt_masks_dynbuf_t * guipoints
Definition masks_gui.h:110
gboolean border_selected
Definition masks_gui.h:152
float last_rebuild_pos[2]
Definition masks_gui.h:172
gboolean pivot_selected
Definition masks_gui.h:154
float last_hit_test_pos[2]
Definition masks_gui.h:176
struct dt_develop_t * dev
Definition masks_gui.h:101
struct dt_masks_gui_center_point_t::@27 main
struct dt_masks_gui_center_point_t::@28 source
How the overlay maps image coordinates onto its cairo target.
Definition masks_gui.h:598
dt_iop_module_t * creation_module
Definition masks_gui.h:516
dt_masks_shape_buttons_flags_t register_flags
Definition masks_gui.h:521
dt_masks_shape_buttons_type_f form_type
Definition masks_gui.h:525
dt_masks_shape_buttons_start_f can_start
Definition masks_gui.h:524
dt_masks_shape_buttons_notify_f exited
Definition masks_gui.h:527
struct dt_develop_t * dev
Definition masks_gui.h:514
dt_masks_shape_buttons_notify_f started
Definition masks_gui.h:526
dt_iop_module_t * owner_module
Definition masks_gui.h:515
dt_masks_shape_buttons_flags_t flags
Definition masks_gui.h:520
One cut in a shape's border outline: while walking the border buffer forward, on reaching index jump_...
#define DT_GUI_MOUSE_EFFECT_RADIUS