Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
ellipse.c File Reference
+ Include dependency graph for ellipse.c:

Go to the source code of this file.

Data Structures

struct  dt_masks_ellipse_creation_values_t
 

Macros

#define FADING_MIN   0.0005f
 
#define FADING_MAX   1.0f
 
#define BORDER_MIN   0.00005f
 
#define BORDER_MAX   0.5f
 
#define RADIUS_CLONE_MIN   0.00005f
 
#define RADIUS_CLONE_MAX   0.5f
 
#define RADIUS_NON_CLONE_MIN   0.0005f
 
#define RADIUS_NON_CLONE_MAX   1.0f
 

Typedefs

typedef struct dt_masks_ellipse_creation_values_t dt_masks_ellipse_creation_values_t
 

Functions

static void _ellipse_point_transform (const float xref, const float yref, const float x, const float y, const float sinr, const float cosr, float *xnew, float *ynew)
 
static int _ellipse_point_close_to_path (float x, float y, float mouse_radius, float *points, int points_count)
 
static void _ellipse_get_distance (float x, float y, float mouse_radius, dt_masks_form_gui_t *gui, int index, int num_points, int *inside, int *inside_border, int *near_handle, int *inside_source, float *dist)
 
static void _ellipse_get_creation_values (const dt_masks_form_t *form, dt_masks_ellipse_creation_values_t *values)
 
static void _ellipse_init_new (dt_masks_form_t *form, dt_masks_form_gui_t *gui, dt_masks_node_ellipse_t *ellipse)
 
static int _ellipse_get_points (dt_develop_t *dev, float xx, float yy, float radius_a, float radius_b, float rotation, float **points, int *points_count)
 
static int _ellipse_get_creation_preview (dt_masks_form_t *form, dt_masks_form_gui_t *gui, dt_masks_preview_buffers_t *preview)
 
static float * _points_to_transform (dt_develop_t *dev, float xx, float yy, float radius_a, float radius_b, float rotation, float wd, float ht, int *points_count)
 
static int _ellipse_get_points_source (dt_develop_t *dev, float xx, float yy, float xs, float ys, float radius_a, float radius_b, float rotation, float **points, int *points_count, const dt_iop_module_t *module)
 
static dt_masks_raster_result_t _ellipse_get_points_border (dt_develop_t *dev, struct dt_masks_form_t *form, float **points, int *points_count, float **border, int *border_count, dt_masks_skip_range_t **border_skips, int *border_skip_count, int source, const dt_iop_module_t *module)
 
static void _ellipse_node_position_cb (const dt_masks_form_gui_points_t *gui_points, int node_index, float *node_x, float *node_y, void *user_data)
 Ellipse-specific node position lookup.
 
static void _ellipse_distance_cb (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_handle, int *inside_source, float *dist, void *user_data)
 Ellipse-specific inside/border hit testing adapter.
 
static void _ellipse_post_select_cb (dt_masks_form_gui_t *mask_gui, int inside, int inside_border, int inside_source, void *user_data)
 Ellipse-specific post-selection hook.
 
static int _find_closest_handle (dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int form_index)
 
static int _init_fading (dt_masks_form_t *form, const float amount, const dt_masks_increment_t increment, const int flow)
 
static int _init_size (dt_masks_form_t *form, const float amount, const dt_masks_increment_t increment, const int flow)
 
static int _init_opacity (dt_masks_form_t *form, const float amount, const dt_masks_increment_t increment, const int flow)
 
static int _init_rotation (dt_masks_form_t *form, const float amount, const dt_masks_increment_t increment, const int flow)
 
static float _ellipse_get_interaction_value (const dt_masks_form_t *form, dt_masks_interaction_t interaction)
 
static gboolean _ellipse_get_gravity_center (dt_develop_t *dev, const dt_masks_form_t *form, float center[2], float *area)
 
static int _change_fading (dt_masks_form_t *form, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module, int index, const float amount, const dt_masks_increment_t increment, const int flow)
 
static int _change_size (dt_masks_form_t *form, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module, int index, const float amount, const dt_masks_increment_t increment, const int flow)
 
static int _change_rotation (dt_masks_form_t *form, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module, int index, const float amount, const dt_masks_increment_t increment, const int flow)
 
static float _ellipse_set_interaction_value (dt_masks_form_t *form, dt_masks_interaction_t interaction, float value, dt_masks_increment_t increment, int flow, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module)
 
static int _ellipse_events_mouse_scrolled (struct dt_iop_module_t *module, double x, double y, int up, const int flow, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index, dt_masks_interaction_t interaction)
 
static int _ellipse_events_button_pressed (struct dt_iop_module_t *module, double x, double y, double pressure, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
 
static int _ellipse_events_button_released (struct dt_iop_module_t *module, double x, double y, int which, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
 
static int _ellipse_events_key_pressed (struct dt_iop_module_t *module, GdkEventKey *event, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
 
static int _ellipse_events_mouse_moved (struct dt_iop_module_t *module, double x, double y, double pressure, int which, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
 
static void _ellipse_draw_shape (dt_develop_t *dev, cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source, const dt_masks_skip_range_t *skips, const int skip_count)
 
static void _ellipse_draw_handles (const dt_masks_form_gui_t *gui, cairo_t *cr, const float zoom_scale, dt_masks_form_gui_points_t *gpt, const int index)
 
static void _ellipse_events_post_expose (cairo_t *cr, float zoom_scale, dt_masks_form_gui_t *gui, int index, int num_points)
 
static void _fill_mask (const size_t numpoints, float *const bufptr, const float *const points, const float *const center, const float a, const float b, const float ta, const float tb, const float alpha, const size_t out_scale)
 
static float *const _ellipse_points_to_transform (dt_develop_t *dev, const float center_x, const float center_y, const float dim1, const float dim2, const float rotation, const float wd, const float ht, size_t *point_count)
 
static dt_masks_raster_result_t _ellipse_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)
 
static dt_masks_raster_result_t _ellipse_get_area (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, int *width, int *height, int *posx, int *posy)
 
static dt_masks_raster_result_t _ellipse_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)
 
static dt_masks_raster_result_t _ellipse_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, dt_iop_roi_t *touched)
 
static void _ellipse_set_form_name (struct dt_masks_form_t *const form, const size_t nb)
 
static void _ellipse_duplicate_points (dt_develop_t *const dev, dt_masks_form_t *const base, dt_masks_form_t *const dest)
 
static void _ellipse_initial_source_pos (dt_develop_t *dev, const float iwd, const float iht, float *x, float *y)
 
static void _ellipse_set_hint_message (const dt_masks_form_gui_t *const gui, const dt_masks_form_t *const form, char *const restrict msgbuf, const size_t msgbuf_len)
 
static void _ellipse_sanitize_config (dt_masks_type_t type)
 

Variables

const dt_masks_functions_t dt_masks_functions_ellipse
 

Macro Definition Documentation

◆ BORDER_MAX

#define BORDER_MAX   0.5f

Definition at line 57 of file ellipse.c.

◆ BORDER_MIN

#define BORDER_MIN   0.00005f

Definition at line 56 of file ellipse.c.

◆ FADING_MAX

#define FADING_MAX   1.0f

Definition at line 54 of file ellipse.c.

◆ FADING_MIN

#define FADING_MIN   0.0005f

Definition at line 53 of file ellipse.c.

◆ RADIUS_CLONE_MAX

#define RADIUS_CLONE_MAX   0.5f

Definition at line 60 of file ellipse.c.

◆ RADIUS_CLONE_MIN

#define RADIUS_CLONE_MIN   0.00005f

Definition at line 59 of file ellipse.c.

◆ RADIUS_NON_CLONE_MAX

#define RADIUS_NON_CLONE_MAX   1.0f

Definition at line 63 of file ellipse.c.

◆ RADIUS_NON_CLONE_MIN

#define RADIUS_NON_CLONE_MIN   0.0005f

Definition at line 62 of file ellipse.c.

Typedef Documentation

◆ dt_masks_ellipse_creation_values_t

Function Documentation

◆ _change_fading()

static int _change_fading ( dt_masks_form_t form,
dt_masks_form_gui_t gui,
struct dt_iop_module_t module,
int  index,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _change_rotation()

static int _change_rotation ( dt_masks_form_t form,
dt_masks_form_gui_t gui,
struct dt_iop_module_t module,
int  index,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _change_size()

static int _change_size ( dt_masks_form_t form,
dt_masks_form_gui_t gui,
struct dt_iop_module_t module,
int  index,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _ellipse_distance_cb()

static void _ellipse_distance_cb ( 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_handle,
int *  inside_source,
float *  dist,
void user_data 
)
static

Ellipse-specific inside/border hit testing adapter.

Definition at line 477 of file ellipse.c.

References _ellipse_get_distance(), and dist().

Referenced by _find_closest_handle().

◆ _ellipse_draw_handles()

◆ _ellipse_draw_shape()

static void _ellipse_draw_shape ( dt_develop_t dev,
cairo_t *  cr,
const float *  points,
const int  points_count,
const int  nb,
const gboolean  border,
const gboolean  source,
const dt_masks_skip_range_t skips,
const int  skip_count 
)
static

Definition at line 972 of file ellipse.c.

References dt_draw_min_emit_step(), t, void(), and x.

◆ _ellipse_duplicate_points()

static void _ellipse_duplicate_points ( dt_develop_t *const  dev,
dt_masks_form_t *const  base,
dt_masks_form_t *const  dest 
)
static

Definition at line 1549 of file ellipse.c.

References dt_masks_duplicate_points().

◆ _ellipse_events_button_pressed()

◆ _ellipse_events_button_released()

◆ _ellipse_events_key_pressed()

static int _ellipse_events_key_pressed ( struct dt_iop_module_t module,
GdkEventKey *  event,
dt_masks_form_t form,
int  parentid,
dt_masks_form_gui_t gui,
int  index 
)
static

Definition at line 862 of file ellipse.c.

◆ _ellipse_events_mouse_moved()

◆ _ellipse_events_mouse_scrolled()

◆ _ellipse_events_post_expose()

◆ _ellipse_get_area()

◆ _ellipse_get_creation_preview()

◆ _ellipse_get_creation_values()

static void _ellipse_get_creation_values ( const dt_masks_form_t form,
dt_masks_ellipse_creation_values_t values 
)
static

◆ _ellipse_get_distance()

static void _ellipse_get_distance ( float  x,
float  y,
float  mouse_radius,
dt_masks_form_gui_t gui,
int  index,
int  num_points,
int *  inside,
int *  inside_border,
int *  near_handle,
int *  inside_source,
float *  dist 
)
static

◆ _ellipse_get_gravity_center()

static gboolean _ellipse_get_gravity_center ( dt_develop_t dev,
const dt_masks_form_t form,
float  center[2],
float *  area 
)
static

◆ _ellipse_get_interaction_value()

◆ _ellipse_get_mask()

◆ _ellipse_get_mask_roi()

◆ _ellipse_get_points()

static int _ellipse_get_points ( dt_develop_t dev,
float  xx,
float  yy,
float  radius_a,
float  radius_b,
float  rotation,
float **  points,
int *  points_count 
)
static

◆ _ellipse_get_points_border()

◆ _ellipse_get_points_source()

static int _ellipse_get_points_source ( dt_develop_t dev,
float  xx,
float  yy,
float  xs,
float  ys,
float  radius_a,
float  radius_b,
float  rotation,
float **  points,
int *  points_count,
const dt_iop_module_t module 
)
static

◆ _ellipse_get_source_area()

◆ _ellipse_init_new()

◆ _ellipse_initial_source_pos()

static void _ellipse_initial_source_pos ( dt_develop_t dev,
const float  iwd,
const float  iht,
float *  x,
float *  y 
)
static

Definition at line 1555 of file ellipse.c.

References dt_conf_get_float(), dt_dev_coordinates_raw_norm_to_raw_abs(), and x.

◆ _ellipse_node_position_cb()

static void _ellipse_node_position_cb ( const dt_masks_form_gui_points_t gui_points,
int  node_index,
float *  node_x,
float *  node_y,
void user_data 
)
static

Ellipse-specific node position lookup.

Ellipse GUI nodes are stored as center + 4 control points; apply the same transform logic used in the original hit testing.

Definition at line 463 of file ellipse.c.

References _ellipse_point_transform(), and dt_masks_form_gui_points_t::points.

Referenced by _find_closest_handle().

◆ _ellipse_point_close_to_path()

static int _ellipse_point_close_to_path ( float  x,
float  y,
float  mouse_radius,
float *  points,
int  points_count 
)
static

Definition at line 137 of file ellipse.c.

References d, i, p, and x.

Referenced by _ellipse_get_distance().

◆ _ellipse_point_transform()

static void _ellipse_point_transform ( const float  xref,
const float  yref,
const float  x,
const float  y,
const float  sinr,
const float  cosr,
float *  xnew,
float *  ynew 
)
inlinestatic

Definition at line 65 of file ellipse.c.

References x.

Referenced by _ellipse_draw_handles(), and _ellipse_node_position_cb().

◆ _ellipse_points_to_transform()

static float *const _ellipse_points_to_transform ( dt_develop_t dev,
const float  center_x,
const float  center_y,
const float  dim1,
const float  dim2,
const float  rotation,
const float  wd,
const float  ht,
size_t *  point_count 
)
static

◆ _ellipse_post_select_cb()

static void _ellipse_post_select_cb ( dt_masks_form_gui_t mask_gui,
int  inside,
int  inside_border,
int  inside_source,
void user_data 
)
static

Ellipse-specific post-selection hook.

Ellipse uses the border hit to arm the pivot interaction.

Definition at line 490 of file ellipse.c.

References FALSE, dt_masks_form_gui_t::pivot_selected, and TRUE.

Referenced by _find_closest_handle().

◆ _ellipse_sanitize_config()

◆ _ellipse_set_form_name()

static void _ellipse_set_form_name ( struct dt_masks_form_t *const  form,
const size_t  nb 
)
static

Definition at line 1544 of file ellipse.c.

References dt_masks_form_t::name.

◆ _ellipse_set_hint_message()

static void _ellipse_set_hint_message ( const dt_masks_form_gui_t *const  gui,
const dt_masks_form_t *const  form,
char *const restrict  msgbuf,
const size_t  msgbuf_len 
)
static

◆ _ellipse_set_interaction_value()

static float _ellipse_set_interaction_value ( dt_masks_form_t form,
dt_masks_interaction_t  interaction,
float  value,
dt_masks_increment_t  increment,
int  flow,
dt_masks_form_gui_t gui,
struct dt_iop_module_t module 
)
static

◆ _fill_mask()

static void _fill_mask ( const size_t  numpoints,
float *const  bufptr,
const float *const  points,
const float *const  center,
const float  a,
const float  b,
const float  ta,
const float  tb,
const float  alpha,
const size_t  out_scale 
)
static

Definition at line 1084 of file ellipse.c.

References __OMP_PARALLEL_FOR_SIMD__, CLIP, f, i, l2, and x.

Referenced by _ellipse_get_mask(), and _ellipse_get_mask_roi().

◆ _find_closest_handle()

static int _find_closest_handle ( dt_masks_form_t mask_form,
dt_masks_form_gui_t mask_gui,
int  form_index 
)
static

◆ _init_fading()

static int _init_fading ( dt_masks_form_t form,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _init_opacity()

static int _init_opacity ( dt_masks_form_t form,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

Definition at line 519 of file ellipse.c.

References dt_masks_get_set_conf_value_with_toast().

Referenced by _ellipse_events_mouse_scrolled().

◆ _init_rotation()

static int _init_rotation ( dt_masks_form_t form,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _init_size()

static int _init_size ( dt_masks_form_t form,
const float  amount,
const dt_masks_increment_t  increment,
const int  flow 
)
static

◆ _points_to_transform()

static float * _points_to_transform ( dt_develop_t dev,
float  xx,
float  yy,
float  radius_a,
float  radius_b,
float  rotation,
float  wd,
float  ht,
int *  points_count 
)
static

Variable Documentation

◆ dt_masks_functions_ellipse

const dt_masks_functions_t dt_masks_functions_ellipse
Initial value:
= {
.point_struct_size = sizeof(struct dt_masks_node_ellipse_t),
.sanitize_config = _ellipse_sanitize_config,
.set_form_name = _ellipse_set_form_name,
.set_hint_message = _ellipse_set_hint_message,
.duplicate_points = _ellipse_duplicate_points,
.initial_source_pos = _ellipse_initial_source_pos,
.get_distance = _ellipse_get_distance,
.get_points = _ellipse_get_points,
.get_points_border = _ellipse_get_points_border,
.get_mask = _ellipse_get_mask,
.get_mask_roi = _ellipse_get_mask_roi,
.get_area = _ellipse_get_area,
.get_source_area = _ellipse_get_source_area,
.get_gravity_center = _ellipse_get_gravity_center,
.get_interaction_value = _ellipse_get_interaction_value,
.set_interaction_value = _ellipse_set_interaction_value,
.update_hover = _find_closest_handle,
.mouse_scrolled = _ellipse_events_mouse_scrolled,
.button_pressed = _ellipse_events_button_pressed,
.button_released = _ellipse_events_button_released,
.draw_shape = _ellipse_draw_shape
}
static dt_masks_raster_result_t _ellipse_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, dt_iop_roi_t *touched)
Definition ellipse.c:1377
static dt_masks_raster_result_t _ellipse_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 ellipse.c:1191
static void _ellipse_initial_source_pos(dt_develop_t *dev, const float iwd, const float iht, float *x, float *y)
Definition ellipse.c:1555
static int _find_closest_handle(dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int form_index)
Definition ellipse.c:496
static int _ellipse_events_mouse_moved(struct dt_iop_module_t *module, double x, double y, double pressure, int which, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
Definition ellipse.c:868
static gboolean _ellipse_get_gravity_center(dt_develop_t *dev, const dt_masks_form_t *form, float center[2], float *area)
Definition ellipse.c:552
static void _ellipse_sanitize_config(dt_masks_type_t type)
Definition ellipse.c:1589
static dt_masks_raster_result_t _ellipse_get_points_border(dt_develop_t *dev, struct dt_masks_form_t *form, float **points, int *points_count, float **border, int *border_count, dt_masks_skip_range_t **border_skips, int *border_skip_count, int source, const dt_iop_module_t *module)
Definition ellipse.c:417
static dt_masks_raster_result_t _ellipse_get_area(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, int *width, int *height, int *posx, int *posy)
Definition ellipse.c:1231
static int _ellipse_events_key_pressed(struct dt_iop_module_t *module, GdkEventKey *event, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
Definition ellipse.c:862
static dt_masks_raster_result_t _ellipse_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 ellipse.c:1269
static void _ellipse_duplicate_points(dt_develop_t *const dev, dt_masks_form_t *const base, dt_masks_form_t *const dest)
Definition ellipse.c:1549
static void _ellipse_get_distance(float x, float y, float mouse_radius, dt_masks_form_gui_t *gui, int index, int num_points, int *inside, int *inside_border, int *near_handle, int *inside_source, float *dist)
Definition ellipse.c:184
static float _ellipse_get_interaction_value(const dt_masks_form_t *form, dt_masks_interaction_t interaction)
Definition ellipse.c:533
static void _ellipse_set_hint_message(const dt_masks_form_gui_t *const gui, const dt_masks_form_t *const form, char *const restrict msgbuf, const size_t msgbuf_len)
Definition ellipse.c:1567
static int _ellipse_events_button_pressed(struct dt_iop_module_t *module, double x, double y, double pressure, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
Definition ellipse.c:705
static void _ellipse_events_post_expose(cairo_t *cr, float zoom_scale, dt_masks_form_gui_t *gui, int index, int num_points)
Definition ellipse.c:1018
static int _ellipse_get_points(dt_develop_t *dev, float xx, float yy, float radius_a, float radius_b, float rotation, float **points, int *points_count)
Definition ellipse.c:395
static void _ellipse_set_form_name(struct dt_masks_form_t *const form, const size_t nb)
Definition ellipse.c:1544
static float _ellipse_set_interaction_value(dt_masks_form_t *form, dt_masks_interaction_t interaction, float value, dt_masks_increment_t increment, int flow, dt_masks_form_gui_t *gui, struct dt_iop_module_t *module)
Definition ellipse.c:570
static int _ellipse_events_button_released(struct dt_iop_module_t *module, double x, double y, int which, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index)
Definition ellipse.c:782
static int _ellipse_events_mouse_scrolled(struct dt_iop_module_t *module, double x, double y, int up, const int flow, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index, dt_masks_interaction_t interaction)
Definition ellipse.c:661
static void _ellipse_draw_shape(dt_develop_t *dev, cairo_t *cr, const float *points, const int points_count, const int nb, const gboolean border, const gboolean source, const dt_masks_skip_range_t *skips, const int skip_count)
Definition ellipse.c:972

Definition at line 1643 of file ellipse.c.

Referenced by _ellipse_events_post_expose(), dt_masks_create(), and main().