Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
develop.c File Reference
#include <assert.h>
#include <glib/gprintf.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include "common/atomic.h"
#include "common/debug.h"
#include "common/history.h"
#include "common/image_cache.h"
#include "common/imageio.h"
#include "common/mipmap_cache.h"
#include "common/opencl.h"
#include "common/tags.h"
#include "control/conf.h"
#include "control/control.h"
#include "control/jobs.h"
#include "develop/blend.h"
#include "develop/develop.h"
#include "develop/imageop.h"
#include "develop/lightroom.h"
#include "develop/masks.h"
#include "develop/pixelpipe_cache.h"
#include "gui/gtk.h"
#include "gui/presets.h"
+ Include dependency graph for develop.c:

Macros

#define DT_DEV_AVERAGE_DELAY_START   250
 
#define DT_DEV_PREVIEW_AVERAGE_DELAY_START   50
 
#define DT_DEV_AVERAGE_DELAY_COUNT   5
 
#define DT_IOP_ORDER_INFO   (darktable.unmuted & DT_DEBUG_IOPORDER)
 

Functions

void dt_dev_init (dt_develop_t *dev, int32_t gui_attached)
 
void dt_dev_cleanup (dt_develop_t *dev)
 
void dt_dev_process_image (dt_develop_t *dev)
 
void dt_dev_process_preview (dt_develop_t *dev)
 
void dt_dev_refresh_ui_images_real (dt_develop_t *dev)
 
void _dev_pixelpipe_set_dirty (dt_dev_pixelpipe_t *pipe)
 
void dt_dev_pixelpipe_rebuild (dt_develop_t *dev)
 
void dt_dev_pixelpipe_resync_main (dt_develop_t *dev)
 
void dt_dev_pixelpipe_resync_preview (dt_develop_t *dev)
 
void dt_dev_pixelpipe_resync_all (dt_develop_t *dev)
 
void dt_dev_invalidate_real (dt_develop_t *dev)
 
void dt_dev_invalidate_zoom_real (dt_develop_t *dev)
 
void dt_dev_invalidate_preview_real (dt_develop_t *dev)
 
void dt_dev_invalidate_all_real (dt_develop_t *dev)
 
static void _flag_pipe (dt_dev_pixelpipe_t *pipe, gboolean error)
 
static void _update_gui_backbuf (dt_dev_pixelpipe_t *pipe)
 
void dt_dev_process_preview_job (dt_develop_t *dev)
 
gboolean _update_darkroom_roi (dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, int *x, int *y, int *wd, int *ht, float *scale, float *zoom_x, float *zoom_y)
 
void dt_dev_process_image_job (dt_develop_t *dev)
 
static int _dt_dev_load_raw (dt_develop_t *dev, const int32_t imgid)
 
float dt_dev_get_zoom_scale (dt_develop_t *dev, dt_dev_zoom_t zoom, int closeup_factor, int preview)
 
int dt_dev_load_image (dt_develop_t *dev, const int32_t imgid)
 
void dt_dev_configure_real (dt_develop_t *dev, int wd, int ht)
 
void dt_dev_reprocess_all (dt_develop_t *dev)
 
void dt_dev_check_zoom_bounds (dt_develop_t *dev, float *zoom_x, float *zoom_y, dt_dev_zoom_t zoom, int closeup, float *boxww, float *boxhh)
 
void dt_dev_get_processed_size (const dt_develop_t *dev, int *procw, int *proch)
 
void dt_dev_get_pointer_zoom_pos (dt_develop_t *dev, const float px, const float py, float *zoom_x, float *zoom_y)
 
int dt_dev_is_current_image (dt_develop_t *dev, int32_t imgid)
 
static dt_dev_proxy_exposure_tfind_last_exposure_instance (dt_develop_t *dev)
 
float dt_dev_exposure_get_exposure (dt_develop_t *dev)
 
float dt_dev_exposure_get_black (dt_develop_t *dev)
 
void dt_dev_modulegroups_set (dt_develop_t *dev, uint32_t group)
 
uint32_t dt_dev_modulegroups_get (dt_develop_t *dev)
 
void dt_dev_modulegroups_switch (dt_develop_t *dev, dt_iop_module_t *module)
 
void dt_dev_modulegroups_update_visibility (dt_develop_t *dev)
 
void dt_dev_masks_list_change (dt_develop_t *dev)
 
void dt_dev_masks_list_update (dt_develop_t *dev)
 
void dt_dev_masks_list_remove (dt_develop_t *dev, int formid, int parentid)
 
void dt_dev_masks_selection_change (dt_develop_t *dev, struct dt_iop_module_t *module, const int selectid, const int throw_event)
 
void dt_dev_snapshot_request (dt_develop_t *dev, const char *filename)
 
void dt_dev_average_delay_update (const dt_times_t *start, uint32_t *average_delay)
 
dt_iop_module_tdt_dev_module_duplicate (dt_develop_t *dev, dt_iop_module_t *base)
 
void dt_dev_module_remove (dt_develop_t *dev, dt_iop_module_t *module)
 
void _dev_module_update_multishow (dt_develop_t *dev, struct dt_iop_module_t *module)
 
void dt_dev_modules_update_multishow (dt_develop_t *dev)
 
gchar * dt_history_item_get_label (const struct dt_iop_module_t *module)
 
gchar * dt_history_item_get_name (const struct dt_iop_module_t *module)
 
gchar * dt_history_item_get_name_html (const struct dt_iop_module_t *module)
 
int dt_dev_distort_transform (dt_develop_t *dev, float *points, size_t points_count)
 
int dt_dev_distort_backtransform (dt_develop_t *dev, float *points, size_t points_count)
 
int dt_dev_distort_transform_locked (dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, const double iop_order, const int transf_direction, float *points, size_t points_count)
 
int dt_dev_distort_transform_plus (dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, const double iop_order, const int transf_direction, float *points, size_t points_count)
 
int dt_dev_distort_backtransform_locked (dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, const double iop_order, const int transf_direction, float *points, size_t points_count)
 
int dt_dev_distort_backtransform_plus (dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, const double iop_order, const int transf_direction, float *points, size_t points_count)
 
dt_dev_pixelpipe_iop_tdt_dev_distort_get_iop_pipe (dt_develop_t *dev, struct dt_dev_pixelpipe_t *pipe, struct dt_iop_module_t *module)
 
int dt_dev_wait_hash (dt_develop_t *dev, struct dt_dev_pixelpipe_t *pipe, const double iop_order, const int transf_direction, dt_pthread_mutex_t *lock, const volatile uint64_t *const hash)
 
int dt_dev_sync_pixelpipe_hash (dt_develop_t *dev, struct dt_dev_pixelpipe_t *pipe, const double iop_order, const int transf_direction, dt_pthread_mutex_t *lock, const volatile uint64_t *const hash)
 
uint64_t dt_dev_hash (dt_develop_t *dev, struct dt_dev_pixelpipe_t *pipe)
 
void dt_dev_reorder_gui_module_list (dt_develop_t *dev)
 
void dt_dev_undo_start_record (dt_develop_t *dev)
 
void dt_dev_undo_end_record (dt_develop_t *dev)
 
gboolean dt_masks_get_lock_mode (dt_develop_t *dev)
 
void dt_masks_set_lock_mode (dt_develop_t *dev, gboolean mode)
 
int32_t dt_dev_get_history_end (dt_develop_t *dev)
 
void dt_dev_set_history_end (dt_develop_t *dev, const uint32_t index)
 
void dt_dev_append_changed_tag (const int32_t imgid)
 
void dt_dev_masks_update_hash (dt_develop_t *dev)
 
void dt_dev_get_final_size (dt_develop_t *dev, dt_dev_pixelpipe_t *pipe, const int32_t imgid, const int input_width, const int input_height, int *processed_width, int *processed_height)
 Compute the theoritical final size of a pipeline taking the full-resolution image at input.
 

Macro Definition Documentation

◆ DT_DEV_AVERAGE_DELAY_COUNT

#define DT_DEV_AVERAGE_DELAY_COUNT   5

◆ DT_DEV_AVERAGE_DELAY_START

#define DT_DEV_AVERAGE_DELAY_START   250

◆ DT_DEV_PREVIEW_AVERAGE_DELAY_START

#define DT_DEV_PREVIEW_AVERAGE_DELAY_START   50

◆ DT_IOP_ORDER_INFO

#define DT_IOP_ORDER_INFO   (darktable.unmuted & DT_DEBUG_IOPORDER)

Function Documentation

◆ _dev_module_update_multishow()

◆ _dev_pixelpipe_set_dirty()

◆ _dt_dev_load_raw()

◆ _flag_pipe()

◆ _update_darkroom_roi()

gboolean _update_darkroom_roi ( dt_develop_t dev,
dt_dev_pixelpipe_t pipe,
int *  x,
int *  y,
int *  wd,
int *  ht,
float *  scale,
float *  zoom_x,
float *  zoom_y 
)

◆ _update_gui_backbuf()

◆ dt_dev_append_changed_tag()

◆ dt_dev_average_delay_update()

void dt_dev_average_delay_update ( const dt_times_t start,
uint32_t *  average_delay 
)

update gliding average for pixelpipe delay

References dt_times_t::clock, DT_DEV_AVERAGE_DELAY_COUNT, and dt_get_times().

Referenced by dt_dev_process_image_job(), and dt_dev_process_preview_job().

◆ dt_dev_check_zoom_bounds()

void dt_dev_check_zoom_bounds ( dt_develop_t dev,
float *  zoom_x,
float *  zoom_y,
dt_dev_zoom_t  zoom,
int  closeup,
float *  boxww,
float *  boxhh 
)

◆ dt_dev_cleanup()

◆ dt_dev_configure_real()

◆ dt_dev_distort_backtransform()

◆ dt_dev_distort_backtransform_locked()

int dt_dev_distort_backtransform_locked ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe,
const double  iop_order,
const int  transf_direction,
float *  points,
size_t  points_count 
)

◆ dt_dev_distort_backtransform_plus()

int dt_dev_distort_backtransform_plus ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe,
const double  iop_order,
const int  transf_direction,
float *  points,
size_t  points_count 
)

◆ dt_dev_distort_get_iop_pipe()

◆ dt_dev_distort_transform()

int dt_dev_distort_transform ( dt_develop_t dev,
float *  points,
size_t  points_count 
)

apply all transforms to the specified points (in preview pipe space)

References dt_dev_distort_transform_plus(), DT_DEV_TRANSFORM_DIR_ALL, and dt_develop_t::preview_pipe.

Referenced by _circle_get_points(), _ellipse_get_points(), and _gradient_get_points().

◆ dt_dev_distort_transform_locked()

int dt_dev_distort_transform_locked ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe,
const double  iop_order,
const int  transf_direction,
float *  points,
size_t  points_count 
)

◆ dt_dev_distort_transform_plus()

◆ dt_dev_exposure_get_black()

float dt_dev_exposure_get_black ( dt_develop_t dev)

get exposure black level

References find_last_exposure_instance(), and dt_dev_proxy_exposure_t::get_black.

Referenced by _extract_patches().

◆ dt_dev_exposure_get_exposure()

float dt_dev_exposure_get_exposure ( dt_develop_t dev)

◆ dt_dev_get_final_size()

void dt_dev_get_final_size ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe,
const int32_t  imgid,
const int  input_width,
const int  input_height,
int *  processed_width,
int *  processed_height 
)

Compute the theoritical final size of a pipeline taking the full-resolution image at input.

Note: this creates a dummy pipeline and develop but doesn't trigger file I/O.

Parameters
devAn inited develop object, with dev->iop and dev->history already populated. Can be NULL, in which case a temporary develop is created from scratch (slower).
pipeAn inited pipeline object, with pipe->iwidth and pipe->iheight already set and pipeline pieces params already synchronized. Can be NULL, in which case a temporary pipeline is created from scratch (slower).
imgid
input_widthNot used if pipe is not NULL, will use pipe->iwidth
input_heightNot used if pipe is not NULL, will use pipe->iheight
processed_widthreturned computed value
processed_heightreturned computed value

References darktable, dt_dev_cleanup(), dt_dev_init(), dt_dev_pixelpipe_cleanup(), dt_dev_pixelpipe_create_nodes(), dt_dev_pixelpipe_get_roi_out(), dt_dev_pixelpipe_init_dummy(), dt_dev_pixelpipe_set_input(), dt_dev_pixelpipe_synch_all, dt_dev_read_history_ext(), dt_get_times(), dt_image_cache_get(), dt_image_cache_read_release(), dt_iop_load_modules(), DT_MIPMAP_NONE, dt_show_times(), FALSE, darktable_t::image_cache, dt_develop_t::image_storage, dt_develop_t::iop, and TRUE.

Referenced by dt_imageio_export_with_flags().

◆ dt_dev_get_history_end()

◆ dt_dev_get_pointer_zoom_pos()

◆ dt_dev_get_processed_size()

◆ dt_dev_get_zoom_scale()

◆ dt_dev_hash()

uint64_t dt_dev_hash ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe 
)

Get the global hash of the last module in pipe

Todo:
: this should have its own hash

References dt_dev_pixelpipe_iop_t::global_hash, dt_pixel_cache_entry_t::hash, and dt_dev_pixelpipe_t::nodes.

Referenced by commit_params_late(), dt_dev_wait_hash(), gui_post_expose(), process(), and process_drago().

◆ dt_dev_init()

void dt_dev_init ( dt_develop_t dev,
int32_t  gui_attached 
)
Todo:
: these are uint32_t, setting to -1 is confusing

References dt_develop_t::allforms, dt_develop_t::alliop, dt_develop_t::allprofile_info, dt_develop_t::auto_save_timeout, dt_develop_t::average_delay, dt_backbuf_t::bpp, dt_backbuf_t::buffer, dt_develop_t::chroma_adaptation, dt_develop_t::colorscheme, dt_develop_t::darkroom_skip_mouse_events, dt_develop_t::display_histogram, dt_develop_t::drawing_timeout, dt_conf_get_float(), dt_conf_get_int(), DT_DEV_AVERAGE_DELAY_START, dt_dev_pixelpipe_init(), dt_dev_pixelpipe_init_preview(), DT_DEV_PREVIEW_AVERAGE_DELAY_START, dt_image_init(), dt_pthread_mutex_init(), dt_develop_t::enabled, dt_develop_t::exit, dt_develop_t::exposure, FALSE, dt_develop_t::form_gui, dt_develop_t::form_visible, dt_develop_t::forms, dt_develop_t::forms_changed, dt_develop_t::forms_hash, dt_develop_t::gui_attached, dt_develop_t::gui_module, dt_backbuf_t::hash, dt_backbuf_t::height, dt_develop_t::height, dt_develop_t::histogram_pre_levels, dt_develop_t::histogram_pre_levels_max, dt_develop_t::histogram_pre_tonecurve, dt_develop_t::histogram_pre_tonecurve_max, dt_develop_t::history, dt_develop_t::history_end, dt_develop_t::history_hash, dt_develop_t::history_mutex, dt_develop_t::image_invalid_cnt, dt_develop_t::image_storage, dt_develop_t::iop, dt_develop_t::iop_instance, dt_develop_t::iop_order_list, dt_develop_t::iop_order_version, dt_develop_t::iso_12646, dt_develop_t::lower, dt_develop_t::mask_lock, dt_develop_t::mode, dt_backbuf_t::op, dt_develop_t::output_histogram, dt_develop_t::overexposed, dt_develop_t::pipe, dt_develop_t::preview_average_delay, dt_develop_t::preview_pipe, dt_develop_t::proxy, dt_develop_t::raw_histogram, dt_develop_t::rawoverexposed, dt_develop_t::threshold, TRUE, dt_develop_t::upper, dt_develop_t::wb_coeffs, dt_develop_t::wb_is_D65, dt_backbuf_t::width, and dt_develop_t::width.

Referenced by _history_copy_and_paste_on_image_merge(), dt_dev_get_final_size(), dt_focus_draw_clusters(), dt_imageio_export_with_flags(), dt_styles_apply_to_image(), and init().

◆ dt_dev_invalidate_all_real()

◆ dt_dev_invalidate_preview_real()

◆ dt_dev_invalidate_real()

◆ dt_dev_invalidate_zoom_real()

◆ dt_dev_is_current_image()

int dt_dev_is_current_image ( dt_develop_t dev,
int32_t  imgid 
)

checks if provided imgid is the image currently in develop

References dt_image_t::id, and dt_develop_t::image_storage.

Referenced by dt_styles_apply_to_image().

◆ dt_dev_load_image()

◆ dt_dev_masks_list_change()

void dt_dev_masks_list_change ( dt_develop_t dev)

◆ dt_dev_masks_list_remove()

void dt_dev_masks_list_remove ( dt_develop_t dev,
int  formid,
int  parentid 
)

◆ dt_dev_masks_list_update()

void dt_dev_masks_list_update ( dt_develop_t dev)

◆ dt_dev_masks_selection_change()

◆ dt_dev_masks_update_hash()

◆ dt_dev_module_duplicate()

◆ dt_dev_module_remove()

◆ dt_dev_modulegroups_get()

◆ dt_dev_modulegroups_set()

◆ dt_dev_modulegroups_switch()

void dt_dev_modulegroups_switch ( dt_develop_t dev,
struct dt_iop_module_t module 
)

◆ dt_dev_modulegroups_update_visibility()

void dt_dev_modulegroups_update_visibility ( dt_develop_t dev)

◆ dt_dev_modules_update_multishow()

◆ dt_dev_pixelpipe_rebuild()

◆ dt_dev_pixelpipe_resync_all()

◆ dt_dev_pixelpipe_resync_main()

◆ dt_dev_pixelpipe_resync_preview()

◆ dt_dev_process_image()

◆ dt_dev_process_image_job()

void dt_dev_process_image_job ( dt_develop_t dev)

References _flag_pipe(), _update_darkroom_roi(), _update_gui_backbuf(), dt_develop_t::average_delay, dt_dev_pixelpipe_t::backbuf_scale, dt_dev_pixelpipe_t::backbuf_zoom_x, dt_dev_pixelpipe_t::backbuf_zoom_y, dt_mipmap_buffer_t::buf, dt_dev_pixelpipe_t::busy_mutex, dt_dev_pixelpipe_t::changed, darktable, dt_atomic_set_int(), dt_control_log_busy_enter(), dt_control_log_busy_leave(), dt_control_queue_redraw_center(), dt_control_toast_busy_enter(), dt_control_toast_busy_leave(), DT_DEBUG_CONTROL_SIGNAL_RAISE, DT_DEBUG_DEV, dt_dev_average_delay_update(), DT_DEV_PIPE_REMOVE, dt_dev_pixelpipe_cache_flush(), dt_dev_pixelpipe_change(), DT_DEV_PIXELPIPE_DIRTY, dt_dev_pixelpipe_has_reentry(), dt_dev_pixelpipe_process(), dt_dev_pixelpipe_reset_reentry(), dt_dev_pixelpipe_set_input(), DT_DEV_PIXELPIPE_UNDEF, DT_DEV_PIXELPIPE_VALID, dt_get_times(), dt_iop_nap(), DT_MIPMAP_BLOCKING, dt_mipmap_cache_get, dt_mipmap_cache_release, DT_MIPMAP_FULL, dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_show_times(), DT_SIGNAL_DEVELOP_UI_PIPE_FINISHED, dt_develop_t::exit, FALSE, dt_mipmap_buffer_t::height, dt_develop_t::height, dt_image_t::id, dt_develop_t::image_invalid_cnt, dt_develop_t::image_storage, darktable_t::mipmap_cache, dt_develop_t::pipe, darktable_t::pixelpipe_cache, dt_dev_pixelpipe_t::processing, dt_dev_pixelpipe_t::running, dt_dev_pixelpipe_t::shutdown, darktable_t::signals, dt_dev_pixelpipe_t::status, dt_dev_pixelpipe_t::type, dt_mipmap_buffer_t::width, and dt_develop_t::width.

Referenced by dt_dev_process_image_job_run().

◆ dt_dev_process_preview()

◆ dt_dev_process_preview_job()

◆ dt_dev_refresh_ui_images_real()

◆ dt_dev_reorder_gui_module_list()

void dt_dev_reorder_gui_module_list ( dt_develop_t dev)

◆ dt_dev_reprocess_all()

◆ dt_dev_set_history_end()

◆ dt_dev_snapshot_request()

void dt_dev_snapshot_request ( dt_develop_t dev,
const char *  filename 
)

◆ dt_dev_sync_pixelpipe_hash()

int dt_dev_sync_pixelpipe_hash ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe,
const double  iop_order,
const int  transf_direction,
dt_pthread_mutex_t *  lock,
const volatile uint64_t *const  hash 
)

synchronize pixelpipe by means hash values by waiting with timeout and potential reprocessing FIXME: modules that need to resync internal data with pipeline should listen to the PREVIEW_PIPE_RECOMPUTED signal. This function relies on timeouts, waiting for the pipe to finish, and the exception is not caught if the timeout expires with no result.

References dt_dev_pixelpipe_t::changed, dt_dev_invalidate, DT_DEV_PIPE_REMOVE, DT_DEV_PIPE_SYNCH, DT_DEV_PIPE_TOP_CHANGED, dt_dev_wait_hash(), FALSE, dt_pixel_cache_entry_t::hash, dt_pixel_cache_entry_t::lock, and TRUE.

Referenced by commit_params_late(), process(), and process_drago().

◆ dt_dev_undo_end_record()

◆ dt_dev_undo_start_record()

◆ dt_dev_wait_hash()

int dt_dev_wait_hash ( dt_develop_t dev,
struct dt_dev_pixelpipe_t pipe,
const double  iop_order,
const int  transf_direction,
dt_pthread_mutex_t *  lock,
const volatile uint64_t *const  hash 
)

◆ dt_history_item_get_label()

gchar * dt_history_item_get_label ( const struct dt_iop_module_t module)

generate item multi-instance name with mnemonics, for Gtk labels

References dt_iop_module_t::multi_name.

Referenced by _iop_panel_label().

◆ dt_history_item_get_name()

gchar * dt_history_item_get_name ( const struct dt_iop_module_t module)

◆ dt_history_item_get_name_html()

gchar * dt_history_item_get_name_html ( const struct dt_iop_module_t module)

◆ dt_masks_get_lock_mode()

◆ dt_masks_set_lock_mode()

◆ find_last_exposure_instance()

static dt_dev_proxy_exposure_t * find_last_exposure_instance ( dt_develop_t dev)
static