86#include <librsvg/rsvg.h>
89#include <librsvg/rsvg-cairo.h>
186 void *new_params,
const int new_version)
188 if(old_version == 1 && new_version == 5)
190 typedef struct dt_iop_watermark_params_v1_t
203 } dt_iop_watermark_params_v1_t;
205 dt_iop_watermark_params_v1_t *o = (dt_iop_watermark_params_v1_t *)old_params;
211 n->opacity = o->opacity;
213 n->xoffset = o->xoffset;
214 n->yoffset = o->yoffset;
215 n->alignment = o->alignment;
218 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
219 g_strlcpy(
n->text,
"",
sizeof(
n->text));
220 g_strlcpy(
n->font,
"DejaVu Sans 10",
sizeof(
n->font));
221 n->color[0] =
n->color[1] =
n->color[2] = 0;
224 else if(old_version == 2 && new_version == 5)
226 typedef struct dt_iop_watermark_params_v2_t
240 } dt_iop_watermark_params_v2_t;
242 dt_iop_watermark_params_v2_t *o = (dt_iop_watermark_params_v2_t *)old_params;
248 n->opacity = o->opacity;
250 n->xoffset = o->xoffset;
251 n->yoffset = o->yoffset;
252 n->alignment = o->alignment;
255 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
256 g_strlcpy(
n->text,
"",
sizeof(
n->text));
257 g_strlcpy(
n->font,
"DejaVu Sans 10",
sizeof(
n->font));
258 n->color[0] =
n->color[1] =
n->color[2] = 0;
261 else if(old_version == 3 && new_version == 5)
263 typedef struct dt_iop_watermark_params_v3_t
279 } dt_iop_watermark_params_v3_t;
281 dt_iop_watermark_params_v3_t *o = (dt_iop_watermark_params_v3_t *)old_params;
287 n->opacity = o->opacity;
289 n->xoffset = o->xoffset;
290 n->yoffset = o->yoffset;
291 n->alignment = o->alignment;
292 n->rotate = o->rotate;
293 n->sizeto = o->sizeto;
294 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
295 g_strlcpy(
n->text,
"",
sizeof(
n->text));
296 g_strlcpy(
n->font,
"DejaVu Sans 10",
sizeof(
n->font));
297 n->color[0] =
n->color[1] =
n->color[2] = 0;
300 else if(old_version == 4 && new_version == 5)
302 typedef struct dt_iop_watermark_params_v4_t
324 } dt_iop_watermark_params_v4_t;
326 dt_iop_watermark_params_v4_t *o = (dt_iop_watermark_params_v4_t *)old_params;
332 n->opacity = o->opacity;
334 n->xoffset = o->xoffset;
335 n->yoffset = o->yoffset;
336 n->alignment = o->alignment;
337 n->rotate = o->rotate;
338 n->sizeto = o->sizeto;
339 g_strlcpy(
n->filename, o->filename,
sizeof(
n->filename));
340 g_strlcpy(
n->text, o->text,
sizeof(
n->text));
341 g_strlcpy(
n->font, o->font,
sizeof(
n->font));
342 n->color[0] = o->color[0];
343 n->color[1] = o->color[1];
344 n->color[2] = o->color[2];
353 return _(
"_Watermark");
360 _(
"non-linear, RGB, display-referred"),
361 _(
"non-linear, RGB"),
362 _(
"non-linear, RGB, display-referred"));
396 const gchar *
extension = strrchr(filename,
'.');
399 const gboolean active = !g_ascii_strcasecmp(
extension,
".svg");
400 gtk_widget_set_sensitive(GTK_WIDGET(
g->colorpick), active);
401 gtk_widget_set_sensitive(GTK_WIDGET(
g->color_picker_button), active);
402 gtk_widget_set_sensitive(GTK_WIDGET(
g->text), active);
403 gtk_widget_set_sensitive(GTK_WIDGET(
g->fontsel), active);
410 for(
const GList *iter =
g->watermarks_filenames; iter; iter = g_list_next(iter))
412 if(!g_strcmp0((gchar *)iter->data, text))
425 gchar *result, *result_old;
449 const dt_image_t *image,
const gchar *filename)
451 gchar *svgdata = NULL;
453 if(g_file_get_contents(filename, &svgdata, &length, NULL))
462 g_strlcpy(buffer, data->
text,
sizeof(buffer));
466 PangoFontDescription *font = pango_font_description_from_string(data->
font);
467 const PangoStyle font_style = pango_font_description_get_style(font);
468 const int font_weight = (int)pango_font_description_get_weight(font);
470 g_strlcpy(buffer, pango_font_description_get_family(font),
sizeof(buffer));
475 case PANGO_STYLE_OBLIQUE:
476 g_strlcpy(buffer,
"oblique",
sizeof(buffer));
478 case PANGO_STYLE_ITALIC:
479 g_strlcpy(buffer,
"italic",
sizeof(buffer));
482 g_strlcpy(buffer,
"normal",
sizeof(buffer));
487 g_snprintf(buffer,
sizeof(buffer),
"%d", font_weight);
490 pango_font_description_free(font);
494 g_strlcpy(buffer, gdk_rgba_to_string(&c),
sizeof(buffer));
501 gboolean from_cache =
FALSE;
504 params->filename = image_path;
505 params->jobcode =
"infos";
506 params->sequence = 0;
507 params->imgid = image->
id;
524 float *in = (
float *)ivoid;
527 const float angle = (
M_PI / 180) * (-data->
rotate);
534 g_strlcat(datadir,
"/watermarks/",
sizeof(datadir));
535 g_strlcat(configdir,
"/watermarks/",
sizeof(configdir));
536 g_strlcat(datadir, data->
filename,
sizeof(datadir));
537 g_strlcat(configdir, data->
filename,
sizeof(configdir));
539 if(g_file_test(configdir, G_FILE_TEST_EXISTS))
540 filename = configdir;
541 else if(g_file_test(datadir, G_FILE_TEST_EXISTS))
554 if(!g_ascii_strcasecmp(
extension,
".svg"))
556 else if(!g_ascii_strcasecmp(
extension,
".png"))
571 gchar *svgdoc = NULL;
583 const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, roi_out->
width);
586 fprintf(stderr,
"[watermark] cairo stride error\n");
592 guint8 *image = (guint8 *)g_try_malloc0_n(roi_out->
height, stride);
598 cairo_surface_t *surface = cairo_image_surface_create_for_data(image, CAIRO_FORMAT_ARGB32, roi_out->
width,
600 if(cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS)
602 fprintf(stderr,
"[watermark] cairo surface error: %s\n",
603 cairo_status_to_string(cairo_surface_status(surface)));
617 RsvgHandle *svg = NULL;
621 GError *
error = NULL;
622 svg = rsvg_handle_new_from_data((
const guint8 *)svgdoc, strlen(svgdoc), &
error);
626 cairo_surface_destroy(surface);
630 fprintf(stderr,
"[watermark] error processing svg file: %s\n",
error->message);
637 guint8 *image_two = NULL;
638 cairo_surface_t *surface_two = NULL;
649 surface_two = cairo_image_surface_create_from_png(filename);
650 if((cairo_surface_status(surface_two) != CAIRO_STATUS_SUCCESS))
652 fprintf(stderr,
"[watermark] cairo png surface 2 error: %s\n",
653 cairo_status_to_string(cairo_surface_status(surface_two)));
654 cairo_surface_destroy(surface);
660 dimension.width = cairo_image_surface_get_width(surface_two);
661 dimension.height = cairo_image_surface_get_height(surface_two);
672 const float uscale = data->
scale / 100.0f;
677 float wbase, hbase, scale;
706 scale *= roi_out->
scale;
714 float svg_width, svg_height;
721 svg_width = iw * uscale;
726 svg_width = ih * uscale;
735 svg_height = ih * uscale;
740 svg_height = iw * uscale;
749 float svg_offset_x = 0;
750 float svg_offset_y = 0;
754 svg_offset_x = ceilf(3.0f * scale);
755 svg_offset_y = ceilf(3.0f * scale);
757 const int watermark_width = (int)((
dimension.width * scale) + 3* svg_offset_x);
758 const int watermark_height = (int)((
dimension.height * scale) + 3* svg_offset_y) ;
760 const int stride_two = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, watermark_width);
761 image_two = (guint8 *)g_try_malloc0_n(watermark_height, stride_two);
764 cairo_surface_destroy(surface);
771 surface_two = cairo_image_surface_create_for_data(image_two, CAIRO_FORMAT_ARGB32, watermark_width,
772 watermark_height, stride_two);
773 if(cairo_surface_status(surface_two) != CAIRO_STATUS_SUCCESS)
775 fprintf(stderr,
"[watermark] cairo surface 2 error: %s\n",
776 cairo_status_to_string(cairo_surface_status(surface_two)));
777 cairo_surface_destroy(surface);
788 cairo_t *cr = cairo_create(surface);
790 cairo_t *cr_two = cairo_create(surface_two);
793 const float bb_width = fabsf(svg_width * cosf(angle)) + fabsf(svg_height * sinf(angle));
794 const float bb_height = fabsf(svg_width * sinf(angle)) + fabsf(svg_height * cosf(angle));
795 const float bX = bb_width / 2.0f - svg_width / 2.0f;
796 const float bY = bb_height / 2.0f - svg_height / 2.0f;
800 float ty = 0, tx = 0;
804 ty = (ih / 2.0f) - (svg_height / 2.0f);
806 ty = ih - svg_height - bY;
811 tx = (iw / 2.0f) - (svg_width / 2.0f);
813 tx = iw - svg_width - bX;
816 cairo_translate(cr, -roi_in->
x, -roi_in->
y);
822 cairo_translate(cr, tx * roi_out->
scale, ty * roi_out->
scale);
825 const float cX = svg_width / 2.0f * roi_out->
scale;
826 const float cY = svg_height / 2.0f * roi_out->
scale;
828 cairo_translate(cr, cX, cY);
829 cairo_rotate(cr, angle);
830 cairo_translate(cr, -cX, -cY);
833 cairo_translate(cr_two, svg_offset_x, svg_offset_y);
838 cairo_scale(cr_two, scale, scale);
843 cairo_scale(cr, scale, scale);
846 cairo_surface_flush(surface_two);
849 cairo_set_source_surface(cr, surface_two, -svg_offset_x, -svg_offset_y);
856 cairo_destroy(cr_two);
859 cairo_surface_flush(surface);
863 const float opacity = data->
opacity / 100.0f;
865 for(
int j = 0; j < roi_out->
height * roi_out->
width; j++)
867 float *
const i = in +
ch*j;
868 float *
const o =
out +
ch*j;
869 guint8 *
const s = sd + 4*j;
870 const float alpha = (s[3] / 255.0f) * opacity;
872 o[0] = ((1.0f - alpha) *
i[0]) + (opacity * (s[2] / 255.0f));
873 o[1] = ((1.0f - alpha) *
i[1]) + (opacity * (s[1] / 255.0f));
874 o[2] = ((1.0f - alpha) *
i[2]) + (opacity * (s[0] / 255.0f));
879 cairo_surface_destroy(surface);
880 cairo_surface_destroy(surface_two);
898 memset(
p->filename, 0,
sizeof(
p->filename));
900 g_strlcpy(
p->filename, (
char *)g_list_nth_data(
g->watermarks_filenames,
n),
sizeof(
p->filename));
926 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(
g->colorpick), &c);
934 char *watermarks_dir = g_build_filename(basedir,
"watermarks", NULL);
935 GDir *dir = g_dir_open(watermarks_dir, 0, NULL);
939 while((d_name = g_dir_read_name(dir)))
940 files = g_list_prepend(files, g_strdup(d_name));
944 files = g_list_sort(files, (GCompareFunc)g_strcmp0);
945 for(GList *iter = files; iter; iter = g_list_next(iter))
947 char *filename = iter->data;
948 gchar *
extension = strrchr(filename,
'.');
955 g->watermarks_filenames = g_list_append(
g->watermarks_filenames, g_strdup(filename));
959 gchar *text = g_strdup_printf(
"%s (%s)", filename,
extension);
981 g->watermarks_filenames = NULL;
1013 for(
int i = 0;
i < 9;
i++)
1018 if(GTK_WIDGET(
g->align[
i]) == tb)
1020 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
i]),
TRUE);
1024 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
i]),
FALSE);
1029 p->alignment = index;
1038 g_strlcpy(
p->text, gtk_entry_get_text(GTK_ENTRY(entry)),
sizeof(
p->text));
1050 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget), &c);
1051 p->color[0] = c.red;
1052 p->color[1] = c.green;
1053 p->color[2] = c.blue;
1067 gchar *fontname = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(button));
1068 g_strlcpy(
p->font, fontname,
sizeof(
p->font));
1080 d->opacity =
p->opacity;
1081 d->scale =
p->scale;
1082 d->rotate =
p->rotate;
1083 d->xoffset =
p->xoffset;
1084 d->yoffset =
p->yoffset;
1085 d->alignment =
p->alignment;
1086 d->sizeto =
p->sizeto;
1087 memset(
d->filename, 0,
sizeof(
d->filename));
1088 g_strlcpy(
d->filename,
p->filename,
sizeof(
d->filename));
1089 memset(
d->text, 0,
sizeof(
d->text));
1090 g_strlcpy(
d->text,
p->text,
sizeof(
d->text));
1091 for (
int k=0;
k<3;
k++)
1092 d->color[
k] =
p->color[
k];
1093 memset(
d->font, 0,
sizeof(
d->font));
1094 g_strlcpy(
d->font,
p->font,
sizeof(
d->font));
1116 for(
int i = 0;
i < 9;
i++)
1118 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
i]),
FALSE);
1120 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->align[
p->alignment]),
TRUE);
1122 gtk_entry_set_text(GTK_ENTRY(
g->text),
p->text);
1123 GdkRGBA
color = (GdkRGBA){.red =
p->color[0], .green =
p->color[1], .blue =
p->color[2], .alpha = 1.0 };
1124 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(
g->colorpick), &
color);
1125 gtk_font_chooser_set_font(GTK_FONT_CHOOSER(
g->fontsel),
p->font);
1136 g_strlcpy(
d->filename,
"simple-text.svg",
sizeof(
d->filename));
1137 g_strlcpy(
d->font,
"DejaVu Sans 10",
sizeof(
d->font));
1147 GtkGrid *grid = GTK_GRID(gtk_grid_new());
1160 gtk_widget_set_hexpand(GTK_WIDGET(
g->watermarks),
TRUE);
1161 char *
tooltip = g_strdup_printf(_(
"SVG watermarks in %s/watermarks or %s/watermarks"), configdir, datadir);
1162 gtk_widget_set_tooltip_text(
g->watermarks,
tooltip);
1166 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1167 gtk_grid_attach_next_to(grid,
g->watermarks, label, GTK_POS_RIGHT, 1, 1);
1168 gtk_grid_attach_next_to(grid,
g->refresh,
g->watermarks, GTK_POS_RIGHT, 1, 1);
1172 g->text = gtk_entry_new();
1174 gtk_entry_set_width_chars(GTK_ENTRY(
g->text), 1);
1175 gtk_widget_set_tooltip_text(
g->text, _(
"text string, tag:\n$(WATERMARK_TEXT)"));
1177 gtk_entry_set_text(GTK_ENTRY(
g->text), str);
1179 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1180 gtk_grid_attach_next_to(grid,
g->text, label, GTK_POS_RIGHT, 2, 1);
1185 g->fontsel = gtk_font_button_new_with_font(str==NULL?
"DejaVu Sans 10":str);
1187 gtk_label_set_ellipsize(GTK_LABEL(child), PANGO_ELLIPSIZE_MIDDLE);
1188 gtk_widget_set_tooltip_text(
g->fontsel, _(
"text font, tags:\n$(WATERMARK_FONT_FAMILY)\n"
1189 "$(WATERMARK_FONT_STYLE)\n$(WATERMARK_FONT_WEIGHT)"));
1190 gtk_font_button_set_show_size (GTK_FONT_BUTTON(
g->fontsel),
FALSE);
1192 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1193 gtk_grid_attach_next_to(grid,
g->fontsel, label, GTK_POS_RIGHT, 2, 1);
1199 GdkRGBA
color = (GdkRGBA){.red = red, .green = green, .blue = blue, .alpha = 1.0 };
1202 g->colorpick = gtk_color_button_new_with_rgba(&
color);
1203 gtk_widget_set_tooltip_text(
g->colorpick, _(
"watermark color, tag:\n$(WATERMARK_COLOR)"));
1204 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(
g->colorpick),
FALSE);
1205 gtk_color_button_set_title(GTK_COLOR_BUTTON(
g->colorpick), _(
"select watermark color"));
1207 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->color_picker_button), _(
"pick color from image"));
1209 gtk_grid_attach(grid, label, 0, line++, 1, 1);
1210 gtk_grid_attach_next_to(grid,
g->colorpick, label, GTK_POS_RIGHT, 1, 1);
1211 gtk_grid_attach_next_to(grid,
g->color_picker_button,
g->colorpick, GTK_POS_RIGHT, 1, 1);
1213 gtk_box_pack_start(GTK_BOX(self->
gui->
widget), GTK_WIDGET(grid),
TRUE,
TRUE, 0);
1232 gtk_widget_set_tooltip_text(
g->sizeto, _(
"size is relative to"));
1237 gtk_grid_attach(GTK_GRID(bat), label, 0, 0, 1, 3);
1238 gtk_widget_set_hexpand(label,
TRUE);
1241 for(
int i = 0;
i < 9;
i++)
1244 gtk_grid_attach(GTK_GRID(bat), GTK_WIDGET(
g->align[
i]), 1 +
i%3,
i/3, 1, 1);
1257 gtk_widget_set_tooltip_text(
g->opacity, _(
"the opacity of the watermark"));
1258 gtk_widget_set_tooltip_text(
g->scale, _(
"the scale of the watermark"));
1259 gtk_widget_set_tooltip_text(
g->rotate, _(
"the rotation of the watermark"));
1263 g_signal_connect(G_OBJECT(
g->watermarks),
"value-changed", G_CALLBACK(
watermark_callback), self);
1264 g_signal_connect(G_OBJECT(
g->refresh),
"clicked", G_CALLBACK(
refresh_callback), self);
1265 g_signal_connect(G_OBJECT(
g->text),
"changed", G_CALLBACK(
text_callback), self);
1267 g_signal_connect(G_OBJECT(
g->fontsel),
"font-set", G_CALLBACK(
fontsel_callback), self);
1274 g->watermarks_filenames = NULL;
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnect accels while a text or search entry has the focus, and reconnect them when it loses it....
Handle default and user-set shortcuts (accelerators)
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)
GtkWidget * dt_color_picker_new(dt_iop_module_t *module, dt_iop_color_picker_kind_t kind, GtkWidget *w)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
const dt_colormatrix_t dt_aligned_pixel_t out
void dt_conf_set_float(const char *name, float val)
float dt_conf_get_float(const char *name)
Float for name, clamped to its declared bounds.
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
Borrow the stored string for name without copying it.
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.
GtkWidget * dt_gui_container_first_child(GtkContainer *container)
struct dt_bauhaus_t * dt_bauhaus_get_global(void)
#define dt_dev_add_history_item(dev, module, enable, redraw)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
Initialise a mutex. With mutexattr NULL – which is how 54 of the 56 call sites in this tree spell it ...
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)
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
GtkWidget * dt_iop_gui_reset_label_new(const gchar *label, dt_iop_module_t *module, void *param, int param_size)
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)
static dt_iop_gui_data_t * dt_iop_gui_data(const struct dt_iop_module_t *m)
The module's GUI data blob, NULL-safe for headless callers: IOP process() implementations read it for...
#define IOP_GUI_ALLOC(module)
GtkWidget * dt_ui_section_label_new(const gchar *str)
GtkWidget * dt_ui_label_new(const gchar *str)
_lib_location_type_t type
float *const restrict const size_t k
float *const restrict const size_t const size_t ch
#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_free_align(ptr)
Release memory from dt_alloc_align() and set ptr to NULL.
static void * dt_calloc_align(size_t size)
dt_alloc_align() followed by a zero fill.
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_MODULE_INTROSPECTION(MODVER, PARAMSTYPE)
DT_MODULE() for a module whose params struct is introspected.
#define __OMP_PARALLEL_FOR__(...)
#define DT_PATH_MAX
Buffer size for a filesystem path anywhere in Ansel.
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_iop_module_t *void * data
struct dt_develop_t * dev
dt_iop_buffer_type_t datatype
dt_iop_params_t * default_params
struct dt_iop_module_gui_t * gui
struct dt_develop_t * dev
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
#define __DT_CLONE_TARGETS__
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 pthread_once_t _rsvg_lock_once
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)
static void _rsvg_lock_init(void)
void color_picker_apply(dt_iop_module_t *self, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static dt_pthread_mutex_t _rsvg_lock
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)