49#include <glib/gstdio.h>
68#include <libxml/encoding.h>
69#include <libxml/xmlwriter.h>
75#define DT_IOP_ORDER_INFO (dt_get_debug_flags() & DT_DEBUG_IOPORDER)
143 const gboolean has_iop_list = (iop_list_txt != NULL);
150 GList *iop_list = NULL;
181 GList *list = filter;
186 const int history_num = GPOINTER_TO_INT(upd->data);
187 const int item_num = GPOINTER_TO_INT(list->data);
190 if(history_num != -1 && item_num != -1)
193 else if(history_num != -1)
196 list = g_list_next(list);
197 upd = g_list_next(upd);
203 const gboolean copy_iop_order,
const gboolean update_iop_order)
224 const int32_t imgid, GList *update,
225 const gboolean copy_iop_order,
const gboolean update_iop_order)
232 if((g_strcmp0(
name, newname)) || (g_strcmp0(desc, newdescription)))
242 if(!copy_iop_order && !update_iop_order)
257 GList *filter,
const int32_t imgid, GList *update,
258 const gboolean copy_iop_order,
const gboolean update_iop_order)
263 if(oldid == 0)
return;
278 if(!copy_iop_order && !update_iop_order)
293 const int32_t imgid, GList *filter, gboolean copy_iop_order)
297 GList *iop_list = NULL;
353 for(
const GList *l = list; l; l = g_list_next(l))
355 const int32_t imgid = GPOINTER_TO_INT(l->data);
356 for(GList *style = styles; style; style = g_list_next(style))
363 const guint styles_cnt = g_list_length(styles);
364 dt_history_message(ngettext(
"style successfully applied!",
"styles successfully applied!", styles_cnt));
369 if(
IS_NULL_PTR(multi_name) || !*multi_name || !strcmp(multi_name,
"0"))
return "";
375 module->enabled = style_item->enabled;
381 module->multi_name[0] = '\0';
405 if(!module->legacy_params
407 labs(module->version())))
409 fprintf(stderr,
"[dt_styles_apply] module `%s' version mismatch: history is %d, dt %d.\n", module->
op,
433 dt_iop_module_t *
module = dt_dev_get_module_instance(dev, style_item->operation, multi_name,
434 style_item->multi_priority);
435 if(module)
return module;
437 module = dt_dev_create_module_instance(dev, style_item->operation, multi_name, style_item->multi_priority, FALSE);
438 if(module)
module->iop_order = style_item->iop_order;
447 dt_iop_module_t *
module = (dt_iop_module_t *)calloc(1, sizeof(dt_iop_module_t));
450 fprintf(stderr,
"[dt_styles_apply] can't load module %s %s\n", style_item->
operation,
456 module->instance = mod_src->instance;
457 module->multi_priority = style_item->multi_priority;
458 module->iop_order = style_item->iop_order;
471 const int module_version,
const char *operation,
const int enabled,
473 const void *blendop_params,
const int32_t blendop_params_size,
474 const int blendop_version,
const char *multi_name,
475 const int selimg_num,
const double iop_order)
477 GList **si_list = (GList **)user_data;
480 style_item->
num = num;
484 style_item->
name = NULL;
485 style_item->
operation = g_strdup(operation);
486 style_item->
multi_name = g_strdup(multi_name);
494 memcpy(style_item->
blendop_params, blendop_params, blendop_params_size);
497 *si_list = g_list_prepend(*si_list, style_item);
502 GList *si_list = NULL;
504 return g_list_reverse(si_list);
509 GList *mod_list = NULL;
510 for(GList *h = g_list_first(dev->
history); h; h = g_list_next(h))
513 if(!hist || !hist->module)
continue;
515 const gboolean keep = g_hash_table_contains(style_ids, id_str);
519 if(!g_list_find(mod_list, hist->module))
520 mod_list = g_list_append(mod_list, hist->module);
533 gboolean *has_iop_list)
538 *has_iop_list =
FALSE;
548 *has_iop_list =
TRUE;
556 GList *applied_items = NULL;
558 for(GList *l = si_list; l; l = g_list_next(l))
561 dt_iop_module_t *
module = _dt_styles_get_or_create_module_instance(dev_src, style_item);
565 module->multi_priority = style_item->multi_priority;
566 g_strlcpy(module->multi_name, multi_name,
sizeof(module->multi_name));
570 applied_items = g_list_append(applied_items, style_item);
571 g_hash_table_add(style_ids, g_strdup_printf(
"%s|%s", style_item->
operation, multi_name));
574 return applied_items;
578 const gboolean has_iop_list)
582 for(GList *l = applied_items; l; l = g_list_next(l))
587 = dt_dev_get_module_instance(dev_src, style_item->operation, multi_name, style_item->multi_priority);
593 module->multi_priority = style_item->multi_priority;
594 module->iop_order = style_item->iop_order;
605 for(GList *l = applied_items; l; l = g_list_next(l))
610 = dt_dev_get_module_instance(dev_src, style_item->operation, multi_name, style_item->multi_priority);
633 const int32_t imgid, GList **out_si_list, GHashTable **out_style_ids,
634 GList **out_mod_list)
636 gboolean has_iop_list =
FALSE;
647 GHashTable *style_ids = g_hash_table_new_full(g_str_hash, g_str_equal,
dt_free_gpointer, NULL);
652 g_hash_table_destroy(style_ids);
661 g_list_free(applied_items);
662 applied_items = NULL;
663 g_hash_table_destroy(style_ids);
671 g_list_free(applied_items);
672 applied_items = NULL;
676 g_hash_table_destroy(style_ids);
682 *out_si_list = si_list;
683 *out_style_ids = style_ids;
684 *out_mod_list = mod_list;
696 GList *si_list = NULL;
697 GHashTable *style_ids = NULL;
698 GList *mod_list = NULL;
719 g_list_free(mod_list);
721 g_hash_table_destroy(style_ids);
733 dt_iop_module_t *
module = _dt_styles_tmp_module_from_style_item(dev, style_item);
776static void _prepend_item(
void *user_data,
const int num,
const int multi_priority,
777 const int module_version,
const char *operation,
const int enabled,
779 const void *blendop_params,
const int32_t blendop_params_size,
780 const int blendop_version,
const char *multi_name,
781 const int selimg_num,
const double iop_order)
785 if(strcmp(operation,
"mask_manager") == 0)
return;
788 char iname[512] = { 0 };
797 const gboolean has_multi_name = multi_name && *multi_name && (strcmp(multi_name,
"0") != 0);
805 g_snprintf(iname,
sizeof(iname),
"%s %s", operation, multi_name);
807 g_snprintf(iname,
sizeof(iname),
"%s", operation);
816 memcpy(item->
blendop_params, blendop_params, blendop_params_size);
823 g_snprintf(iname,
sizeof(iname),
"%s %s", itname, multi_name);
825 g_snprintf(iname,
sizeof(iname),
"%s", itname);
834 item->
name = g_strdup(iname);
854 return g_list_reverse(ctx.
result);
863 for(GList *items_iter =
items; items_iter; items_iter = g_list_next(items_iter))
880 GList **result = (GList **)user_data;
884 *result = g_list_prepend(*result, s);
889 GList *result = NULL;
891 return g_list_reverse(result);
894static void _write_item(
void *user_data,
const int num,
const int multi_priority,
895 const int module_version,
const char *operation,
const int enabled,
897 const void *blendop_params,
const int32_t blendop_params_size,
898 const int blendop_version,
const char *multi_name,
899 const int selimg_num,
const double iop_order)
901 xmlTextWriterPtr writer = (xmlTextWriterPtr)user_data;
903 char *blendop_params_txt =
dt_exif_xmp_encode((
const unsigned char *)blendop_params, blendop_params_size, NULL);
905 xmlTextWriterStartElement(writer, BAD_CAST
"plugin");
906 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"num",
"%d", num);
907 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"module",
"%d", module_version);
908 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"operation",
"%s", operation);
909 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"op_params",
"%s", op_params_txt);
910 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"enabled",
"%d",
enabled);
911 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"blendop_params",
"%s", blendop_params_txt);
912 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"blendop_version",
"%d", blendop_version);
913 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"multi_priority",
"%d", multi_priority);
914 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"multi_name",
"%s", multi_name);
915 xmlTextWriterEndElement(writer);
928 g_strlcat(stylesdir,
"/styles",
sizeof(stylesdir));
929 g_mkdir_with_parents(stylesdir, 00755);
938 char *filename = g_strdup_printf(
"%s.dtstyle", style_name);
939 g_strdelimit(filename,
"/<>:\"\\|*?[]",
'_');
944 if(g_file_test(stylename, G_FILE_TEST_EXISTS) ==
TRUE)
948 if(g_unlink(stylename))
963 xmlTextWriterPtr writer = xmlNewTextWriterFilename(stylename, 0);
966 fprintf(stderr,
"[dt_styles_save_to_file] Error creating the xml writer\n, path: %s", stylename);
969 rc = xmlTextWriterStartDocument(writer, NULL,
"UTF-8", NULL);
972 fprintf(stderr,
"[dt_styles_save_to_file]: Error on encoding setting");
975 xmlTextWriterStartElement(writer, BAD_CAST
"darktable_style");
976 xmlTextWriterWriteAttribute(writer, BAD_CAST
"version", BAD_CAST
"1.0");
978 xmlTextWriterStartElement(writer, BAD_CAST
"info");
979 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"name",
"%s", style_name);
981 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"description",
"%s", style_description);
987 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"iop_list",
"%s", iop_list_text);
992 xmlTextWriterEndElement(writer);
994 xmlTextWriterStartElement(writer, BAD_CAST
"style");
996 xmlTextWriterEndDocument(writer);
997 xmlFreeTextWriter(writer);
1003 info->
name = g_string_new(
"");
1027 g_string_free(style->
info->
name, free_segments);
1037 const gchar **attribute_names,
const gchar **attribute_values,
1038 gpointer user_data, GError **
error)
1041 const gchar *elt = g_markup_parse_context_get_element(context);
1045 if(g_ascii_strcasecmp(elt,
"plugin") == 0)
1053 gpointer user_data, GError **
error)
1056 const gchar *elt = g_markup_parse_context_get_element(context);
1060 if(g_ascii_strcasecmp(elt,
"plugin") == 0)
1067 gpointer user_data, GError **
error)
1070 const gchar *elt = g_markup_parse_context_get_element(context);
1072 if(g_ascii_strcasecmp(elt,
"name") == 0)
1074 g_string_append_len(style->
info->
name, text, text_len);
1076 else if(g_ascii_strcasecmp(elt,
"description") == 0)
1080 else if(g_ascii_strcasecmp(elt,
"iop_list") == 0)
1089 if(g_ascii_strcasecmp(elt,
"operation") == 0)
1091 g_string_append_len(plug->
operation, text, text_len);
1093 else if(g_ascii_strcasecmp(elt,
"op_params") == 0)
1095 g_string_append_len(plug->
op_params, text, text_len);
1097 else if(g_ascii_strcasecmp(elt,
"blendop_params") == 0)
1101 else if(g_ascii_strcasecmp(elt,
"blendop_version") == 0)
1105 else if(g_ascii_strcasecmp(elt,
"multi_priority") == 0)
1109 else if(g_ascii_strcasecmp(elt,
"multi_name") == 0)
1111 g_string_append_len(plug->
multi_name, text, text_len);
1113 else if(g_ascii_strcasecmp(elt,
"num") == 0)
1115 plug->
num = atoi(text);
1117 else if(g_ascii_strcasecmp(elt,
"module") == 0)
1119 plug->module = atoi(text);
1121 else if(g_ascii_strcasecmp(elt,
"enabled") == 0)
1125 else if(g_ascii_strcasecmp(elt,
"iop_order") == 0)
1142 int id = GPOINTER_TO_INT(styleId);
1144 const char *param_c = plugin->
op_params->str;
1145 const int param_c_len = strlen(param_c);
1150 int blendop_params_len = 0;
1155 params_len, plugin->
enabled, blendop_params, blendop_params_len,
1181 GMarkupParseContext *parser;
1185 parser = g_markup_parse_context_new(&
dt_style_parser, 0, style, NULL);
1187 if((style_file = g_fopen(style_path,
"r")))
1190 while(!feof(style_file))
1192 const size_t num_read = fread(buf,
sizeof(gchar),
sizeof(buf), style_file);
1198 else if(num_read == -1)
1205 if(!g_markup_parse_context_parse(parser, buf, num_read, NULL))
1207 g_markup_parse_context_free(parser);
1218 g_markup_parse_context_free(parser);
1223 if(!g_markup_parse_context_end_parse(parser, NULL))
1225 g_markup_parse_context_free(parser);
1230 g_markup_parse_context_free(parser);
1243 if(
id == 0)
return NULL;
1273#undef DT_IOP_ORDER_INFO
const char ** description(struct dt_iop_module_t *self)
static void error(char *msg)
size_t params_size(dt_imageio_module_format_t *self)
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)
const dt_colormatrix_t dt_aligned_pixel_t out
int dt_conf_get_bool(const char *name)
void dt_dev_pop_history_items_ext(dt_develop_t *dev) REQUIRES_SHARED(dev -> history_mutex)
Apply history items to module params up to dev->history_end.
dt_dev_history_item_t * dt_dev_history_item_create(void)
Allocate a fresh, blank history item with refcount 1.
int dt_dev_replace_history_on_image(dt_develop_t *dev_src, const int32_t dest_imgid, const gboolean reload_defaults, const char *msg)
Replace an image history with the content of dev_src.
int dt_history_merge_module_into_history(dt_develop_t *dev_dest, dt_develop_t *dev_src, dt_iop_module_t *mod_src) REQUIRES(dev_dest -> history_mutex)
Merge a single module instance into a destination history.
gboolean dt_dev_history_item_update_from_params(dt_develop_t *dev, dt_dev_history_item_t *hist, dt_iop_module_t *module, const gboolean enabled, const void *params, const int32_t params_size, const dt_develop_blend_params_t *blend_params, GList *forms)
void dt_dev_history_free_history(dt_develop_t *dev) REQUIRES(dev -> history_mutex)
Free the whole history list attached to dev->history.
void dt_dev_history_compress_ext(dt_develop_t *dev, gboolean write_history)
Variant of history compression that optionally skips DB writeback.
int dt_dev_merge_history_into_image(dt_develop_t *dev_src, int32_t dest_imgid, const GList *mod_list, gboolean merge_iop_order, const dt_history_merge_strategy_t mode, const gboolean paste_instances, const char *source_label, dt_hm_batch_state_t *batch)
Merge a list of modules into a destination image history via dt_history_merge().
gboolean dt_dev_init_default_history(dt_develop_t *dev, const int32_t imgid, gboolean apply_auto_presets)
Initialize module defaults and insert required default modules.
void dt_dev_set_history_end_ext(struct dt_develop_t *dev, const uint32_t index)
Set the history end index (GUI perspective).
int32_t dt_dev_get_history_end_ext(struct dt_develop_t *dev)
Get the current history end index (GUI perspective).
void dt_dev_cleanup(dt_develop_t *dev)
void dt_dev_init(dt_develop_t *dev, int32_t gui_attached)
dt_dev_image_storage_t dt_dev_ensure_image_storage(dt_develop_t *dev, const int32_t imgid)
GHashTable * names
GtkWidget* -> the name the application knows it by.
gboolean enabled
–doc was passed on the command line
static int dt_pthread_rwlock_wrlock(dt_pthread_rwlock_t *rwlock) ACQUIRE(rwlock) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_rwlock_unlock(dt_pthread_rwlock_t *rwlock) RELEASE_GENERIC(rwlock) NO_THREAD_SAFETY_ANALYSIS
unsigned char * dt_exif_xmp_decode(const char *input, const int len, int *output_len)
char * dt_exif_xmp_encode(const unsigned char *input, const int len, int *output_len)
What a photograph says about itself: the EXIF, IPTC and XMP tags a camera and a cataloguer write,...
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
const dt_collection_sort_t items[]
void dt_history_message(const char *format,...)
void dt_history_changed(const dt_history_change_t what)
Raise it. Internal to this code.
Everything the history, styles and presets code says to the outside world: messages for the user,...
@ DT_HISTORY_CHANGE_STYLES
gboolean dt_history_style_on_image(const int32_t imgid, const char *name, const gboolean duplicate)
dt_history_merge_strategy_t
@ DT_HISTORY_MERGE_REPLACE
void dt_iop_cleanup_module(dt_iop_module_t *module)
const gchar * dt_iop_get_localized_name(const gchar *op)
int dt_iop_load_module(dt_iop_module_t *module, dt_iop_module_so_t *module_so, dt_develop_t *dev)
dt_iop_module_t * dt_iop_get_module_by_op_priority(GList *modules, const char *operation, const int multi_priority)
GList * dt_ioppr_get_iop_order_list(int32_t imgid, gboolean sorted)
Load the order list for an image from the DB.
int dt_ioppr_get_iop_order(GList *iop_order_list, const char *op_name, const int multi_priority)
Return the iop_order for a given operation/instance pair.
void dt_ioppr_update_for_style_items(dt_develop_t *dev, GList *st_items, gboolean append)
Update dev->iop_order_list with modules referenced by style items.
void dt_ioppr_set_default_iop_order(dt_develop_t *dev, const int32_t imgid)
Set dev->iop_order_list to the default order for a given image.
void dt_ioppr_resync_pipeline(dt_develop_t *dev, const int32_t imgid, const char *msg, gboolean check_duplicates)
Resynchronize pipeline order and related structures.
char * dt_ioppr_serialize_text_iop_order_list(GList *iop_order_list)
Serialize an order list to a text representation.
GList * dt_ioppr_deserialize_text_iop_order_list(const char *buf)
Deserialize an order list from a text representation.
GList * dt_ioppr_insert_missing_modules(GList *iop_order_list)
Insert modules that postdate a deserialized/custom order list.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
static void dt_free_gpointer(gpointer ptr)
g_free() one pointer, with the signature GDestroyNotify wants.
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
#define DT_PATH_MAX
Buffer size for a filesystem path anywhere in Ansel.
void dt_concat_path_file(char destination[4096], const char path[4096], const char *const file)
Append a constant filename to a variable, stack-based, fixed-sized, directory, and add a / in-between...
static StyleData * dt_styles_style_data_new()
void dt_styles_cleanup(void)
gboolean dt_styles_exists(const char *name)
static void dt_styles_end_tag_handler(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error)
GList * dt_styles_get_item_list(const char *name, gboolean params, int32_t imgid)
static GList * _dt_styles_build_mod_list_from_history(dt_develop_t *dev, GHashTable *style_ids)
static gboolean _dt_styles_apply_item_to_module(dt_iop_module_t *module, const dt_style_item_t *style_item)
gchar * dt_styles_get_description(const char *name)
static int _styles_rebuild_history_from_items(dt_develop_t *dev_src, GList *applied_items)
void dt_styles_apply_to_image(const char *name, const gboolean duplicate, const int32_t imgid)
char * dt_styles_get_item_list_as_string(const char *name)
static void dt_style_plugin_save(StylePluginData *plugin, gpointer styleId)
static void _prepend_item(void *user_data, const int num, const int multi_priority, const int module_version, const char *operation, const int enabled, const void *params, const int32_t params_size, const void *blendop_params, const int32_t blendop_params_size, const int blendop_version, const char *multi_name, const int selimg_num, const double iop_order)
static const char * _dt_styles_normalize_multi_name(const char *multi_name)
void dt_styles_update(const char *name, const char *newname, const char *newdescription, GList *filter, const int32_t imgid, GList *update, const gboolean copy_iop_order, const gboolean update_iop_order)
static void _prepend_style(void *user_data, const char *name, const char *description)
static void _prepend_apply_item(void *user_data, const int num, const int multi_priority, const int module_version, const char *operation, const int enabled, const void *params, const int32_t params_size, const void *blendop_params, const int32_t blendop_params_size, const int blendop_version, const char *multi_name, const int selimg_num, const double iop_order)
void dt_multiple_styles_apply_to_list(GList *styles, const GList *list, gboolean duplicate)
void dt_styles_apply_style_item(dt_develop_t *dev, dt_style_item_t *style_item)
static void dt_styles_style_data_free(StyleData *style, gboolean free_segments)
int dt_styles_apply_to_image_merge(const char *name, const int style_id, const int32_t newimgid, const dt_history_merge_strategy_t mode, dt_hm_batch_state_t *batch)
void dt_style_item_free(gpointer data)
void dt_styles_delete_by_name_adv(const char *name, const gboolean raise)
void dt_styles_save_to_file(const char *style_name, const char *filedir, gboolean overwrite)
void dt_styles_create_from_style(const char *name, const char *newname, const char *description, GList *filter, const int32_t imgid, GList *update, const gboolean copy_iop_order, const gboolean update_iop_order)
static GList * _styles_collect_applied_items(dt_develop_t *dev_src, GList *si_list, GHashTable *style_ids)
static void _dt_style_update_iop_order(const gchar *name, const int id, const int32_t imgid, const gboolean copy_iop_order, const gboolean update_iop_order)
void dt_style_free(gpointer data)
static void dt_styles_style_text_handler(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error)
void dt_styles_delete_by_name(const char *name)
static void _styles_sync_pipeline_from_items(dt_develop_t *dev_src, GList *applied_items, const gboolean has_iop_list)
static void _dt_style_update_from_image(int id, int32_t imgid, GList *filter, GList *update)
static void _write_item(void *user_data, const int num, const int multi_priority, const int module_version, const char *operation, const int enabled, const void *params, const int32_t params_size, const void *blendop_params, const int32_t blendop_params_size, const int blendop_version, const char *multi_name, const int selimg_num, const double iop_order)
static StylePluginData * dt_styles_style_plugin_new()
dt_style_t * dt_styles_get_by_name(const char *name)
int32_t dt_styles_get_id_by_name(const char *name)
static void dt_style_save(StyleData *style)
static GMarkupParser dt_style_parser
void dt_styles_import_from_file(const char *style_path)
static void _collect_style(void *user_data, const char *name, const char *description)
static dt_iop_module_t * _dt_styles_get_or_create_module_instance(dt_develop_t *dev, const dt_style_item_t *style_item)
static int _styles_init_source_dev(dt_develop_t *dev_src, const char *name, const int32_t imgid, gboolean *has_iop_list)
GList * dt_styles_module_order_list(const char *name)
static void _dt_styles_tmp_module_free(dt_iop_module_t *module)
#define DT_IOP_ORDER_INFO
gboolean dt_styles_has_module_order(const char *name)
gboolean dt_styles_create_from_image(const char *name, const char *description, const int32_t imgid, GList *filter, gboolean copy_iop_order)
GList * dt_styles_get_list(const char *filter)
static GList * _dt_styles_get_apply_items(const int style_id)
static gboolean dt_styles_create_style_header(const char *name, const char *description, GList *iop_list)
static int _styles_prepare_source_dev(dt_develop_t *dev_src, const char *name, const int style_id, const int32_t imgid, GList **out_si_list, GHashTable **out_style_ids, GList **out_mod_list)
static dt_iop_module_t * _dt_styles_tmp_module_from_style_item(dt_develop_t *dev, const dt_style_item_t *style_item)
static void dt_styles_start_tag_handler(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error)
struct dt_iop_module_t *gboolean enabled
dt_pthread_rwlock_t history_mutex
dt_iop_params_t * default_params
struct dt_develop_blend_params_t * blend_params
struct dt_develop_blend_params_t * default_blendop_params
dt_develop_blend_params_t * blendop_params
int32_t blendop_params_size
gboolean dt_style_repository_delete_items_except(const int32_t styleid, GList *nums)
gboolean dt_style_repository_copy_items_from_history(const int32_t styleid, const int32_t imgid, GList *nums)
void dt_style_repository_foreach_style(const char *filter, dt_style_repository_style_cb cb, void *user_data)
gboolean dt_style_repository_get_style(const char *name, dt_style_repository_style_cb cb, void *user_data)
int32_t dt_style_repository_get_id_by_name(const char *name)
char * dt_style_repository_get_iop_list(const char *name)
void dt_style_repository_foreach_item_with_params(const int32_t styleid, dt_style_repository_item_cb cb, void *user_data)
gboolean dt_style_repository_normalize_multi_priority(const int32_t styleid)
void dt_style_repository_foreach_item(const int32_t styleid, dt_style_repository_item_cb cb, void *user_data)
gboolean dt_style_repository_insert_item(const int32_t styleid, const int num, const int module_version, const char *operation, const void *params, const int32_t params_size, const int enabled, const void *blendop_params, const int32_t blendop_params_size, const int blendop_version, const int multi_priority, const char *multi_name)
gboolean dt_style_repository_set_iop_list(const int32_t styleid, const char *iop_list_txt)
void dt_style_repository_cleanup(void)
void dt_style_repository_foreach_item_against_image(const int32_t styleid, const int32_t imgid, dt_style_repository_item_cb cb, void *user_data)
void dt_style_repository_foreach_apply_item(const int32_t styleid, dt_style_repository_item_cb cb, void *user_data)
gboolean dt_style_repository_update_header(const int32_t styleid, const char *newname, const char *description)
gboolean dt_style_repository_insert_header(const char *name, const char *description, const char *iop_list_txt)
void dt_style_repository_append_item_from_history(const int32_t styleid, const int32_t imgid, const int history_num)
char * dt_style_repository_get_description(const int32_t styleid)
gboolean dt_style_repository_delete(const int32_t styleid)
void dt_style_repository_foreach_item_for_export(const int32_t styleid, dt_style_repository_item_cb cb, void *user_data)
void dt_style_repository_update_item_from_history(const int32_t styleid, const int item_num, const int32_t imgid, const int history_num)
gboolean dt_style_repository_copy_items_from_style(const int32_t dest_styleid, const int32_t source_styleid, GList *nums)
void dt_undo_end_group(dt_undo_t *self)
void dt_undo_start_group(dt_undo_t *self, dt_undo_type_t type)
dt_undo_t * dt_undo_get_global(void)
gchar * dt_util_glist_to_str(const gchar *separator, GList *items)