67#include <libxml/encoding.h>
68#include <libxml/xmlwriter.h>
74#define DT_IOP_ORDER_INFO (darktable.unmuted & DT_DEBUG_IOPORDER)
148 char last_operation[128] = { 0 };
163 "SELECT rowid,operation FROM data.style_items WHERE styleid=?1 ORDER BY operation, multi_priority ASC", -1,
167 while(sqlite3_step(stmt) == SQLITE_ROW)
169 struct _data *
d = malloc(
sizeof(
struct _data));
170 const char *operation = (
const char *)sqlite3_column_text(stmt, 1);
172 if(strncmp(last_operation, operation, 128) != 0)
175 g_strlcpy(last_operation, operation,
sizeof(last_operation));
180 d->rowid = sqlite3_column_int(stmt, 0);
182 list = g_list_prepend(list,
d);
184 sqlite3_finalize(stmt);
185 list = g_list_reverse(list);
189 for(GList *list_iter = list; list_iter; list_iter = g_list_next(list_iter))
191 struct _data *
d = (
struct _data *)list_iter->data;
194 "UPDATE data.style_items SET multi_priority=?1 WHERE rowid=?2", -1, &stmt, NULL);
198 sqlite3_finalize(stmt);
218 const gboolean has_iop_list = (sqlite3_column_type(stmt, 0) != SQLITE_NULL);
219 sqlite3_finalize(stmt);
225 GList *iop_list = NULL;
236 if(sqlite3_column_type(stmt, 0) != SQLITE_NULL)
238 const char *iop_list_txt = (
char *)sqlite3_column_text(stmt, 0);
241 sqlite3_finalize(stmt);
255 char *iop_list_txt = NULL;
261 "INSERT INTO data.styles (name, description, id, iop_list)"
262 " VALUES (?1, ?2, (SELECT COALESCE(MAX(id),0)+1 FROM data.styles), ?3)", -1, &stmt, NULL);
272 sqlite3_bind_null(stmt, 3);
275 sqlite3_finalize(stmt);
285 GList *list = filter;
287 char query[4096] = { 0 };
289 char *fields[] = {
"op_params",
"module",
"enabled",
"blendop_params",
290 "blendop_version",
"multi_priority",
"multi_name", 0 };
297 if(GPOINTER_TO_INT(upd->data) != -1 && GPOINTER_TO_INT(list->data) != -1)
299 g_strlcpy(query,
"UPDATE data.style_items SET ",
sizeof(query));
301 for(
int k = 0; fields[
k];
k++)
303 if(
k != 0) g_strlcat(query,
",",
sizeof(query));
304 snprintf(tmp,
sizeof(tmp),
305 "%s=(SELECT %s FROM main.history WHERE imgid=%d AND num=%d)",
306 fields[
k], fields[
k], imgid, GPOINTER_TO_INT(upd->data));
307 g_strlcat(query, tmp,
sizeof(query));
309 snprintf(tmp,
sizeof(tmp),
" WHERE styleid=%d AND data.style_items.num=%d",
id,
310 GPOINTER_TO_INT(list->data));
311 g_strlcat(query, tmp,
sizeof(query));
314 else if(GPOINTER_TO_INT(upd->data) != -1)
316 snprintf(query,
sizeof(query),
317 "INSERT INTO data.style_items "
318 " (styleid, num, module, operation, op_params, enabled, blendop_params,"
319 " blendop_version, multi_priority, multi_name)"
322 " FROM data.style_items"
324 " ORDER BY num DESC LIMIT 1), "
325 " module, operation, op_params, enabled, blendop_params, blendop_version,"
326 " multi_priority, multi_name"
328 " WHERE imgid=%d AND num=%d",
329 id,
id, imgid, GPOINTER_TO_INT(upd->data));
334 list = g_list_next(list);
335 upd = g_list_next(upd);
341 const gboolean copy_iop_order,
const gboolean update_iop_order)
355 if(copy_iop_order || update_iop_order)
359 "UPDATE data.styles SET iop_list=?1 WHERE id=?2", -1, &stmt, NULL);
366 "UPDATE data.styles SET iop_list=NULL WHERE id=?1", -1, &stmt, NULL);
375 sqlite3_finalize(stmt);
379 const int32_t imgid, GList *update,
380 const gboolean copy_iop_order,
const gboolean update_iop_order)
389 if((g_strcmp0(
name, newname)) || (g_strcmp0(desc, newdescription)))
392 "UPDATE data.styles SET name=?1, description=?2 WHERE id=?3", -1, &stmt, NULL);
397 sqlite3_finalize(stmt);
403 char include[2048] = { 0 };
404 g_strlcat(include,
"num NOT IN (",
sizeof(include));
405 for(GList *list = filter; list; list = g_list_next(list))
407 if(list != filter) g_strlcat(include,
",",
sizeof(include));
408 snprintf(tmp,
sizeof(tmp),
"%d", GPOINTER_TO_INT(list->data));
409 g_strlcat(include, tmp,
sizeof(include));
411 g_strlcat(include,
")",
sizeof(include));
413 char query[4096] = { 0 };
414 snprintf(query,
sizeof(query),
"DELETE FROM data.style_items WHERE styleid=?1 AND %s", include);
418 sqlite3_finalize(stmt);
425 if(!copy_iop_order && !update_iop_order)
440 GList *filter,
const int32_t imgid, GList *update,
441 const gboolean copy_iop_order,
const gboolean update_iop_order)
447 if(oldid == 0)
return;
457 char include[2048] = { 0 };
458 g_strlcat(include,
"num IN (",
sizeof(include));
459 for(GList *list = filter; list; list = g_list_next(list))
461 if(list != filter) g_strlcat(include,
",",
sizeof(include));
462 snprintf(tmp,
sizeof(tmp),
"%d", GPOINTER_TO_INT(list->data));
463 g_strlcat(include, tmp,
sizeof(include));
465 g_strlcat(include,
")",
sizeof(include));
466 char query[4096] = { 0 };
469 snprintf(query,
sizeof(query),
470 "INSERT INTO data.style_items "
471 " (styleid,num,module,operation,op_params,enabled,blendop_params,blendop_version,"
472 " multi_priority,multi_name)"
473 " SELECT ?1, num,module,operation,op_params,enabled,blendop_params,blendop_version,"
474 " multi_priority,multi_name"
475 " FROM data.style_items"
476 " WHERE styleid=?2 AND %s",
484 "INSERT INTO data.style_items "
485 " (styleid,num,module,operation,op_params,enabled,blendop_params,"
486 " blendop_version,multi_priority,multi_name)"
487 " SELECT ?1, num,module,operation,op_params,enabled,blendop_params,"
488 " blendop_version,multi_priority,multi_name"
489 " FROM data.style_items"
496 sqlite3_finalize(stmt);
504 if(!copy_iop_order && !update_iop_order)
513 dt_control_log(_(
"style named '%s' successfully created"), newname);
519 const int32_t imgid, GList *filter, gboolean copy_iop_order)
524 GList *iop_list = NULL;
542 char include[2048] = { 0 };
543 g_strlcat(include,
"num IN (",
sizeof(include));
544 for(GList *list = filter; list; list = g_list_next(list))
546 if(list != filter) g_strlcat(include,
",",
sizeof(include));
547 snprintf(tmp,
sizeof(tmp),
"%d", GPOINTER_TO_INT(list->data));
548 g_strlcat(include, tmp,
sizeof(include));
551 g_strlcat(include,
")",
sizeof(include));
552 char query[4096] = { 0 };
554 snprintf(query,
sizeof(query),
555 "INSERT INTO data.style_items"
556 " (styleid,num,module,operation,op_params,enabled,blendop_params,"
557 " blendop_version,multi_priority,multi_name)"
558 " SELECT ?1, num,module,operation,op_params,enabled,blendop_params,blendop_version,"
559 " multi_priority,multi_name"
561 " WHERE imgid=?2 AND %s",
569 "INSERT INTO data.style_items"
570 " (styleid,num,module,operation,op_params,enabled,blendop_params,"
571 " blendop_version,multi_priority,multi_name)"
572 " SELECT ?1, num,module,operation,op_params,enabled,blendop_params,blendop_version,"
573 " multi_priority,multi_name"
581 sqlite3_finalize(stmt);
623 for(
const GList *l = list; l; l = g_list_next(l))
625 const int32_t imgid = GPOINTER_TO_INT(l->data);
626 for(GList *style = styles; style; style = g_list_next(style))
633 const guint styles_cnt = g_list_length(styles);
634 dt_control_log(ngettext(
"style successfully applied!",
"styles successfully applied!", styles_cnt));
639 gboolean selected =
FALSE;
641 for(
const GList *l = list; l; l = g_list_next(l))
643 const int32_t imgid = GPOINTER_TO_INT(l->data);
653 if(
IS_NULL_PTR(multi_name) || !*multi_name || !strcmp(multi_name,
"0"))
return "";
659 module->enabled = style_item->enabled;
665 module->multi_name[0] = '\0';
689 if(!module->legacy_params
691 labs(module->version())))
693 fprintf(stderr,
"[dt_styles_apply] module `%s' version mismatch: history is %d, dt %d.\n", module->
op,
695 dt_control_log(_(
"module `%s' version mismatch: %d != %d"), module->
op, module->version(),
717 dt_iop_module_t *
module = dt_dev_get_module_instance(dev, style_item->operation, multi_name,
718 style_item->multi_priority);
719 if(module)
return module;
721 module = dt_dev_create_module_instance(dev, style_item->operation, multi_name, style_item->multi_priority, FALSE);
722 if(module)
module->iop_order = style_item->iop_order;
731 dt_iop_module_t *
module = (dt_iop_module_t *)calloc(1, sizeof(dt_iop_module_t));
734 fprintf(stderr,
"[dt_styles_apply] can't load module %s %s\n", style_item->
operation,
740 module->instance = mod_src->instance;
741 module->multi_priority = style_item->multi_priority;
742 module->iop_order = style_item->iop_order;
760 "SELECT num, module, operation, op_params, enabled,"
761 " blendop_params, blendop_version, multi_priority, multi_name"
762 " FROM data.style_items WHERE styleid=?1 "
763 " ORDER BY num, operation, multi_priority",
770 sqlite3_clear_bindings(stmt);
773 GList *si_list = NULL;
774 while(sqlite3_step(stmt) == SQLITE_ROW)
778 style_item->
num = sqlite3_column_int(stmt, 0);
780 style_item->
enabled = sqlite3_column_int(stmt, 4);
782 style_item->
name = NULL;
783 style_item->
operation = g_strdup((
char *)sqlite3_column_text(stmt, 2));
784 style_item->
multi_name = g_strdup((
char *)sqlite3_column_text(stmt, 8));
787 style_item->
params_size = sqlite3_column_bytes(stmt, 3);
789 memcpy(style_item->
params, (
void *)sqlite3_column_blob(stmt, 3), style_item->
params_size);
795 si_list = g_list_prepend(si_list, style_item);
799 return g_list_reverse(si_list);
804 GList *mod_list = NULL;
805 for(GList *h = g_list_first(dev->
history); h; h = g_list_next(h))
808 if(!hist || !hist->module)
continue;
810 const gboolean keep = g_hash_table_contains(style_ids, id_str);
814 if(!g_list_find(mod_list, hist->module))
815 mod_list = g_list_append(mod_list, hist->module);
828 gboolean *has_iop_list)
833 *has_iop_list =
FALSE;
843 *has_iop_list =
TRUE;
851 GList *applied_items = NULL;
853 for(GList *l = si_list; l; l = g_list_next(l))
856 dt_iop_module_t *
module = _dt_styles_get_or_create_module_instance(dev_src, style_item);
860 module->multi_priority = style_item->multi_priority;
861 g_strlcpy(module->multi_name, multi_name,
sizeof(module->multi_name));
865 applied_items = g_list_append(applied_items, style_item);
866 g_hash_table_add(style_ids, g_strdup_printf(
"%s|%s", style_item->
operation, multi_name));
869 return applied_items;
873 const gboolean has_iop_list)
877 for(GList *l = applied_items; l; l = g_list_next(l))
882 = dt_dev_get_module_instance(dev_src, style_item->operation, multi_name, style_item->multi_priority);
888 module->multi_priority = style_item->multi_priority;
889 module->iop_order = style_item->iop_order;
900 for(GList *l = applied_items; l; l = g_list_next(l))
905 = dt_dev_get_module_instance(dev_src, style_item->operation, multi_name, style_item->multi_priority);
928 const int32_t imgid, GList **out_si_list, GHashTable **out_style_ids,
929 GList **out_mod_list)
931 gboolean has_iop_list =
FALSE;
942 GHashTable *style_ids = g_hash_table_new_full(g_str_hash, g_str_equal,
dt_free_gpointer, NULL);
947 g_hash_table_destroy(style_ids);
956 g_list_free(applied_items);
957 applied_items = NULL;
958 g_hash_table_destroy(style_ids);
966 g_list_free(applied_items);
967 applied_items = NULL;
971 g_hash_table_destroy(style_ids);
977 *out_si_list = si_list;
978 *out_style_ids = style_ids;
979 *out_mod_list = mod_list;
991 GList *si_list = NULL;
992 GHashTable *style_ids = NULL;
993 GList *mod_list = NULL;
1014 g_list_free(mod_list);
1016 g_hash_table_destroy(style_ids);
1028 dt_iop_module_t *
module = _dt_styles_tmp_module_from_style_item(dev, style_item);
1058 sqlite3_finalize(stmt);
1065 sqlite3_finalize(stmt);
1079 GList *result = NULL;
1087 "SELECT num, multi_priority, module, operation, enabled, op_params, blendop_params, "
1088 " multi_name, blendop_version"
1089 " FROM data.style_items"
1090 " WHERE styleid=?1 ORDER BY num DESC",
1101 "SELECT num, multi_priority, module, operation, enabled,"
1103 " FROM main.history"
1105 " AND operation=data.style_items.operation"
1106 " AND multi_priority=data.style_items.multi_priority),"
1107 " 0, multi_name, blendop_version"
1108 " FROM data.style_items"
1111 " SELECT -1,main.history.multi_priority,main.history.module,main.history.operation,main.history.enabled, "
1112 " main.history.num,0,multi_name, blendop_version"
1113 " FROM main.history"
1114 " WHERE imgid=?2 AND main.history.enabled=1"
1115 " AND (main.history.operation NOT IN (SELECT operation FROM data.style_items WHERE styleid=?1))"
1116 " GROUP BY operation HAVING MAX(num) ORDER BY num DESC", -1, &stmt, NULL);
1123 "SELECT num, multi_priority, module, operation, enabled, 0, 0, multi_name"
1124 " FROM data.style_items"
1125 " WHERE styleid=?1 ORDER BY num DESC",
1130 while(sqlite3_step(stmt) == SQLITE_ROW)
1132 if(strcmp((
const char*)sqlite3_column_text(stmt, 3),
"mask_manager") == 0)
continue;
1135 char iname[512] = { 0 };
1138 if(sqlite3_column_type(stmt, 0) == SQLITE_NULL)
1141 item->
num = sqlite3_column_int(stmt, 0);
1148 item->
enabled = sqlite3_column_int(stmt, 4);
1150 const char *multi_name = (
const char *)sqlite3_column_text(stmt, 7);
1151 const gboolean has_multi_name = multi_name && *multi_name && (strcmp(multi_name,
"0") != 0);
1159 g_snprintf(iname,
sizeof(iname),
"%s %s", sqlite3_column_text(stmt, 3), multi_name);
1161 g_snprintf(iname,
sizeof(iname),
"%s", sqlite3_column_text(stmt, 3));
1163 const unsigned char *op_blob = sqlite3_column_blob(stmt, 5);
1164 const int32_t op_len = sqlite3_column_bytes(stmt, 5);
1165 const unsigned char *bop_blob = sqlite3_column_blob(stmt, 6);
1166 const int32_t bop_len = sqlite3_column_bytes(stmt, 6);
1167 const int32_t bop_ver = sqlite3_column_int(stmt, 8);
1169 item->
params = malloc(op_len);
1171 memcpy(item->
params, op_blob, op_len);
1183 g_snprintf(iname,
sizeof(iname),
"%s %s", itname, multi_name);
1185 g_snprintf(iname,
sizeof(iname),
"%s", itname);
1192 if(imgid !=
UNKNOWN_IMAGE && sqlite3_column_type(stmt, 5) != SQLITE_NULL)
1193 item->
selimg_num = sqlite3_column_int(stmt, 5);
1195 item->
name = g_strdup(iname);
1196 item->
operation = g_strdup((
char *)sqlite3_column_text(stmt, 3));
1197 item->
multi_name = g_strdup((
char *)sqlite3_column_text(stmt, 7));
1198 item->
iop_order = sqlite3_column_double(stmt, 8);
1199 result = g_list_prepend(result, item);
1201 sqlite3_finalize(stmt);
1203 return g_list_reverse(result);
1211 GList *names = NULL;
1212 for(GList *items_iter =
items; items_iter; items_iter = g_list_next(items_iter))
1215 names = g_list_prepend(names, g_strdup(item->
name));
1217 names = g_list_reverse(names);
1229 char filterstring[512] = { 0 };
1230 snprintf(filterstring,
sizeof(filterstring),
"%%%s%%", filter);
1235 "SELECT name, description FROM data.styles WHERE name LIKE ?1 OR description LIKE ?1 ORDER BY name", -1,
1239 sqlite3_reset(stmt);
1240 sqlite3_clear_bindings(stmt);
1242 GList *result = NULL;
1243 while(sqlite3_step(stmt) == SQLITE_ROW)
1245 const char *
name = (
const char *)sqlite3_column_text(stmt, 0);
1246 const char *
description = (
const char *)sqlite3_column_text(stmt, 1);
1250 result = g_list_prepend(result, s);
1252 return g_list_reverse(result);
1257 const int32_t len = sqlite3_column_bytes(stmt,
row);
1258 char *vparams =
dt_exif_xmp_encode((
const unsigned char *)sqlite3_column_blob(stmt,
row), len, NULL);
1268 g_strlcat(stylesdir,
"/styles",
sizeof(stylesdir));
1269 g_mkdir_with_parents(stylesdir, 00755);
1270 filedir = stylesdir;
1279 char *filename = g_strdup_printf(
"%s.dtstyle", style_name);
1280 g_strdelimit(filename,
"/<>:\"\\|*?[]",
'_');
1285 if(g_file_test(stylename, G_FILE_TEST_EXISTS) ==
TRUE)
1289 if(g_unlink(stylename))
1291 dt_control_log(_(
"failed to overwrite style file for %s"), style_name);
1304 xmlTextWriterPtr writer = xmlNewTextWriterFilename(stylename, 0);
1307 fprintf(stderr,
"[dt_styles_save_to_file] Error creating the xml writer\n, path: %s", stylename);
1310 rc = xmlTextWriterStartDocument(writer, NULL,
"UTF-8", NULL);
1313 fprintf(stderr,
"[dt_styles_save_to_file]: Error on encoding setting");
1316 xmlTextWriterStartElement(writer, BAD_CAST
"darktable_style");
1317 xmlTextWriterWriteAttribute(writer, BAD_CAST
"version", BAD_CAST
"1.0");
1319 xmlTextWriterStartElement(writer, BAD_CAST
"info");
1320 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"name",
"%s", style_name);
1326 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"iop_list",
"%s", iop_list_text);
1331 xmlTextWriterEndElement(writer);
1333 xmlTextWriterStartElement(writer, BAD_CAST
"style");
1336 "SELECT num, module, operation, op_params, enabled,"
1337 " blendop_params, blendop_version, multi_priority, multi_name"
1338 " FROM data.style_items"
1339 " WHERE styleid =?1",
1343 while(sqlite3_step(stmt) == SQLITE_ROW)
1345 xmlTextWriterStartElement(writer, BAD_CAST
"plugin");
1346 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"num",
"%d", sqlite3_column_int(stmt, 0));
1347 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"module",
"%d", sqlite3_column_int(stmt, 1));
1348 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"operation",
"%s", sqlite3_column_text(stmt, 2));
1349 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"op_params",
"%s",
dt_style_encode(stmt, 3));
1350 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"enabled",
"%d", sqlite3_column_int(stmt, 4));
1351 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"blendop_params",
"%s",
dt_style_encode(stmt, 5));
1352 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"blendop_version",
"%d", sqlite3_column_int(stmt, 6));
1353 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"multi_priority",
"%d", sqlite3_column_int(stmt, 7));
1354 xmlTextWriterWriteFormatElement(writer, BAD_CAST
"multi_name",
"%s", sqlite3_column_text(stmt, 8));
1355 xmlTextWriterEndElement(writer);
1357 sqlite3_finalize(stmt);
1358 xmlTextWriterEndDocument(writer);
1359 xmlFreeTextWriter(writer);
1365 info->
name = g_string_new(
"");
1389 g_string_free(style->
info->
name, free_segments);
1399 const gchar **attribute_names,
const gchar **attribute_values,
1400 gpointer user_data, GError **
error)
1403 const gchar *elt = g_markup_parse_context_get_element(context);
1407 if(g_ascii_strcasecmp(elt,
"plugin") == 0)
1415 gpointer user_data, GError **
error)
1418 const gchar *elt = g_markup_parse_context_get_element(context);
1422 if(g_ascii_strcasecmp(elt,
"plugin") == 0)
1429 gpointer user_data, GError **
error)
1432 const gchar *elt = g_markup_parse_context_get_element(context);
1434 if(g_ascii_strcasecmp(elt,
"name") == 0)
1436 g_string_append_len(style->
info->
name, text, text_len);
1438 else if(g_ascii_strcasecmp(elt,
"description") == 0)
1442 else if(g_ascii_strcasecmp(elt,
"iop_list") == 0)
1449 if(g_ascii_strcasecmp(elt,
"operation") == 0)
1451 g_string_append_len(plug->
operation, text, text_len);
1453 else if(g_ascii_strcasecmp(elt,
"op_params") == 0)
1455 g_string_append_len(plug->
op_params, text, text_len);
1457 else if(g_ascii_strcasecmp(elt,
"blendop_params") == 0)
1461 else if(g_ascii_strcasecmp(elt,
"blendop_version") == 0)
1465 else if(g_ascii_strcasecmp(elt,
"multi_priority") == 0)
1469 else if(g_ascii_strcasecmp(elt,
"multi_name") == 0)
1471 g_string_append_len(plug->
multi_name, text, text_len);
1473 else if(g_ascii_strcasecmp(elt,
"num") == 0)
1475 plug->
num = atoi(text);
1477 else if(g_ascii_strcasecmp(elt,
"module") == 0)
1479 plug->module = atoi(text);
1481 else if(g_ascii_strcasecmp(elt,
"enabled") == 0)
1485 else if(g_ascii_strcasecmp(elt,
"iop_order") == 0)
1502 int id = GPOINTER_TO_INT(styleId);
1506 "INSERT INTO data.style_items "
1507 " (styleid, num, module, operation, op_params, enabled, blendop_params,"
1508 " blendop_version, multi_priority, multi_name)"
1509 " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)",
1517 const char *param_c = plugin->
op_params->str;
1518 const int param_c_len = strlen(param_c);
1526 int blendop_params_len = 0;
1537 sqlite3_finalize(stmt);
1560 GMarkupParseContext *parser;
1564 parser = g_markup_parse_context_new(&
dt_style_parser, 0, style, NULL);
1566 if((style_file = g_fopen(style_path,
"r")))
1569 while(!feof(style_file))
1571 const size_t num_read = fread(buf,
sizeof(gchar),
sizeof(buf), style_file);
1577 else if(num_read == -1)
1584 if(!g_markup_parse_context_parse(parser, buf, num_read, NULL))
1586 g_markup_parse_context_free(parser);
1597 g_markup_parse_context_free(parser);
1602 if(!g_markup_parse_context_end_parse(parser, NULL))
1604 g_markup_parse_context_free(parser);
1609 g_markup_parse_context_free(parser);
1630 description = (
char *)sqlite3_column_text(stmt, 0);
1632 sqlite3_finalize(stmt);
1642 "SELECT id FROM data.styles WHERE name=?1 ORDER BY id DESC LIMIT 1", -1, &stmt,
1645 if(sqlite3_step(stmt) == SQLITE_ROW)
1647 id = sqlite3_column_int(stmt, 0);
1649 sqlite3_finalize(stmt);
1657 "SELECT name, description FROM data.styles WHERE name = ?1", -1, &stmt, NULL);
1659 if(sqlite3_step(stmt) == SQLITE_ROW)
1661 const char *style_name = (
const char *)sqlite3_column_text(stmt, 0);
1662 const char *
description = (
const char *)sqlite3_column_text(stmt, 1);
1664 s->
name = g_strdup(style_name);
1666 sqlite3_finalize(stmt);
1672 sqlite3_finalize(stmt);
1691#undef DT_IOP_ORDER_INFO
const char ** description(struct dt_iop_module_t *self)
static void error(char *msg)
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)
int dt_conf_get_bool(const char *name)
void dt_control_log(const char *msg,...)
void dt_concat_path_file(char destination[PATH_MAX], const char path[PATH_MAX], const char *const file)
static void dt_free_gpointer(gpointer ptr)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
sqlite3 * dt_database_get(const dt_database_t *db)
#define DT_DEBUG_SQLITE3_EXEC(a, b, c, d, e)
#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)
int dt_history_merge_module_into_history(dt_develop_t *dev_dest, dt_develop_t *dev_src, dt_iop_module_t *mod_src)
Merge a single module instance into a destination history.
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.
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)
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.
void dt_dev_pop_history_items_ext(dt_develop_t *dev)
Apply history items to module params up to dev->history_end.
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)
#define dt_pthread_rwlock_wrlock
#define dt_pthread_rwlock_unlock
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)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
const dt_collection_sort_t items[]
void dt_gui_styles_dialog_new(int32_t imgid)
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.
float *const restrict const size_t k
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_STYLE_CHANGED
This signal is raised when a style is added/deleted/changed
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 const char * _dt_styles_normalize_multi_name(const char *multi_name)
static char * dt_style_encode(sqlite3_stmt *stmt, int row)
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)
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)
static sqlite3_stmt * _styles_apply_items_stmt
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 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)
void dt_styles_create_from_list(const GList *list)
static GMarkupParser dt_style_parser
void dt_styles_import_from_file(const char *style_path)
static sqlite3_stmt * _styles_get_list_stmt
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
static void _dt_style_cleanup_multi_instance(int id)
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)
const struct dt_database_t * db
struct dt_control_signal_t * signals
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
GModule *dt_dev_operation_t op
struct dt_develop_blend_params_t * default_blendop_params
dt_develop_blend_params_t * blendop_params
int32_t blendop_params_size
void dt_undo_end_group(dt_undo_t *self)
void dt_undo_start_group(dt_undo_t *self, dt_undo_type_t type)
gchar * dt_util_glist_to_str(const gchar *separator, GList *items)