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
50
63
69
75
82
89
99
105
112
115{
116 float center[2]; // point in normalized input space
117 float radius;
118 float border;
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 /* Mouse pzx and pzy are normalized coordinates in full image space */
220 int (*mouse_moved)(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which,
221 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index);
222 /* Mouse pzx and pzy are normalized coordinates in full image space */
223 int (*mouse_scrolled)(struct dt_iop_module_t *module, float pzx, float pzy, int up, const int delta_y, uint32_t state,
224 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index,
225 dt_masks_interaction_t interaction);
226 /* Mouse pzx and pzy are normalized coordinates in full image space */
227 int (*button_pressed)(struct dt_iop_module_t *module, float pzx, float pzy,
228 double pressure, int which, int type, uint32_t state,
229 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index);
230 /* Mouse pzx and pzy are normalized coordinates in full image space */
231 int (*button_released)(struct dt_iop_module_t *module, float pzx, float pzy, int which, uint32_t state,
232 struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index);
233 void (*post_expose)(cairo_t *cr, float zoom_scale, struct dt_masks_form_gui_t *gui, int index, int num_points);
234 // The function to draw the shape in question
235 void (*draw_shape)(cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source);
239
241typedef struct dt_masks_form_t
242{
243 GList *points; // list of point structures (nodes)
246
247 // position of the origin point of source (used only for clone)
248 float source[2];
249 // name of the form
250 char name[128];
251 // id used to store the form
253 // version of the form
256
259{
260 float *points; // points in anormalized out space
262 float *border; // border points in anormalized out space
264 float *source; // source point in anormalized out space
266 gboolean clockwise;
268
270typedef struct dt_masks_dynbuf_t
271{
272 float *buffer;
273 char tag[128];
274 size_t pos;
275 size_t size;
277
278
281{
282 // points used to draw the form
283 GList *points; // list of dt_masks_form_gui_points_t
284
285 // points used to sample mouse moves
288
289 // values for mouse positions, etc...
290
291 // Mouse position (in anormalized out space)
292 float pos[2];
293 // delta movement of the mouse (in anormalized out space)
294 float delta[2];
295 // scroll offset
297 // Position of a clone mask's source point
298 float pos_source[2];
299
300 // TRUE if mouse has leaved the center window
313
323
325
326
327 gboolean creation;
330
332
333 // ids
337
345
348
351int dt_masks_get_points_border(dt_develop_t *dev, dt_masks_form_t *form, float **points, int *points_count,
352 float **border, int *border_count, int source, dt_iop_module_t *module);
353
356 int *width, int *height, int *posx, int *posy);
358 int *width, int *height, int *posx, int *posy);
360static inline int dt_masks_get_mask(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece,
361 dt_masks_form_t *const form,
362 float **buffer, int *width, int *height, int *posx, int *posy)
363{
364 return form->functions ? form->functions->get_mask(module, piece, form, buffer, width, height, posx, posy) : 0;
365}
366static inline int dt_masks_get_mask_roi(const dt_iop_module_t *const module, const dt_dev_pixelpipe_iop_t *const piece,
367 dt_masks_form_t *const form, const dt_iop_roi_t *roi, float *buffer)
368{
369 return form->functions ? form->functions->get_mask_roi(module, piece, form, roi, buffer) : 0;
370}
371
373 const dt_iop_roi_t *roi, float *buffer);
374
375// returns current masks version
376int dt_masks_version(void);
377
380
381// update masks from older versions
382int dt_masks_legacy_params(dt_develop_t *dev, void *params, const int old_version, const int new_version);
383/*
384 * TODO:
385 *
386 * int
387 * dt_masks_legacy_params(
388 * dt_develop_t *dev,
389 * const void *const old_params, const int old_version,
390 * void *new_params, const int new_version);
391 */
392
398void dt_masks_replace_current_forms(dt_develop_t *dev, GList *forms);
400dt_masks_form_t *dt_masks_get_from_id_ext(GList *forms, int id);
403
405void dt_masks_read_masks_history(dt_develop_t *dev, const int32_t imgid);
407void dt_masks_write_masks_history_item(const int32_t imgid, const int num, dt_masks_form_t *form);
410
414void dt_masks_reset_form_gui(void);
417
418int dt_masks_events_mouse_moved(struct dt_iop_module_t *module, double x, double y, double pressure,
419 int which);
420int dt_masks_events_button_released(struct dt_iop_module_t *module, double x, double y, int which,
421 uint32_t state);
422int dt_masks_events_button_pressed(struct dt_iop_module_t *module, double x, double y, double pressure,
423 int which, int type, uint32_t state);
424int dt_masks_events_mouse_scrolled(struct dt_iop_module_t *module, double x, double y, int up, uint32_t state, int delta_y);
425
437gboolean dt_masks_is_corner_node(const dt_masks_form_gui_points_t *gpt, const int index, const int nb, const int coord_offset);
438
449void dt_masks_draw_source(cairo_t *cr, dt_masks_form_gui_t *gui, const int index, const int nb,
450 const float zoom_scale, const shape_draw_function_t *functions);
451
452void dt_masks_events_post_expose(struct dt_iop_module_t *module, cairo_t *cr, int32_t width, int32_t height,
453 int32_t pointerx, int32_t pointery);
456
459 struct dt_iop_module_t *module);
460
471gboolean dt_masks_gui_delete(struct dt_iop_module_t *module, dt_masks_form_t *form, dt_masks_form_gui_t *gui, const int parentid);
472
480
481void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module);
484void dt_masks_iop_update(struct dt_iop_module_t *module);
485void dt_masks_iop_combo_populate(GtkWidget *w, void *module);
486void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src);
488
490int dt_masks_form_change_opacity(dt_masks_form_t *form, int parentid, int up, const int flow);
491void dt_masks_form_move(dt_masks_form_t *grp, int formid, int up);
492int dt_masks_form_duplicate(dt_develop_t *dev, int formid);
493/* returns a duplicate tof form, including the formid */
495/* duplicate the list of forms, replace item in the list with form with the same formid */
496GList *dt_masks_dup_forms_deep(GList *forms, dt_masks_form_t *form);
497
499int dt_masks_point_in_form_exact(float x, float y, float *points, int points_start, int points_count);
500int dt_masks_point_in_form_near(float x, float y, float *points, int points_start, int points_count, float distance, int *near);
501
503void dt_masks_select_form(struct dt_iop_module_t *module, dt_masks_form_t *sel);
504
506void dt_masks_draw_clone_source_pos(cairo_t *cr, const float zoom_scale, const float x, const float y);
507void dt_masks_set_source_pos_initial_state(dt_masks_form_gui_t *gui, const uint32_t state, const float pzx,
508 const float pzy);
510 const float pzx, const float pzy);
511void dt_masks_calculate_source_pos_value(dt_masks_form_gui_t *gui, const int mask_type, const float initial_xpos,
512 const float initial_ypos, const float xpos, const float ypos, float *px,
513 float *py, const int adding);
524float dt_masks_rotate_with_anchor(dt_develop_t *dev, const float anchor[2], const float center[2], dt_masks_form_gui_t *gui);
525
527float dt_masks_form_get_opacity(dt_masks_form_t *form, int parentid);
528int dt_masks_form_set_opacity(dt_masks_form_t *form, int parentid, float opacity, dt_masks_increment_t offset, const int flow);
529
542float dt_masks_get_set_conf_value(dt_masks_form_t *form, char *feature, float new_value, float v_min, float v_max,
543 dt_masks_increment_t increment, const int flow);
544
546void dt_masks_extend_border(float *const mask, const int width, const int height, const int border);
547void dt_masks_blur_9x9_coeff(float *coeffs, const float sigma);
548void dt_masks_blur_9x9(float *const src, float *const out, const int width, const int height, const float sigma);
549void dt_masks_calc_rawdetail_mask(float *const src, float *const out, float *const tmp, const int width,
550 const int height, const dt_aligned_pixel_t wb);
551void 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);
552
553void dt_group_events_post_expose(cairo_t *cr, float zoom_scale, dt_masks_form_t *form,
555
557static inline gboolean _dt_masks_dynbuf_growto(dt_masks_dynbuf_t *a, size_t size)
558{
559 const size_t newsize = dt_round_size_sse(sizeof(float) * size) / sizeof(float);
560 float *newbuf = dt_alloc_align_float(newsize);
561 if (!newbuf)
562 {
563 // not much we can do here except emit an error message
564 fprintf(stderr, "critical: out of memory for dynbuf '%s' with size request %zu!\n", a->tag, size);
565 return FALSE;
566 }
567 if (a->buffer)
568 {
569 memcpy(newbuf, a->buffer, a->size * sizeof(float));
570 dt_print(DT_DEBUG_MASKS, "[masks dynbuf '%s'] grows to size %lu (is %p, was %p)\n", a->tag,
571 (unsigned long)a->size, newbuf, a->buffer);
573 }
574 a->size = newsize;
575 a->buffer = newbuf;
576 return TRUE;
577}
578
579static inline dt_masks_dynbuf_t *dt_masks_dynbuf_init(size_t size, const char *tag)
580{
581 assert(size > 0);
582 dt_masks_dynbuf_t *a = (dt_masks_dynbuf_t *)calloc(1, sizeof(dt_masks_dynbuf_t));
583
584 if(a != NULL)
585 {
586 g_strlcpy(a->tag, tag, sizeof(a->tag)); //only for debugging purposes
587 a->pos = 0;
589 dt_print(DT_DEBUG_MASKS, "[masks dynbuf '%s'] with initial size %lu (is %p)\n", a->tag,
590 (unsigned long)a->size, a->buffer);
591 if(a->buffer == NULL)
592 {
593 free(a);
594 a = NULL;
595 }
596 }
597 return a;
598}
599
600static inline void dt_masks_dynbuf_add_2(dt_masks_dynbuf_t *a, float value1, float value2)
601{
602 assert(a != NULL);
603 assert(a->pos <= a->size);
604 if(__builtin_expect(a->pos + 2 >= a->size, 0))
605 {
606 if (a->size == 0 || !_dt_masks_dynbuf_growto(a, 2 * (a->size+1)))
607 return;
608 }
609 a->buffer[a->pos++] = value1;
610 a->buffer[a->pos++] = value2;
611}
612
613// Return a pointer to N floats past the current end of the dynbuf's contents, marking them as already in use.
614// The caller should then fill in the reserved elements using the returned pointer.
615static inline float *dt_masks_dynbuf_reserve_n(dt_masks_dynbuf_t *a, const int n)
616{
617 assert(a != NULL);
618 assert(a->pos <= a->size);
619 if(__builtin_expect(a->pos + n >= a->size, 0))
620 {
621 if(a->size == 0) return NULL;
622 size_t newsize = a->size;
623 while(a->pos + n >= newsize) newsize *= 2;
624 if (!_dt_masks_dynbuf_growto(a, newsize))
625 {
626 return NULL;
627 }
628 }
629 // get the current end of the (possibly reallocated) buffer, then mark the next N items as in-use
630 float *reserved = a->buffer + a->pos;
631 a->pos += n;
632 return reserved;
633}
634
635static inline void dt_masks_dynbuf_add_zeros(dt_masks_dynbuf_t *a, const int n)
636{
637 assert(a != NULL);
638 assert(a->pos <= a->size);
639 if(__builtin_expect(a->pos + n >= a->size, 0))
640 {
641 if(a->size == 0) return;
642 size_t newsize = a->size;
643 while(a->pos + n >= newsize) newsize *= 2;
644 if (!_dt_masks_dynbuf_growto(a, newsize))
645 {
646 return;
647 }
648 }
649 // now that we've ensured a sufficiently large buffer add N zeros to the end of the existing data
650 memset(a->buffer + a->pos, 0, n * sizeof(float));
651 a->pos += n;
652}
653
654
655static inline float dt_masks_dynbuf_get(dt_masks_dynbuf_t *a, int offset)
656{
657 assert(a != NULL);
658 // offset: must be negative distance relative to end of buffer
659 assert(offset < 0);
660 assert((long)a->pos + offset >= 0);
661 return (a->buffer[a->pos + offset]);
662}
663
664static inline void dt_masks_dynbuf_set(dt_masks_dynbuf_t *a, int offset, float value)
665{
666 assert(a != NULL);
667 // offset: must be negative distance relative to end of buffer
668 assert(offset < 0);
669 assert((long)a->pos + offset >= 0);
670 a->buffer[a->pos + offset] = value;
671}
672
674{
675 assert(a != NULL);
676 return a->buffer;
677}
678
680{
681 assert(a != NULL);
682 return a->pos;
683}
684
686{
687 assert(a != NULL);
688 a->pos = 0;
689}
690
692{
693 // take out data buffer and make dynamic buffer obsolete
694 if(a == NULL) return NULL;
695 float *r = a->buffer;
696 a->buffer = NULL;
697 a->pos = a->size = 0;
698 return r;
699}
700
702{
703 if(a == NULL) return;
704 dt_print(DT_DEBUG_MASKS, "[masks dynbuf '%s'] freed (was %p)\n", a->tag,
705 a->buffer);
707 free(a);
708}
709
710static inline int dt_masks_roundup(int num, int mult)
711{
712 const int rem = num % mult;
713
714 return (rem == 0) ? num : num + mult - rem;
715}
716
727gboolean dt_masks_is_within_radius(const float px, const float py,
728 const float cx, const float cy,
729 const float radius);
730
731#ifdef __cplusplus
732}
733#endif
734
735// clang-format off
736// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
737// vim: shiftwidth=2 expandtab tabstop=2 cindent
738// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
739// 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:1417
@ 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
void(* shape_draw_function_t)(cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source)
Definition draw.h:676
GList * dt_masks_dup_forms_deep(GList *forms, dt_masks_form_t *form)
Definition develop/masks/masks.c:68
gboolean dt_masks_gui_delete(struct dt_iop_module_t *module, dt_masks_form_t *form, dt_masks_form_gui_t *gui, const int parentid)
Delete a mask shape or node form from the GUI. This function is to be used with a popupmenu "Delete" ...
Definition develop/masks/masks.c:261
void dt_masks_gui_form_remove(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index)
Definition develop/masks/masks.c:280
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:1373
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:812
static float * dt_masks_dynbuf_buffer(dt_masks_dynbuf_t *a)
Definition masks.h:673
dt_masks_form_group_t * dt_masks_group_add_form(dt_masks_form_t *grp, dt_masks_form_t *form)
Definition develop/masks/masks.c:2029
void dt_masks_remove_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:373
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:157
gboolean dt_masks_is_corner_node(const dt_masks_form_gui_points_t *gpt, const int index, const int nb, const int coord_offset)
returns wether a node is a corner or not. A node is a corner if its 2 control handles are at the same...
Definition develop/masks/masks.c:1221
void dt_masks_change_form_gui(dt_masks_form_t *newform)
Definition develop/masks/masks.c:1447
static void dt_masks_dynbuf_add_2(dt_masks_dynbuf_t *a, float value1, float value2)
Definition masks.h:600
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:2320
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:2501
int dt_masks_point_in_form_exact(float x, float y, float *points, int points_start, int points_count)
Check whether the 2D point (x, y) lies inside the polygon (mask) described by points.
Definition develop/masks/masks.c:2268
int dt_masks_form_change_opacity(dt_masks_form_t *form, int parentid, int up, const int flow)
Definition develop/masks/masks.c:1972
void dt_masks_free_form(dt_masks_form_t *form)
Definition develop/masks/masks.c:1064
void dt_masks_draw_source(cairo_t *cr, dt_masks_form_gui_t *gui, const int index, const int nb, const float zoom_scale, const shape_draw_function_t *functions)
Draw the source for a correction mask.
Definition develop/masks/masks.c:1269
static dt_masks_dynbuf_t * dt_masks_dynbuf_init(size_t size, const char *tag)
Definition masks.h:579
void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src)
Definition develop/masks/masks.c:1582
void dt_masks_reset_form_gui(void)
Definition develop/masks/masks.c:1453
void dt_masks_read_masks_history(dt_develop_t *dev, const int32_t imgid)
Definition develop/masks/masks.c:925
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:1151
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:1113
int dt_masks_events_mouse_scrolled(struct dt_iop_module_t *module, double x, double y, int up, uint32_t state, int delta_y)
Definition develop/masks/masks.c:1196
static float dt_masks_dynbuf_get(dt_masks_dynbuf_t *a, int offset)
Definition masks.h:655
const dt_masks_functions_t dt_masks_functions_group
Definition group.c:704
dt_masks_form_t * dt_masks_dup_masks_form(const dt_masks_form_t *form)
Definition develop/masks/masks.c:28
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:674
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:1023
static float * dt_masks_dynbuf_reserve_n(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:615
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:378
void dt_masks_select_form(struct dt_iop_module_t *module, dt_masks_form_t *sel)
Definition develop/masks/masks.c:2362
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)
int dt_masks_form_set_opacity(dt_masks_form_t *form, int parentid, float opacity, dt_masks_increment_t offset, const int flow)
Definition develop/masks/masks.c:1942
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 develop/masks/masks.c:1915
void dt_masks_clear_form_gui(dt_develop_t *dev)
Definition develop/masks/masks.c:1414
static gboolean _dt_masks_dynbuf_growto(dt_masks_dynbuf_t *a, size_t size)
Definition masks.h:557
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_POLYGON
Definition masks.h:42
@ 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_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:897
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:2420
int dt_masks_version(void)
Definition develop/masks/masks.c:506
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:1072
static size_t dt_masks_dynbuf_position(dt_masks_dynbuf_t *a)
Definition masks.h:679
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:483
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
const dt_masks_functions_t dt_masks_functions_polygon
Definition polygon.c:3005
void dt_masks_cleanup_unused(dt_develop_t *dev)
Definition develop/masks/masks.c:2221
void dt_masks_group_ungroup(dt_masks_form_t *dest_grp, dt_masks_form_t *grp)
Definition develop/masks/masks.c:2052
dt_masks_form_t * dt_masks_create(dt_masks_type_t type)
Definition develop/masks/masks.c:858
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:1176
int dt_masks_events_mouse_enter(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:1082
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 develop/masks/masks.c:2581
static void dt_masks_dynbuf_add_zeros(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:635
void dt_masks_form_move(dt_masks_form_t *grp, int formid, int up)
Definition develop/masks/masks.c:1978
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:2395
dt_masks_form_t * dt_masks_get_from_id_ext(GList *forms, int id)
Definition develop/masks/masks.c:910
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:492
const dt_masks_functions_t dt_masks_functions_ellipse
Definition ellipse.c:1753
const dt_masks_functions_t dt_masks_functions_circle
Definition circle.c:1184
gboolean dt_masks_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 develop/masks/masks.c:2617
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
Definition develop/masks/masks.c:920
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:368
float dt_masks_form_get_opacity(dt_masks_form_t *form, int parentid)
Definition develop/masks/masks.c:1862
void dt_masks_soft_reset_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:140
dt_masks_edit_mode_t dt_masks_get_edit_mode(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:1489
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:366
void dt_masks_set_source_pos_initial_value(dt_masks_form_gui_t *gui, dt_masks_form_t *form, const float pzx, const float pzy)
Definition develop/masks/masks.c:2440
void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module)
Definition develop/masks/masks.c:1695
void dt_masks_init_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:129
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:1468
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:297
static int dt_masks_roundup(int num, int mult)
Definition masks.h:710
const dt_masks_functions_t dt_masks_functions_brush
Definition brush.c:2672
static float * dt_masks_dynbuf_harvest(dt_masks_dynbuf_t *a)
Definition masks.h:691
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:1763
void dt_masks_group_update_name(dt_iop_module_t *module)
Definition develop/masks/masks.c:1571
uint64_t dt_masks_group_get_hash(uint64_t hash, dt_masks_form_t *form)
Definition develop/masks/masks.c:2080
void dt_masks_set_edit_mode(struct dt_iop_module_t *module, dt_masks_edit_mode_t value)
Definition develop/masks/masks.c:1496
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:195
static void dt_masks_dynbuf_set(dt_masks_dynbuf_t *a, int offset, float value)
Definition masks.h:664
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:360
dt_masks_form_t * dt_masks_create_ext(dt_masks_type_t type)
Definition develop/masks/masks.c:886
int dt_masks_form_duplicate(dt_develop_t *dev, int formid)
Definition develop/masks/masks.c:449
const dt_masks_functions_t dt_masks_functions_gradient
Definition gradient.c:1514
static void dt_masks_dynbuf_reset(dt_masks_dynbuf_t *a)
Definition masks.h:685
void dt_masks_iop_combo_populate(GtkWidget *w, void *module)
Definition develop/masks/masks.c:1617
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:473
static void dt_masks_dynbuf_free(dt_masks_dynbuf_t *a)
Definition masks.h:701
size_t size
Definition mipmap_cache.c:3
unsigned __int64 uint64_t
Definition strptime.c:71
Definition pixelpipe_hb.h:46
Definition develop.h:150
Definition imageop.h:181
Definition imageop.h:32
Definition masks.h:155
float extent
Definition masks.h:158
float curvature
Definition masks.h:160
float rotation
Definition masks.h:157
float center[2]
Definition masks.h:156
dt_masks_gradient_states_t state
Definition masks.h:161
float steepness
Definition masks.h:159
Definition masks.h:271
size_t size
Definition masks.h:275
char tag[128]
Definition masks.h:273
size_t pos
Definition masks.h:274
float * buffer
Definition masks.h:272
Definition masks.h:166
float opacity
Definition masks.h:170
int formid
Definition masks.h:167
int parentid
Definition masks.h:168
int state
Definition masks.h:169
Definition masks.h:259
float * source
Definition masks.h:264
float * border
Definition masks.h:262
gboolean clockwise
Definition masks.h:266
int source_count
Definition masks.h:265
int border_count
Definition masks.h:263
int points_count
Definition masks.h:261
float * points
Definition masks.h:260
Definition masks.h:281
int handle_border_selected
Definition masks.h:311
gboolean border_toggling
Definition masks.h:317
dt_masks_dynbuf_t * guipoints_payload
Definition masks.h:286
int node_edited
Definition masks.h:308
int handle_selected
Definition masks.h:309
gboolean source_selected
Definition masks.h:304
int handle_border_dragging
Definition masks.h:322
int node_selected
Definition masks.h:307
int seg_selected
Definition masks.h:310
gboolean source_dragging
Definition masks.h:315
dt_masks_edit_mode_t edit_mode
Definition masks.h:306
dt_iop_module_t * creation_module
Definition masks.h:329
int source_pos_type
Definition masks.h:312
int group_selected
Definition masks.h:324
gboolean creation_closing_form
Definition masks.h:328
float pos[2]
Definition masks.h:292
uint64_t pipe_hash
Definition masks.h:335
dt_masks_pressure_sensitivity_t pressure_sensitivity
Definition masks.h:331
gboolean form_dragging
Definition masks.h:314
int guipoints_count
Definition masks.h:287
float scrolly
Definition masks.h:296
float scrollx
Definition masks.h:296
gboolean gradient_toggling
Definition masks.h:318
gboolean creation
Definition masks.h:327
int node_dragging
Definition masks.h:319
float pos_source[2]
Definition masks.h:298
GList * points
Definition masks.h:283
gboolean form_selected
Definition masks.h:302
int formid
Definition masks.h:334
gboolean form_rotating
Definition masks.h:316
dt_masks_dynbuf_t * guipoints
Definition masks.h:286
gboolean border_selected
Definition masks.h:303
int handle_dragging
Definition masks.h:320
gboolean pivot_selected
Definition masks.h:305
gboolean mouse_leaved_center
Definition masks.h:301
int seg_dragging
Definition masks.h:321
float delta[2]
Definition masks.h:294
Definition masks.h:242
const dt_masks_functions_t * functions
Definition masks.h:245
dt_masks_type_t type
Definition masks.h:244
float source[2]
Definition masks.h:248
int version
Definition masks.h:254
char name[128]
Definition masks.h:250
GList * points
Definition masks.h:243
int formid
Definition masks.h:252
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(* mouse_scrolled)(struct dt_iop_module_t *module, float pzx, float pzy, int up, const int delta_y, 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:223
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:227
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
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
void(* draw_shape)(cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source)
Definition masks.h:235
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:231
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:220
void(* post_expose)(cairo_t *cr, float zoom_scale, struct dt_masks_form_gui_t *gui, int index, int num_points)
Definition masks.h:233
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
void(* init_ctrl_points)(struct dt_masks_form_t *form)
Definition masks.h:237
Definition masks.h:143
float ctrl2[2]
Definition masks.h:146
float node[2]
Definition masks.h:144
float ctrl1[2]
Definition masks.h:145
float hardness
Definition masks.h:149
dt_masks_points_states_t state
Definition masks.h:150
float border[2]
Definition masks.h:147
float density
Definition masks.h:148
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 border
Definition masks.h:127
float radius[2]
Definition masks.h:125
dt_masks_ellipse_flags_t flags
Definition masks.h:128
float center[2]
Definition masks.h:124
float rotation
Definition masks.h:126
Definition masks.h:133
dt_masks_points_states_t state
Definition masks.h:138
float node[2]
Definition masks.h:134
float ctrl2[2]
Definition masks.h:136
float border[2]
Definition masks.h:137
float ctrl1[2]
Definition masks.h:135