99#ifdef GDK_WINDOWING_QUARTZ
114#define DT_IOP_HEADER_MENU_OPEN "dt-module-header-menu-open"
115#define DT_IOP_HEADER_MENU_DISMISS_CLICK "dt-module-header-menu-dismiss-click"
116#define DT_IOP_HEADER_IGNORE_RELEASE "dt-module-header-ignore-release"
125 GdkModifierType modifier, gpointer data);
127 GdkModifierType modifier, gpointer data);
264 module->op, (
void *)picker, (
void *)pipe, piece ? piece->
global_hash : 0);
296 const void *
const i,
void *
const o)
323 size_t param_size =
module->so->get_introspection()->size;
324 module->params_size = param_size;
330 module->params = NULL;
335 module->default_params = NULL;
337 module->params = (dt_iop_params_t *)calloc(1, param_size);
338 module->default_params = (dt_iop_params_t *)calloc(1, param_size);
340 module->default_enabled = 0;
341 module->gui_data = NULL;
346 switch(
i->header.type)
349 *(
float*)((uint8_t *)
module->default_params + i->header.offset) = i->Float.Default;
352 *(
int*)((uint8_t *)
module->default_params + i->header.offset) = i->Int.Default;
355 *(
unsigned int*)((uint8_t *)
module->default_params + i->header.offset) = i->UInt.Default;
358 *(
unsigned short*)((uint8_t *)
module->default_params + i->header.offset) = i->UShort.Default;
361 *(
int*)((uint8_t *)
module->default_params + i->header.offset) = i->Enum.Default;
364 *(gboolean*)((uint8_t *)
module->default_params + i->header.offset) = i->Bool.Default;
367 *(
char*)((uint8_t *)
module->default_params + i->header.offset) = i->Char.Default;
370 memset((uint8_t *)
module->default_params +
i->header.offset, 0,
i->header.size);
379 int8_t *
p = (int8_t *)
module->default_params +
i->header.offset;
386 size_t num_ints =
i->header.size /
sizeof(int);
388 int *
p = (
int *)((uint8_t *)
module->default_params + i->header.offset);
398 fprintf(
stderr,
"unsupported introspection type \"%s\" encountered in dt_iop_default_init (field %s)\n",
i->header.type_name,
i->header.field_name);
431#define INCLUDE_API_FROM_MODULE_LOAD "iop_load_module"
435 if(
IS_NULL_PTR(
module->modify_roi_in))
module->modify_roi_in = _iop_modify_roi_in;
436 if(
IS_NULL_PTR(
module->modify_roi_out))
module->modify_roi_out = _iop_modify_roi_out;
439 if(
IS_NULL_PTR(
module->process_tiling_cl))
module->process_tiling_cl = darktable.opencl->inited ? default_process_tiling_cl : NULL;
443 module->process_plain = module->process;
444 module->process = default_process;
449 module->have_introspection = FALSE;
450 if(
module->introspection_init)
455 module->have_introspection = TRUE;
464 fprintf(
stderr,
"[iop_load_module] failed to initialize introspection for operation `%s'\n", module_name);
467 if(
module->init_global)
module->init_global(module);
474 module->widget = NULL;
475 module->header = NULL;
477 module->hide_enable_button = 0;
478 module->request_color_pick = DT_REQUEST_COLORPICK_OFF;
479 module->request_histogram = DT_REQUEST_ONLY_IN_GUI;
480 module->histogram_stats.bins_count = 0;
481 module->histogram_stats.pixels = 0;
482 module->multi_priority = 0;
483 module->iop_order = 0;
484 for(
int k = 0;
k < 3;
k++)
486 module->picked_color[k] = module->picked_output_color[k] = 0.0f;
487 module->picked_color_min[k] = module->picked_output_color_min[k] = 666.0f;
488 module->picked_color_max[k] = module->picked_output_color_max[k] = -666.0f;
490 module->histogram_cst = IOP_CS_NONE;
491 module->histogram = NULL;
492 module->histogram_max[0] = module->histogram_max[1] = module->histogram_max[2] = module->histogram_max[3]
494 module->histogram_middle_grey = FALSE;
495 module->request_mask_display = DT_DEV_PIXELPIPE_DISPLAY_NONE;
496 module->bypass_cache = FALSE;
497 module->bypass_cache_variant = 0;
498 module->enabled = module->default_enabled = module->workflow_enabled = 0;
500 module->raster_mask.source.users = g_hash_table_new(NULL, NULL);
501 module->raster_mask.source.masks = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, dt_free_gpointer);
502 module->raster_mask.sink.source = NULL;
503 module->raster_mask.sink.id = 0;
506 module->module = so->module;
509#define INCLUDE_API_FROM_MODULE_LOAD_BY_SO
512 module->version = so->version;
513 module->process_plain = so->process_plain;
514 module->have_introspection = so->have_introspection;
516 module->reset_button = NULL;
517 module->presets_button = NULL;
518 module->fusion_slider = NULL;
520 module->global_data = so->data;
523 module->init(module);
524 module->hash = DT_PIXELPIPE_CACHE_HASH_INVALID;
525 module->blendop_hash = DT_PIXELPIPE_CACHE_HASH_INVALID;
527 if(
module->params_size == 0)
529 fprintf(
stderr,
"[iop_load_module] `%s' needs to have a params size > 0!\n", so->
op);
536 module->params = calloc(1, module->params_size);
538 module->default_params = calloc(1, module->params_size);
539 module->blend_params = calloc(1, sizeof(dt_develop_blend_params_t));
540 module->default_blendop_params = calloc(1, sizeof(dt_develop_blend_params_t));
548 module->common_fields.name = delete_underscore(module->name());
549 module->common_fields.view = g_strdup(_("Darkroom"));
553 module->common_fields.name = NULL;
554 module->common_fields.view = NULL;
556 module->common_fields.widget_list = NULL;
557 module->common_fields.widget_list_bh = NULL;
558 module->common_fields.focus = module->iop_focus;
559 module->common_fields.deprecated = (module->flags() & IOP_FLAGS_DEPRECATED) == IOP_FLAGS_DEPRECATED;
567 module->init_pipe(module, pipe, piece);
590 "[dt_iop_cleanup_pipe] missing module, skipping module pipe cleanup\n");
595 "[dt_iop_cleanup_pipe] missing pipe for `%s`, skipping module pipe cleanup\n",
617 "[dt_iop_cleanup_pipe] invalid shared-object descriptor %p, skipping module pipe cleanup\n",
621 "[dt_iop_cleanup_pipe] stale cleanup callback for `%s`, skipping module pipe cleanup\n",
651 else if(
mod->instance ==
module->instance)
665 const gboolean
is_zero = (
module->multi_priority == 0);
699 if(!hist || !hist->module)
704 if(hist->module->instance ==
module->instance && hist->module !=
module)
706 first = hist->module;
834 module->blend_params->mask_id = 0;
845 if(
module->dev->gui_attached)
906 module->multi_name[0] = module->multi_name[sizeof(module->multi_name) - 1];
907 module->multi_name[sizeof(module->multi_name) - 1] = 0;
918 module->multi_name[0] = 0;
927 module->multi_name[0] = module->multi_name[sizeof(module->multi_name) - 1];
928 module->multi_name[sizeof(module->multi_name) - 1] = 0;
973 module->multi_name[sizeof(module->multi_name) - 1] = module->multi_name[0];
974 module->multi_name[0] = 0;
1028 else if(!
IS_NULL_PTR(event) && event->button == 2)
1092 module->enabled = 1;
1099 module->enabled = 0;
1103 module->dev->proxy.chroma_adaptation = NULL;
1124 g_debug(
"Module '%s' is not hidden and lacks implementation of gui_init()...",
module->op);
1125 else if(!
module->gui_cleanup)
1126 g_debug(
"Module '%s' is not hidden and lacks implementation of gui_cleanup()...",
module->op);
1159 if(
mod->instance_name)
1175 mod->instance_name);
1197 if(
module->default_enabled &&
module->hide_enable_button)
1201 else if(!
module->default_enabled &&
module->hide_enable_button)
1218 if(
module->hide_enable_button)
1225 if(
module->hide_enable_button)
1228 module->enabled ?
"dt_iop_enable_forced_on" :
"dt_iop_enable_forced_off");
1254 const gchar *
const main_scope =
_(
"Darkroom/Modules");
1269 if(
module->gui_init)
module->gui_init(module);
1270 if(
module->color_picker_apply)
1289 if(
module->reload_defaults)
1296 module->reload_defaults(module);
1301 fprintf(
stderr,
"reload_defaults should not be called without image.\n");
1320 const int32_t module_version =
module_so->version();
1325 "SELECT name, op_version, op_params, blendop_version, blendop_params FROM data.presets WHERE operation = ?1",
1351 "SELECT module FROM main.history WHERE operation = ?1 AND op_params = ?2", -1,
1362 fprintf(
stderr,
"[imageop_init_presets] WARNING: Could not find versioning information for '%s' "
1363 "preset '%s'\nUntil some is found, the preset will be unavailable.\n(To make it "
1364 "return, please load an image that uses the preset.)\n",
1378 "UPDATE data.presets SET op_version=?1 WHERE operation=?2 AND name=?3", -1,
1392 module = (dt_iop_module_t *)calloc(1, sizeof(dt_iop_module_t));
1422 fprintf(
stderr,
"[imageop_init_presets] updating '%s' preset '%s' from version %d to version %d\nto:'%s'",
1430 "SET op_version=?1, op_params=?2 "
1431 "WHERE operation=?3 AND name=?4",
1448 fprintf(
stderr,
"[imageop_init_presets] Can't upgrade '%s' preset '%s' from version %d to %d, no "
1449 "legacy_params() implemented \n",
1456 "[imageop_init_presets] updating '%s' preset '%s' from blendop version %d to version %d\n",
1462 module = (dt_iop_module_t *)calloc(1, sizeof(dt_iop_module_t));
1469 if(
module->params_size == 0)
1494 "SET blendop_version=?1, blendop_params=?2 "
1495 "WHERE operation=?3 AND name=?4",
1592 module->cleanup(module);
1597 module->common_fields.name = NULL;
1602 module->common_fields.view = NULL;
1623 module->raster_mask.source.users = NULL;
1624 module->raster_mask.source.masks = NULL;
1638 if(
module->cleanup_global)
module->cleanup_global(module);
1648 static const int key = 0;
1670 && ((module->blend_params->mask_mode & DEVELOP_MASK_RASTER) == DEVELOP_MASK_RASTER);
1684 = ((
module->flags() & IOP_FLAGS_SUPPORTS_BLENDING) == IOP_FLAGS_SUPPORTS_BLENDING);
1685 const gboolean
internal_masks = ((
module->flags() & IOP_FLAGS_INTERNAL_MASKS) == IOP_FLAGS_INTERNAL_MASKS);
1707 if(
module->raster_mask.sink.source)
1710 if(
module->blend_params != blendop_params)
1715 module->blend_params->blend_cst = dt_develop_blend_default_module_blend_colorspace(module);
1726 if(!
strcmp(
m->op, blendop_params->raster_mask_source))
1728 if(
m->multi_priority == blendop_params->raster_mask_instance)
1733 module->raster_mask.sink.source = m;
1734 module->raster_mask.sink.id = blendop_params->raster_mask_id;
1741 module->raster_mask.sink.source = NULL;
1742 module->raster_mask.sink.id = 0;
1780 fprintf(
stderr,
"validation check failed in _iop_validate_params for type \"%s\"; string not null terminated.\n",
1792 fprintf(
stderr,
"validation check failed in _iop_validate_params for type \"%s\", for array element \"%d\"\n",
1828 if(
i->value == *(
int*)
p)
1842 fprintf(
stderr,
"unsupported introspection type \"%s\" encountered in _iop_validate_params (field %s)\n",
1849 fprintf(
stderr,
"validation check failed in _iop_validate_params for type \"%s\"%s%s\n",
1861 &&
mod_1->multi_priority ==
mod_2->multi_priority
1924 module->blendop_hash = hash;
1935 hash =
dt_hash(hash, (
char *)&
module->enabled,
sizeof(gboolean));
1936 hash =
dt_hash(hash, (
char *)&
module->instance,
sizeof(int32_t));
1937 hash =
dt_hash(hash, (
char *)&
module->multi_priority,
sizeof(
int));
1938 hash =
dt_hash(hash, (
char *)&
module->iop_order,
sizeof(
int));
1948 module->hash = hash;
1975 module->commit_params(module, params, pipe, piece);
2040 if(!
IS_NULL_PTR(
module->dev) &&
module->dev->gui_module == module) module->dev->gui_module = NULL;
2057 if(
mod->instance_name)
2069 m->widget_list =
NULL;
2071 m->widget_list_bh =
NULL;
2077 if(
module->color_picker_apply)
2084 module->gui_cleanup(module);
2127 module->widget = NULL;
2128 module->header = NULL;
2129 module->expander = NULL;
2143 module->gui_update(module);
2163 const gboolean disabled = !
module->default_enabled && module->hide_enable_button;
2164 if(disabled)
return;
2182 if(
module->blend_params->mask_id > 0)
2205 const gboolean disabled = !
module->default_enabled && module->hide_enable_button;
2206 if(disabled)
return;
2232 && !IS_NULL_PTR(module->header) && GTK_IS_WIDGET(module->header));
2288 if(
module->gui_focus)
module->gui_focus(module, TRUE);
2330 module->expanded = expanded;
2360 snprintf(var,
sizeof(var),
"plugins/darkroom/%s/expanded",
module->op);
2402 const gboolean expanded =
module->expanded;
2422 else if(e->button == 3)
2434 return module->focus(module, TRUE);
2447 GdkModifierType modifier, gpointer data)
2459 return module->focus(module, FALSE);
2463 GdkModifierType modifier, gpointer data)
2477 if(!
module->hide_enable_button)
2479 module->enabled = TRUE;
2523 else if(e->button == 3)
2578 module->request_mask_display
2579 &= ~(DT_DEV_PIXELPIPE_DISPLAY_MASK | DT_DEV_PIXELPIPE_DISPLAY_CHANNEL
2580 | DT_DEV_PIXELPIPE_DISPLAY_ANY | DT_DEV_PIXELPIPE_DISPLAY_STICKY);
2583 module->request_mask_display |= DT_DEV_PIXELPIPE_DISPLAY_MASK;
2649 if(
module->mask_indicator)
2651 gchar *
type =
_(
"unknown mask");
2658 type=
_(
"drawn + parametric mask");
2660 type=
_(
"drawn mask");
2662 type=
_(
"parametric mask");
2664 type=
_(
"raster mask");
2678 gchar *details =
g_strdup_printf(
"%s\n%s",
part2,
_(
"click to display (module must be activated first)"));
2684 part2 =
g_strdup(
_(
"click to display (module must be activated first)"));
2705 const gboolean
support_blending = (
module->flags() & IOP_FLAGS_SUPPORTS_BLENDING) == IOP_FLAGS_SUPPORTS_BLENDING;
2730 const char **
des =
module->description(module);
2758 const char *
ilabs[4] = {
_(
"Purpose"),
_(
"Input"),
_(
"Process"),
_(
"Output")};
2760 for(
int k=1;
k<5;
k++)
2809 module->header = header;
2827 char w_name[256] = { 0 };
2856 module->mask_indicator = hw[IOP_MODULE_MASK];
2860 module->multimenu_button = GTK_WIDGET(hw[IOP_MODULE_INSTANCE]);
2862 _(
"multiple instance actions\nright-click creates new instance"));
2872 module->reset_button = GTK_WIDGET(hw[IOP_MODULE_RESET]);
2880 module->presets_button = GTK_WIDGET(hw[IOP_MODULE_PRESETS]);
2897 module->off = DTGTK_TOGGLEBUTTON(switch_button);
2932 if(
module->deprecated_msg())
2949 module->expander = expander;
2975 if(
usec <= 0)
return;
2986 return module->bypass_cache;
2991 module->bypass_cache = state;
3008 module->bypass_cache_variant = variant;
3060 "INSERT INTO memory.darktable_iop_names (operation, name) VALUES (?1, ?2)",
3143 module->multi_priority = new_priority;
3169 && (
mod->multi_priority == multi_priority || multi_priority == -1))
3231 return (
const char **)
str_out;
3239 if(
module->gui_changed)
module->gui_changed(module, widget, data);
3277 fprintf(stderr,
"[dt_bauhaus_update_module] unsupported slider data type\n");
3296 fprintf(stderr,
"[dt_bauhaus_update_module] unsupported combo data type\n");
3300 fprintf(stderr,
"[dt_bauhaus_update_module] invalid bauhaus widget type encountered\n");
3320 float *
f = w->
field, prevf = *
f; *
f = val;
3326 int *
i = w->
field, previ = *
i; *
i = val;
3332 unsigned short *s = w->
field, prevs = *s; *s = val;
3337 fprintf(stderr,
"[_bauhaus_slider_value_change] unsupported slider data type\n");
3351 int *e = w->
field, preve = *e; *e = GPOINTER_TO_INT(entry->
data);
3358 int *
i = w->
field, previ = *
i; *
i =
d->active;
3364 unsigned int *u = w->
field, prevu = *u; *u =
d->active;
3370 gboolean *b = w->
field, prevb = *b; *b =
d->active;
3375 fprintf(stderr,
"[_bauhaus_combobox_set] unsupported combo data type\n");
3380 fprintf(stderr,
"[dt_bauhaus_value_changed_default_callback] invalid bauhaus widget type encountered for %s %s: %i\n", w->
label, w->module->name, w->
type);
void dt_accels_remove_shortcut(dt_accels_t *accels, const char *path)
Remove the shortcut object identified by path and all its accels.
void dt_accels_new_virtual_instance_shortcut(dt_accels_t *accels, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gpointer data, GtkAccelGroup *accel_group, const gchar *action_scope, const gchar *action_name)
gchar * dt_accels_build_path(const gchar *scope, const gchar *feature)
void dt_accels_remove_accel(dt_accels_t *accels, const char *path, gpointer data)
Recursively remove all accels for all shortcuts containing path. This is unneeded for accels attached...
__DT_CLONE_TARGETS__ int process(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid)
float dt_bauhaus_slider_get(GtkWidget *widget)
gboolean dt_bauhaus_combobox_set_from_value(GtkWidget *widget, int value)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
#define DT_BAUHAUS_WIDGET(obj)
void dt_develop_blend_init_blend_parameters(dt_develop_blend_params_t *blend_params, dt_develop_blend_colorspace_t cst)
dt_develop_blend_colorspace_t dt_develop_blend_default_module_blend_colorspace(dt_iop_module_t *module)
int dt_develop_blend_version(void)
int dt_develop_blend_legacy_params(dt_iop_module_t *module, const void *const old_params, const int old_version, void *new_params, const int new_version, const int length)
void dt_develop_blend_get_mask_usage(const dt_iop_module_t *module, const dt_develop_blend_params_t *params, gboolean *top_enabled, gboolean *raster_used, gboolean *drawn_used, gboolean *parametric_used)
gboolean blend_color_picker_apply(dt_iop_module_t *module, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void dt_iop_gui_init_blending(dt_iop_module_t *module)
dt_develop_blend_colorspace_t
void dt_iop_gui_update_blending(dt_iop_module_t *module)
void dt_iop_gui_blending_lose_focus(dt_iop_module_t *module)
void dt_iop_gui_cleanup_blending(dt_iop_module_t *module)
void dt_iop_gui_blending_reload_defaults(dt_iop_module_t *module)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
void dt_collection_hint_message(const dt_collection_t *collection)
void dt_iop_color_picker_reset(dt_iop_module_t *module, gboolean keep)
int dt_iop_color_picker_get_ready_data(const dt_iop_module_t *module, GtkWidget **picker, dt_dev_pixelpipe_t **pipe, const dt_dev_pixelpipe_iop_t **piece)
const dt_aligned_pixel_t f
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
int dt_conf_key_exists(const char *key)
gboolean dt_conf_key_not_empty(const char *name)
void dt_control_queue_redraw_center()
request redraw of center window. This redraws the center view within a gdk critical section to preven...
#define dt_control_queue_cursor(cursor)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
#define dt_gui_freeze_begin()
#define dt_gui_freeze_end()
#define dt_gui_widget_freeze()
void void void gboolean dt_gui_widgets_suppressed(void)
static gchar * delete_underscore(const char *s)
static uint64_t dt_hash(uint64_t hash, const char *str, size_t size)
static const dt_aligned_pixel_simd_t value
static gboolean dt_modifier_is(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
void dt_database_end_transaction_batch(const struct dt_database_t *db)
void dt_database_begin_transaction_batch(const struct dt_database_t *db)
sqlite3 * dt_database_get(const dt_database_t *db)
#define dt_database_start_transaction(db)
#define dt_database_release_transaction(db)
#define DT_DEBUG_SQLITE3_BIND_BLOB(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_PREPARE_V2(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_TEXT(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_INT(a, b, c)
void dt_dev_write_history(dt_develop_t *dev, gboolean async)
Thread-safe wrapper around dt_dev_write_history_ext() for dev->image_storage.id.
#define dt_dev_add_history_item(dev, module, enable, redraw)
#define dt_dev_pixelpipe_rebuild_all(dev)
#define dt_dev_pixelpipe_update_history_main(dev)
void dt_dev_signal_modules_moved(dt_develop_t *dev)
void dt_dev_modulegroups_switch_tab(dt_develop_t *dev, dt_iop_module_t *module)
void dt_dev_module_remove(dt_develop_t *dev, dt_iop_module_t *module)
void dt_dev_undo_start_record(dt_develop_t *dev)
gchar * dt_history_item_get_label(const struct dt_iop_module_t *module)
void dt_dev_undo_end_record(dt_develop_t *dev)
gchar * dt_history_item_get_name(const struct dt_iop_module_t *module)
@ DT_DEV_PIXELPIPE_DISPLAY_NONE
void dtgtk_cairo_paint_module_switch_on(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_presets(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_showmask(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_multiinstance(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_module_switch(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_reset(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
char * dt_exif_xmp_encode(const unsigned char *input, const int len, int *output_len)
GtkWidget * dtgtk_expander_get_header_event_box(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_body_event_box(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_frame(GtkDarktableExpander *expander)
GtkWidget * dtgtk_expander_get_body(GtkDarktableExpander *expander)
void dtgtk_expander_set_expanded(GtkDarktableExpander *expander, gboolean expanded)
GtkWidget * dtgtk_expander_new(GtkWidget *header, GtkWidget *body)
#define DTGTK_EXPANDER(obj)
static guint dt_keys_mainpad_alternatives(const guint key_val)
Remap keypad keys to usual mainpad ones.
void dt_gui_menu_popup(GtkMenu *menu, GtkWidget *button, GdkGravity widget_anchor, GdkGravity menu_anchor)
void dt_gui_remove_class(GtkWidget *widget, const gchar *class_name)
GtkWidget * dt_gui_container_nth_child(GtkContainer *container, int which)
void dt_capitalize_label(gchar *text)
void dt_gui_add_help_link(GtkWidget *widget, char *link)
void dt_gui_refocus_center()
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnects accels when a text or search entry gets the focus, and reconnects them when it looses it....
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
void dt_ui_container_focus_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
gives a widget focus in the container
#define dt_accels_new_darkroom_action(a, b, c, d, e, f, g)
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
gboolean dt_gui_presets_autoapply_for_module(dt_iop_module_t *module)
void dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
gboolean dt_gui_presets_autogen_enabled()
void dt_gui_throttle_cancel(gpointer source)
static gboolean enable(dt_image_t *image)
uint32_t dt_rawspeed_crop_dcraw_filters(uint32_t filters, uint32_t crop_x, uint32_t crop_y)
static gboolean _iop_plugin_enable_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static int default_operation_tags(void)
dt_iop_module_t * dt_iop_get_module_from_list(GList *iop_list, const char *op)
static void _gui_reset_callback(GtkButton *button, GdkEventButton *event, dt_iop_module_t *module)
dt_iop_module_t * dt_iop_get_module(const char *op)
static int default_distort_backtransform(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *points, size_t points_count)
void dt_iop_set_darktable_iop_table()
gboolean dt_iop_module_needs_mask_history_ext(const dt_iop_module_t *module, gboolean *raster, gboolean *drawn, gboolean *parametric)
static gboolean _gui_multiinstance_callback(GtkButton *button, GdkEventButton *event, gpointer user_data)
static const char * default_aliases(void)
void dt_iop_gui_cleanup_module(dt_iop_module_t *module)
static void _init_module_so(void *m)
void dt_iop_load_default_params(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_get_module_by_instance_name(GList *modules, const char *operation, const char *multi_name)
static int default_distort_transform(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *points, size_t points_count)
static gboolean _iop_plugin_header_button_release(GtkWidget *w, GdkEventButton *e, gpointer user_data)
GtkWidget * dt_iop_gui_get_pluginui(dt_iop_module_t *module)
static int default_default_group(void)
gboolean dt_iop_is_raster_mask_used(dt_iop_module_t *module, int id)
static void _iop_plugin_header_menu_deactivate(GtkWidget *menu, gpointer user_data)
void dt_iop_commit_params(dt_iop_module_t *module, dt_iop_params_t *params, dt_develop_blend_params_t *blendop_params, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void dt_iop_compute_module_hash(dt_iop_module_t *module, GList *masks)
void dt_iop_add_remove_mask_indicator(dt_iop_module_t *module)
void dt_iop_reload_defaults(dt_iop_module_t *module)
void _hash_raster_masks(gpointer key, gpointer value, uint64_t *hash)
void dt_iop_gui_set_expander(dt_iop_module_t *module)
void dt_iop_throttled_history_update(gpointer data)
void dt_iop_compute_blendop_hash(dt_iop_module_t *module, uint64_t hash, GList *masks)
dt_iop_module_t * dt_iop_gui_get_next_visible_module(dt_iop_module_t *module)
void dt_iop_init_pipe(struct dt_iop_module_t *module, struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece)
static gboolean _rename_module_key_press(GtkWidget *entry, GdkEventKey *event, dt_iop_module_t *module)
static gboolean _iop_plugin_header_activate(GtkWidget *self, gboolean group_cycling, gpointer user_data)
static void _iop_panel_label(dt_iop_module_t *module)
gboolean dt_iop_is_first_instance(GList *modules, dt_iop_module_t *module)
static int default_flags(void)
int dt_iop_load_module_so(void *m, const char *libname, const char *module_name)
void dt_iop_gui_init(dt_iop_module_t *module)
void dt_iop_commit_blend_params(dt_iop_module_t *module, const dt_develop_blend_params_t *blendop_params)
uint32_t dt_dev_get_roi_filters(const dt_dev_pixelpipe_iop_t *const piece, const dt_iop_roi_t *const roi_in)
void dt_iop_cleanup_module(dt_iop_module_t *module)
static gboolean _iop_plugin_focus_accel(GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
static void _iop_modify_roi_out(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece, dt_iop_roi_t *roi_out, const dt_iop_roi_t *roi_in)
gboolean dt_iop_module_has_raster_mask(const dt_iop_module_t *module)
void dt_iop_gui_update(dt_iop_module_t *module)
const gchar * dt_iop_get_localized_aliases(const gchar *op)
const gchar * dt_iop_get_localized_name(const gchar *op)
void dt_bauhaus_update_module(dt_iop_module_t *self)
void dt_iop_set_cache_bypass_variant(dt_iop_module_t *module, int variant)
static void default_commit_params(struct dt_iop_module_t *self, dt_iop_params_t *params, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static dt_introspection_field_t * default_get_f(const char *name)
int dt_iop_load_module(dt_iop_module_t *module, dt_iop_module_so_t *module_so, dt_develop_t *dev)
gboolean _iop_validate_params(dt_introspection_field_t *field, gpointer params, gboolean report)
int dt_iop_load_module_by_so(dt_iop_module_t *module, dt_iop_module_so_t *so, dt_develop_t *dev)
static void default_cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void default_gui_cleanup(dt_iop_module_t *self)
static void _display_mask_indicator_callback(GtkToggleButton *bt, dt_iop_module_t *module)
void dt_iop_gui_reset(dt_iop_module_t *module)
static void default_init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
gboolean dt_iop_module_needs_mask_history(const dt_iop_module_t *module)
void dt_iop_load_modules_so(void)
void dt_iop_nap(int32_t usec)
static void default_cleanup(dt_iop_module_t *module)
void dt_iop_default_init(dt_iop_module_t *module)
void _iop_dim_all_but(dt_iop_module_t *module, gboolean dim)
void dt_iop_gui_update_expanded(dt_iop_module_t *module)
void dt_iop_gui_update_header(dt_iop_module_t *module)
void dt_iop_unload_modules_so()
static gboolean _iop_plugin_header_menu_dismiss_idle(gpointer user_data)
void dt_iop_gui_set_enable_button(dt_iop_module_t *module)
int default_iop_focus(dt_gui_module_t *m, gboolean toggle)
void dt_iop_cleanup_pipe(struct dt_iop_module_t *module, struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece)
Release module-owned resources for one pixelpipe node.
static const char ** default_description(struct dt_iop_module_t *self)
static void _gui_copy_callback(GtkButton *button, gpointer user_data)
gboolean dt_iop_is_visible(dt_iop_module_t *module)
void dt_iop_request_focus(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_gui_get_previous_visible_module(dt_iop_module_t *module)
static const char * default_deprecated_msg(void)
gboolean dt_iop_is_hidden(dt_iop_module_t *module)
static gboolean default_has_defaults(struct dt_iop_module_t *self)
static gboolean _iop_plugin_body_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data)
const char ** dt_iop_set_description(dt_iop_module_t *module, const char *main_text, const char *purpose, const char *input, const char *process, const char *output)
GtkWidget * dt_iop_gui_get_widget(dt_iop_module_t *module)
gboolean dt_iop_so_is_hidden(dt_iop_module_so_t *module)
static void _gui_set_single_expanded(dt_iop_module_t *module, gboolean expanded)
float dt_dev_get_module_scale(const dt_dev_pixelpipe_t *const pipe, const dt_iop_roi_t *const roi_in)
void dt_iop_gui_changed(dt_iop_module_t *action, GtkWidget *widget, gpointer data)
int dt_iop_get_module_flags(const char *op)
static void _iop_color_picker_data_ready_callback(gpointer instance, gpointer user_data)
static void _mask_indicator_get_usage(dt_iop_module_t *module, gboolean *top_enabled, gboolean *raster_used, gboolean *drawn_used, gboolean *parametric_used)
static gboolean _iop_plugin_header_child_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static gboolean _mask_indicator_tooltip(GtkWidget *treeview, gint x, gint y, gboolean kb_mode, GtkTooltip *tooltip, dt_iop_module_t *module)
void dt_iop_gui_set_enable_button_icon(GtkWidget *w, dt_iop_module_t *module)
static gboolean default_runtime_data_hash(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
gboolean dt_iop_gui_move_module_before(dt_iop_module_t *module, dt_iop_module_t *module_next, const char *reason)
Move a module before another one and commit the GUI-side effects.
void dt_bauhaus_value_changed_default_callback(GtkWidget *widget)
dt_iop_module_t * dt_iop_get_colorout_module(void)
gboolean dt_iop_check_modules_equal(dt_iop_module_t *mod_1, dt_iop_module_t *mod_2)
#define DT_IOP_HEADER_IGNORE_RELEASE
static void _presets_popup_callback(GtkButton *button, dt_iop_module_t *module)
static int default_operation_tags_filter(void)
#define DT_IOP_HEADER_MENU_DISMISS_CLICK
static sqlite3_stmt * _iop_presets_select_stmt
static void _iop_gui_widget_gone(gpointer user_data, GObject *where_the_object_was)
Clear GUI pointers that still reference one iop widget being finalized.
static gboolean _rename_module_resize(GtkWidget *entry, GdkEventKey *event, dt_iop_module_t *module)
void dt_iop_gui_set_expanded(dt_iop_module_t *module, gboolean expanded, gboolean collapse_others)
static void _gui_delete_callback(GtkButton *button, dt_iop_module_t *module)
void dt_iop_set_cache_bypass(dt_iop_module_t *module, gboolean state)
static dt_introspection_t * default_get_introspection(void)
gboolean dt_iop_get_cache_bypass(dt_iop_module_t *module)
gboolean dt_iop_gui_move_module_after(dt_iop_module_t *module, dt_iop_module_t *module_prev, const char *reason)
Move a module after another one and commit the GUI-side effects.
void dt_iop_set_mask_mode(dt_iop_module_t *module, int mask_mode)
static gboolean _rename_module_idle(gpointer user_data)
static gboolean _iop_plugin_header_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data)
static void _iop_modify_roi_in(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece, const dt_iop_roi_t *roi_out, dt_iop_roi_t *roi_in)
gboolean _iop_tooltip_callback(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data)
static void _init_presets(dt_iop_module_so_t *module_so)
void dt_iop_gui_rename_module(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_gui_duplicate(dt_iop_module_t *base, gboolean copy_params)
gboolean dt_iop_gui_module_is_visible(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_get_module_by_op_priority(GList *modules, const char *operation, const int multi_priority)
gboolean dt_iop_gui_commit_iop_order_change(dt_develop_t *dev, dt_iop_module_t *module, gboolean enable, gboolean write_history, const char *reason)
Commit the GUI-side consequences of an IOP-order change.
static void _gui_duplicate_callback(GtkButton *button, gpointer user_data)
static void * default_get_p(const void *param, const char *name)
static dt_introspection_field_t * default_get_introspection_linear(void)
void dt_iop_update_multi_priority(dt_iop_module_t *module, int new_priority)
static void _gui_off_callback(GtkToggleButton *togglebutton, gpointer user_data)
static void _gui_rename_callback(GtkButton *button, dt_iop_module_t *module)
#define DT_IOP_HEADER_MENU_OPEN
static int default_process(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, const struct dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o)
static gboolean dt_iop_colorspace_is_rgb(const dt_iop_colorspace_type_t cst)
@ IOP_FLAGS_SUPPORTS_BLENDING
#define DT_INTROSPECTION_VERSION
@ DT_INTROSPECTION_TYPE_BOOL
@ DT_INTROSPECTION_TYPE_ENUM
@ DT_INTROSPECTION_TYPE_OPAQUE
@ DT_INTROSPECTION_TYPE_NONE
@ DT_INTROSPECTION_TYPE_ARRAY
@ DT_INTROSPECTION_TYPE_CHAR
@ DT_INTROSPECTION_TYPE_FLOAT
@ DT_INTROSPECTION_TYPE_UNION
@ DT_INTROSPECTION_TYPE_UINT
@ DT_INTROSPECTION_TYPE_USHORT
@ DT_INTROSPECTION_TYPE_INT8
@ DT_INTROSPECTION_TYPE_STRUCT
@ DT_INTROSPECTION_TYPE_FLOATCOMPLEX
@ DT_INTROSPECTION_TYPE_INT
gboolean dt_ioppr_move_iop_after(struct dt_develop_t *dev, dt_iop_module_t *module, dt_iop_module_t *module_prev)
Move a module instance after another module in the pipe.
gboolean dt_ioppr_move_iop_before(struct dt_develop_t *dev, dt_iop_module_t *module, dt_iop_module_t *module_next)
Move a module instance before another module in the pipe.
int dt_ioppr_check_iop_order(dt_develop_t *dev, const int32_t imgid, const char *msg)
Debug helper to validate the current order for a develop context.
float *const restrict const size_t k
void dt_masks_iop_use_same_as(struct dt_iop_module_t *module, struct dt_iop_module_t *src)
void dt_masks_reset_form_gui(void)
dt_masks_form_t * dt_masks_get_from_id_ext(GList *forms, int id)
dt_masks_form_t * dt_masks_get_from_id(dt_develop_t *dev, int id)
void dt_masks_form_delete(struct dt_iop_module_t *module, dt_masks_form_t *grp, dt_masks_form_t *form)
void dt_masks_group_update_name(dt_iop_module_t *module)
uint64_t dt_masks_group_get_hash(uint64_t hash, dt_masks_form_t *form)
GList * dt_module_load_modules(const char *subdir, size_t module_size, int(*load_module_so)(void *module, const char *libname, const char *plugin_name), void(*init_module)(void *module), gint(*sort_modules)(gconstpointer a, gconstpointer b))
char * dt_pixelpipe_get_pipe_name(dt_dev_pixelpipe_type_t pipe_type)
void dt_sentry_record_module_usage(const char *category, const char *name)
char dt_dev_operation_t[20]
void dt_control_signal_disconnect_all(const struct dt_control_signal_t *ctlsig, gpointer user_data)
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_DEVELOP_MASKS_GUI_CHANGED
@ DT_SIGNAL_CONTROL_PICKERDATA_READY
This signal is raised when new color picker data are available in darkroom. no param,...
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
struct _GtkWidget GtkWidget
const float uint32_t state[4]
const float const float param
unsigned __int64 uint64_t
struct dt_gui_gtk_t * gui
struct dt_collection_t * collection
const struct dt_database_t * db
struct dt_control_signal_t * signals
struct dt_opencl_t * opencl
struct dt_develop_t * develop
GtkAccelGroup * darkroom_accels
struct dt_develop_blend_params_t * blend_params
dt_iop_buffer_dsc_t dsc_in
uint64_t global_mask_hash
struct dt_iop_module_t *void * data
gboolean cache_output_on_ram
dt_dev_pixelpipe_type_t type
struct dt_develop_t::@19 color_picker
Authoritative darkroom color-picker state.
struct dt_iop_module_t * gui_module
struct dt_iop_module_t *struct dt_iop_color_picker_t * picker
GtkMenu * presets_popup_menu
GtkWidget * has_scroll_focus
GtkWidget * scroll_to_header_once
The dt_gui_module_t type is the intersection between a dt_lib_module_t and a dt_iop_module_t structur...
union dt_introspection_field_t * field
dt_introspection_type_t type
dt_introspection_type_enum_tuple_t * values
union dt_introspection_field_t ** fields
union dt_introspection_field_t ** fields
GModule *dt_dev_operation_t op
dt_iop_params_t * default_params
struct dt_develop_blend_params_t * blend_params
struct dt_develop_t * dev
int(* process_plain)(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, const struct dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o)
struct dt_develop_blend_params_t * default_blendop_params
Region of interest passed through the pixelpipe.
void dt_telemetry_record_module_usage(const char *category, const char *name)
dt_bauhaus_combobox_data_t combobox
dt_introspection_type_float_complex_t FloatComplex
dt_introspection_type_header_t header
dt_introspection_type_ushort_t UShort
dt_introspection_type_float_t Float
dt_introspection_type_union_t Union
dt_introspection_type_uint_t UInt
dt_introspection_type_int_t Int
dt_introspection_type_char_t Char
dt_introspection_type_int8_t Int8
dt_introspection_type_array_t Array
dt_introspection_type_enum_t Enum
dt_introspection_type_struct_t Struct
char * dt_get_help_url(char *name)
void dt_ui_container_add_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER