Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
masks.c File Reference
#include "common/darktable.h"
#include "develop/masks.h"
#include "develop/develop.h"
#include "bauhaus/bauhaus.h"
#include "common/debug.h"
#include "common/math.h"
#include "common/mipmap_cache.h"
#include "control/conf.h"
#include "common/undo.h"
#include "develop/blend.h"
#include "develop/imageop.h"
#include "develop/imageop_gui.h"
#include <stdint.h>
#include "detail.c"
+ Include dependency graph for develop/masks/masks.c:

Functions

gboolean dt_masks_point_is_within_radius (const float point_x, const float point_y, const float center_x, const float center_y, const float squared_radius)
 Check whether a point lies within a squared radius of a center.
 
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)
 Centralized hit-testing for node/handle/segment selection across shapes.
 
dt_masks_form_tdt_masks_dup_masks_form (const dt_masks_form_t *mask_form)
 Deep-copy a mask form, including its points list.
 
static void_dup_masks_form_cb (const void *formdata, gpointer user_data)
 
static dt_masks_form_group_t_masks_group_find_form (dt_masks_form_t *group_form, const int form_id)
 Find a form entry inside a group by form id.
 
int dt_masks_group_index_from_formid (const dt_masks_form_t *group_form, int form_id)
 
dt_masks_form_tdt_masks_get_visible_form (const dt_develop_t *dev)
 Return the currently visible form used by the masks GUI.
 
void dt_masks_set_visible_form (dt_develop_t *dev, dt_masks_form_t *form)
 
void dt_masks_gui_init (dt_develop_t *dev)
 
void dt_masks_gui_cleanup (dt_develop_t *dev)
 
void dt_masks_gui_set_dragging (dt_masks_form_gui_t *gui)
 
void dt_masks_gui_reset_dragging (dt_masks_form_gui_t *gui)
 
gboolean dt_masks_gui_is_dragging (const dt_masks_form_gui_t *gui)
 
dt_masks_form_group_tdt_masks_form_group_from_parentid (int parent_id, int form_id)
 Return the group entry for a (parent, form) pair.
 
dt_masks_form_group_tdt_masks_form_get_selected_group (const dt_masks_form_t *mask_form, const dt_masks_form_gui_t *mask_gui)
 Get the selected group entry from the GUI selection index.
 
dt_masks_form_group_tdt_masks_form_get_selected_group_live (const dt_masks_form_t *mask_form, const dt_masks_form_gui_t *mask_gui)
 Resolve a "live" selected group entry, even if GUI selection is stale.
 
static dt_masks_form_t_dt_masks_events_get_dispatch_form (dt_masks_form_t *visible_form, const dt_masks_form_gui_t *mask_gui, dt_masks_form_group_t **group_entry, int *parent_id, int *form_index)
 Resolve the concrete form that should receive an event.
 
static gboolean _dt_masks_events_group_update_selection (dt_masks_form_t *group_form, dt_masks_form_gui_t *mask_gui)
 Update group selection from the current cached cursor before leaf dispatch.
 
static gboolean _dt_masks_events_should_update_hover_on_move (dt_masks_form_gui_t *mask_gui)
 
static int _dt_masks_events_update_hover (dt_masks_form_t *dispatch_form, dt_masks_form_gui_t *mask_gui, const int form_index)
 
static gboolean _dt_masks_events_cursor_over_form (const dt_masks_form_t *dispatch_form, dt_masks_form_gui_t *mask_gui, const int form_index)
 
static gboolean _dt_masks_events_group_blocks_motion (dt_masks_form_gui_t *mask_gui)
 Consume the initial drag motion used to disambiguate scrolling vs dragging in groups.
 
static gboolean _dt_masks_events_flush_rebuild_if_needed (struct dt_iop_module_t *module, dt_masks_form_t *dispatch_form, dt_masks_form_gui_t *mask_gui, const int form_index, const int button)
 Flush a deferred throttled rebuild before drag state is reset.
 
GList * dt_masks_dup_forms_deep (GList *form_list, dt_masks_form_t *replacement_form)
 Duplicate the list of forms, replacing a single item by formid match.
 
static gboolean _set_hinter_message (dt_masks_form_gui_t *mask_gui, const dt_masks_form_t *mask_form)
 Build and display the on-canvas hint message for masks interactions.
 
void dt_masks_init_form_gui (dt_masks_form_gui_t *mask_gui)
 
void dt_masks_soft_reset_form_gui (dt_masks_form_gui_t *mask_gui)
 
void dt_masks_gui_form_create (dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int form_index, dt_iop_module_t *module)
 
gboolean dt_masks_gui_form_create_throttled (dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int form_index, dt_iop_module_t *module, float posx, float posy)
 
void dt_masks_form_gui_points_free (gpointer data)
 
void dt_masks_remove_node (struct dt_iop_module_t *module, dt_masks_form_t *mask_form, int parent_id, dt_masks_form_gui_t *mask_gui, int form_index, int node_index)
 
static gboolean _masks_remove_shape (struct dt_iop_module_t *module, dt_masks_form_t *mask_form, int parent_id, dt_masks_form_gui_t *mask_gui, int form_index)
 Remove a shape from the GUI and free its resources.
 
gboolean dt_masks_form_cancel_creation (dt_iop_module_t *module, dt_masks_form_gui_t *mask_gui)
 
gboolean dt_masks_gui_delete (struct dt_iop_module_t *module, dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, const int parent_id)
 Delete a mask shape or node form from the GUI. This function is to be used with a popupmenu "Delete" action in the future.
 
void dt_masks_gui_form_remove (dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int form_index)
 
void dt_masks_gui_form_test_create (dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, dt_iop_module_t *module)
 
static void _check_id (dt_masks_form_t *mask_form)
 
static void _set_group_name_from_module (dt_iop_module_t *module, dt_masks_form_t *group_form)
 
static dt_masks_form_t_group_create (dt_develop_t *develop, dt_iop_module_t *module, dt_masks_type_t group_type)
 
static dt_masks_form_t_group_from_module (dt_develop_t *develop, dt_iop_module_t *module)
 
void dt_masks_append_form (dt_develop_t *develop, dt_masks_form_t *mask_form)
 
void dt_masks_remove_form (dt_develop_t *develop, dt_masks_form_t *mask_form)
 
void dt_masks_gui_form_save_creation (dt_develop_t *develop, dt_iop_module_t *module, dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui)
 
int dt_masks_form_duplicate (dt_develop_t *develop, int form_id)
 
int dt_masks_get_points_border (dt_develop_t *develop, dt_masks_form_t *mask_form, float **point_buffer, int *point_count, float **border_buffer, int *border_count, int source, dt_iop_module_t *module)
 
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 *mask_form, int *area_width, int *area_height, int *area_pos_x, int *area_pos_y)
 
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 *mask_form, int *area_width, int *area_height, int *area_pos_x, int *area_pos_y)
 
int dt_masks_version (void)
 
static int dt_masks_legacy_params_v1_to_v2 (dt_develop_t *develop, void *params)
 
static void dt_masks_legacy_params_v2_to_v3_transform (const dt_image_t *image, float *coords)
 
static void dt_masks_legacy_params_v2_to_v3_transform_only_rescale (const dt_image_t *image, float *coords, size_t coords_count)
 
static int dt_masks_legacy_params_v2_to_v3 (dt_develop_t *develop, void *params)
 
static int dt_masks_legacy_params_v3_to_v4 (dt_develop_t *develop, void *params)
 
static int dt_masks_legacy_params_v4_to_v5 (dt_develop_t *develop, void *params)
 
static int dt_masks_legacy_params_v5_to_v6 (dt_develop_t *develop, void *params)
 
int dt_masks_legacy_params (dt_develop_t *develop, void *params, const int old_version, const int new_version)
 
dt_masks_form_tdt_masks_create (dt_masks_type_t type)
 
dt_masks_form_tdt_masks_create_ext (dt_masks_type_t type)
 
void dt_masks_replace_current_forms (dt_develop_t *develop, GList *forms)
 
dt_masks_form_tdt_masks_get_from_id_ext (GList *form_list, int form_id)
 
dt_masks_form_tdt_masks_get_from_id (dt_develop_t *develop, int form_id)
 
dt_iop_module_tdt_masks_get_mask_manager (dt_develop_t *develop)
 
GList * dt_masks_snapshot_current_forms (dt_develop_t *develop, gboolean reset_changed)
 
static void _masks_fill_used_forms (GList *forms_list, const int form_id, int *used_form_ids, const int used_count)
 
int dt_masks_copy_used_forms_for_module (dt_develop_t *develop_dest, dt_develop_t *develop_src, const dt_iop_module_t *source_module)
 
void dt_masks_read_masks_history (dt_develop_t *develop, const int32_t image_id)
 
void dt_masks_write_masks_history_item (const int32_t image_id, const int history_num, dt_masks_form_t *mask_form)
 
void dt_masks_free_form (dt_masks_form_t *mask_form)
 
int dt_masks_events_mouse_leave (struct dt_iop_module_t *module)
 
int dt_masks_events_mouse_enter (struct dt_iop_module_t *module)
 
gboolean dt_masks_is_anything_selected (const dt_masks_form_gui_t *mask_gui)
 
gboolean dt_masks_is_anything_hovered (const dt_masks_form_gui_t *mask_gui)
 
static void _set_cursor_shape (dt_masks_form_gui_t *mask_gui)
 
static void _apply_gui_button_pressed_state (dt_masks_form_gui_t *mask_gui, const int button, const uint32_t state, const gboolean shape_was_selected)
 
static void _dt_masks_events_set_current_pos (const double x, const double y, dt_masks_form_gui_t *mask_gui)
 Convert the GTK/Cairo widget cursor once for the full mask event chain.
 
int dt_masks_events_mouse_moved (struct dt_iop_module_t *module, double x, double y, double pressure, int which)
 
int dt_masks_events_button_released (struct dt_iop_module_t *module, double x, double y, int button, uint32_t state)
 
int dt_masks_events_button_pressed (struct dt_iop_module_t *module, double x, double y, double pressure, int button, int event_type, uint32_t state)
 
int dt_masks_events_key_pressed (struct dt_iop_module_t *module, GdkEventKey *event)
 
int dt_masks_events_mouse_scrolled (struct dt_iop_module_t *module, double x, double y, int scroll_up, uint32_t key_state, int scrolling_delta)
 
gboolean dt_masks_node_is_cusp (const dt_masks_form_gui_points_t *gui_points, const int node_index)
 returns wether a node is a corner or not. A node is a corner if its 2 control handles are at the same position, else it's a curve.
 
static void _dt_masks_find_best_attachment_point (const float ray_1[2], const float ray_2[2], const float *points, const int points_count, const float zoom_scale, const int first_pt, const gboolean is_closed_shape, float result[2])
 Find the best attachment point on the shape contour for a ray crossing the form.
 
void dt_masks_draw_source (cairo_t *cr, dt_masks_form_gui_t *mask_gui, const int form_index, const int node_count, 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.
 
void dt_masks_draw_path_seg_by_seg (cairo_t *cr, dt_masks_form_gui_t *mask_gui, const int form_index, const float *points, const int points_count, const int node_count, const float zoom_scale)
 
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)
 
void dt_masks_clear_form_gui (dt_develop_t *develop)
 
void dt_masks_change_form_gui (dt_masks_form_t *new_form)
 
void dt_masks_reset_form_gui (void)
 
void dt_masks_reset_show_masks_icons (void)
 
dt_masks_edit_mode_t dt_masks_get_edit_mode (struct dt_iop_module_t *module)
 
void dt_masks_set_edit_mode (struct dt_iop_module_t *module, dt_masks_edit_mode_t value)
 
static void _menu_no_masks (struct dt_iop_module_t *module)
 
static void _menu_add_shape (struct dt_iop_module_t *module, dt_masks_type_t type)
 
static void _menu_add_exist (dt_iop_module_t *module, int form_id)
 
void dt_masks_group_update_name (dt_iop_module_t *module)
 
void dt_masks_iop_use_same_as (dt_iop_module_t *module, dt_iop_module_t *source_module)
 
void dt_masks_iop_combo_populate (GtkWidget *widget, void *data)
 
void dt_masks_iop_value_changed_callback (GtkWidget *widget, struct dt_iop_module_t *module)
 
void dt_masks_form_remove (struct dt_iop_module_t *module, dt_masks_form_t *group_form, dt_masks_form_t *mask_form)
 
float dt_masks_form_get_interaction_value (dt_masks_form_group_t *form_group, dt_masks_interaction_t interaction)
 
gboolean dt_masks_form_get_gravity_center (const dt_masks_form_t *mask_form, float center[2], float *area)
 
void dt_masks_form_update_gravity_center (dt_masks_form_t *mask_form)
 
static float _change_opacity (dt_masks_form_group_t *form_group, float value, const dt_masks_increment_t increment, const int flow)
 
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, dt_masks_form_gui_t *mask_gui, dt_iop_module_t *module)
 
const char * _get_mask_plugin (dt_masks_form_t *mask_form)
 
const char * _get_mask_type (dt_masks_form_t *mask_form)
 
float dt_masks_apply_increment (float current, float amount, dt_masks_increment_t increment, int flow)
 Apply a scroll increment to a scalar value.
 
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.
 
float dt_masks_get_set_conf_value (dt_masks_form_t *mask_form, char *feature, float new_value, float value_min, float value_max, dt_masks_increment_t increment, int flow)
 Change a numerical property of a mask shape, either by in/de-crementing the current value or setting it in an absolute fashion, then save it to configuration.
 
float dt_masks_get_set_conf_value_with_toast (dt_masks_form_t *mask_form, const char *feature, float amount, float value_min, float value_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.
 
void dt_masks_duplicate_points (const dt_masks_form_t *base_form, dt_masks_form_t *dest_form, size_t node_size)
 Duplicate a points list for a mask using a fixed node size.
 
int dt_masks_form_change_opacity (dt_masks_form_t *mask_form, int parent_id, int scroll_up, const int flow)
 
void dt_masks_form_move (dt_masks_form_t *group_form, int form_id, int move_up)
 
static int _find_in_group (dt_masks_form_t *group_form, int form_id)
 
dt_masks_form_group_tdt_masks_group_add_form (dt_masks_form_t *group_form, dt_masks_form_t *mask_form)
 
void dt_masks_group_ungroup (dt_masks_form_t *dest_group, dt_masks_form_t *group_form)
 
uint64_t dt_masks_group_get_hash (uint64_t hash, dt_masks_form_t *mask_form)
 
static void _cleanup_unused_recurs (GList *form_list, int form_id, int *used_form_ids, int used_count)
 
static int _masks_cleanup_unused (GList **forms_list, GList *history_list, const int history_end)
 
void dt_masks_cleanup_unused_from_list (GList *history_list)
 Remove unused mask forms from a history list, preserving undo safety.
 
void dt_masks_cleanup_unused (dt_develop_t *develop)
 Cleanup unused masks and refresh the current forms snapshot.
 
int dt_masks_point_in_form_exact (const float *test_points, int test_point_count, const float *form_points, int form_points_start, int form_points_count)
 Check whether any 2D point in pts[] lies inside the form points[].
 
void dt_masks_select_form (struct dt_iop_module_t *module, dt_masks_form_t *selected_form)
 Select or clear the current mask form, notifying the owning module if needed.
 
void dt_masks_set_source_pos_initial_state (dt_masks_form_gui_t *mask_gui, const uint32_t key_state)
 Decide initial source positioning mode for clone masks.
 
void dt_masks_set_source_pos_initial_value (dt_masks_form_gui_t *mask_gui, dt_masks_form_t *mask_form)
 Initialize the clone source position based on current GUI state.
 
void dt_masks_calculate_source_pos_value (dt_masks_form_gui_t *mask_gui, const float initial_xpos, const float initial_ypos, const float xpos, const float ypos, float *pos_x, float *pos_y, const int adding)
 Compute preview-space source position for drawing the clone indicator.
 
float dt_masks_rotate_with_anchor (dt_develop_t *develop, const float anchor[2], const float center[2], dt_masks_form_gui_t *mask_gui)
 Compute rotation angle (degrees) around a center using an anchor point.
 
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.
 
void apply_operation (struct dt_masks_form_group_t *group_entry, const dt_masks_state_t apply_state)
 Apply a mask state operation on a group entry.
 

Variables

static int form_id_seed = 0
 

Function Documentation

◆ _apply_gui_button_pressed_state()

◆ _change_opacity()

static float _change_opacity ( dt_masks_form_group_t form_group,
float  value,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _check_id()

◆ _cleanup_unused_recurs()

static void _cleanup_unused_recurs ( GList *  form_list,
int  form_id,
int *  used_form_ids,
int  used_count 
)
static

◆ _dt_masks_events_cursor_over_form()

static gboolean _dt_masks_events_cursor_over_form ( const dt_masks_form_t dispatch_form,
dt_masks_form_gui_t mask_gui,
const int  form_index 
)
static

◆ _dt_masks_events_flush_rebuild_if_needed()

static gboolean _dt_masks_events_flush_rebuild_if_needed ( struct dt_iop_module_t module,
dt_masks_form_t dispatch_form,
dt_masks_form_gui_t mask_gui,
const int  form_index,
const int  button 
)
static

◆ _dt_masks_events_get_dispatch_form()

static dt_masks_form_t * _dt_masks_events_get_dispatch_form ( dt_masks_form_t visible_form,
const dt_masks_form_gui_t mask_gui,
dt_masks_form_group_t **  group_entry,
int *  parent_id,
int *  form_index 
)
static

◆ _dt_masks_events_group_blocks_motion()

static gboolean _dt_masks_events_group_blocks_motion ( dt_masks_form_gui_t mask_gui)
static

Consume the initial drag motion used to disambiguate scrolling vs dragging in groups.

References DT_GUI_MOUSE_EFFECT_RADIUS_SCALED, FALSE, dt_masks_form_gui_t::pos, dt_masks_form_gui_t::scrollx, dt_masks_form_gui_t::scrolly, and TRUE.

Referenced by dt_masks_events_mouse_moved().

◆ _dt_masks_events_group_update_selection()

static gboolean _dt_masks_events_group_update_selection ( dt_masks_form_t group_form,
dt_masks_form_gui_t mask_gui 
)
static

◆ _dt_masks_events_set_current_pos()

static void _dt_masks_events_set_current_pos ( const double  x,
const double  y,
dt_masks_form_gui_t mask_gui 
)
static

Convert the GTK/Cairo widget cursor once for the full mask event chain.

The event entry points are the only place where widget-space x, y are consumed. Downstream handlers reuse the cached positions:

  • mask_gui->rel_pos: normalized output-image coordinates
  • mask_gui->pos: absolute output-image coordinates
  • mask_gui->raw_pos: absolute raw input-image coordinates

References darktable, darktable_t::develop, dt_dev_coordinates_image_abs_to_raw_abs(), dt_dev_coordinates_image_norm_to_image_abs(), dt_dev_coordinates_widget_to_image_norm(), dt_masks_form_gui_t::pos, dt_masks_form_gui_t::raw_pos, dt_masks_form_gui_t::rel_pos, and x.

Referenced by dt_masks_events_button_pressed(), dt_masks_events_button_released(), dt_masks_events_mouse_moved(), and dt_masks_events_mouse_scrolled().

◆ _dt_masks_events_should_update_hover_on_move()

◆ _dt_masks_events_update_hover()

static int _dt_masks_events_update_hover ( dt_masks_form_t dispatch_form,
dt_masks_form_gui_t mask_gui,
const int  form_index 
)
static

◆ _dt_masks_find_best_attachment_point()

static void _dt_masks_find_best_attachment_point ( const float  ray_1[2],
const float  ray_2[2],
const float *  points,
const int  points_count,
const float  zoom_scale,
const int  first_pt,
const gboolean  is_closed_shape,
float  result[2] 
)
static

Find the best attachment point on the shape contour for a ray crossing the form.

The best point is the one with the smallest positive projection along the ray. The result is offset from the contour by a given distance along the ray axis, oriented toward the center of the ray segment [ray_2, ray_1].

Parameters
ray_1First point of the ray
ray_2Second point of the ray
pointsArray of points defining the shape contour
points_countNumber of points in the contour
first_ptIndex of the first point to consider
is_closed_shapeWhether the contour is closed
resultArray to store the resulting attachment point

References DT_PIXEL_APPLY_DPI, f_inv_sqrtf(), and i.

Referenced by dt_masks_draw_source().

◆ _dup_masks_form_cb()

static void * _dup_masks_form_cb ( const void formdata,
gpointer  user_data 
)
static

◆ _find_in_group()

◆ _get_mask_plugin()

const char * _get_mask_plugin ( dt_masks_form_t mask_form)

◆ _get_mask_type()

◆ _group_create()

◆ _group_from_module()

◆ _masks_cleanup_unused()

static int _masks_cleanup_unused ( GList **  forms_list,
GList *  history_list,
const int  history_end 
)
static

◆ _masks_fill_used_forms()

static void _masks_fill_used_forms ( GList *  forms_list,
const int  form_id,
int *  used_form_ids,
const int  used_count 
)
static

◆ _masks_group_find_form()

static dt_masks_form_group_t * _masks_group_find_form ( dt_masks_form_t group_form,
const int  form_id 
)
inlinestatic

Find a form entry inside a group by form id.

Assumption: only valid for DT_MASKS_GROUP forms.

References DT_MASKS_GROUP, dt_masks_form_group_t::formid, dt_masks_form_t::points, and dt_masks_form_t::type.

Referenced by dt_masks_form_group_from_parentid().

◆ _masks_remove_shape()

static gboolean _masks_remove_shape ( struct dt_iop_module_t module,
dt_masks_form_t mask_form,
int  parent_id,
dt_masks_form_gui_t mask_gui,
int  form_index 
)
static

Remove a shape from the GUI and free its resources.

Parameters
moduleThe module owning the mask
formThe form to remove
parentidThe parent ID of the form
guiThe GUI state
indexThe index of the form in the group
Returns
gboolean TRUE if the form was removed, FALSE otherwise.

References darktable, darktable_t::develop, dt_free, dt_masks_change_form_gui(), dt_masks_clear_form_gui(), dt_masks_form_remove(), dt_masks_get_from_id(), dt_masks_get_visible_form(), DT_MASKS_GROUP, dt_masks_form_gui_t::edit_mode, dt_masks_form_group_t::formid, dt_masks_form_t::formid, g_list_shorter_than(), dt_masks_form_t::points, and dt_masks_form_t::type.

Referenced by dt_masks_gui_delete().

◆ _menu_add_exist()

◆ _menu_add_shape()

static void _menu_add_shape ( struct dt_iop_module_t module,
dt_masks_type_t  type 
)
static

◆ _menu_no_masks()

◆ _set_cursor_shape()

◆ _set_group_name_from_module()

static void _set_group_name_from_module ( dt_iop_module_t module,
dt_masks_form_t group_form 
)
static

◆ _set_hinter_message()

◆ apply_operation()

void apply_operation ( struct dt_masks_form_group_t group_entry,
const dt_masks_state_t  apply_state 
)

Apply a mask state operation on a group entry.

Inverse toggles its flag, combine operations replace the combine bits.

References DT_MASKS_STATE_INVERSE, DT_MASKS_STATE_IS_COMBINE_OP, and dt_masks_form_group_t::state.

Referenced by _blendop_masks_group_operation_callback(), _masks_operation_callback(), _tree_difference(), _tree_exclusion(), _tree_intersection(), _tree_inverse(), and _tree_union().

◆ dt_masks_append_form()

◆ dt_masks_apply_increment()

float dt_masks_apply_increment ( float  current,
float  amount,
dt_masks_increment_t  increment,
int  flow 
)

◆ dt_masks_apply_increment_precomputed()

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.

References DT_MASKS_INCREMENT_ABSOLUTE, DT_MASKS_INCREMENT_OFFSET, and DT_MASKS_INCREMENT_SCALE.

Referenced by _change_hardness(), _change_hardness(), and _change_size().

◆ dt_masks_calculate_source_pos_value()

void dt_masks_calculate_source_pos_value ( dt_masks_form_gui_t mask_gui,
const float  initial_xpos,
const float  initial_ypos,
const float  xpos,
const float  ypos,
float *  pos_x,
float *  pos_y,
const int  adding 
)

◆ dt_masks_change_form_gui()

◆ dt_masks_cleanup_unused()

void dt_masks_cleanup_unused ( dt_develop_t develop)

Cleanup unused masks and refresh the current forms snapshot.

Assumption: caller already decided to drop unused forms (non-reversible).

References dt_dev_get_history_end_ext(), dt_masks_change_form_gui(), dt_masks_cleanup_unused_from_list(), dt_masks_replace_current_forms(), dt_dev_history_item_t::forms, and dt_develop_t::history.

Referenced by _tree_cleanup().

◆ dt_masks_cleanup_unused_from_list()

void dt_masks_cleanup_unused_from_list ( GList *  history_list)

Remove unused mask forms from a history list, preserving undo safety.

Caveat: if multiple history entries reference masks, some unused masks may remain. This is intentional so users can still jump back in history.

References _masks_cleanup_unused(), dt_dev_history_item_t::forms, and dt_dev_history_item_t::op_name.

Referenced by dt_masks_cleanup_unused().

◆ dt_masks_clear_form_gui()

void dt_masks_clear_form_gui ( dt_develop_t develop)

References dt_masks_form_gui_t::border_selected, dt_masks_form_gui_t::border_toggling, dt_masks_form_gui_t::creation, dt_masks_form_gui_t::creation_closing_form, dt_masks_form_gui_t::creation_module, dt_masks_form_gui_t::delta, dt_masks_dynbuf_free(), DT_MASKS_EDIT_OFF, dt_masks_form_gui_points_free(), DT_MASKS_PRESSURE_OFF, dt_masks_select_form(), DT_PIXELPIPE_CACHE_HASH_INVALID, dt_masks_form_gui_t::edit_mode, FALSE, dt_masks_form_gui_t::form_dragging, dt_develop_t::form_gui, dt_masks_form_gui_t::form_rotating, dt_masks_form_gui_t::form_selected, dt_masks_form_gui_t::formid, dt_masks_form_gui_t::gradient_toggling, dt_masks_form_gui_t::group_selected, dt_masks_form_gui_t::guipoints, dt_masks_form_gui_t::guipoints_count, dt_masks_form_gui_t::guipoints_payload, dt_masks_form_gui_t::handle_border_dragging, dt_masks_form_gui_t::handle_border_hovered, dt_masks_form_gui_t::handle_border_selected, dt_masks_form_gui_t::handle_dragging, dt_masks_form_gui_t::handle_hovered, dt_masks_form_gui_t::handle_selected, dt_masks_form_gui_t::last_hit_test_pos, dt_masks_form_gui_t::last_rebuild_pos, dt_masks_form_gui_t::last_rebuild_ts, dt_masks_form_gui_t::node_dragging, dt_masks_form_gui_t::node_hovered, dt_masks_form_gui_t::node_selected, dt_masks_form_gui_t::node_selected_idx, dt_masks_form_gui_t::pipe_hash, dt_masks_form_gui_t::pivot_selected, dt_masks_form_gui_t::points, dt_masks_form_gui_t::pressure_sensitivity, dt_masks_form_gui_t::rebuild_pending, dt_masks_form_gui_t::scrollx, dt_masks_form_gui_t::scrolly, dt_masks_form_gui_t::seg_dragging, dt_masks_form_gui_t::seg_hovered, dt_masks_form_gui_t::seg_selected, dt_masks_form_gui_t::source_dragging, and dt_masks_form_gui_t::source_selected.

Referenced by _masks_remove_shape(), dt_masks_change_form_gui(), dt_masks_gui_cleanup(), and dt_masks_gui_init().

◆ dt_masks_copy_used_forms_for_module()

◆ dt_masks_create()

◆ dt_masks_create_ext()

dt_masks_form_t * dt_masks_create_ext ( dt_masks_type_t  type)

◆ dt_masks_creation_mode()

◆ dt_masks_draw_path_seg_by_seg()

void dt_masks_draw_path_seg_by_seg ( cairo_t *  cr,
dt_masks_form_gui_t mask_gui,
const int  form_index,
const float *  points,
const int  points_count,
const int  node_count,
const float  zoom_scale 
)

◆ dt_masks_draw_source()

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 
)

◆ dt_masks_dup_forms_deep()

GList * dt_masks_dup_forms_deep ( GList *  form_list,
dt_masks_form_t replacement_form 
)

Duplicate the list of forms, replacing a single item by formid match.

References _dup_masks_form_cb().

Referenced by dt_dev_pixelpipe_process(), dt_history_duplicate(), dt_masks_replace_current_forms(), and dt_masks_snapshot_current_forms().

◆ dt_masks_dup_masks_form()

dt_masks_form_t * dt_masks_dup_masks_form ( const dt_masks_form_t mask_form)

Deep-copy a mask form, including its points list.

Caveats:

  • The caller owns the returned form and must free it.
  • Point payloads are copied byte-for-byte using the type's point struct size.

References dt_masks_form_t::functions, dt_masks_functions_t::point_struct_size, and dt_masks_form_t::points.

Referenced by _dup_masks_form_cb(), and dt_masks_copy_used_forms_for_module().

◆ dt_masks_duplicate_points()

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.

The destination list is appended to, mirroring the previous per-mask implementations.

References dt_masks_form_t::points.

Referenced by _brush_duplicate_points(), _circle_duplicate_points(), _ellipse_duplicate_points(), _gradient_duplicate_points(), and _polygon_duplicate_points().

◆ dt_masks_events_button_pressed()

◆ dt_masks_events_button_released()

◆ dt_masks_events_key_pressed()

◆ dt_masks_events_mouse_enter()

int dt_masks_events_mouse_enter ( struct dt_iop_module_t module)

Referenced by mouse_enter().

◆ dt_masks_events_mouse_leave()

int dt_masks_events_mouse_leave ( struct dt_iop_module_t module)

Referenced by mouse_leave().

◆ dt_masks_events_mouse_moved()

◆ dt_masks_events_mouse_scrolled()

◆ dt_masks_events_post_expose()

◆ dt_masks_find_closest_handle_common()

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 
)

Centralized hit-testing for node/handle/segment selection across shapes.

Shared selection logic for node/handle/segment hit testing.

This function:

  • Translates pointer coordinates into GUI space,
  • Resets selection flags,
  • Tests border/curve handles and nodes,
  • Delegates inside/border/segment tests to the shape callback.

node_count_override can be used for shapes that don't expose nodes via GList (e.g. gradient/ellipse control points). Pass -1 to use g_list_length().

Callers provide shape-specific callbacks for handles and distance tests.

The cached cursor in mask_gui->pos is authoritative for hit testing.

References dt_masks_form_gui_t::border_selected, dt_masks_form_gui_t::creation, DT_GUI_MOUSE_EFFECT_RADIUS_SCALED, dt_masks_gui_selected_node_index(), dt_masks_gui_was_anything_selected(), dt_masks_node_is_cusp(), dt_masks_point_is_within_radius(), FALSE, dt_masks_form_gui_t::form_selected, dt_masks_form_gui_t::group_selected, dt_masks_form_gui_t::handle_border_dragging, dt_masks_form_gui_t::handle_border_hovered, dt_masks_form_gui_t::handle_dragging, dt_masks_form_gui_t::handle_hovered, dt_masks_form_gui_t::node_dragging, dt_masks_form_gui_t::node_hovered, dt_masks_form_t::points, dt_masks_form_gui_points_t::points, dt_masks_form_gui_t::points, dt_masks_form_gui_t::pos, dt_masks_form_gui_t::seg_dragging, dt_masks_form_gui_t::seg_hovered, dt_masks_form_gui_t::source_selected, TRUE, and dt_masks_form_t::uses_bezier_points_layout.

Referenced by _find_closest_handle(), _find_closest_handle(), _find_closest_handle(), _find_closest_handle(), and _find_closest_handle().

◆ dt_masks_form_cancel_creation()

◆ dt_masks_form_change_opacity()

◆ dt_masks_form_duplicate()

◆ dt_masks_form_get_gravity_center()

gboolean dt_masks_form_get_gravity_center ( const dt_masks_form_t mask_form,
float  center[2],
float *  area 
)

◆ dt_masks_form_get_interaction_value()

◆ dt_masks_form_get_selected_group()

dt_masks_form_group_t * dt_masks_form_get_selected_group ( const dt_masks_form_t mask_form,
const dt_masks_form_gui_t mask_gui 
)

Get the selected group entry from the GUI selection index.

Selection sequence overview:

Use dt_masks_form_get_selected_group() in tight GUI paths where the list is known stable; use dt_masks_form_get_selected_group_live() when correctness matters across potential list mutations.

Todo:
simplify that.

References dt_masks_form_gui_t::group_selected, and dt_masks_form_t::points.

Referenced by dt_masks_events_key_pressed(), and dt_masks_form_get_selected_group_live().

◆ dt_masks_form_get_selected_group_live()

dt_masks_form_group_t * dt_masks_form_get_selected_group_live ( const dt_masks_form_t mask_form,
const dt_masks_form_gui_t mask_gui 
)

Resolve a "live" selected group entry, even if GUI selection is stale.

Selection source:

  • GUI index (mask_gui->group_selected) for the currently visible group.

If the GUI works on a temporary group copy, we re-resolve through parentid to get the live entry from dev->forms.

References dt_masks_form_get_selected_group(), dt_masks_form_group_from_parentid(), dt_masks_form_group_t::formid, dt_masks_form_gui_t::group_selected, and dt_masks_form_group_t::parentid.

Referenced by _dt_masks_events_get_dispatch_form(), _dt_masks_events_group_update_selection(), _set_hinter_message(), and dt_masks_events_button_released().

◆ dt_masks_form_group_from_parentid()

dt_masks_form_group_t * dt_masks_form_group_from_parentid ( int  parent_id,
int  form_id 
)

◆ dt_masks_form_gui_points_free()

◆ dt_masks_form_move()

void dt_masks_form_move ( dt_masks_form_t group_form,
int  form_id,
int  move_up 
)

◆ dt_masks_form_remove()

◆ dt_masks_form_set_interaction_value()

◆ dt_masks_form_update_gravity_center()

◆ dt_masks_free_form()

◆ dt_masks_get_area()

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 
)

get the rectangle which include the form and his border

References dt_masks_form_t::functions, and dt_masks_functions_t::get_area.

Referenced by masks_form_is_in_roi(), rt_compute_roi_in(), and rt_masks_form_is_in_roi().

◆ dt_masks_get_edit_mode()

◆ dt_masks_get_from_id()

dt_masks_form_t * dt_masks_get_from_id ( dt_develop_t dev,
int  id 
)

returns a form with formid == id from dev->forms

References dt_masks_get_from_id_ext(), dt_pthread_rwlock_rdlock, dt_pthread_rwlock_unlock, dt_develop_t::forms, and dt_develop_t::masks_mutex.

Referenced by _blendop_masks_all_delete_callback(), _blendop_masks_all_name_edited(), _blendop_masks_all_toggled(), _blendop_masks_group_button_pressed(), _blendop_masks_group_from_module(), _blendop_masks_group_move_callback(), _blendop_masks_group_tree_append(), _blendop_masks_is_group_with_shapes(), _blendop_masks_is_single_group_wrapper(), _blendop_masks_show_and_edit(), _brush_add_node_callback(), _brush_events_button_released(), _brush_reset_round_node_callback(), _brush_switch_node_callback(), _develop_blend_init_drawn_mask(), _dt_masks_events_get_dispatch_form(), _dt_masks_events_group_update_selection(), _edit_masks(), _find_in_group(), _group_from_module(), _group_get_child_at(), _group_get_gravity_center(), _group_get_mask(), _group_get_mask_roi(), _gui_reset_callback(), _is_form_used(), _lib_masks_handler_callback(), _lib_masks_list_recurs(), _lib_masks_update_item(), _masks_gui_delete_node_callback(), _masks_gui_remove_form_callback(), _masks_move_up_down_callback(), _masks_remove_shape(), _menu_add_exist(), _polygon_add_node_callback(), _polygon_events_post_expose(), _polygon_reset_round_node_callback(), _polygon_switch_node_callback(), _process(), _reset_form_creation(), _resynch_params(), _set_hinter_message(), _shape_is_being_added(), _tree_add_exist(), _tree_cell_edited(), _tree_context_menu(), _tree_delete_shape(), _tree_difference(), _tree_exclusion(), _tree_format_form_usage_label(), _tree_intersection(), _tree_inverse(), _tree_movedown(), _tree_moveup(), _tree_selection_change(), _tree_union(), _update_foreach(), dt_masks_copy_used_forms_for_module(), dt_masks_create_menu(), dt_masks_events_key_pressed(), dt_masks_form_duplicate(), dt_masks_form_get_interaction_value(), dt_masks_form_group_from_parentid(), dt_masks_form_remove(), dt_masks_form_set_interaction_value(), dt_masks_group_get_hash(), dt_masks_group_ungroup(), dt_masks_gui_form_test_create(), dt_masks_iop_update(), dt_masks_iop_use_same_as(), dt_masks_set_edit_mode(), give_control_to_form(), gui_focus(), gui_update(), modify_roi_in(), post_history_commit(), rt_compute_roi_in(), rt_display_selected_shapes_lbl(), rt_edit_masks_callback(), rt_extend_roi_in_for_clone(), rt_extend_roi_in_from_source_clones(), rt_get_mask_point_group(), rt_menu_select_algorithm_callback(), rt_process_forms(), rt_resynch_params(), rt_shape_is_being_added(), rt_show_forms_for_current_scale(), and rt_show_hide_controls().

◆ dt_masks_get_from_id_ext()

dt_masks_form_t * dt_masks_get_from_id_ext ( GList *  forms,
int  id 
)

◆ dt_masks_get_mask_manager()

dt_iop_module_t * dt_masks_get_mask_manager ( struct dt_develop_t dev)

return the mask manager module instance if present

References dt_develop_t::iop.

◆ dt_masks_get_points_border()

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 
)

get points in real space with respect of distortion dx and dy are used to eventually move the center of the circle

References dt_masks_form_t::functions, and dt_masks_functions_t::get_points_border.

Referenced by dt_masks_gui_form_create().

◆ dt_masks_get_set_conf_value()

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 it in an absolute fashion, then save it to configuration.

Parameters
formthe shape to change. We will read its type internally
featurethe propertie to change: hardness, size, curvature (for gradients)
new_valueif increment is set to absolute, this is directly the updated value. if increment is offset, the updated value is old_value + new_value. if increment is scale, the updated value is old value * new_value.
v_minminimum acceptable value of the property for sanitization
v_maxmaximum acceptable value of the property for sanitization
incrementthe increment type: absolute, offset or scale.
flowthe value of the scroll distance that can be postive or negative.

References _get_mask_plugin(), _get_mask_type(), dt_conf_get_float(), dt_conf_set_float(), dt_free, dt_masks_apply_increment(), MAX, and MIN.

Referenced by _brush_events_button_pressed(), _brush_events_button_released(), _brush_events_post_expose(), _change_hardness(), _change_size(), _init_hardness(), _init_size(), and dt_masks_get_set_conf_value_with_toast().

◆ dt_masks_get_set_conf_value_with_toast()

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.

This is a convenience wrapper around dt_masks_get_set_conf_value() that keeps UI feedback consistent across mask types.

References dt_masks_get_set_conf_value(), dt_toast_log(), and value.

Referenced by _init_curvature(), _init_extent(), _init_hardness(), _init_hardness(), _init_hardness(), _init_opacity(), _init_opacity(), _init_opacity(), _init_opacity(), _init_rotation(), _init_rotation(), _init_size(), and _init_size().

◆ dt_masks_get_source_area()

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 mask_form,
int *  area_width,
int *  area_height,
int *  area_pos_x,
int *  area_pos_y 
)

◆ dt_masks_get_visible_form()

dt_masks_form_t * dt_masks_get_visible_form ( const dt_develop_t dev)

Return the currently visible form used by the masks GUI.

This can be a temporary group copy used for editing, not necessarily a form stored in dev->forms.

References dt_develop_t::form_gui, and dt_masks_form_gui_t::form_visible.

Referenced by _masks_remove_shape(), dt_masks_calculate_source_pos_value(), dt_masks_events_button_pressed(), dt_masks_events_button_released(), dt_masks_events_key_pressed(), dt_masks_events_mouse_moved(), dt_masks_events_mouse_scrolled(), and dt_masks_events_post_expose().

◆ dt_masks_group_add_form()

◆ dt_masks_group_get_hash()

◆ dt_masks_group_index_from_formid()

int dt_masks_group_index_from_formid ( const dt_masks_form_t group_form,
int  form_id 
)

◆ dt_masks_group_ungroup()

◆ dt_masks_group_update_name()

◆ dt_masks_gui_cleanup()

void dt_masks_gui_cleanup ( dt_develop_t dev)

◆ dt_masks_gui_delete()

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" action in the future.

Parameters
moduleThe module owning the mask
formThe form to delete
guiThe GUI state of the form
parentidThe parent ID of the form
Returns
gboolean TRUE if the form was deleted, FALSE otherwise

References _masks_remove_shape(), DT_MASKS_EDIT_FULL, dt_masks_form_cancel_creation(), DT_MASKS_IS_PATH_SHAPE, dt_masks_remove_node(), dt_masks_form_gui_t::edit_mode, FALSE, g_list_shorter_than(), dt_masks_form_gui_t::group_selected, dt_masks_form_gui_t::node_hovered, dt_masks_form_gui_t::node_selected, dt_masks_form_t::points, TRUE, and dt_masks_form_t::type.

Referenced by _group_events_key_pressed(), _masks_gui_remove_form_callback(), and dt_masks_events_key_pressed().

◆ dt_masks_gui_form_create()

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 
)

◆ dt_masks_gui_form_create_throttled()

◆ dt_masks_gui_form_remove()

◆ dt_masks_gui_form_save_creation()

◆ dt_masks_gui_form_test_create()

◆ dt_masks_gui_init()

◆ dt_masks_gui_is_dragging()

◆ dt_masks_gui_reset_dragging()

◆ dt_masks_gui_set_dragging()

◆ dt_masks_init_form_gui()

◆ dt_masks_iop_combo_populate()

◆ dt_masks_iop_use_same_as()

◆ dt_masks_iop_value_changed_callback()

◆ dt_masks_is_anything_hovered()

gboolean dt_masks_is_anything_hovered ( const dt_masks_form_gui_t mask_gui)

◆ dt_masks_is_anything_selected()

◆ dt_masks_legacy_params()

int dt_masks_legacy_params ( dt_develop_t develop,
void params,
const int  old_version,
const int  new_version 
)

◆ dt_masks_legacy_params_v1_to_v2()

◆ dt_masks_legacy_params_v2_to_v3()

◆ dt_masks_legacy_params_v2_to_v3_transform()

static void dt_masks_legacy_params_v2_to_v3_transform ( const dt_image_t image,
float *  coords 
)
static

◆ dt_masks_legacy_params_v2_to_v3_transform_only_rescale()

static void dt_masks_legacy_params_v2_to_v3_transform_only_rescale ( const dt_image_t image,
float *  coords,
size_t  coords_count 
)
static

◆ dt_masks_legacy_params_v3_to_v4()

static int dt_masks_legacy_params_v3_to_v4 ( dt_develop_t develop,
void params 
)
static

◆ dt_masks_legacy_params_v4_to_v5()

static int dt_masks_legacy_params_v4_to_v5 ( dt_develop_t develop,
void params 
)
static

◆ dt_masks_legacy_params_v5_to_v6()

static int dt_masks_legacy_params_v5_to_v6 ( dt_develop_t develop,
void params 
)
static

◆ dt_masks_node_is_cusp()

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 position, else it's a curve.

Parameters
gptthe GUI points of the mask form
indexthe index of the node to test
nbthe number of coord by node
coord_offsetthe offset of the coordinates in the points array
Returns
TRUE if the node is a corner, FALSE it's a curve.

References FALSE, dt_masks_form_gui_points_t::points, and dt_masks_form_gui_points_t::points_count.

Referenced by _brush_events_button_pressed(), _brush_events_post_expose(), _brush_populate_context_menu(), _polygon_events_button_pressed(), _polygon_events_post_expose(), _polygon_populate_context_menu(), dt_masks_find_closest_handle_common(), dt_masks_reset_bezier_ctrl_points(), and dt_masks_toggle_bezier_node_type().

◆ dt_masks_point_in_form_exact()

int dt_masks_point_in_form_exact ( const float *  test_points,
int  test_point_count,
const float *  form_points,
int  form_points_start,
int  form_points_count 
)

Check whether any 2D point in pts[] lies inside the form points[].

We use the ray casting algorithm for each tested point.

Parameters
ptsFlat array of tested points [x0, y0, x1, y1, ...].
num_ptsNumber of tested points in pts.
pointsThe array of form vertices.
points_startThe starting index of the form vertices in the array.
points_countThe total number of vertices in the form.
Returns
int Index of the first tested point found inside the form, -1 otherwise.

References i.

Referenced by _circle_get_distance(), _ellipse_get_distance(), _polygon_get_distance(), and dt_masks_draw_source().

◆ dt_masks_point_is_within_radius()

gboolean dt_masks_point_is_within_radius ( const float  point_x,
const float  point_y,
const float  center_x,
const float  center_y,
const float  squared_radius 
)

Check whether a point lies within a squared radius of a center.

Check if a point (px,py) is inside a radius from a center point (cx,cy)

Assumptions/caveats:

  • Uses squared distance to avoid sqrt.
  • Callers must pass a squared radius (not the radius).

Referenced by dt_masks_find_closest_handle_common().

◆ dt_masks_read_masks_history()

◆ dt_masks_remove_form()

void dt_masks_remove_form ( dt_develop_t develop,
dt_masks_form_t mask_form 
)

◆ dt_masks_remove_node()

◆ dt_masks_replace_current_forms()

◆ dt_masks_reset_form_gui()

◆ dt_masks_reset_show_masks_icons()

void dt_masks_reset_show_masks_icons ( void  )
Todo:
: this doesn't look right. Why do we break the while look as soon as one module has no blend_data?

References darktable, darktable_t::develop, DEVELOP_MASKS_NB_SHAPES, DT_MASKS_EDIT_OFF, FALSE, dt_develop_t::iop, IOP_FLAGS_SUPPORTS_BLENDING, and n.

Referenced by _tree_selection_change().

◆ dt_masks_rotate_with_anchor()

float dt_masks_rotate_with_anchor ( dt_develop_t develop,
const float  anchor[2],
const float  center[2],
dt_masks_form_gui_t mask_gui 
)

Compute rotation angle (degrees) around a center using an anchor point.

Rotate a mask shape around its center. WARNING: gui->delta will be updated with the new position after rotation.

anchor, center, and mask_gui->delta are absolute output-image coordinates. The angle accounts for possible axis inversion due to distortion transforms. Updates mask_gui->delta to store the last anchor position.

References dt_masks_form_gui_t::delta, dt_dev_coordinates_image_abs_to_raw_abs(), and M_PI.

Referenced by _ellipse_events_mouse_moved(), and _gradient_events_mouse_moved().

◆ dt_masks_select_form()

void dt_masks_select_form ( struct dt_iop_module_t module,
dt_masks_form_t selected_form 
)

Select or clear the current mask form, notifying the owning module if needed.

Passing NULL clears the selection.

References dt_masks_form_t::formid.

Referenced by _brush_events_button_released(), and dt_masks_clear_form_gui().

◆ dt_masks_set_edit_mode()

◆ dt_masks_set_source_pos_initial_state()

void dt_masks_set_source_pos_initial_state ( dt_masks_form_gui_t mask_gui,
const uint32_t  key_state 
)

Decide initial source positioning mode for clone masks.

Uses key modifiers to choose absolute vs. relative positioning, and stores the reference position in preview coordinates. The current implementation caches that reference in absolute output-image coordinates.

References DT_MASKS_SOURCE_POS_ABSOLUTE, DT_MASKS_SOURCE_POS_RELATIVE_TEMP, dt_modifier_is(), dt_masks_form_gui_t::pos, dt_masks_form_gui_t::pos_source, and dt_masks_form_gui_t::source_pos_type.

Referenced by _brush_events_button_pressed(), _circle_events_button_pressed(), _ellipse_events_button_pressed(), and _polygon_events_button_pressed().

◆ dt_masks_set_source_pos_initial_value()

void dt_masks_set_source_pos_initial_value ( dt_masks_form_gui_t mask_gui,
dt_masks_form_t mask_form 
)

Initialize the clone source position based on current GUI state.

Handles first-time relative positioning, existing relative offsets, and absolute coordinates. Updates mask_form->source accordingly. mask_gui->rel_pos is the normalized output-image cursor, while mask_gui->pos_source stores either an absolute output-image position or an absolute output-image delta depending on the current source mode.

References darktable, darktable_t::develop, dt_dev_coordinates_image_abs_to_raw_abs(), dt_dev_coordinates_image_abs_to_raw_norm(), dt_dev_coordinates_raw_abs_to_raw_norm(), DT_MASKS_SOURCE_POS_ABSOLUTE, DT_MASKS_SOURCE_POS_RELATIVE, DT_MASKS_SOURCE_POS_RELATIVE_TEMP, dt_masks_form_t::functions, dt_masks_functions_t::initial_source_pos, dt_masks_form_gui_t::pos, dt_masks_form_gui_t::pos_source, dt_develop_t::raw_height, dt_develop_t::raw_width, dt_develop_t::roi, dt_masks_form_t::source, and dt_masks_form_gui_t::source_pos_type.

Referenced by _brush_events_button_pressed(), _circle_init_new(), _ellipse_init_new(), and _polygon_events_button_pressed().

◆ dt_masks_set_visible_form()

◆ dt_masks_snapshot_current_forms()

GList * dt_masks_snapshot_current_forms ( dt_develop_t dev,
gboolean  reset_changed 
)

◆ dt_masks_soft_reset_form_gui()

◆ dt_masks_version()

int dt_masks_version ( void  )

◆ dt_masks_write_masks_history_item()

Variable Documentation

◆ form_id_seed

int form_id_seed = 0
static

Referenced by dt_masks_create().