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);
551 if(!gui)
return TRUE;
554 return selected_node < 0 || selected_node == index;
559 if(!points || !points->data)
return 0.0f;
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],
685 if(!mask_form || !mask_gui || !gui_points || !state || node_index < 0)
return FALSE;
695 ctrl1[0] = ctrl2[0] = node[0];
696 ctrl1[1] = ctrl2[1] = node[1];
707 const int form_index,
709 const int node_index,
712 if(!mask_form || !mask_gui || !gui_points || !state || node_index < 0)
return FALSE;
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;
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)
922 int which,
int type, uint32_t state);
952 const int points_count,
const int node_count,
const float zoom_scale);
955 int32_t pointerx, int32_t pointery);
1016 const float initial_ypos,
const float xpos,
const float ypos,
float *px,
1017 float *py,
const int adding);
1019 const float initial_xpos,
const float initial_ypos,
1020 const float xpos,
const float ypos,
const int adding)
1022 float source_pos[2] = { 0.0f, 0.0f };
1024 &source_pos[0], &source_pos[1], adding);
1025 dt_draw_cross(cr, zoom_scale, source_pos[0], source_pos[1]);
1092 const char *toast_fmt,
float toast_scale);
1117 const int height,
const dt_aligned_pixel_t wb);
1131 fprintf(stderr,
"critical: out of memory for dynbuf '%s' with size request %zu!\n",
a->tag,
size);
1136 memcpy(newbuf,
a->buffer,
a->size *
sizeof(
float));
1138 (
unsigned long)
a->size, newbuf,
a->buffer);
1153 g_strlcpy(
a->tag, tag,
sizeof(
a->tag));
1157 (
unsigned long)
a->size,
a->buffer);
1158 if(
a->buffer == NULL)
1169 assert(
a->pos <=
a->size);
1170 if(__builtin_expect(
a->pos + 2 >=
a->size, 0))
1175 a->buffer[
a->pos++] = value1;
1176 a->buffer[
a->pos++] = value2;
1184 assert(
a->pos <=
a->size);
1185 if(__builtin_expect(
a->pos +
n >=
a->size, 0))
1187 if(
a->size == 0)
return NULL;
1188 size_t newsize =
a->size;
1189 while(
a->pos +
n >= newsize) newsize *= 2;
1196 float *reserved =
a->buffer +
a->pos;
1204 assert(
a->pos <=
a->size);
1205 if(__builtin_expect(
a->pos +
n >=
a->size, 0))
1207 if(
a->size == 0)
return;
1208 size_t newsize =
a->size;
1209 while(
a->pos +
n >= newsize) newsize *= 2;
1216 memset(
a->buffer +
a->pos, 0,
n *
sizeof(
float));
1226 assert((
long)
a->pos + offset >= 0);
1227 return (
a->buffer[
a->pos + offset]);
1235 assert((
long)
a->pos + offset >= 0);
1236 a->buffer[
a->pos + offset] =
value;
1246 float center[2],
float *area)
1248 if(!points || !center || !area || points_count <= 0)
1255 if(area) *area = 0.0f;
1264 if(points_count >= 3)
1270 for(
int i = 0;
i < points_count;
i++)
1272 const int j = (
i + 1 < points_count) ? (
i + 1) : 0;
1273 const double x0 = points[
i * 2];
1274 const double y0 = points[
i * 2 + 1];
1275 const double x1 = points[j * 2];
1276 const double y1 = points[j * 2 + 1];
1278 const double cross = x0 * y1 - x1 * y0;
1280 cx += (x0 + x1) * cross;
1281 cy += (y0 + y1) * cross;
1284 if(fabs(area2) > 1e-12)
1286 const double inv = 1.0 / (3.0 * area2);
1287 center[0] = (float)(cx *
inv);
1288 center[1] = (float)(cy *
inv);
1290 *area = (float)(0.5 * fabs(area2));
1298 const float inv_count = 1.0f / (float)points_count;
1299 for(
int i = 0;
i < points_count;
i++)
1301 sum_x += points[
i * 2] * inv_count;
1302 sum_y += points[
i * 2 + 1] * inv_count;
1331 if(
a == NULL)
return NULL;
1332 float *
r =
a->buffer;
1334 a->pos =
a->size = 0;
1340 if(
a == NULL)
return;
1349 const int rem = num % mult;
1351 return (rem == 0) ? num : num + mult - rem;
1365 const float cx,
const float cy,
1366 const float radius);
1374 int node_index,
float *handle_x,
float *handle_y,
void *user_data);
1381 float *handle_x,
float *handle_y,
void *user_data);
1388 float *node_x,
float *node_y,
void *user_data);
1397 int *inside,
int *inside_border,
int *near,
int *inside_source,
float *
dist,
1403 int inside_source,
void *user_data);
1414 int form_index,
int node_count_override,
1427#define menu_item_set_fake_accel(menu_item, keyval, mods) \
1430 GtkWidget *child = gtk_bin_get_child(GTK_BIN(menu_item)); \
1431 if(GTK_IS_ACCEL_LABEL(child)) \
1432 gtk_accel_label_set_accel(GTK_ACCEL_LABEL(child), keyval, mods); \
1440 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:669
const float denom
Definition colorspaces_inline_conversions.h:1334
const float threshold
Definition colorspaces_inline_conversions.h:340
const float r
Definition colorspaces_inline_conversions.h:1324
const float b
Definition colorspaces_inline_conversions.h:1326
const float a
Definition colorspaces_inline_conversions.h:1292
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
const float n
Definition colorspaces_inline_conversions.h:929
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
darktable_t darktable
Definition darktable.c:178
void dt_print(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1530
@ DT_DEBUG_PERF
Definition darktable.h:639
@ DT_DEBUG_MASKS
Definition darktable.h:647
#define dt_pixelpipe_cache_alloc_align_float_cache(pixels, id)
Definition darktable.h:371
static size_t dt_round_size_sse(const size_t size)
Definition darktable.h:327
#define dt_free(ptr)
Definition darktable.h:380
#define dt_pixelpipe_cache_free_align(mem)
Definition darktable.h:377
static const dt_aligned_pixel_simd_t value
Definition darktable.h:501
static double dt_get_wtime(void)
Definition darktable.h:846
void dt_dev_coordinates_raw_norm_to_raw_abs(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:981
int dt_dev_coordinates_image_abs_to_raw_abs(dt_develop_t *dev, float *points, size_t points_count)
Definition develop.c:1390
void dt_dev_coordinates_raw_abs_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:964
void dt_dev_coordinates_image_abs_to_raw_norm(dt_develop_t *dev, float *points, size_t num_points)
Definition develop.c:996
static void dt_draw_cross(cairo_t *cr, const float zoom_scale, const float x, const float y)
Definition draw.h:896
@ 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:740
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:725
#define DT_GUI_MOUSE_EFFECT_RADIUS_SCALED
Definition gtk.h:71
static const float x
Definition iop_profile.h:239
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:718
GdkModifierType dt_masks_get_accel_mods(dt_masks_interaction_t interaction)
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:1014
static void dt_masks_gui_delta_to_image_abs(const dt_masks_form_gui_t *gui, float point[2])
Definition masks.h:612
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:3974
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:737
void dt_masks_gui_form_remove(dt_masks_form_t *form, dt_masks_form_gui_t *gui, int index)
Definition develop/masks/masks.c:1039
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:2651
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:1395
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:389
void dt_masks_iop_update(struct dt_iop_module_t *module)
Definition blend_gui.c:3264
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:1634
static float * dt_masks_dynbuf_buffer(dt_masks_dynbuf_t *a)
Definition masks.h:1239
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:3447
void dt_masks_remove_form(dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:1143
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:835
void dt_masks_change_form_gui(dt_masks_form_t *newform)
Definition develop/masks/masks.c:2768
int dt_masks_events_key_pressed(struct dt_iop_module_t *module, GdkEventKey *event)
Definition develop/masks/masks.c:2291
static void dt_masks_dynbuf_add_2(dt_masks_dynbuf_t *a, float value1, float value2)
Definition masks.h:1166
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_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:2398
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:1018
struct dt_iop_module_t * dt_masks_get_mask_manager(struct dt_develop_t *dev)
Definition develop/masks/masks.c:1762
int dt_masks_form_change_opacity(dt_masks_form_t *form, int parentid, int up, const int flow)
Definition develop/masks/masks.c:3382
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:3687
void dt_masks_free_form(dt_masks_form_t *form)
Definition develop/masks/masks.c:1997
gboolean dt_masks_form_cancel_creation(dt_iop_module_t *module, dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:993
void dt_masks_gui_reset_dragging(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:403
static dt_masks_dynbuf_t * dt_masks_dynbuf_init(size_t size, const char *tag)
Definition masks.h:1146
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:2897
void dt_masks_reset_form_gui(void)
Definition develop/masks/masks.c:2774
void dt_masks_read_masks_history(dt_develop_t *dev, const int32_t imgid)
Definition develop/masks/masks.c:1853
void dt_masks_gui_init(struct dt_develop_t *dev)
Definition develop/masks/masks.c:364
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:1402
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:2189
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:2145
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:2346
static float dt_masks_dynbuf_get(dt_masks_dynbuf_t *a, int offset)
Definition masks.h:1221
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:2015
const dt_masks_functions_t dt_masks_functions_group
Definition group.c:819
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:273
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:3366
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:1954
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:871
static float * dt_masks_dynbuf_reserve_n(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:1181
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:1150
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:3733
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:1773
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:3324
float dt_masks_form_get_interaction_value(dt_masks_form_group_t *form_group, dt_masks_interaction_t interaction)
Definition develop/masks/masks.c:3187
void dt_masks_clear_form_gui(dt_develop_t *dev)
Definition develop/masks/masks.c:2723
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:2483
static gboolean _dt_masks_dynbuf_growto(dt_masks_dynbuf_t *a, size_t size)
Definition masks.h:1124
void dt_masks_blur_9x9_coeff(float *coeffs, const float sigma)
Definition detail.c:171
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:1373
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:332
void dt_masks_replace_current_forms(dt_develop_t *dev, GList *forms)
Definition develop/masks/masks.c:1723
void _masks_gui_delete_node_callback(GtkWidget *menu, gpointer user_data)
Definition masks_gui.c:300
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:1315
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:1245
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:2005
static size_t dt_masks_dynbuf_position(dt_masks_dynbuf_t *a)
Definition masks.h:1316
gboolean dt_masks_gui_is_dragging(const dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:415
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
const dt_masks_functions_t dt_masks_functions_polygon
Definition polygon.c:3659
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:3652
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:3470
dt_masks_form_t * dt_masks_create(dt_masks_type_t type)
Definition develop/masks/masks.c:1680
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:2236
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:3295
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:3354
int dt_masks_events_mouse_enter(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:2010
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:3909
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:3309
static void dt_masks_dynbuf_add_zeros(dt_masks_dynbuf_t *a, const int n)
Definition masks.h:1201
void dt_masks_form_move(dt_masks_form_t *grp, int formid, int up)
Definition develop/masks/masks.c:3395
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:1277
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:3240
dt_masks_form_t * dt_masks_get_from_id_ext(GList *forms, int id)
Definition develop/masks/masks.c:1744
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:3846
const dt_masks_functions_t dt_masks_functions_ellipse
Definition ellipse.c:1698
const dt_masks_functions_t dt_masks_functions_circle
Definition circle.c:1141
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
Definition develop/masks/masks.c:1754
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:1136
void dt_masks_soft_reset_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:811
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:3776
dt_masks_edit_mode_t dt_masks_get_edit_mode(struct dt_iop_module_t *module)
Definition develop/masks/masks.c:2810
void dt_masks_iop_value_changed_callback(GtkWidget *widget, struct dt_iop_module_t *module)
Definition develop/masks/masks.c:3016
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:415
void dt_masks_gui_cleanup(struct dt_develop_t *dev)
Definition develop/masks/masks.c:380
void dt_masks_init_form_gui(dt_masks_form_gui_t *gui)
Definition develop/masks/masks.c:783
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:2789
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:1058
static int dt_masks_roundup(int num, int mult)
Definition masks.h:1347
const dt_masks_functions_t dt_masks_functions_brush
Definition develop/masks/brush.c:3242
static float * dt_masks_dynbuf_harvest(dt_masks_dynbuf_t *a)
Definition masks.h:1328
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:3086
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:1387
gboolean dt_masks_is_anything_hovered(const dt_masks_form_gui_t *mask_gui)
Definition develop/masks/masks.c:2025
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:1298
void dt_masks_group_update_name(dt_iop_module_t *module)
Definition develop/masks/masks.c:2886
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:923
uint64_t dt_masks_group_get_hash(uint64_t hash, dt_masks_form_t *form)
Definition develop/masks/masks.c:3500
void dt_masks_set_edit_mode(struct dt_iop_module_t *module, dt_masks_edit_mode_t value)
Definition develop/masks/masks.c:2817
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:137
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:1380
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:1288
static void dt_masks_dynbuf_set(dt_masks_dynbuf_t *a, int offset, float value)
Definition masks.h:1230
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:427
dt_masks_form_t * dt_masks_create_ext(dt_masks_type_t type)
Definition develop/masks/masks.c:1709
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:1253
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:2598
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:3751
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:1546
static void dt_masks_dynbuf_reset(dt_masks_dynbuf_t *a)
Definition masks.h:1322
void dt_masks_iop_combo_populate(GtkWidget *w, void *module)
Definition develop/masks/masks.c:2932
void dt_masks_form_update_gravity_center(struct dt_masks_form_t *form)
Definition develop/masks/masks.c:3213
void dt_masks_set_visible_form(struct dt_develop_t *dev, dt_masks_form_t *form)
Definition develop/masks/masks.c:358
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:3953
static void dt_masks_dynbuf_free(dt_masks_dynbuf_t *a)
Definition masks.h:1338
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
struct _GtkWidget GtkWidget
Definition splash.h:29
unsigned __int64 uint64_t
Definition strptime.c:74
int32_t unmuted
Definition darktable.h:688
Definition pixelpipe_hb.h:95
Definition pixelpipe_hb.h:216
uint64_t hash
Definition imageop.h:345
GtkWidget * widget
Definition imageop.h:302
struct dt_develop_t * dev
Definition imageop.h:261
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