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

Go to the source code of this file.

Data Structures

struct  dt_masks_gradient_creation_values_t
 

Macros

#define extent_MIN   0.0005f
 
#define extent_MAX   1.0f
 
#define CURVATURE_MIN   -2.0f
 
#define CURVATURE_MAX   2.0f
 
#define BORDER_MIN   0.00005f
 
#define BORDER_MAX   0.5f
 

Typedefs

typedef struct dt_masks_gradient_creation_values_t dt_masks_gradient_creation_values_t
 

Functions

static int _find_border_separator (const float *border, int count)
 
static void _closest_point_on_segment (float px, float py, float x1, float y1, float x2, float y2, float *closest_x, float *closest_y, float *distance_sq)
 
static void _closest_point_on_line (float px, float py, const float *border, int start_idx, int end_idx, float *closest_x, float *closest_y, float *min_distance_sq)
 
static float _gradient_get_border_len_sq (const dt_masks_form_gui_points_t *gpt)
 
static void _gradient_get_creation_values (dt_masks_gradient_creation_values_t *values)
 
static void _gradient_init_new (dt_masks_form_gui_t *gui, dt_masks_anchor_gradient_t *gradient)
 
static int _gradient_get_points (dt_develop_t *dev, float x, float y, float rotation, float curvature, float **points, int *points_count)
 Build the distorted display polyline for a gradient mask.
 
static int _gradient_get_pts_border (dt_develop_t *dev, float x, float y, float rotation, float distance, float curvature, float **points, int *points_count)
 
static int _gradient_get_creation_preview (dt_masks_form_gui_t *gui, dt_masks_preview_buffers_t *preview)
 
static void _gradient_get_distance (float x, float y, float dist_mouse, dt_masks_form_gui_t *gui, int index, int num_points, int *inside, int *inside_border, int *near, int *inside_source, float *dist)
 
static void _gradient_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 void _gradient_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, int *inside_source, float *dist, void *user_data)
 
static void _gradient_post_select_cb (dt_masks_form_gui_t *mask_gui, int inside, int inside_border, int inside_source, void *user_data)
 
static int _find_closest_handle (dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int index)
 
static int _init_extent (dt_masks_form_t *form, const float amount, const dt_masks_increment_t increment, const int flow)
 
static int _init_curvature (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 _gradient_get_interaction_value (const dt_masks_form_t *form, dt_masks_interaction_t interaction)
 
static gboolean _gradient_get_gravity_center (const dt_masks_form_t *form, float center[2], float *area)
 
static int _change_extent (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_curvature (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 _gradient_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 _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 int _gradient_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 _gradient_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 _gradient_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 _gradient_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 _gradient_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 gboolean _gradient_is_canonical (const float x, const float y, const float wd, const float ht)
 
static void _copy_points (float *dest, const float *src, int count, int *k)
 
static void _gradient_draw_shape (cairo_t *cr, const float *pts_line, const int pts_line_count, const int nb, const gboolean border, const gboolean source)
 
static void _gradient_draw_arrow (cairo_t *cr, const gboolean selected, const gboolean pivot_selected, const gboolean is_rotating, const float zoom_scale, float *pts, int pts_count)
 
static void _gradient_events_post_expose (cairo_t *cr, float zoom_scale, dt_masks_form_gui_t *gui, int index, int nb)
 
static int _gradient_get_points_border (dt_develop_t *dev, dt_masks_form_t *form, float **points, int *points_count, float **border, int *border_count, int source, const dt_iop_module_t *module)
 
static int _gradient_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 float dt_gradient_lookup (const float *lut, const float i)
 
static int _gradient_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 int _gradient_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)
 
static void _gradient_sanitize_config (dt_masks_type_t type)
 
static void _gradient_set_form_name (struct dt_masks_form_t *const form, const size_t nb)
 
static void _gradient_set_hint_message (const dt_masks_form_gui_t *const gui, const dt_masks_form_t *const form, const int opacity, char *const restrict msgbuf, const size_t msgbuf_len)
 
static void _gradient_duplicate_points (dt_develop_t *dev, dt_masks_form_t *const base, dt_masks_form_t *const dest)
 

Variables

const dt_masks_functions_t dt_masks_functions_gradient
 

Macro Definition Documentation

◆ BORDER_MAX

#define BORDER_MAX   0.5f

Definition at line 48 of file gradient.c.

◆ BORDER_MIN

#define BORDER_MIN   0.00005f

Definition at line 47 of file gradient.c.

◆ CURVATURE_MAX

#define CURVATURE_MAX   2.0f

Definition at line 45 of file gradient.c.

◆ CURVATURE_MIN

#define CURVATURE_MIN   -2.0f

Definition at line 44 of file gradient.c.

◆ extent_MAX

#define extent_MAX   1.0f

Definition at line 43 of file gradient.c.

◆ extent_MIN

#define extent_MIN   0.0005f

Definition at line 42 of file gradient.c.

Typedef Documentation

◆ dt_masks_gradient_creation_values_t

Function Documentation

◆ _change_curvature()

◆ _change_extent()

static int _change_extent ( 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

◆ _closest_point_on_line()

static void _closest_point_on_line ( float  px,
float  py,
const float *  border,
int  start_idx,
int  end_idx,
float *  closest_x,
float *  closest_y,
float *  min_distance_sq 
)
static

Definition at line 103 of file gradient.c.

References _closest_point_on_segment(), and i.

Referenced by _gradient_get_distance().

◆ _closest_point_on_segment()

static void _closest_point_on_segment ( float  px,
float  py,
float  x1,
float  y1,
float  x2,
float  y2,
float *  closest_x,
float *  closest_y,
float *  distance_sq 
)
static

Definition at line 77 of file gradient.c.

References t.

Referenced by _closest_point_on_line().

◆ _copy_points()

static void _copy_points ( float *  dest,
const float *  src,
int  count,
int *  k 
)
static

Definition at line 849 of file gradient.c.

References i.

Referenced by _gradient_get_pts_border().

◆ _find_border_separator()

static int _find_border_separator ( const float *  border,
int  count 
)
static

Definition at line 51 of file gradient.c.

References i, and IS_NULL_PTR.

Referenced by _gradient_get_distance().

◆ _find_closest_handle()

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

◆ _gradient_distance_cb()

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

Definition at line 333 of file gradient.c.

References _gradient_get_distance(), and dist().

Referenced by _find_closest_handle().

◆ _gradient_draw_arrow()

static void _gradient_draw_arrow ( cairo_t *  cr,
const gboolean  selected,
const gboolean  pivot_selected,
const gboolean  is_rotating,
const float  zoom_scale,
float *  pts,
int  pts_count 
)
static

◆ _gradient_draw_shape()

static void _gradient_draw_shape ( cairo_t *  cr,
const float *  pts_line,
const int  pts_line_count,
const int  nb,
const gboolean  border,
const gboolean  source 
)
static

◆ _gradient_duplicate_points()

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

Definition at line 1509 of file gradient.c.

References dt_masks_duplicate_points().

◆ _gradient_events_button_pressed()

◆ _gradient_events_button_released()

◆ _gradient_events_key_pressed()

static int _gradient_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 665 of file gradient.c.

◆ _gradient_events_mouse_moved()

◆ _gradient_events_mouse_scrolled()

◆ _gradient_events_post_expose()

◆ _gradient_get_area()

static int _gradient_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

◆ _gradient_get_border_len_sq()

static float _gradient_get_border_len_sq ( const dt_masks_form_gui_points_t gpt)
static

Definition at line 173 of file gradient.c.

References dt_masks_form_gui_points_t::points.

Referenced by _gradient_get_distance().

◆ _gradient_get_creation_preview()

◆ _gradient_get_creation_values()

static void _gradient_get_creation_values ( dt_masks_gradient_creation_values_t values)
static

◆ _gradient_get_distance()

static void _gradient_get_distance ( float  x,
float  y,
float  dist_mouse,
dt_masks_form_gui_t gui,
int  index,
int  num_points,
int *  inside,
int *  inside_border,
int *  near,
int *  inside_source,
float *  dist 
)
static

◆ _gradient_get_gravity_center()

static gboolean _gradient_get_gravity_center ( const dt_masks_form_t form,
float  center[2],
float *  area 
)
static

◆ _gradient_get_interaction_value()

static float _gradient_get_interaction_value ( const dt_masks_form_t form,
dt_masks_interaction_t  interaction 
)
static

◆ _gradient_get_mask()

◆ _gradient_get_mask_roi()

◆ _gradient_get_points()

static int _gradient_get_points ( dt_develop_t dev,
float  x,
float  y,
float  rotation,
float  curvature,
float **  points,
int *  points_count 
)
static

Build the distorted display polyline for a gradient mask.

The guide curve is sampled in raw image coordinates first, then transformed through the distortion stack in one call. Threads collect only the samples that stay close enough to the raw frame, so the final merge must keep the output bounded to the number of input samples.

Definition at line 735 of file gradient.c.

References __OMP_PARALLEL_FOR__, darktable, dt_dev_coordinates_raw_abs_to_image_abs(), dt_dev_coordinates_raw_norm_to_raw_abs(), dt_get_bythread, dt_get_perthread, dt_pixelpipe_cache_alloc_align_float_cache, dt_pixelpipe_cache_alloc_perthread_float, dt_pixelpipe_cache_calloc_perthread, dt_pixelpipe_cache_free_align, i, IS_NULL_PTR, k, M_PI, darktable_t::num_openmp_threads, dt_develop_t::raw_height, dt_develop_t::raw_width, dt_develop_t::roi, v, and x.

Referenced by _gradient_get_creation_preview(), _gradient_get_points_border(), and _gradient_get_pts_border().

◆ _gradient_get_points_border()

static int _gradient_get_points_border ( dt_develop_t dev,
dt_masks_form_t form,
float **  points,
int *  points_count,
float **  border,
int *  border_count,
int  source,
const dt_iop_module_t module 
)
static

◆ _gradient_get_pts_border()

static int _gradient_get_pts_border ( dt_develop_t dev,
float  x,
float  y,
float  rotation,
float  distance,
float  curvature,
float **  points,
int *  points_count 
)
static

◆ _gradient_init_new()

◆ _gradient_is_canonical()

static gboolean _gradient_is_canonical ( const float  x,
const float  y,
const float  wd,
const float  ht 
)
inlinestatic

Definition at line 722 of file gradient.c.

References FALSE, TRUE, and x.

Referenced by _gradient_draw_shape().

◆ _gradient_node_position_cb()

static void _gradient_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

Definition at line 326 of file gradient.c.

Referenced by _find_closest_handle().

◆ _gradient_post_select_cb()

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

◆ _gradient_sanitize_config()

static void _gradient_sanitize_config ( dt_masks_type_t  type)
static

Definition at line 1487 of file gradient.c.

References dt_conf_set_float().

◆ _gradient_set_form_name()

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

Definition at line 1493 of file gradient.c.

References dt_masks_form_t::name.

◆ _gradient_set_hint_message()

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

◆ _gradient_set_interaction_value()

static float _gradient_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

◆ _init_curvature()

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

◆ _init_extent()

static int _init_extent ( 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 378 of file gradient.c.

References dt_masks_get_set_conf_value_with_toast().

Referenced by _gradient_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

◆ dt_gradient_lookup()

static float dt_gradient_lookup ( const float *  lut,
const float  i 
)
inlinestatic

Definition at line 1151 of file gradient.c.

References f, i, and lut.

Referenced by _gradient_get_mask(), and _gradient_get_mask_roi().

Variable Documentation

◆ dt_masks_functions_gradient

const dt_masks_functions_t dt_masks_functions_gradient
Initial value:
= {
.point_struct_size = sizeof(struct dt_masks_anchor_gradient_t),
.sanitize_config = _gradient_sanitize_config,
.set_form_name = _gradient_set_form_name,
.set_hint_message = _gradient_set_hint_message,
.duplicate_points = _gradient_duplicate_points,
.get_distance = _gradient_get_distance,
.get_points_border = _gradient_get_points_border,
.get_mask = _gradient_get_mask,
.get_mask_roi = _gradient_get_mask_roi,
.get_area = _gradient_get_area,
.get_gravity_center = _gradient_get_gravity_center,
.get_interaction_value = _gradient_get_interaction_value,
.set_interaction_value = _gradient_set_interaction_value,
.update_hover = _find_closest_handle,
.draw_shape = _gradient_draw_shape
}
static void _gradient_events_post_expose(cairo_t *cr, float zoom_scale, dt_masks_form_gui_t *gui, int index, int nb)
Definition gradient.c:1059
static float _gradient_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 gradient.c:425
static int _gradient_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 gradient.c:1117
static void _gradient_get_distance(float x, float y, float dist_mouse, dt_masks_form_gui_t *gui, int index, int num_points, int *inside, int *inside_border, int *near, int *inside_source, float *dist)
Definition gradient.c:232
static int _gradient_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 gradient.c:615
static float _gradient_get_interaction_value(const dt_masks_form_t *form, dt_masks_interaction_t interaction)
Definition gradient.c:392
static int _gradient_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 gradient.c:671
static int _gradient_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 gradient.c:665
static int _gradient_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 gradient.c:546
static void _gradient_draw_shape(cairo_t *cr, const float *pts_line, const int pts_line_count, const int nb, const gboolean border, const gboolean source)
Definition gradient.c:944
static void _gradient_set_hint_message(const dt_masks_form_gui_t *const gui, const dt_masks_form_t *const form, const int opacity, char *const restrict msgbuf, const size_t msgbuf_len)
Definition gradient.c:1498
static int _find_closest_handle(dt_masks_form_t *mask_form, dt_masks_form_gui_t *mask_gui, int index)
Definition gradient.c:355
static void _gradient_set_form_name(struct dt_masks_form_t *const form, const size_t nb)
Definition gradient.c:1493
static int _gradient_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 gradient.c:514
static int _gradient_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 gradient.c:1159
static gboolean _gradient_get_gravity_center(const dt_masks_form_t *form, float center[2], float *area)
Definition gradient.c:409
static void _gradient_duplicate_points(dt_develop_t *dev, dt_masks_form_t *const base, dt_masks_form_t *const dest)
Definition gradient.c:1509
static int _gradient_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 gradient.c:1331
static void _gradient_sanitize_config(dt_masks_type_t type)
Definition gradient.c:1487
static int _gradient_get_points_border(dt_develop_t *dev, dt_masks_form_t *form, float **points, int *points_count, float **border, int *border_count, int source, const dt_iop_module_t *module)
Definition gradient.c:1099

Definition at line 1516 of file gradient.c.

Referenced by _gradient_events_post_expose(), and dt_masks_create().