30
30
#include <librsvg/rsvg.h>
31
31
#include <librsvg/librsvg-features.h> /* for version check */
35
33
#include "libgimp/gimp.h"
36
34
#include "libgimp/gimpui.h"
38
36
#include "libgimp/stdplugins-intl.h"
39
#define LOAD_PROC "file-svg-load"
40
#define LOAD_THUMB_PROC "file-svg-load-thumb"
41
#define PLUG_IN_BINARY "svg"
41
42
#define SVG_VERSION "2.5.0"
42
43
#define SVG_DEFAULT_RESOLUTION 90.0
43
44
#define SVG_DEFAULT_SIZE 500
97
static GimpParamDef load_args[] =
98
static const GimpParamDef load_args[] =
99
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
100
{ GIMP_PDB_INT32, "run-mode", "Interactive, non-interactive" },
100
101
{ GIMP_PDB_STRING, "filename", "The name of the file to load" },
101
{ GIMP_PDB_STRING, "raw_filename", "The name of the file to load" },
102
{ GIMP_PDB_STRING, "raw-filename", "The name of the file to load" },
102
103
{ GIMP_PDB_FLOAT, "resolution",
103
"Resolution to use for rendering the SVG (defaults to 72 dpi" },
104
"Resolution to use for rendering the SVG (defaults to 90 dpi)" },
104
105
{ GIMP_PDB_INT32, "width",
105
106
"Width (in pixels) to load the SVG in. "
106
107
"(0 for original width, a negative width to specify a maximum width)" },
111
112
"Whether to not import paths (0), import paths individually (1) "
112
113
"or merge all imported paths (2)" }
114
static GimpParamDef load_return_vals[] =
115
static const GimpParamDef load_return_vals[] =
116
117
{ GIMP_PDB_IMAGE, "image", "Output image" }
119
static GimpParamDef thumb_args[] =
120
static const GimpParamDef thumb_args[] =
121
122
{ GIMP_PDB_STRING, "filename", "The name of the file to load" },
122
{ GIMP_PDB_INT32, "thumb_size", "Preferred thumbnail size" }
123
{ GIMP_PDB_INT32, "thumb-size", "Preferred thumbnail size" }
124
static GimpParamDef thumb_return_vals[] =
125
static const GimpParamDef thumb_return_vals[] =
126
127
{ GIMP_PDB_IMAGE, "image", "Thumbnail image" },
127
{ GIMP_PDB_INT32, "image_width", "Width of full-sized image" },
128
{ GIMP_PDB_INT32, "image_height", "Height of full-sized image" }
128
{ GIMP_PDB_INT32, "image-width", "Width of full-sized image" },
129
{ GIMP_PDB_INT32, "image-height", "Height of full-sized image" }
131
gimp_install_procedure ("file_svg_load",
132
gimp_install_procedure (LOAD_PROC,
132
133
"Loads files in the SVG file format",
133
134
"Renders SVG files to raster graphics using librsvg.",
134
135
"Dom Lachowicz, Sven Neumann",
135
136
"Dom Lachowicz <cinamod@hotmail.com>",
137
N_("Scalable SVG image"),
140
141
G_N_ELEMENTS (load_args),
141
142
G_N_ELEMENTS (load_return_vals),
142
143
load_args, load_return_vals);
144
gimp_register_file_handler_mime ("file_svg_load", "image/svg+xml");
145
gimp_register_magic_load_handler ("file_svg_load",
147
"0,string,<?xml,0,string,<svg");
145
gimp_register_file_handler_mime (LOAD_PROC, "image/svg+xml");
146
gimp_register_magic_load_handler (LOAD_PROC,
148
"0,string,<?xml,0,string,<svg");
149
gimp_install_procedure ("file_svg_load_thumb",
150
gimp_install_procedure (LOAD_THUMB_PROC,
150
151
"Loads a small preview from an SVG image",
152
153
"Dom Lachowicz, Sven Neumann",
153
154
"Dom Lachowicz <cinamod@hotmail.com>",
158
159
G_N_ELEMENTS (thumb_args),
159
160
G_N_ELEMENTS (thumb_return_vals),
160
161
thumb_args, thumb_return_vals);
162
gimp_register_thumbnail_loader ("file_svg_load", "file_svg_load_thumb");
163
gimp_register_thumbnail_loader (LOAD_PROC, LOAD_THUMB_PROC);
221
225
if (status == GIMP_PDB_SUCCESS)
223
const gchar *filename = param[1].data.d_string;
227
const gchar *filename = param[1].data.d_string;
224
228
gint32 image_ID = load_image (filename);
228
232
if (load_vals.import)
229
gimp_path_import (image_ID, filename, load_vals.merge, TRUE);
232
values[1].type = GIMP_PDB_IMAGE;
233
values[1].data.d_image = image_ID;
237
gimp_vectors_import_from_file (image_ID, filename,
238
load_vals.merge, TRUE,
239
&num_vectors, &vectors);
246
values[1].type = GIMP_PDB_IMAGE;
247
values[1].data.d_image = image_ID;
237
251
status = GIMP_PDB_EXECUTION_ERROR;
240
gimp_set_data ("file_svg_load", &load_vals, sizeof (load_vals));
254
gimp_set_data (LOAD_PROC, &load_vals, sizeof (load_vals));
243
else if (strcmp (name, "file_svg_load_thumb") == 0)
257
else if (strcmp (name, LOAD_THUMB_PROC) == 0)
268
282
if (image_ID != -1)
271
values[1].type = GIMP_PDB_IMAGE;
272
values[1].data.d_image = image_ID;
273
values[2].type = GIMP_PDB_INT32;
274
values[2].data.d_int32 = width;
275
values[3].type = GIMP_PDB_INT32;
276
values[3].data.d_int32 = height;
285
values[1].type = GIMP_PDB_IMAGE;
286
values[1].data.d_image = image_ID;
287
values[2].type = GIMP_PDB_INT32;
288
values[2].data.d_int32 = width;
289
values[3].type = GIMP_PDB_INT32;
290
values[3].data.d_int32 = height;
312
320
g_message (_("Could not open '%s' for reading: %s"),
313
321
gimp_filename_to_utf8 (filename),
314
322
error ? error->message : _("Unknown reason"));
318
gimp_progress_init (_("Rendering SVG..."));
326
gimp_progress_init (_("Rendering SVG"));
320
328
width = gdk_pixbuf_get_width (pixbuf);
321
329
height = gdk_pixbuf_get_height (pixbuf);
323
331
image = gimp_image_new (width, height, GIMP_RGB);
332
gimp_image_undo_disable (image);
324
334
gimp_image_set_filename (image, filename);
325
335
gimp_image_set_resolution (image,
326
336
load_vals.resolution, load_vals.resolution);
328
layer = gimp_layer_new (image, _("Rendered SVG"), width, height,
329
GIMP_RGBA_IMAGE, 100, GIMP_NORMAL_MODE);
331
drawable = gimp_drawable_get (layer);
333
gimp_pixel_rgn_init (&rgn, drawable, 0, 0, width, height, TRUE, FALSE);
335
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
336
bpp = gdk_pixbuf_get_n_channels (pixbuf);
337
pixels = gdk_pixbuf_get_pixels (pixbuf);
339
g_assert (bpp == rgn.bpp);
341
for (pr = gimp_pixel_rgns_register (1, &rgn);
343
pr = gimp_pixel_rgns_process (pr))
349
src = pixels + rgn.y * rowstride + rgn.x * bpp;
352
for (y = 0; y < rgn.h; y++)
354
memcpy (dest, src, rgn.w * rgn.bpp);
357
dest += rgn.rowstride;
361
gimp_drawable_detach (drawable);
362
g_object_unref (pixbuf);
364
gimp_progress_update (1.0);
338
layer = gimp_layer_new_from_pixbuf (image, _("Rendered SVG"), pixbuf,
339
100, GIMP_NORMAL_MODE, 0.0, 1.0);
366
340
gimp_image_add_layer (image, layer, 0);
342
gimp_image_undo_enable (image);
718
gimp_ui_init ("svg", FALSE);
696
gimp_ui_init (PLUG_IN_BINARY, FALSE);
720
698
/* Scalable Vector Graphics is SVG, should perhaps not be translated */
721
dialog = gimp_dialog_new (_("Render Scalable Vector Graphics"), "svg",
699
dialog = gimp_dialog_new (_("Render Scalable Vector Graphics"),
723
gimp_standard_help_func, "file-svg-load",
702
gimp_standard_help_func, LOAD_PROC,
725
704
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
726
705
GTK_STOCK_OK, GTK_RESPONSE_OK,
709
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
730
714
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
732
716
hbox = gtk_hbox_new (FALSE, 12);
826
810
gimp_size_entry_set_resolution (size, 0, load_vals.resolution, FALSE);
827
811
gimp_size_entry_set_resolution (size, 1, load_vals.resolution, FALSE);
829
g_signal_connect (size, "value_changed",
830
G_CALLBACK (load_dialog_size_callback),
813
g_signal_connect (size, "value-changed",
814
G_CALLBACK (load_dialog_size_callback),
833
817
/* Scale ratio */
834
818
hbox = gtk_hbox_new (FALSE, 0);
835
819
gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 2, 4,
836
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
820
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
837
821
gtk_widget_show (hbox);
839
823
table2 = gtk_table_new (2, 2, FALSE);
852
836
gtk_table_attach_defaults (GTK_TABLE (table2), spinbutton, 0, 1, 0, 1);
853
837
gtk_widget_show (spinbutton);
855
g_signal_connect (xadj, "value_changed",
856
G_CALLBACK (load_dialog_ratio_callback),
839
g_signal_connect (xadj, "value-changed",
840
G_CALLBACK (load_dialog_ratio_callback),
859
843
label = gtk_label_new_with_mnemonic (_("_X ratio:"));
860
844
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
861
845
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
862
846
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
863
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
847
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
864
848
gtk_widget_show (label);
874
858
gtk_table_attach_defaults (GTK_TABLE (table2), spinbutton, 0, 1, 1, 2);
875
859
gtk_widget_show (spinbutton);
877
g_signal_connect (yadj, "value_changed",
878
G_CALLBACK (load_dialog_ratio_callback),
861
g_signal_connect (yadj, "value-changed",
862
G_CALLBACK (load_dialog_ratio_callback),
881
865
label = gtk_label_new_with_mnemonic (_("_Y ratio:"));
882
866
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
883
867
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
884
868
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4,
885
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
869
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
886
870
gtk_widget_show (label);
888
872
/* the constrain ratio chainbutton */