83#include <librsvg/rsvg.h>
86#include <librsvg/rsvg-cairo.h>
165 void *new_params,
const int new_version)
167 if(old_version == 1 && new_version == 5)
169 typedef struct dt_iop_watermark_params_v1_t
182 } dt_iop_watermark_params_v1_t;
184 dt_iop_watermark_params_v1_t *o = (dt_iop_watermark_params_v1_t *)old_params;
190 n->opacity = o->opacity;
192 n->xoffset = o->xoffset;
193 n->yoffset = o->yoffset;
194 n->alignment = o->alignment;
197 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
198 g_strlcpy(
n->text,
"",
sizeof(
n->text));
199 g_strlcpy(
n->font,
"DejaVu Sans 10",
sizeof(
n->font));
200 n->color[0] =
n->color[1] =
n->color[2] = 0;
203 else if(old_version == 2 && new_version == 5)
205 typedef struct dt_iop_watermark_params_v2_t
219 } dt_iop_watermark_params_v2_t;
221 dt_iop_watermark_params_v2_t *o = (dt_iop_watermark_params_v2_t *)old_params;
227 n->opacity = o->opacity;
229 n->xoffset = o->xoffset;
230 n->yoffset = o->yoffset;
231 n->alignment = o->alignment;
234 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
235 g_strlcpy(
n->text,
"",
sizeof(
n->text));
236 g_strlcpy(
n->font,
"DejaVu Sans 10",
sizeof(
n->font));
237 n->color[0] =
n->color[1] =
n->color[2] = 0;
240 else if(old_version == 3 && new_version == 5)
242 typedef struct dt_iop_watermark_params_v3_t
258 } dt_iop_watermark_params_v3_t;
260 dt_iop_watermark_params_v3_t *o = (dt_iop_watermark_params_v3_t *)old_params;
266 n->opacity = o->opacity;
268 n->xoffset = o->xoffset;
269 n->yoffset = o->yoffset;
270 n->alignment = o->alignment;
271 n->rotate = o->rotate;
272 n->sizeto = o->sizeto;
273 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
274 g_strlcpy(
n->text,
"",
sizeof(
n->text));
275 g_strlcpy(
n->font,
"DejaVu Sans 10",
sizeof(
n->font));
276 n->color[0] =
n->color[1] =
n->color[2] = 0;
279 else if(old_version == 4 && new_version == 5)
281 typedef struct dt_iop_watermark_params_v4_t
303 } dt_iop_watermark_params_v4_t;
305 dt_iop_watermark_params_v4_t *o = (dt_iop_watermark_params_v4_t *)old_params;
311 n->opacity = o->opacity;
313 n->xoffset = o->xoffset;
314 n->yoffset = o->yoffset;
315 n->alignment = o->alignment;
316 n->rotate = o->rotate;
317 n->sizeto = o->sizeto;
318 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
319 g_strlcpy(
n->text, o->text,
sizeof(
n->text));
320 g_strlcpy(
n->font, o->font,
sizeof(
n->font));
321 n->color[0] = o->color[0];
322 n->color[1] = o->color[1];
323 n->color[2] = o->color[2];
332 return _(
"_Watermark");
339 _(
"non-linear, RGB, display-referred"),
340 _(
"non-linear, RGB"),
341 _(
"non-linear, RGB, display-referred"));
375 const gchar *
extension = strrchr(filename,
'.');
378 const gboolean active = !g_ascii_strcasecmp(
extension,
".svg");
379 gtk_widget_set_sensitive(GTK_WIDGET(
g->colorpick), active);
380 gtk_widget_set_sensitive(GTK_WIDGET(
g->color_picker_button), active);
381 gtk_widget_set_sensitive(GTK_WIDGET(
g->text), active);
382 gtk_widget_set_sensitive(GTK_WIDGET(
g->fontsel), active);
389 for(
const GList *iter =
g->watermarks_filenames; iter; iter = g_list_next(iter))
391 if(!g_strcmp0((gchar *)iter->data, text))
404 gchar *result, *result_old;
428 const dt_image_t *image,
const gchar *filename)
430 gchar *svgdata = NULL;
432 if(g_file_get_contents(filename, &svgdata, &length, NULL))
441 g_strlcpy(buffer, data->
text,
sizeof(buffer));
445 PangoFontDescription *font = pango_font_description_from_string(data->
font);
446 const PangoStyle font_style = pango_font_description_get_style(font);
447 const int font_weight = (int)pango_font_description_get_weight(font);
449 g_strlcpy(buffer, pango_font_description_get_family(font),
sizeof(buffer));
454 case PANGO_STYLE_OBLIQUE:
455 g_strlcpy(buffer,
"oblique",
sizeof(buffer));
457 case PANGO_STYLE_ITALIC:
458 g_strlcpy(buffer,
"italic",
sizeof(buffer));
461 g_strlcpy(buffer,
"normal",
sizeof(buffer));
466 g_snprintf(buffer,
sizeof(buffer),
"%d", font_weight);
469 pango_font_description_free(font);
473 g_strlcpy(buffer, gdk_rgba_to_string(&c),
sizeof(buffer));
480 gboolean from_cache =
FALSE;
483 params->filename = image_path;
484 params->jobcode =
"infos";
485 params->sequence = 0;
486 params->imgid = image->
id;
503 float *in = (
float *)ivoid;
506 const float angle = (
M_PI / 180) * (-data->
rotate);
513 g_strlcat(datadir,
"/watermarks/",
sizeof(datadir));
514 g_strlcat(configdir,
"/watermarks/",
sizeof(configdir));
515 g_strlcat(datadir, data->
filename,
sizeof(datadir));
516 g_strlcat(configdir, data->
filename,
sizeof(configdir));
518 if(g_file_test(configdir, G_FILE_TEST_EXISTS))
519 filename = configdir;
520 else if(g_file_test(datadir, G_FILE_TEST_EXISTS))
533 if(!g_ascii_strcasecmp(
extension,
".svg"))
535 else if(!g_ascii_strcasecmp(
extension,
".png"))
550 gchar *svgdoc = NULL;
562 const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, roi_out->
width);
565 fprintf(stderr,
"[watermark] cairo stride error\n");
571 guint8 *image = (guint8 *)g_try_malloc0_n(roi_out->
height, stride);
577 cairo_surface_t *surface = cairo_image_surface_create_for_data(image, CAIRO_FORMAT_ARGB32, roi_out->
width,
579 if(cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS)
581 fprintf(stderr,
"[watermark] cairo surface error: %s\n",
582 cairo_status_to_string(cairo_surface_status(surface)));
591 RsvgHandle *svg = NULL;
595 GError *
error = NULL;
596 svg = rsvg_handle_new_from_data((
const guint8 *)svgdoc, strlen(svgdoc), &
error);
600 cairo_surface_destroy(surface);
604 fprintf(stderr,
"[watermark] error processing svg file: %s\n",
error->message);
611 guint8 *image_two = NULL;
612 cairo_surface_t *surface_two = NULL;
623 surface_two = cairo_image_surface_create_from_png(filename);
624 if((cairo_surface_status(surface_two) != CAIRO_STATUS_SUCCESS))
626 fprintf(stderr,
"[watermark] cairo png surface 2 error: %s\n",
627 cairo_status_to_string(cairo_surface_status(surface_two)));
628 cairo_surface_destroy(surface);
634 dimension.width = cairo_image_surface_get_width(surface_two);
635 dimension.height = cairo_image_surface_get_height(surface_two);
646 const float uscale = data->
scale / 100.0f;
651 float wbase, hbase, scale;
680 scale *= roi_out->
scale;
688 float svg_width, svg_height;
695 svg_width = iw * uscale;
700 svg_width = ih * uscale;
709 svg_height = ih * uscale;
714 svg_height = iw * uscale;
723 float svg_offset_x = 0;
724 float svg_offset_y = 0;
728 svg_offset_x = ceilf(3.0f * scale);
729 svg_offset_y = ceilf(3.0f * scale);
731 const int watermark_width = (int)((
dimension.width * scale) + 3* svg_offset_x);
732 const int watermark_height = (int)((
dimension.height * scale) + 3* svg_offset_y) ;
734 const int stride_two = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, watermark_width);
735 image_two = (guint8 *)g_try_malloc0_n(watermark_height, stride_two);
738 cairo_surface_destroy(surface);
745 surface_two = cairo_image_surface_create_for_data(image_two, CAIRO_FORMAT_ARGB32, watermark_width,
746 watermark_height, stride_two);
747 if(cairo_surface_status(surface_two) != CAIRO_STATUS_SUCCESS)
749 fprintf(stderr,
"[watermark] cairo surface 2 error: %s\n",
750 cairo_status_to_string(cairo_surface_status(surface_two)));
751 cairo_surface_destroy(surface);
762 cairo_t *cr = cairo_create(surface);
764 cairo_t *cr_two = cairo_create(surface_two);
767 const float bb_width = fabsf(svg_width * cosf(angle)) + fabsf(svg_height * sinf(angle));
768 const float bb_height = fabsf(svg_width * sinf(angle)) + fabsf(svg_height * cosf(angle));
769 const float bX = bb_width / 2.0f - svg_width / 2.0f;
770 const float bY = bb_height / 2.0f - svg_height / 2.0f;
774 float ty = 0, tx = 0;
778 ty = (ih / 2.0f) - (svg_height / 2.0f);
780 ty = ih - svg_height - bY;
785 tx = (iw / 2.0f) - (svg_width / 2.0f);
787 tx = iw - svg_width - bX;
790 cairo_translate(cr, -roi_in->
x, -roi_in->
y);
796 cairo_translate(cr, tx * roi_out->
scale, ty * roi_out->
scale);
799 const float cX = svg_width / 2.0f * roi_out->
scale;
800 const float cY = svg_height / 2.0f * roi_out->
scale;
802 cairo_translate(cr, cX, cY);
803 cairo_rotate(cr, angle);
804 cairo_translate(cr, -cX, -cY);
807 cairo_translate(cr_two, svg_offset_x, svg_offset_y);
812 cairo_scale(cr_two, scale, scale);
817 cairo_scale(cr, scale, scale);
820 cairo_surface_flush(surface_two);
823 cairo_set_source_surface(cr, surface_two, -svg_offset_x, -svg_offset_y);
830 cairo_destroy(cr_two);
833 cairo_surface_flush(surface);
837 const float opacity = data->
opacity / 100.0f;
839 for(
int j = 0; j < roi_out->
height * roi_out->
width; j++)
841 float *
const i = in +
ch*j;
842 float *
const o =
out +
ch*j;
843 guint8 *
const s = sd + 4*j;
844 const float alpha = (s[3] / 255.0f) * opacity;
846 o[0] = ((1.0f - alpha) *
i[0]) + (opacity * (s[2] / 255.0f));
847 o[1] = ((1.0f - alpha) *
i[1]) + (opacity * (s[1] / 255.0f));
848 o[2] = ((1.0f - alpha) *
i[2]) + (opacity * (s[0] / 255.0f));
853 cairo_surface_destroy(surface);
854 cairo_surface_destroy(surface_two);
872 memset(
p->filename, 0,
sizeof(
p->filename));
874 g_strlcpy(
p->filename, (
char *)g_list_nth_data(
g->watermarks_filenames,
n),
sizeof(
p->filename));
900 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(
g->colorpick), &c);
908 char *watermarks_dir = g_build_filename(basedir,
"watermarks", NULL);
909 GDir *dir = g_dir_open(watermarks_dir, 0, NULL);
913 while((d_name = g_dir_read_name(dir)))
914 files = g_list_prepend(files, g_strdup(d_name));
918 files = g_list_sort(files, (GCompareFunc)g_strcmp0);
919 for(GList *iter = files; iter; iter = g_list_next(iter))
921 char *filename = iter->data;
922 gchar *
extension = strrchr(filename,
'.');
929 g->watermarks_filenames = g_list_append(
g->watermarks_filenames, g_strdup(filename));
933 gchar *text = g_strdup_printf(
"%s (%s)", filename,
extension);
955 g->watermarks_filenames = NULL;
987 for(
int i = 0;
i < 9;
i++)
992 if(GTK_WIDGET(
g->align[
i]) == tb)
994 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
i]),
TRUE);
998 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
i]),
FALSE);
1003 p->alignment = index;
1012 g_strlcpy(
p->text, gtk_entry_get_text(GTK_ENTRY(entry)),
sizeof(
p->text));
1024 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &c);
1025 p->color[0] = c.red;
1026 p->color[1] = c.green;
1027 p->color[2] = c.blue;
1041 gchar *fontname = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(button));
1042 g_strlcpy(
p->font, fontname,
sizeof(
p->font));
1054 d->opacity =
p->opacity;
1055 d->scale =
p->scale;
1056 d->rotate =
p->rotate;
1057 d->xoffset =
p->xoffset;
1058 d->yoffset =
p->yoffset;
1059 d->alignment =
p->alignment;
1060 d->sizeto =
p->sizeto;
1061 memset(
d->filename, 0,
sizeof(
d->filename));
1062 g_strlcpy(
d->filename,
p->filename,
sizeof(
d->filename));
1063 memset(
d->text, 0,
sizeof(
d->text));
1064 g_strlcpy(
d->text,
p->text,
sizeof(
d->text));
1065 for (
int k=0;
k<3;
k++)
1066 d->color[
k] =
p->color[
k];
1067 memset(
d->font, 0,
sizeof(
d->font));
1068 g_strlcpy(
d->font,
p->font,
sizeof(
d->font));
1090 for(
int i = 0;
i < 9;
i++)
1092 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
i]),
FALSE);
1094 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
p->alignment]),
TRUE);
1096 gtk_entry_set_text(GTK_ENTRY(
g->text),
p->text);
1097 GdkRGBA color = (GdkRGBA){.red =
p->color[0], .green =
p->color[1], .blue =
p->color[2], .alpha = 1.0 };
1098 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(
g->colorpick), &color);
1099 gtk_font_chooser_set_font(GTK_FONT_CHOOSER(
g->fontsel),
p->font);
1110 g_strlcpy(
d->filename,
"simple-text.svg",
sizeof(
d->filename));
1111 g_strlcpy(
d->font,
"DejaVu Sans 10",
sizeof(
d->font));
1121 GtkGrid *grid = GTK_GRID(gtk_grid_new());
1134 gtk_widget_set_hexpand(GTK_WIDGET(
g->watermarks),
TRUE);
1135 char *
tooltip = g_strdup_printf(_(
"SVG watermarks in %s/watermarks or %s/watermarks"), configdir, datadir);
1136 gtk_widget_set_tooltip_text(
g->watermarks,
tooltip);
1140 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1141 gtk_grid_attach_next_to(grid,
g->watermarks, label, GTK_POS_RIGHT, 1, 1);
1142 gtk_grid_attach_next_to(grid,
g->refresh,
g->watermarks, GTK_POS_RIGHT, 1, 1);
1146 g->text = gtk_entry_new();
1148 gtk_entry_set_width_chars(GTK_ENTRY(
g->text), 1);
1149 gtk_widget_set_tooltip_text(
g->text, _(
"text string, tag:\n$(WATERMARK_TEXT)"));
1151 gtk_entry_set_text(GTK_ENTRY(
g->text), str);
1153 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1154 gtk_grid_attach_next_to(grid,
g->text, label, GTK_POS_RIGHT, 2, 1);
1159 g->fontsel = gtk_font_button_new_with_font(str==NULL?
"DejaVu Sans 10":str);
1161 gtk_label_set_ellipsize(GTK_LABEL(child), PANGO_ELLIPSIZE_MIDDLE);
1162 gtk_widget_set_tooltip_text(
g->fontsel, _(
"text font, tags:\n$(WATERMARK_FONT_FAMILY)\n"
1163 "$(WATERMARK_FONT_STYLE)\n$(WATERMARK_FONT_WEIGHT)"));
1164 gtk_font_button_set_show_size (GTK_FONT_BUTTON(
g->fontsel),
FALSE);
1166 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1167 gtk_grid_attach_next_to(grid,
g->fontsel, label, GTK_POS_RIGHT, 2, 1);
1173 GdkRGBA color = (GdkRGBA){.red = red, .green = green, .blue = blue, .alpha = 1.0 };
1176 g->colorpick = gtk_color_button_new_with_rgba(&color);
1177 gtk_widget_set_tooltip_text(
g->colorpick, _(
"watermark color, tag:\n$(WATERMARK_COLOR)"));
1178 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(
g->colorpick),
FALSE);
1179 gtk_color_button_set_title(GTK_COLOR_BUTTON(
g->colorpick), _(
"select watermark color"));
1181 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->color_picker_button), _(
"pick color from image"));
1183 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1184 gtk_grid_attach_next_to(grid,
g->colorpick, label, GTK_POS_RIGHT, 1, 1);
1185 gtk_grid_attach_next_to(grid,
g->color_picker_button,
g->colorpick, GTK_POS_RIGHT, 1, 1);
1187 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(grid),
TRUE,
TRUE, 0);
1206 gtk_widget_set_tooltip_text(
g->sizeto, _(
"size is relative to"));
1211 gtk_grid_attach(GTK_GRID(bat), label, 0, 0, 1, 3);
1212 gtk_widget_set_hexpand(label,
TRUE);
1215 for(
int i = 0;
i < 9;
i++)
1218 gtk_grid_attach(GTK_GRID(bat), GTK_WIDGET(
g->align[
i]), 1 +
i%3,
i/3, 1, 1);
1231 gtk_widget_set_tooltip_text(
g->opacity, _(
"the opacity of the watermark"));
1232 gtk_widget_set_tooltip_text(
g->scale, _(
"the scale of the watermark"));
1233 gtk_widget_set_tooltip_text(
g->rotate, _(
"the rotation of the watermark"));
1237 g_signal_connect(G_OBJECT(
g->watermarks),
"value-changed", G_CALLBACK(
watermark_callback), self);
1238 g_signal_connect(G_OBJECT(
g->refresh),
"clicked", G_CALLBACK(
refresh_callback), self);
1239 g_signal_connect(G_OBJECT(
g->text),
"changed", G_CALLBACK(
text_callback), self);
1241 g_signal_connect(G_OBJECT(
g->fontsel),
"font-set", G_CALLBACK(
fontsel_callback), self);
1248 g->watermarks_filenames = NULL;
static void error(char *msg)
const char * extension(dt_imageio_module_data_t *data)
void dt_bauhaus_slider_set_digits(GtkWidget *widget, int val)
void dt_bauhaus_combobox_clear(GtkWidget *widget)
int dt_bauhaus_combobox_get(GtkWidget *widget)
void dt_bauhaus_slider_set_soft_max(GtkWidget *widget, float val)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
GtkWidget * dt_color_picker_new(dt_iop_module_t *module, dt_iop_color_picker_kind_t kind, GtkWidget *w)
const dt_colormatrix_t dt_aligned_pixel_t out
void dt_image_full_path(const int32_t imgid, char *pathname, size_t pathname_len, gboolean *from_cache, const char *calling_func)
Get the full path of an image out of the database.
void dt_conf_set_float(const char *name, float val)
float dt_conf_get_float(const char *name)
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
static void dt_free_gpointer(gpointer ptr)
#define DT_MODULE_INTROSPECTION(MODVER, PARAMSTYPE)
#define __DT_CLONE_TARGETS__
#define __OMP_PARALLEL_FOR__(...)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_dev_add_history_item(dev, module, enable, redraw)
void dtgtk_cairo_paint_refresh(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_alignment(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
GtkWidget * dt_gui_container_first_child(GtkContainer *container)
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....
static GtkWidget * dt_ui_section_label_new(const gchar *str)
#define DT_GUI_BOX_SPACING
static GtkWidget * dt_ui_label_new(const gchar *str)
static void dt_iop_image_copy_by_size(float *const __restrict__ out, const float *const __restrict__ in, const size_t width, const size_t height, const size_t ch)
void dt_iop_default_init(dt_iop_module_t *module)
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)
@ IOP_FLAGS_INCLUDE_IN_STYLES
@ IOP_FLAGS_SUPPORTS_BLENDING
#define IOP_GUI_ALLOC(module)
GtkWidget * dt_bauhaus_slider_from_params(dt_iop_module_t *self, const char *param)
GtkWidget * dt_bauhaus_combobox_from_params(dt_iop_module_t *self, const char *param)
float *const restrict const size_t k
float *const restrict const size_t const size_t ch
GtkWidget * dtgtk_reset_label_new(const gchar *text, dt_iop_module_t *module, void *param, int param_size)
struct _GtkWidget GtkWidget
char * dt_variables_expand(dt_variables_params_t *params, gchar *source, gboolean iterate)
void dt_variables_params_destroy(dt_variables_params_t *params)
void dt_variables_params_init(dt_variables_params_t **params)
void dt_variables_set_tags_flags(dt_variables_params_t *params, uint32_t flags)
struct dt_gui_gtk_t * gui
dt_pthread_mutex_t plugin_threadsafe
struct dt_bauhaus_t * bauhaus
struct dt_develop_t * develop
struct dt_iop_module_t *void * data
struct dt_develop_t * dev
dt_iop_buffer_type_t datatype
dt_iop_params_t * default_params
dt_iop_gui_data_t * gui_data
dt_aligned_pixel_t picked_color
Region of interest passed through the pixelpipe.
dt_iop_watermark_base_scale_t sizeto
GList * watermarks_filenames
GtkWidget * color_picker_button
dt_iop_watermark_base_scale_t sizeto
gchar * dt_util_str_replace(const gchar *string, const gchar *pattern, const gchar *substitute)
RsvgDimensionData dt_get_svg_dimension(RsvgHandle *svg)
void dt_render_svg(RsvgHandle *svg, cairo_t *cr, double width, double height, double offset_x, double offset_y)
void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void init(dt_iop_module_t *module)
static void colorpick_color_set(GtkColorButton *widget, gpointer user_data)
const char ** description(struct dt_iop_module_t *self)
__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)
static void watermark_callback(GtkWidget *tb, gpointer user_data)
void reload_defaults(dt_iop_module_t *module)
static void _text_color_font_set_sensitive(dt_iop_watermark_gui_data_t *g, gchar *filename)
static void fontsel_callback(GtkWidget *button, gpointer user_data)
void init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static gchar * _string_escape(const gchar *string)
dt_iop_watermark_base_scale_t
@ DT_SCALE_SMALLER_BORDER
static void refresh_watermarks(dt_iop_module_t *self)
void gui_update(struct dt_iop_module_t *self)
Refresh GUI controls from current params and configuration.
static gchar * _string_substitute(gchar *string, const gchar *search, const gchar *replace)
static void refresh_callback(GtkWidget *tb, gpointer user_data)
void gui_init(struct dt_iop_module_t *self)
static void text_callback(GtkWidget *entry, gpointer user_data)
static void alignment_callback(GtkWidget *tb, gpointer user_data)
int default_colorspace(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
void input_format(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_iop_buffer_dsc_t *dsc)
void gui_cleanup(struct dt_iop_module_t *self)
static void load_watermarks(const char *basedir, dt_iop_watermark_gui_data_t *g)
void cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void _combo_box_set_active_text(dt_iop_watermark_gui_data_t *g, gchar *text)
void color_picker_apply(dt_iop_module_t *self, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
int legacy_params(dt_iop_module_t *self, const void *const old_params, const int old_version, void *new_params, const int new_version)
static gchar * _watermark_get_svgdoc(dt_iop_module_t *self, dt_iop_watermark_data_t *data, const dt_image_t *image, const gchar *filename)