Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
masks.h
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2013-2021 darktable developers.
4
5 darktable is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 darktable is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with darktable. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19#pragma once
20
21#include "common/darktable.h"
22#include "common/opencl.h"
23#include "develop/pixelpipe.h"
24#include "dtgtk/button.h"
26#include "gui/draw.h"
27#include "control/control.h"
28
29#include <assert.h>
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35#define DEVELOP_MASKS_VERSION (6)
36
38typedef enum dt_masks_type_t
39{
40 DT_MASKS_NONE = 0, // keep first
42 DT_MASKS_PATH = 1 << 1,
48 DT_MASKS_NON_CLONE = 1 << 7
50
63
69
75
82
89
99
105
112
120
130
140
152
163
172
173
174/*
175* Type of user interaction to map with internal properties of masks.
176* Those were initially handled implicitly by Shift/Ctrl/Shift+Ctrl + mouse scroll
177* at the scope of each mask type, which is a shitty design when using Wacom tablets.
178* This case is now covered by the DT_MASK_INTERACTION_UNDEF.
179* Otherwise, when calling the mouse_scroll callback from GUI, we set the case
180* explicitly, along with a value.
181*/
183{
184 DT_MASKS_INTERACTION_UNDEF = 0, // let it be deduced contextually from key modifiers, implicit
185 DT_MASKS_INTERACTION_SIZE = 1, // property of the form (shape), explicit
186 DT_MASKS_INTERACTION_HARDNESS = 2, // property of the form (shape), explicit
187 DT_MASKS_INTERACTION_OPACITY = 3, // property of the group in which the form is included, explicit
190
194{
195 int point_struct_size; // sizeof(struct dt_masks_point_*_t)
197 void (*set_form_name)(struct dt_masks_form_t *const form, const size_t nb);
198 void (*set_hint_message)(const struct dt_masks_form_gui_t *const gui, const struct dt_masks_form_t *const form,
199 const int opacity, char *const __restrict__ msgbuf, const size_t msgbuf_len);
200 void (*duplicate_points)(struct dt_develop_t *const dev, struct dt_masks_form_t *base, struct dt_masks_form_t *dest);
201 void (*initial_source_pos)(const float iwd, const float iht, float *x, float *y);
202 void (*get_distance)(float x, float y, float as, struct dt_masks_form_gui_t *gui, int index, int num_points,
203 int *inside, int *inside_border, int *near, int *inside_source, float *dist);
204 int (*get_points)(dt_develop_t *dev, float x, float y, float radius_a, float radius_b, float rotation,
205 float **points, int *points_count);
206 int (*get_points_border)(dt_develop_t *dev, struct dt_masks_form_t *form, float **points, int *points_count,
207 float **border, int *border_count, int source, const dt_iop_module_t *const module);
208 int (*get_mask)(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece,
209 struct dt_masks_form_t *const form,
210 float **buffer, int *width, int *height, int *posx, int *posy);
211 int (*get_mask_roi)(const dt_iop_module_t *const fmodule, const dt_dev_pixelpipe_iop_t *const piece,
212 struct dt_masks_form_t *const form,
213 const dt_iop_roi_t *roi, float *buffer);
214 int (*get_area)(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece,
215 struct dt_masks_form_t *const form,
216 int *width, int *height, int *posx, int *posy);
218 int *width, int *height, int *posx, int *posy);
219 int (*mouse_moved)(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which,
220 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index);
221 int (*mouse_scrolled)(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state,
222 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index,
223 dt_masks_interaction_t interaction);
224 int (*button_pressed)(struct dt_iop_module_t *module, float pzx, float pzy,
225 double pressure, int which, int type, uint32_t state,
226 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index);
227 int (*button_released)(struct dt_iop_module_t *module, float pzx, float pzy, int which, uint32_t state,
228 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index);
229 void (*post_expose)(cairo_t *cr, float zoom_scale, struct dt_masks_form_gui_t *gui, int index, int num_points);
231
233typedef struct dt_masks_form_t
234{
235 GList *points; // list of point structures
238
239 // position of the source (used only for clone)
240 float source[2];
241 // name of the form
242 char name[128];
243 // id used to store the form
245 // version of the form
248
259
261typedef struct dt_masks_dynbuf_t
262{
263 float *buffer;
264 char tag[128];
265 size_t pos;
266 size_t size;
268
269
272{
273 // points used to draw the form
274 GList *points; // list of dt_masks_form_gui_points_t
275
276 // points used to sample mouse moves
279
280 // values for mouse positions, etc...
282 // TRUE if mouse has leaved the center window
295
305
307
308
309 gboolean creation;
312
314
315 // ids
319
327
330
333int dt_masks_get_points_border(dt_develop_t *dev, dt_masks_form_t *form, float **points, int *points_count,
334 float **border, int *border_count, int source, dt_iop_module_t *module);
335
338 int *width, int *height, int *posx, int *posy);
340 int *width, int *height, int *posx, int *posy);
342static inline int dt_masks_get_mask(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece,
343 dt_masks_form_t *const form,
344 float **buffer, int *width, int *height, int *posx, int *posy)
345{
346 return form->functions ? form->functions->get_mask(module, piece, form, buffer, width, height, posx, posy) : 0;
347}
348static inline int dt_masks_get_mask_roi(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece,
349 dt_masks_form_t *const form, const dt_iop_roi_t *roi, float *buffer)
350{
351 return form->functions ? form->functions->get_mask_roi(module, piece, form, roi, buffer) : 0;
352}
353
355 const dt_iop_roi_t *roi, float *buffer);
356
357// returns current masks version
358int dt_masks_version(void);
359
362
363// update masks from older versions
364int dt_masks_legacy_params(dt_develop_t *dev, void *params, const int old_version, const int new_version);
365/*
366 * TODO:
367 *
368 * int
369 * dt_masks_legacy_params(
370 * dt_develop_t *dev,
371 * const void *const old_params, const int old_version,
372 * void *new_params, const int new_version);
373 */
374
380void dt_masks_replace_current_forms(dt_develop_t *dev, GList *forms);
382dt_masks_form_t *dt_masks_get_from_id_ext(GList *forms, int id);
385
387void dt_masks_read_masks_history(dt_develop_t *dev, const int32_t imgid);
389void dt_masks_write_masks_history_item(const int32_t imgid, const int num, dt_masks_form_t *form);
392
396void dt_masks_reset_form_gui(void);
399
400int dt_masks_events_mouse_moved(struct dt_iop_module_t *module, double x, double y, double pressure,
401 int which);
402int dt_masks_events_button_released(struct dt_iop_module_t *module, double x, double y, int which,
403 uint32_t state);
404int dt_masks_events_button_pressed(struct dt_iop_module_t *module, double x, double y, double pressure,
405 int which, int type, uint32_t state);
406int dt_masks_events_mouse_scrolled(struct dt_iop_module_t *module, double x, double y, int up, uint32_t state);
407void dt_masks_events_post_expose(struct dt_iop_module_t *module, cairo_t *cr, int32_t width, int32_t height,
408 int32_t pointerx, int32_t pointery);
411
414 struct dt_iop_module_t *module);
422
423void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module);
426void dt_masks_iop_update(struct dt_iop_module_t *module);
427void dt_masks_iop_combo_populate(GtkWidget *w, void *module);
428void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src);
430
432int dt_masks_form_change_opacity(dt_masks_form_t *form, int parentid, int up);
433void dt_masks_form_move(dt_masks_form_t *grp, int formid, int up);
434int dt_masks_form_duplicate(dt_develop_t *dev, int formid);
435/* returns a duplicate tof form, including the formid */
437/* duplicate the list of forms, replace item in the list with form with the same formid */
438GList *dt_masks_dup_forms_deep(GList *forms, dt_masks_form_t *form);
439
441int dt_masks_point_in_form_exact(float x, float y, float *points, int points_start, int points_count);
442int dt_masks_point_in_form_near(float x, float y, float *points, int points_start, int points_count, float distance, int *near);
443
445void dt_masks_select_form(struct dt_iop_module_t *module, dt_masks_form_t *sel);
446
448void dt_masks_draw_clone_source_pos(cairo_t *cr, const float zoom_scale, const float x, const float y);
449void dt_masks_set_source_pos_initial_state(dt_masks_form_gui_t *gui, const uint32_t state, const float pzx,
450 const float pzy);
452 const float pzx, const float pzy);
453void dt_masks_calculate_source_pos_value(dt_masks_form_gui_t *gui, const int mask_type, const float initial_xpos,
454 const float initial_ypos, const float xpos, const float ypos, float *px,
455 float *py, const int adding);
456
458float dt_masks_form_get_opacity(dt_masks_form_t *form, int parentid);
459int dt_masks_form_set_opacity(dt_masks_form_t *form, int parentid, float opacity, dt_masks_increment_t offset);
460
472float dt_masks_get_set_conf_value(dt_masks_form_t *form, char *feature, float new_value, float v_min, float v_max,
473 dt_masks_increment_t increment);
474
476void dt_masks_extend_border(float *const mask, const int width, const int height, const int border);
477void dt_masks_blur_9x9_coeff(float *coeffs, const float sigma);
478void dt_masks_blur_9x9(float *const src, float *const out, const int width, const int height, const float sigma);
479void dt_masks_calc_rawdetail_mask(float *const src, float *const out, float *const tmp, const int width,
480 const int height, const dt_aligned_pixel_t wb);
481void dt_masks_calc_detail_mask(float *const src, float *const out, float *const tmp, const int width, const int height, const float threshold, const gboolean detail);
482
483void dt_group_events_post_expose(cairo_t *cr, float zoom_scale, dt_masks_form_t *form,
485
487static inline gboolean _dt_masks_dynbuf_growto(dt_masks_dynbuf_t *a, size_t size)
488{
489 const size_t newsize = dt_round_size_sse(sizeof(float) * size) / sizeof(float);
490 float *newbuf = dt_alloc_align_float(newsize);
491 if (!newbuf)
492 {
493 // not much we can do here except emit an error message
494 fprintf(stderr, "critical: out of memory for dynbuf '%s' with size request %zu!\n", a->tag, size);
495 return FALSE;
496 }
497 if (a->buffer)
498 {
499 memcpy(newbuf, a->buffer, a->size * sizeof(float));
500 dt_print(DT_DEBUG_MASKS, "[masks dynbuf '%s'] grows to size %lu (is %p, was %p)\n", a->tag,
501 (unsigned long)a->size, newbuf, a->buffer);
503 }
504 a->size = newsize;
505 a->buffer = newbuf;
506 return TRUE;
507}
508
509static inline dt_masks_dynbuf_t *dt_masks_dynbuf_init(size_t size, const char *tag)
510{
511 assert(size > 0);
512 dt_masks_dynbuf_t *a = (dt_masks_dynbuf_t *)calloc(1, sizeof(dt_masks_dynbuf_t));
513
514 if(a != NULL)
515 {
516 g_strlcpy(a->tag, tag, sizeof(a->tag)); //only for debugging purposes
517 a->pos = 0;
519 dt_print(DT_DEBUG_MASKS, "[masks dynbuf '%s'] with initial size %lu (is %p)\n", a->tag,
520 (unsigned long)a->size, a->buffer);
521 if(a->buffer == NULL)
522 {
523 free(a);
524 a = NULL;
525 }
526 }
527 return a;
528}
529
530static inline void dt_masks_dynbuf_add_2(dt_masks_dynbuf_t *a, float value1, float value2)
531{
532 assert(a != NULL);
533 assert(a->pos <= a->size);
534 if(__builtin_expect(a->pos + 2 >= a->size, 0))
535 {
536 if (a->size == 0 || !_dt_masks_dynbuf_growto(a, 2 * (a->size+1)))
537 return;
538 }
539 a->buffer[a->pos++] = value1;
540 a->buffer[a->pos++] = value2;
541}
542
543// Return a pointer to N floats past the current end of the dynbuf's contents, marking them as already in use.
544// The caller should then fill in the reserved elements using the returned pointer.
545static inline float *dt_masks_dynbuf_reserve_n(dt_masks_dynbuf_t *a, const int n)
546{
547 assert(a != NULL);
548 assert(a->pos <= a->size);
549 if(__builtin_expect(a->pos + n >= a->size, 0))
550 {
551 if(a->size == 0) return NULL;
552 size_t newsize = a->size;
553 while(a->pos + n >= newsize) newsize *= 2;
554 if (!_dt_masks_dynbuf_growto(a, newsize))
555 {
556 return NULL;
557 }
558 }
559 // get the current end of the (possibly reallocated) buffer, then mark the next N items as in-use
560 float *reserved = a->buffer + a->pos;
561 a->pos += n;
562 return reserved;
563}
564
565static inline void dt_masks_dynbuf_add_zeros(dt_masks_dynbuf_t *a, const int n)
566{
567 assert(a != NULL);
568 assert(a->pos <= a->size);
569 if(__builtin_expect(a->pos + n >= a->size, 0))
570 {
571 if(a->size == 0) return;
572 size_t newsize = a->size;
573 while(a->pos + n >= newsize) newsize *= 2;
574 if (!_dt_masks_dynbuf_growto(a, newsize))
575 {
576 return;
577 }
578 }
579 // now that we've ensured a sufficiently large buffer add N zeros to the end of the existing data
580 memset(a->buffer + a->pos, 0, n * sizeof(float));
581 a->pos += n;
582}
583
584
585static inline float dt_masks_dynbuf_get(dt_masks_dynbuf_t *a, int offset)
586{
587 assert(a != NULL);
588 // offset: must be negative distance relative to end of buffer
589 assert(offset < 0);
590 assert((long)a->pos + offset >= 0);
591 return (a->buffer[a->pos + offset]);
592}
593
594static inline void dt_masks_dynbuf_set(dt_masks_dynbuf_t *a, int offset, float value)
595{
596 assert(a != NULL);
597 // offset: must be negative distance relative to end of buffer
598 assert(offset < 0);
599 assert((long)a->pos + offset >= 0);
600 a->buffer[a->pos + offset] = value;
601}
602
604{
605 assert(a != NULL);
606 return a->buffer;
607}
608
610{
611 assert(a != NULL);
612 return a->pos;
613}
614
616{
617 assert(a != NULL);
618 a->pos = 0;
619}
620
622{
623 // take out data buffer and make dynamic buffer obsolete
624 if(a == NULL) return NULL;
625 float *r = a->buffer;
626 a->buffer = NULL;
627 a->pos = a->size = 0;
628 return r;
629}
630
632{
633 if(a == NULL) return;
634 dt_print(DT_DEBUG_MASKS, "[masks dynbuf '%s'] freed (was %p)\n", a->tag,
635 a->buffer);
637 free(a);
638}
639
640static inline int dt_masks_roundup(int num, int mult)
641{
642 const int rem = num % mult;
643
644 return (rem == 0) ? num : num + mult - rem;
645}
646
647#ifdef __cplusplus
648}
649#endif
650
651// clang-format off
652// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
653// vim: shiftwidth=2 expandtab tabstop=2 cindent
654// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
655// clang-format on
static double dist(double x1, double y1, double x2, double y2)
Definition ashift_lsd.c:239
#define TRUE
Definition ashift_lsd.c:151
#define FALSE
Definition ashift_lsd.c:147
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
int type
Definition common/metadata.c:42
void dt_print(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1395
@ DT_DEBUG_MASKS
Definition darktable.h:483
static float * dt_alloc_align_float(size_t pixels)
Definition darktable.h:345
static size_t dt_round_size_sse(const size_t size)
Definition darktable.h:285
#define dt_free_align(A)
Definition darktable.h:334
GList * dt_masks_dup_forms_deep(GList *forms, dt_masks_form_t *form)
Definition develop/masks/masks.c:71
void dt_masks_gui_form_remove(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index)
Definition develop/masks/masks.c:197
void dt_masks_blur_9x9(float *const src, float *const out, const int width, const int height, const float sigma)
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)
Definition develop/masks/masks.c:1112
void dt_masks_iop_update(struct dt_iop_module_t *module)
Definition blend_gui.c:2334
int dt_masks_legacy_params(dt_develop_t *dev, void *params, const int old_version, const int new_version)
Definition develop/masks/masks.c:730
static float * dt_masks_dynbuf_buffer(dt_masks_dynbuf_t *a)
Definition masks.h:603
void dt_masks_remove_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:290
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 develop/masks/masks.c:160
void dt_masks_change_form_gui(dt_masks_form_t *newform)
Definition develop/masks/masks.c:1191
void dt_masks_set_source_pos_initial_value(dt_masks_form_gui_t *gui, const int mask_type, dt_masks_form_t *form, const float pzx, const float pzy)
Definition develop/masks/masks.c:2132
static void dt_masks_dynbuf_add_2(dt_masks_dynbuf_t *a, float value1, float value2)
Definition masks.h:530
dt_masks_edit_mode_t
Definition masks.h:84
@ DT_MASKS_EDIT_RESTRICTED
Definition masks.h:87
@ DT_MASKS_EDIT_OFF
Definition masks.h:85
@ DT_MASKS_EDIT_FULL
Definition masks.h:86
int dt_masks_point_in_form_near(float x, float y, float *points, int points_start, int points_count, float distance, int *near)
Definition develop/masks/masks.c:2013
void dt_masks_calculate_source_pos_value(dt_masks_form_gui_t *gui, const int mask_type, const float initial_xpos, const float initial_ypos, const float xpos, const float ypos, float *px, float *py, const int adding)
Definition develop/masks/masks.c:2197
int dt_masks_form_change_opacity(dt_masks_form_t *form, int parentid, int up)
Definition develop/masks/masks.c:1706
int dt_masks_point_in_form_exact(float x, float y, float *points, int points_start, int points_count)
Definition develop/masks/masks.c:1978
void dt_masks_free_form(dt_masks_form_t *form)
Definition develop/masks/masks.c:982
static dt_masks_dynbuf_t * dt_masks_dynbuf_init(size_t size, const char *tag)
Definition masks.h:509
void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src)
Definition develop/masks/masks.c:1326
void dt_masks_reset_form_gui(void)
Definition develop/masks/masks.c:1197
void dt_masks_read_masks_history(dt_develop_t *dev, const int32_t imgid)
Definition develop/masks/masks.c:843
int dt_masks_events_button_released(struct dt_iop_module_t *module, double x, double y, int which, uint32_t state)
Definition develop/masks/masks.c:1044
int dt_masks_events_mouse_moved(struct dt_iop_module_t *module, double x, double y, double pressure, int which)
Definition develop/masks/masks.c:1010
int dt_masks_events_mouse_scrolled(struct dt_iop_module_t *module, double x, double y, int up, uint32_t state)
Definition develop/masks/masks.c:1090
static float dt_masks_dynbuf_get(dt_masks_dynbuf_t *a, int offset)
Definition masks.h:585
const dt_masks_functions_t dt_masks_functions_group
Definition group.c:670
dt_masks_form_t * dt_masks_dup_masks_form(const dt_masks_form_t *form)
Definition develop/masks/masks.c:31
int dt_masks_group_render_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, dt_masks_form_t *form, const dt_iop_roi_t *roi, float *buffer)
Definition group.c:640
dt_masks_state_t
Definition masks.h:53
@ DT_MASKS_STATE_DIFFERENCE
Definition masks.h:60
@ DT_MASKS_STATE_INVERSE
Definition masks.h:57
@ DT_MASKS_STATE_INTERSECTION
Definition masks.h:59
@ DT_MASKS_STATE_SHOW
Definition masks.h:56
@ DT_MASKS_STATE_EXCLUSION
Definition masks.h:61
@ DT_MASKS_STATE_NONE
Definition masks.h:54
@ DT_MASKS_STATE_UNION
Definition masks.h:58
@ DT_MASKS_STATE_USE
Definition masks.h:55
void dt_masks_write_masks_history_item(const int32_t imgid, const int num, dt_masks_form_t *form)
Definition develop/masks/masks.c:941
static float * dt_masks_dynbuf_reserve_n(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:545
const dt_masks_functions_t dt_masks_functions_path
Definition path.c:3143
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)
Definition develop/masks/masks.c:295
void dt_masks_select_form(struct dt_iop_module_t *module, dt_masks_form_t *sel)
Definition develop/masks/masks.c:2055
void dt_masks_calc_detail_mask(float *const src, float *const out, float *const tmp, const int width, const int height, const float threshold, const gboolean detail)
dt_masks_point_group_t * dt_masks_group_add_form(dt_masks_form_t *grp, dt_masks_form_t *form)
Definition develop/masks/masks.c:1763
void dt_masks_clear_form_gui(dt_develop_t *dev)
Definition develop/masks/masks.c:1158
static gboolean _dt_masks_dynbuf_growto(dt_masks_dynbuf_t *a, size_t size)
Definition masks.h:487
void dt_masks_blur_9x9_coeff(float *coeffs, const float sigma)
Definition detail.c:163
dt_masks_type_t
Definition masks.h:39
@ DT_MASKS_NON_CLONE
Definition masks.h:48
@ DT_MASKS_BRUSH
Definition masks.h:47
@ DT_MASKS_ELLIPSE
Definition masks.h:46
@ DT_MASKS_CLONE
Definition masks.h:44
@ DT_MASKS_GRADIENT
Definition masks.h:45
@ DT_MASKS_NONE
Definition masks.h:40
@ DT_MASKS_CIRCLE
Definition masks.h:41
@ DT_MASKS_PATH
Definition masks.h:42
@ DT_MASKS_GROUP
Definition masks.h:43
dt_masks_interaction_t
Definition masks.h:183
@ DT_MASKS_INTERACTION_OPACITY
Definition masks.h:187
@ DT_MASKS_INTERACTION_HARDNESS
Definition masks.h:186
@ DT_MASKS_INTERACTION_SIZE
Definition masks.h:185
@ DT_MASKS_INTERACTION_LAST
Definition masks.h:188
@ DT_MASKS_INTERACTION_UNDEF
Definition masks.h:184
void dt_masks_replace_current_forms(dt_develop_t *dev, GList *forms)
Definition develop/masks/masks.c:815
void dt_masks_set_source_pos_initial_state(dt_masks_form_gui_t *gui, const uint32_t state, const float pzx, const float pzy)
Definition develop/masks/masks.c:2114
int dt_masks_version(void)
Definition develop/masks/masks.c:424
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)
Change a numerical property of a mask shape, either by in/de-crementing the current value or setting ...
Definition develop/masks/masks.c:1659
dt_masks_ellipse_flags_t
Definition masks.h:101
@ DT_MASKS_ELLIPSE_PROPORTIONAL
Definition masks.h:103
@ DT_MASKS_ELLIPSE_EQUIDISTANT
Definition masks.h:102
int dt_masks_events_mouse_leave(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:990
static size_t dt_masks_dynbuf_position(dt_masks_dynbuf_t *a)
Definition masks.h:609
void dt_masks_calc_rawdetail_mask(float *const src, float *const out, float *const tmp, const int width, const int height, const dt_aligned_pixel_t wb)
int dt_masks_get_area(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, dt_masks_form_t *form, int *width, int *height, int *posx, int *posy)
Definition develop/masks/masks.c:401
dt_masks_source_pos_type_t
Definition masks.h:107
@ DT_MASKS_SOURCE_POS_RELATIVE_TEMP
Definition masks.h:109
@ DT_MASKS_SOURCE_POS_RELATIVE
Definition masks.h:108
@ DT_MASKS_SOURCE_POS_ABSOLUTE
Definition masks.h:110
void dt_masks_cleanup_unused(dt_develop_t *dev)
Definition develop/masks/masks.c:1955
void dt_masks_group_ungroup(dt_masks_form_t *dest_grp, dt_masks_form_t *grp)
Definition develop/masks/masks.c:1786
int dt_masks_form_set_opacity(dt_masks_form_t *form, int parentid, float opacity, dt_masks_increment_t offset)
Definition develop/masks/masks.c:1678
dt_masks_form_t * dt_masks_create(dt_masks_type_t type)
Definition develop/masks/masks.c:776
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)
Definition develop/masks/masks.c:1070
int dt_masks_events_mouse_enter(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:1000
static void dt_masks_dynbuf_add_zeros(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:565
void dt_masks_form_move(dt_masks_form_t *grp, int formid, int up)
Definition develop/masks/masks.c:1712
dt_masks_increment_t
Definition masks.h:77
@ DT_MASKS_INCREMENT_SCALE
Definition masks.h:79
@ DT_MASKS_INCREMENT_OFFSET
Definition masks.h:80
@ DT_MASKS_INCREMENT_ABSOLUTE
Definition masks.h:78
dt_masks_pressure_sensitivity_t
Definition masks.h:91
@ DT_MASKS_PRESSURE_OPACITY_REL
Definition masks.h:95
@ DT_MASKS_PRESSURE_OPACITY_ABS
Definition masks.h:96
@ DT_MASKS_PRESSURE_BRUSHSIZE_REL
Definition masks.h:97
@ DT_MASKS_PRESSURE_HARDNESS_REL
Definition masks.h:93
@ DT_MASKS_PRESSURE_OFF
Definition masks.h:92
@ DT_MASKS_PRESSURE_HARDNESS_ABS
Definition masks.h:94
void dt_masks_draw_clone_source_pos(cairo_t *cr, const float zoom_scale, const float x, const float y)
Definition develop/masks/masks.c:2088
dt_masks_form_t * dt_masks_get_from_id_ext(GList *forms, int id)
Definition develop/masks/masks.c:828
int dt_masks_get_source_area(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, dt_masks_form_t *form, int *width, int *height, int *posx, int *posy)
Definition develop/masks/masks.c:410
const dt_masks_functions_t dt_masks_functions_ellipse
Definition ellipse.c:2199
const dt_masks_functions_t dt_masks_functions_circle
Definition circle.c:1334
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
Definition develop/masks/masks.c:838
dt_masks_points_states_t
Definition masks.h:65
@ DT_MASKS_POINT_STATE_NORMAL
Definition masks.h:66
@ DT_MASKS_POINT_STATE_USER
Definition masks.h:67
void dt_masks_append_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:285
float dt_masks_form_get_opacity(dt_masks_form_t *form, int parentid)
Definition develop/masks/masks.c:1606
void dt_masks_soft_reset_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:143
dt_masks_edit_mode_t dt_masks_get_edit_mode(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:1233
static int dt_masks_get_mask_roi(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece, dt_masks_form_t *const form, const dt_iop_roi_t *roi, float *buffer)
Definition masks.h:348
void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module)
Definition develop/masks/masks.c:1439
void dt_masks_init_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:132
dt_masks_gradient_states_t
Definition masks.h:71
@ DT_MASKS_GRADIENT_STATE_SIGMOIDAL
Definition masks.h:73
@ DT_MASKS_GRADIENT_STATE_LINEAR
Definition masks.h:72
void dt_masks_reset_show_masks_icons(void)
Definition develop/masks/masks.c:1212
void dt_masks_extend_border(float *const mask, const int width, const int height, const int border)
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 develop/masks/masks.c:214
static int dt_masks_roundup(int num, int mult)
Definition masks.h:640
const dt_masks_functions_t dt_masks_functions_brush
Definition brush.c:2909
static float * dt_masks_dynbuf_harvest(dt_masks_dynbuf_t *a)
Definition masks.h:621
void dt_masks_form_remove(struct dt_iop_module_t *module, dt_masks_form_t *grp, dt_masks_form_t *form)
Definition develop/masks/masks.c:1507
void dt_masks_group_update_name(dt_iop_module_t *module)
Definition develop/masks/masks.c:1315
uint64_t dt_masks_group_get_hash(uint64_t hash, dt_masks_form_t *form)
Definition develop/masks/masks.c:1814
void dt_masks_set_edit_mode(struct dt_iop_module_t *module, dt_masks_edit_mode_t value)
Definition develop/masks/masks.c:1240
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:165
static void dt_masks_dynbuf_set(dt_masks_dynbuf_t *a, int offset, float value)
Definition masks.h:594
static int dt_masks_get_mask(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece, dt_masks_form_t *const form, float **buffer, int *width, int *height, int *posx, int *posy)
Definition masks.h:342
dt_masks_form_t * dt_masks_create_ext(dt_masks_type_t type)
Definition develop/masks/masks.c:804
int dt_masks_form_duplicate(dt_develop_t *dev, int formid)
Definition develop/masks/masks.c:366
const dt_masks_functions_t dt_masks_functions_gradient
Definition gradient.c:1458
static void dt_masks_dynbuf_reset(dt_masks_dynbuf_t *a)
Definition masks.h:615
void dt_masks_iop_combo_populate(GtkWidget *w, void *module)
Definition develop/masks/masks.c:1361
int dt_masks_get_points_border(dt_develop_t *dev, dt_masks_form_t *form, float **points, int *points_count, float **border, int *border_count, int source, dt_iop_module_t *module)
Definition develop/masks/masks.c:390
static void dt_masks_dynbuf_free(dt_masks_dynbuf_t *a)
Definition masks.h:631
size_t size
Definition mipmap_cache.c:3
unsigned __int64 uint64_t
Definition strptime.c:71
Definition pixelpipe_hb.h:46
Definition develop.h:143
Definition imageop.h:182
Definition imageop.h:32
Definition masks.h:262
size_t size
Definition masks.h:266
char tag[128]
Definition masks.h:264
size_t pos
Definition masks.h:265
float * buffer
Definition masks.h:263
Definition masks.h:250
float * source
Definition masks.h:255
float * border
Definition masks.h:253
gboolean clockwise
Definition masks.h:257
int source_count
Definition masks.h:256
int border_count
Definition masks.h:254
int points_count
Definition masks.h:252
float * points
Definition masks.h:251
Definition masks.h:272
float posy_source
Definition masks.h:281
gboolean border_toggling
Definition masks.h:299
int feather_dragging
Definition masks.h:302
dt_masks_dynbuf_t * guipoints_payload
Definition masks.h:277
int point_edited
Definition masks.h:290
gboolean source_selected
Definition masks.h:286
int seg_selected
Definition masks.h:292
gboolean source_dragging
Definition masks.h:297
dt_masks_edit_mode_t edit_mode
Definition masks.h:288
int point_border_selected
Definition masks.h:293
dt_iop_module_t * creation_module
Definition masks.h:311
int source_pos_type
Definition masks.h:294
int group_selected
Definition masks.h:306
gboolean creation_closing_form
Definition masks.h:310
uint64_t pipe_hash
Definition masks.h:317
dt_masks_pressure_sensitivity_t pressure_sensitivity
Definition masks.h:313
gboolean form_dragging
Definition masks.h:296
int guipoints_count
Definition masks.h:278
float scrolly
Definition masks.h:281
float scrollx
Definition masks.h:281
gboolean gradient_toggling
Definition masks.h:300
gboolean creation
Definition masks.h:309
float posx
Definition masks.h:281
int point_border_dragging
Definition masks.h:304
float dy
Definition masks.h:281
int feather_selected
Definition masks.h:291
GList * points
Definition masks.h:274
gboolean form_selected
Definition masks.h:284
int formid
Definition masks.h:316
gboolean form_rotating
Definition masks.h:298
dt_masks_dynbuf_t * guipoints
Definition masks.h:277
float posy
Definition masks.h:281
int point_dragging
Definition masks.h:301
gboolean border_selected
Definition masks.h:285
gboolean pivot_selected
Definition masks.h:287
gboolean mouse_leaved_center
Definition masks.h:283
int seg_dragging
Definition masks.h:303
float posx_source
Definition masks.h:281
int point_selected
Definition masks.h:289
float dx
Definition masks.h:281
Definition masks.h:234
const dt_masks_functions_t * functions
Definition masks.h:237
dt_masks_type_t type
Definition masks.h:236
float source[2]
Definition masks.h:240
int version
Definition masks.h:246
char name[128]
Definition masks.h:242
GList * points
Definition masks.h:235
int formid
Definition masks.h:244
Definition masks.h:194
int(* get_points)(dt_develop_t *dev, float x, float y, float radius_a, float radius_b, float rotation, float **points, int *points_count)
Definition masks.h:204
int(* get_source_area)(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, struct dt_masks_form_t *form, int *width, int *height, int *posx, int *posy)
Definition masks.h:217
int point_struct_size
Definition masks.h:195
int(* get_mask_roi)(const dt_iop_module_t *const fmodule, const dt_dev_pixelpipe_iop_t *const piece, struct dt_masks_form_t *const form, const dt_iop_roi_t *roi, float *buffer)
Definition masks.h:211
int(* get_area)(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece, struct dt_masks_form_t *const form, int *width, int *height, int *posx, int *posy)
Definition masks.h:214
void(* sanitize_config)(dt_masks_type_t type_flags)
Definition masks.h:196
void(* set_form_name)(struct dt_masks_form_t *const form, const size_t nb)
Definition masks.h:197
void(* duplicate_points)(struct dt_develop_t *const dev, struct dt_masks_form_t *base, struct dt_masks_form_t *dest)
Definition masks.h:200
int(* button_pressed)(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, int type, uint32_t state, struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index)
Definition masks.h:224
int(* get_points_border)(dt_develop_t *dev, struct dt_masks_form_t *form, float **points, int *points_count, float **border, int *border_count, int source, const dt_iop_module_t *const module)
Definition masks.h:206
int(* mouse_scrolled)(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state, struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index, dt_masks_interaction_t interaction)
Definition masks.h:221
void(* get_distance)(float x, float y, float as, struct dt_masks_form_gui_t *gui, int index, int num_points, int *inside, int *inside_border, int *near, int *inside_source, float *dist)
Definition masks.h:202
int(* get_mask)(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece, struct dt_masks_form_t *const form, float **buffer, int *width, int *height, int *posx, int *posy)
Definition masks.h:208
int(* button_released)(struct dt_iop_module_t *module, float pzx, float pzy, int which, uint32_t state, struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index)
Definition masks.h:227
void(* initial_source_pos)(const float iwd, const float iht, float *x, float *y)
Definition masks.h:201
int(* mouse_moved)(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index)
Definition masks.h:219
void(* post_expose)(cairo_t *cr, float zoom_scale, struct dt_masks_form_gui_t *gui, int index, int num_points)
Definition masks.h:229
void(* set_hint_message)(const struct dt_masks_form_gui_t *const gui, const struct dt_masks_form_t *const form, const int opacity, char *const __restrict__ msgbuf, const size_t msgbuf_len)
Definition masks.h:198
Definition masks.h:143
float density
Definition masks.h:148
float hardness
Definition masks.h:149
float border[2]
Definition masks.h:147
float corner[2]
Definition masks.h:144
float ctrl1[2]
Definition masks.h:145
dt_masks_points_states_t state
Definition masks.h:150
float ctrl2[2]
Definition masks.h:146
Definition masks.h:115
float border
Definition masks.h:118
float center[2]
Definition masks.h:116
float radius
Definition masks.h:117
Definition masks.h:123
float rotation
Definition masks.h:126
float center[2]
Definition masks.h:124
float border
Definition masks.h:127
float radius[2]
Definition masks.h:125
dt_masks_ellipse_flags_t flags
Definition masks.h:128
Definition masks.h:155
float curvature
Definition masks.h:160
dt_masks_gradient_states_t state
Definition masks.h:161
float rotation
Definition masks.h:157
float steepness
Definition masks.h:159
float compression
Definition masks.h:158
float anchor[2]
Definition masks.h:156
Definition masks.h:166
int state
Definition masks.h:169
float opacity
Definition masks.h:170
int parentid
Definition masks.h:168
int formid
Definition masks.h:167
Definition masks.h:133
dt_masks_points_states_t state
Definition masks.h:138
float corner[2]
Definition masks.h:134
float border[2]
Definition masks.h:137
float ctrl1[2]
Definition masks.h:135
float ctrl2[2]
Definition masks.h:136