125#define DEVELOP_MASKS_VERSION (6)
318 const int opacity,
char *
const __restrict__ msgbuf,
const size_t msgbuf_len);
323 int *inside,
int *inside_border,
int *near,
int *inside_source,
float *
dist);
325 float **points,
int *points_count);
327 float **border,
int *border_count,
int source,
const dt_iop_module_t *
const module);
331 float **buffer,
int *
width,
int *
height,
int *posx,
int *posy);
359 double pressure,
int which,
int type, uint32_t
state,
368 void (*
draw_shape)(cairo_t *cr,
const float *points,
const int points_count,
const int nb,
const gboolean border,
const gboolean source);
554 return selected_node < 0 || selected_node == index;
562 const float *first = (
const float *)points->data;
563 float min_x = first[0];
564 float max_x = first[0];
565 float min_y = first[1];
566 float max_y = first[1];
568 for(
const GList *point_node = points; point_node; point_node = g_list_next(point_node))
570 const float *node = (
const float *)point_node->data;
572 min_x = fminf(min_x, node[0]);
573 max_x = fmaxf(max_x, node[0]);
574 min_y = fminf(min_y, node[1]);
575 max_y = fmaxf(max_y, node[1]);
578 return fmaxf(max_x - min_x, max_y - min_y);
586 if(gui->
last_hit_test_pos[0] < 0.0f || (dx * dx + dy * dy) > (hit_thresh * hit_thresh))
621 const float anchor[2],
float *delta_x,
float *delta_y)
625 *delta_x =
point[0] - anchor[0];
626 *delta_y =
point[1] - anchor[1];
648 form->
source[0] += delta_x;
649 form->
source[1] += delta_y;
653 const float delta_x,
const float delta_y)
665 ctrl1[0] = control_points[0];
666 ctrl1[1] = control_points[1];
667 ctrl2[0] = control_points[2];
668 ctrl2[1] = control_points[3];
679 const int form_index,
681 const int node_index,
682 float node[2],
float ctrl1[2],
float ctrl2[2],
695 ctrl1[0] = ctrl2[0] = node[0];
696 ctrl1[1] = ctrl2[1] = node[1];
707 const int form_index,
709 const int node_index,
727 const float handle[2],
float point[2])
729 const float dx_line = handle[0] - node[0];
730 const float dy_line = handle[1] - node[1];
732 if(fabsf(dx_line) < 1e-6f)
735 point[1] = cursor[1];
739 const float a = dy_line / dx_line;
740 const float b = node[1] - a * node[0];
741 const float denom = a * a + 1.0f;
742 const float xproj = (a * cursor[1] + cursor[0] - b * a) / denom;
745 point[1] = a * xproj + b;
752 const float projected_image_pos[2],
753 const float scale_ref)
755 float projected_raw[2] = { projected_image_pos[0], projected_image_pos[1] };
756 float node_raw[2] = { node[0], node[1] };
760 const float delta_x = projected_raw[0] - node_raw[0];
761 const float delta_y = projected_raw[1] - node_raw[1];
762 return sqrtf(delta_x * delta_x + delta_y * delta_y) / scale_ref;
768 float *points,
const int points_count,
769 float *border,
const int border_count,
770 void (*
const *draw_shape)(cairo_t *cr,
const float *points,
771 const int points_count,
const int nb,
772 const gboolean border,
773 const gboolean source),
774 const cairo_line_cap_t shape_cap,
775 const cairo_line_cap_t border_cap,
776 const gboolean save_restore)
778 if(save_restore) cairo_save(cr);
779 if(points && points_count > 0)
781 draw_shape, shape_cap);
782 if(border && border_count > 0)
784 draw_shape, border_cap);
785 if(save_restore) cairo_restore(cr);
833 float **border,
int *border_count,
int source,
dt_iop_module_t *module);
846 float **buffer,
int *
width,
int *
height,
int *posx,
int *posy)
952 const int points_count,
const int node_count,
const float zoom_scale);
955 int32_t pointerx, int32_t pointery);
1030 const float initial_ypos,
const float xpos,
const float ypos,
float *px,
1031 float *py,
const int adding);
1033 const float initial_xpos,
const float initial_ypos,
1034 const float xpos,
const float ypos,
const int adding)
1036 float source_pos[2] = { 0.0f, 0.0f };
1038 &source_pos[0], &source_pos[1], adding);
1039 dt_draw_cross(cr, zoom_scale, source_pos[0], source_pos[1]);
1106 const char *toast_fmt,
float toast_scale);
1145 fprintf(stderr,
"critical: out of memory for dynbuf '%s' with size request %" G_GSIZE_FORMAT
"!\n", a->
tag,
size);
1150 memcpy(newbuf, a->
buffer, a->
size *
sizeof(
float));
1167 g_strlcpy(a->
tag, tag,
sizeof(a->
tag));
1184 if(__builtin_expect(a->
pos + 2 >= a->
size, 0))
1199 if(__builtin_expect(a->
pos +
n >= a->
size, 0))
1201 if(a->
size == 0)
return NULL;
1202 size_t newsize = a->
size;
1203 while(a->
pos +
n >= newsize) newsize *= 2;
1219 if(__builtin_expect(a->
pos +
n >= a->
size, 0))
1221 if(a->
size == 0)
return;
1222 size_t newsize = a->
size;
1223 while(a->
pos +
n >= newsize) newsize *= 2;
1230 memset(a->
buffer + a->
pos, 0,
n *
sizeof(
float));
1240 assert((
long)a->
pos + offset >= 0);
1249 assert((
long)a->
pos + offset >= 0);
1260 float center[2],
float *area)
1278 if(points_count >= 3)
1284 for(
int i = 0;
i < points_count;
i++)
1286 const int j = (
i + 1 < points_count) ? (
i + 1) : 0;
1287 const double x0 = points[
i * 2];
1288 const double y0 = points[
i * 2 + 1];
1289 const double x1 = points[j * 2];
1290 const double y1 = points[j * 2 + 1];
1292 const double cross = x0 * y1 - x1 * y0;
1294 cx += (x0 + x1) * cross;
1295 cy += (y0 + y1) * cross;
1298 if(fabs(area2) > 1e-12)
1300 const double inv = 1.0 / (3.0 * area2);
1301 center[0] = (float)(cx *
inv);
1302 center[1] = (float)(cy *
inv);
1304 *area = (float)(0.5 * fabs(area2));
1312 const float inv_count = 1.0f / (float)points_count;
1313 for(
int i = 0;
i < points_count;
i++)
1315 sum_x += points[
i * 2] * inv_count;
1316 sum_y += points[
i * 2 + 1] * inv_count;
1363 const int rem = num % mult;
1365 return (rem == 0) ? num : num + mult - rem;
1379 const float cx,
const float cy,
1380 const float radius);
1388 int node_index,
float *handle_x,
float *handle_y,
void *user_data);
1395 float *handle_x,
float *handle_y,
void *user_data);
1402 float *node_x,
float *node_y,
void *user_data);
1411 int *inside,
int *inside_border,
int *near,
int *inside_source,
float *
dist,
1417 int inside_source,
void *user_data);
1428 int form_index,
int node_count_override,
1441#define menu_item_set_fake_accel(menu_item, keyval, mods) \
1444 GtkWidget *child = gtk_bin_get_child(GTK_BIN(menu_item)); \
1445 if(GTK_IS_ACCEL_LABEL(child)) \
1446 gtk_accel_label_set_accel(GTK_ACCEL_LABEL(child), keyval, mods); \
1454 const float pzx,
const float pzy);
static double dist(double x1, double y1, double x2, double y2)
Definition ashift_lsd.c:250
static double * inv
Definition ashift_lsd.c:1077
#define TRUE
Definition ashift_lsd.c:162
#define FALSE
Definition ashift_lsd.c:158
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
const float i
Definition colorspaces_inline_conversions.h:440
const float threshold
Definition colorspaces_inline_conversions.h:176
const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:42
const float n
Definition colorspaces_inline_conversions.h:678
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
darktable_t darktable
Definition darktable.c:173
void dt_print(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1448
@ DT_DEBUG_PERF
Definition darktable.h:718
@ DT_DEBUG_MASKS
Definition darktable.h:726
#define dt_pixelpipe_cache_alloc_align_float_cache(pixels, id)
Definition darktable.h:447
static size_t dt_round_size_sse(const size_t size)
Definition darktable.h:403
#define dt_free(ptr)
Definition darktable.h:456
#define dt_pixelpipe_cache_free_align(mem)
Definition darktable.h:453
static const dt_aligned_pixel_simd_t value
Definition darktable.h:577
static double dt_get_wtime(void)
Definition darktable.h:913
#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 darktable.h:281
void dt_dev_coordinates_raw_norm_to_raw_abs(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:986
int dt_dev_coordinates_image_abs_to_raw_abs(dt_develop_t *dev, float *points, size_t points_count)
Definition develop.c:1392
void dt_dev_coordinates_raw_abs_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:969
void dt_dev_coordinates_image_abs_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:1001
static void dt_draw_cross(cairo_t *cr, const float zoom_scale, const float x, const float y)
Definition draw.h:890
@ DT_MASKS_DASH_STICK
Definition draw.h:94
@ DT_MASKS_NO_DASH
Definition draw.h:93
static void dt_draw_shape_lines(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)
Draw the lines of a mask shape.
Definition draw.h:734
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:719
#define DT_GUI_MOUSE_EFFECT_RADIUS_SCALED
Definition gtk.h:71
static const float x
Definition iop_profile.h:235
GList * dt_masks_dup_forms_deep(GList *forms, dt_masks_form_t *form)
Duplicate the list of forms, replacing a single item by formid match.
Definition develop/masks/masks.c:719
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.h:612
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 develop/masks/masks.c:1020
void apply_operation(struct dt_masks_form_group_t *pt, const dt_masks_state_t apply_state)
Apply a mask state operation on a group entry.
Definition develop/masks/masks.c:4052
int dt_masks_group_render_roi(dt_iop_module_t *module, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, dt_masks_form_t *form, const dt_iop_roi_t *roi, float *buffer)
Definition group.c:661
void dt_masks_gui_form_remove(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index)
Definition develop/masks/masks.c:1105
static int dt_masks_gui_selected_segment_index(const dt_masks_form_gui_t *gui)
Definition masks.h:543
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:2726
static void dt_masks_draw_preview_shape(cairo_t *cr, const float zoom_scale, const int num_points, float *points, const int points_count, float *border, const int border_count, void(*const *draw_shape)(cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source), const cairo_line_cap_t shape_cap, const cairo_line_cap_t border_cap, const gboolean save_restore)
Definition masks.h:767
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, int *inside_source, float *dist, void *user_data)
Shape-specific callback for inside/border/segment hit testing.
Definition masks.h:1409
static int dt_masks_gui_selected_node_index(const dt_masks_form_gui_t *gui)
Definition masks.h:528
void dt_masks_gui_set_dragging(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:390
void dt_masks_iop_update(struct dt_iop_module_t *module)
Definition blend_gui.c:3267
static int dt_masks_gui_selected_handle_index(const dt_masks_form_gui_t *gui)
Definition masks.h:533
int dt_masks_legacy_params(dt_develop_t *dev, void *params, const int old_version, const int new_version)
Definition develop/masks/masks.c:1700
static float * dt_masks_dynbuf_buffer(dt_masks_dynbuf_t *a)
Definition masks.h:1253
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:3522
void dt_masks_remove_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:1209
static 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.h:676
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:836
void dt_masks_change_form_gui(dt_masks_form_t *newform)
Definition develop/masks/masks.c:2843
int dt_masks_events_key_pressed(struct dt_iop_module_t *module, GdkEventKey *event)
Definition develop/masks/masks.c:2365
static void dt_masks_dynbuf_add_2(dt_masks_dynbuf_t *a, float value1, float value2)
Definition masks.h:1180
dt_masks_edit_mode_t
Definition masks.h:200
@ DT_MASKS_EDIT_RESTRICTED
Definition masks.h:203
@ DT_MASKS_EDIT_OFF
Definition masks.h:201
@ DT_MASKS_EDIT_FULL
Definition masks.h:202
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 develop/masks/masks.c:1075
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 develop/masks/masks.c:2472
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.h:1032
struct dt_iop_module_t * dt_masks_get_mask_manager(struct dt_develop_t *dev)
Definition develop/masks/masks.c:1828
int dt_masks_form_change_opacity(dt_masks_form_t *form, int parentid, int up, const int flow)
Definition develop/masks/masks.c:3457
int dt_masks_point_in_form_exact(const float *pts, int num_pts, const float *points, int points_start, int points_count)
Check whether any 2D point in pts[] lies inside the form points[].
Definition develop/masks/masks.c:3765
void dt_masks_free_form(dt_masks_form_t *form)
Definition develop/masks/masks.c:2068
gboolean dt_masks_form_cancel_creation(dt_iop_module_t *module, dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:1054
void dt_masks_gui_reset_dragging(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:404
static dt_masks_dynbuf_t * dt_masks_dynbuf_init(size_t size, const char *tag)
Definition masks.h:1160
static void dt_masks_translate_source(dt_masks_form_t *form, const float delta_x, const float delta_y)
Definition masks.h:646
void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src)
Definition develop/masks/masks.c:2972
void dt_masks_reset_form_gui(void)
Definition develop/masks/masks.c:2849
void dt_masks_read_masks_history(dt_develop_t *dev, const int32_t imgid)
Definition develop/masks/masks.c:1919
void dt_masks_gui_init(struct dt_develop_t *dev)
Definition develop/masks/masks.c:365
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.h:1416
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:2260
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:2216
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:2420
static float dt_masks_dynbuf_get(dt_masks_dynbuf_t *a, int offset)
Definition masks.h:1235
static void dt_masks_translate_ctrl_node(float node[2], float ctrl1[2], float ctrl2[2], const float delta_x, const float delta_y)
Definition masks.h:652
gboolean dt_masks_is_anything_selected(const dt_masks_form_gui_t *mask_gui)
Definition develop/masks/masks.c:2086
const dt_masks_functions_t dt_masks_functions_group
Definition group.c:743
dt_masks_form_t * dt_masks_dup_masks_form(const dt_masks_form_t *form)
Deep-copy a mask form, including its points list.
Definition develop/masks/masks.c:274
void dt_masks_duplicate_points(const dt_masks_form_t *base, dt_masks_form_t *dest, size_t node_size)
Duplicate a points list for a mask using a fixed node size.
Definition develop/masks/masks.c:3441
dt_masks_state_t
Definition masks.h:166
@ DT_MASKS_STATE_DIFFERENCE
Definition masks.h:173
@ DT_MASKS_STATE_INVERSE
Definition masks.h:170
@ DT_MASKS_STATE_INTERSECTION
Definition masks.h:172
@ DT_MASKS_STATE_IS_COMBINE_OP
Definition masks.h:177
@ DT_MASKS_STATE_SHOW
Definition masks.h:169
@ DT_MASKS_STATE_EXCLUSION
Definition masks.h:174
@ DT_MASKS_STATE_NONE
Definition masks.h:167
@ DT_MASKS_STATE_UNION
Definition masks.h:171
@ DT_MASKS_STATE_USE
Definition masks.h:168
@ DT_MASKS_STATE_NOOP
Definition masks.h:175
static float dt_masks_get_form_size_from_nodes(const GList *points)
Definition masks.h:557
void dt_masks_write_masks_history_item(const int32_t imgid, const int num, dt_masks_form_t *form)
Definition develop/masks/masks.c:2025
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 develop/masks/masks.c:872
static float * dt_masks_dynbuf_reserve_n(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:1195
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:1216
void dt_masks_select_form(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 develop/masks/masks.c:3811
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)
static int dt_masks_gui_selected_handle_border_index(const dt_masks_form_gui_t *gui)
Definition masks.h:538
GList * dt_masks_snapshot_current_forms(dt_develop_t *dev, gboolean reset_changed)
Definition develop/masks/masks.c:1839
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:3399
float dt_masks_form_get_interaction_value(dt_masks_form_group_t *form_group, dt_masks_interaction_t interaction)
Definition develop/masks/masks.c:3263
void dt_masks_clear_form_gui(dt_develop_t *dev)
Definition develop/masks/masks.c:2798
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 develop/masks/masks.c:2558
static gboolean _dt_masks_dynbuf_growto(dt_masks_dynbuf_t *a, size_t size)
Definition masks.h:1138
void dt_masks_blur_9x9_coeff(float *coeffs, const float sigma)
Definition detail.c:159
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.h:1387
dt_masks_type_t
Definition masks.h:129
@ DT_MASKS_NON_CLONE
Definition masks.h:138
@ DT_MASKS_ALL
Definition masks.h:140
@ DT_MASKS_POLYGON
Definition masks.h:132
@ DT_MASKS_BRUSH
Definition masks.h:137
@ DT_MASKS_IS_PATH_SHAPE
Definition masks.h:148
@ DT_MASKS_IS_OPEN_SHAPE
Definition masks.h:144
@ DT_MASKS_ELLIPSE
Definition masks.h:136
@ DT_MASKS_CLONE
Definition masks.h:134
@ DT_MASKS_GRADIENT
Definition masks.h:135
@ DT_MASKS_NONE
Definition masks.h:130
@ DT_MASKS_CIRCLE
Definition masks.h:131
@ DT_MASKS_GROUP
Definition masks.h:133
@ DT_MASKS_IS_PRIMITIVE_SHAPE
Definition masks.h:149
@ DT_MASKS_IS_CLOSED_SHAPE
Definition masks.h:143
@ DT_MASKS_IS_RETOUCHE
Definition masks.h:146
dt_masks_interaction_t
Definition masks.h:302
@ DT_MASKS_INTERACTION_OPACITY
Definition masks.h:306
@ DT_MASKS_INTERACTION_HARDNESS
Definition masks.h:305
@ DT_MASKS_INTERACTION_SIZE
Definition masks.h:304
@ DT_MASKS_INTERACTION_LAST
Definition masks.h:307
@ DT_MASKS_INTERACTION_UNDEF
Definition masks.h:303
int dt_masks_group_index_from_formid(const dt_masks_form_t *group_form, int formid)
Definition develop/masks/masks.c:333
void dt_masks_replace_current_forms(dt_develop_t *dev, GList *forms)
Definition develop/masks/masks.c:1789
void _masks_gui_delete_node_callback(GtkWidget *menu, gpointer user_data)
Definition masks_gui.c:257
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.h:597
int dt_masks_version(void)
Definition develop/masks/masks.c:1381
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 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.h:751
static gboolean dt_masks_center_of_gravity_from_points(const float *points, const int points_count, float center[2], float *area)
Definition masks.h:1259
dt_masks_ellipse_flags_t
Definition masks.h:217
@ DT_MASKS_ELLIPSE_PROPORTIONAL
Definition masks.h:219
@ DT_MASKS_ELLIPSE_EQUIDISTANT
Definition masks.h:218
int dt_masks_events_mouse_leave(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:2076
static size_t dt_masks_dynbuf_position(dt_masks_dynbuf_t *a)
Definition masks.h:1330
gboolean dt_masks_gui_is_dragging(const dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:416
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)
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 develop/masks/masks.c:64
static void dt_masks_preview_buffers_cleanup(dt_masks_preview_buffers_t *buffers)
Definition masks.h:798
dt_masks_source_pos_type_t
Definition masks.h:223
@ DT_MASKS_SOURCE_POS_RELATIVE_TEMP
Definition masks.h:225
@ DT_MASKS_SOURCE_POS_RELATIVE
Definition masks.h:224
@ DT_MASKS_SOURCE_POS_ABSOLUTE
Definition masks.h:226
static gboolean dt_masks_gui_was_anything_selected(const dt_masks_form_gui_t *gui)
Definition masks.h:523
int dt_masks_gui_confirm_delete_form_dialog(const char *form_name)
Definition masks_gui.c:208
const dt_masks_functions_t dt_masks_functions_polygon
Definition polygon.c:3639
static gboolean dt_masks_gui_change_affects_selected_node_or_all(const dt_masks_form_gui_t *gui, const int index)
Definition masks.h:548
void dt_masks_cleanup_unused(dt_develop_t *dev)
Cleanup unused masks and refresh the current forms snapshot.
Definition develop/masks/masks.c:3730
dt_masks_event_t
Definition masks.h:156
@ DT_MASKS_EVENT_NONE
Definition masks.h:157
@ DT_MASKS_EVENT_UPDATE
Definition masks.h:160
@ DT_MASKS_EVENT_RESET
Definition masks.h:163
@ DT_MASKS_EVENT_ADD
Definition masks.h:158
@ DT_MASKS_EVENT_DELETE
Definition masks.h:161
@ DT_MASKS_EVENT_REMOVE
Definition masks.h:159
@ DT_MASKS_EVENT_CHANGE
Definition masks.h:162
void dt_masks_group_ungroup(dt_masks_form_t *dest_grp, dt_masks_form_t *grp)
Definition develop/masks/masks.c:3545
dt_masks_form_t * dt_masks_create(dt_masks_type_t type)
Definition develop/masks/masks.c:1746
static gboolean dt_masks_gui_should_hit_test(dt_masks_form_gui_t *gui)
Definition masks.h:581
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:2307
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.h:620
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 develop/masks/masks.c:3370
static gboolean dt_masks_form_is_clone(const dt_masks_form_t *form)
Definition masks.h:635
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 develop/masks/masks.c:3429
int dt_masks_events_mouse_enter(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:2081
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:3987
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 develop/masks/masks.c:3384
static void dt_masks_dynbuf_add_zeros(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:1215
void dt_masks_form_move(dt_masks_form_t *grp, int formid, int up)
Definition develop/masks/masks.c:3470
dt_masks_increment_t
Definition masks.h:193
@ DT_MASKS_INCREMENT_SCALE
Definition masks.h:195
@ DT_MASKS_INCREMENT_OFFSET
Definition masks.h:196
@ DT_MASKS_INCREMENT_ABSOLUTE
Definition masks.h:194
dt_masks_pressure_sensitivity_t
Definition masks.h:207
@ DT_MASKS_PRESSURE_OPACITY_REL
Definition masks.h:211
@ DT_MASKS_PRESSURE_OPACITY_ABS
Definition masks.h:212
@ DT_MASKS_PRESSURE_BRUSHSIZE_REL
Definition masks.h:213
@ DT_MASKS_PRESSURE_HARDNESS_REL
Definition masks.h:209
@ DT_MASKS_PRESSURE_OFF
Definition masks.h:208
@ DT_MASKS_PRESSURE_HARDNESS_ABS
Definition masks.h:210
int dt_masks_get_points_border(struct 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:1343
float dt_masks_form_set_interaction_value(dt_masks_form_group_t *form_group, 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 develop/masks/masks.c:3316
dt_masks_form_t * dt_masks_get_from_id_ext(GList *forms, int id)
Definition develop/masks/masks.c:1810
void dt_masks_calculate_source_pos_value(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 develop/masks/masks.c:3924
const dt_masks_functions_t dt_masks_functions_ellipse
Definition ellipse.c:1667
const dt_masks_functions_t dt_masks_functions_circle
Definition circle.c:1103
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
Definition develop/masks/masks.c:1820
dt_masks_points_states_t
Definition masks.h:181
@ DT_MASKS_POINT_STATE_NORMAL
Definition masks.h:182
@ DT_MASKS_POINT_STATE_USER
Definition masks.h:183
void dt_masks_append_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:1202
void dt_masks_soft_reset_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:812
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 develop/masks/masks.c:3854
dt_masks_edit_mode_t dt_masks_get_edit_mode(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:2885
void dt_masks_form_delete(struct dt_iop_module_t *module, dt_masks_form_t *grp, dt_masks_form_t *form)
Definition develop/masks/masks.c:3161
void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module)
Definition develop/masks/masks.c:3091
static int dt_masks_get_mask(const dt_iop_module_t *const module, dt_dev_pixelpipe_t *pipe, 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:843
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:372
void dt_masks_gui_cleanup(struct dt_develop_t *dev)
Definition develop/masks/masks.c:381
void dt_masks_init_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:784
static int dt_masks_get_mask_roi(const dt_iop_module_t *const module, dt_dev_pixelpipe_t *pipe, 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:852
static void dt_masks_project_on_line(const float cursor[2], const float node[2], const float handle[2], float point[2])
Definition masks.h:726
dt_masks_gradient_states_t
Definition masks.h:187
@ DT_MASKS_GRADIENT_STATE_SIGMOIDAL
Definition masks.h:189
@ DT_MASKS_GRADIENT_STATE_LINEAR
Definition masks.h:188
void dt_masks_reset_show_masks_icons(void)
Definition develop/masks/masks.c:2864
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:1124
static int dt_masks_roundup(int num, int mult)
Definition masks.h:1361
const dt_masks_functions_t dt_masks_functions_brush
Definition develop/masks/brush.c:3231
static float * dt_masks_dynbuf_harvest(dt_masks_dynbuf_t *a)
Definition masks.h:1342
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.h:1401
gboolean dt_masks_is_anything_hovered(const dt_masks_form_gui_t *mask_gui)
Definition develop/masks/masks.c:2096
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 develop/masks/masks.c:90
int dt_masks_get_source_area(dt_iop_module_t *module, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_masks_form_t *form, int *width, int *height, int *posx, int *posy)
Definition develop/masks/masks.c:1364
void dt_masks_group_update_name(dt_iop_module_t *module)
Definition develop/masks/masks.c:2961
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 develop/masks/masks.c:924
uint64_t dt_masks_group_get_hash(uint64_t hash, dt_masks_form_t *form)
Definition develop/masks/masks.c:3575
void dt_masks_set_edit_mode(struct dt_iop_module_t *module, dt_masks_edit_mode_t value)
Definition develop/masks/masks.c:2892
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:136
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.h:1394
int dt_masks_get_area(dt_iop_module_t *module, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_masks_form_t *form, int *width, int *height, int *posx, int *posy)
Definition develop/masks/masks.c:1354
static void dt_masks_dynbuf_set(dt_masks_dynbuf_t *a, int offset, float value)
Definition masks.h:1244
dt_masks_form_group_t * dt_masks_form_group_from_parentid(int parentid, int formid)
Return the group entry for a (parent, form) pair.
Definition develop/masks/masks.c:428
dt_masks_form_t * dt_masks_create_ext(dt_masks_type_t type)
Definition develop/masks/masks.c:1775
static 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.h:704
int dt_masks_form_duplicate(dt_develop_t *dev, int formid)
Definition develop/masks/masks.c:1319
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)
Definition develop/masks/masks.c:2673
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.h:605
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 develop/masks/masks.c:3829
static gboolean dt_masks_form_uses_spot_defaults(const dt_masks_form_t *form)
Definition masks.h:630
const dt_masks_functions_t dt_masks_functions_gradient
Definition gradient.c:1498
static void dt_masks_dynbuf_reset(dt_masks_dynbuf_t *a)
Definition masks.h:1336
void dt_masks_iop_combo_populate(GtkWidget *w, void *module)
Definition develop/masks/masks.c:3007
void dt_masks_form_update_gravity_center(struct dt_masks_form_t *form)
Definition develop/masks/masks.c:3289
void dt_masks_set_visible_form(struct dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:359
gboolean dt_masks_creation_mode(dt_iop_module_t *module, const dt_masks_type_t type)
Enter mask creation mode for a given shape type.
Definition develop/masks/masks.c:4031
static void dt_masks_dynbuf_free(dt_masks_dynbuf_t *a)
Definition masks.h:1352
static void dt_masks_reset_source(dt_masks_form_t *form)
Definition masks.h:640
static void dt_masks_set_ctrl_points(float ctrl1[2], float ctrl2[2], const float control_points[4])
Definition masks.h:663
gboolean dt_masks_form_get_gravity_center(const struct dt_masks_form_t *form, float center[2], float *area)
int dt_masks_copy_used_forms_for_module(dt_develop_t *dev_dest, dt_develop_t *dev_src, const struct dt_iop_module_t *mod_src)
size_t size
Definition mipmap_cache.c:3
float dt_aligned_pixel_t[4]
Definition noiseprofile.c:28
struct _GtkWidget GtkWidget
Definition splash.h:29
const float uint32_t state[4]
Definition src/develop/noise_generator.h:72
const float sigma
Definition src/develop/noise_generator.h:71
const float r
Definition src/develop/noise_generator.h:101
unsigned __int64 uint64_t
Definition strptime.c:75
int32_t unmuted
Definition darktable.h:759
Definition pixelpipe_hb.h:96
Definition pixelpipe_hb.h:218
uint64_t hash
Definition imageop.h:382
GtkWidget * widget
Definition imageop.h:339
struct dt_develop_t * dev
Definition imageop.h:298
Region of interest passed through the pixelpipe.
Definition imageop.h:72
float extent
Definition masks.h:274
float curvature
Definition masks.h:276
float rotation
Definition masks.h:273
float center[2]
Definition masks.h:272
dt_masks_gradient_states_t state
Definition masks.h:277
float steepness
Definition masks.h:275
size_t size
Definition masks.h:421
char tag[128]
Definition masks.h:419
size_t pos
Definition masks.h:420
float * buffer
Definition masks.h:418
float(* get_interaction_value)(const struct dt_masks_form_t *form, dt_masks_interaction_t interaction)
Definition masks.h:344
int point_struct_size
Definition masks.h:314
gboolean(* get_gravity_center)(const struct dt_masks_form_t *form, float center[2], float *area)
Definition masks.h:343
int(* button_pressed)(struct dt_iop_module_t *module, double x, double y, 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:358
int(* get_points)(struct dt_develop_t *dev, float x, float y, float radius_a, float radius_b, float rotation, float **points, int *points_count)
Definition masks.h:324
int(* button_released)(struct dt_iop_module_t *module, double x, double y, 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:362
int(* get_mask_roi)(const dt_iop_module_t *const fmodule, struct dt_dev_pixelpipe_t *pipe, 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:332
int(* get_source_area)(dt_iop_module_t *module, struct dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, struct dt_masks_form_t *form, int *width, int *height, int *posx, int *posy)
Definition masks.h:340
int(* key_pressed)(struct dt_iop_module_t *module, GdkEventKey *event, struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index)
Definition masks.h:365
int(* mouse_moved)(struct dt_iop_module_t *module, double x, double y, double pressure, int which, struct dt_masks_form_t *form, int parentid, struct dt_masks_form_gui_t *gui, int index)
Definition masks.h:351
void(* sanitize_config)(dt_masks_type_t type_flags)
Definition masks.h:315
void(* set_form_name)(struct dt_masks_form_t *const form, const size_t nb)
Definition masks.h:316
void(* duplicate_points)(struct dt_develop_t *const dev, struct dt_masks_form_t *base, struct dt_masks_form_t *dest)
Definition masks.h:319
int(* populate_context_menu)(GtkWidget *menu, struct dt_masks_form_t *form, struct dt_masks_form_gui_t *gui, const float pzx, const float pzy)
Definition masks.h:371
int(* update_hover)(struct dt_masks_form_t *form, struct dt_masks_form_gui_t *gui, int index)
Definition masks.h:349
float(* set_interaction_value)(struct dt_masks_form_t *form, 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.h:345
int(* get_points_border)(struct 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:326
int(* get_area)(const dt_iop_module_t *const module, struct dt_dev_pixelpipe_t *pipe, 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:336
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:322
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:368
int(* mouse_scrolled)(struct dt_iop_module_t *module, double x, double y, 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:354
void(* initial_source_pos)(const float iwd, const float iht, float *x, float *y)
Definition masks.h:320
int(* get_mask)(const dt_iop_module_t *const module, struct dt_dev_pixelpipe_t *pipe, 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:328
void(* post_expose)(cairo_t *cr, float zoom_scale, struct dt_masks_form_gui_t *gui, int index, int num_points)
Definition masks.h:366
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:317
void(* init_ctrl_points)(struct dt_masks_form_t *form)
Definition masks.h:370
struct dt_masks_gui_center_point_t::@33 source
struct dt_masks_gui_center_point_t::@32 main
float x
Definition masks.h:808
float y
Definition masks.h:809
float ctrl2[2]
Definition masks.h:262
float node[2]
Definition masks.h:260
float ctrl1[2]
Definition masks.h:261
float hardness
Definition masks.h:265
dt_masks_points_states_t state
Definition masks.h:266
float border[2]
Definition masks.h:263
float density
Definition masks.h:264
float border
Definition masks.h:234
float center[2]
Definition masks.h:232
float radius
Definition masks.h:233
float border
Definition masks.h:243
float radius[2]
Definition masks.h:241
dt_masks_ellipse_flags_t flags
Definition masks.h:244
float center[2]
Definition masks.h:240
float rotation
Definition masks.h:242
dt_masks_points_states_t state
Definition masks.h:254
float node[2]
Definition masks.h:250
float ctrl2[2]
Definition masks.h:252
float border[2]
Definition masks.h:253
float ctrl1[2]
Definition masks.h:251
float * border
Definition masks.h:794
float * points
Definition masks.h:792
int points_count
Definition masks.h:793
int border_count
Definition masks.h:795
Definition ashift_lsd.c:192