improvements on the gimp plugin - allow for non-interactive use, image resolution dialog, and some other goodies
This commit is contained in:
@ -16,12 +16,11 @@
|
|||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* SVG loading and saving file filter for the GIMP
|
/* SVG loading file filter for the GIMP
|
||||||
* -Dom Lachowicz <cinamod@hotmail.com>
|
* -Dom Lachowicz <cinamod@hotmail.com> 2003
|
||||||
*
|
*
|
||||||
* TODO:
|
* TODO:
|
||||||
* 1) size/zoom dialog, resultion setting
|
* *) image preview
|
||||||
* 2) image preview
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@ -29,10 +28,38 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <libgimp/gimp.h>
|
|
||||||
#include <rsvg.h>
|
#include <rsvg.h>
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
#include <libgimp/gimp.h>
|
||||||
|
#include <libgimp/gimpui.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
double scale;
|
||||||
|
} SvgLoadVals;
|
||||||
|
|
||||||
|
static SvgLoadVals load_vals =
|
||||||
|
{
|
||||||
|
1.0 /* scale */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
gint run;
|
||||||
|
} SvgLoadInterface;
|
||||||
|
|
||||||
|
static SvgLoadInterface load_interface =
|
||||||
|
{
|
||||||
|
FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GtkWidget *dialog;
|
||||||
|
GtkAdjustment *scale;
|
||||||
|
} LoadDialogVals;
|
||||||
|
|
||||||
/* TODO: remove me, initialize gimp i18n services */
|
/* TODO: remove me, initialize gimp i18n services */
|
||||||
#define _(String) (String)
|
#define _(String) (String)
|
||||||
|
|
||||||
@ -42,9 +69,6 @@ static void run (gchar *name,
|
|||||||
GimpParam *param,
|
GimpParam *param,
|
||||||
gint *nreturn_vals,
|
gint *nreturn_vals,
|
||||||
GimpParam **return_vals);
|
GimpParam **return_vals);
|
||||||
static gint32 load_image (gchar *filename,
|
|
||||||
GimpRunMode runmode,
|
|
||||||
gboolean preview);
|
|
||||||
|
|
||||||
GimpPlugInInfo PLUG_IN_INFO = {
|
GimpPlugInInfo PLUG_IN_INFO = {
|
||||||
NULL, /* init_proc */
|
NULL, /* init_proc */
|
||||||
@ -55,6 +79,171 @@ GimpPlugInInfo PLUG_IN_INFO = {
|
|||||||
|
|
||||||
MAIN ()
|
MAIN ()
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_load_vals (void)
|
||||||
|
{
|
||||||
|
if (load_vals.scale < 0.01)
|
||||||
|
load_vals.scale = 0.01;
|
||||||
|
else if (load_vals.scale > 100.)
|
||||||
|
load_vals.scale = 100.;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 'load_image()' - Load a SVG image into a new image window.
|
||||||
|
*/
|
||||||
|
static gint32
|
||||||
|
load_image (gchar *filename, /* I - File to load */
|
||||||
|
GimpRunMode runmode,
|
||||||
|
gboolean preview)
|
||||||
|
{
|
||||||
|
gint32 image; /* Image */
|
||||||
|
gint32 layer; /* Layer */
|
||||||
|
GimpDrawable *drawable; /* Drawable for layer */
|
||||||
|
GimpPixelRgn pixel_rgn; /* Pixel region for layer */
|
||||||
|
GdkPixbuf *pixbuf; /* SVG, rasterized */
|
||||||
|
gchar *status;
|
||||||
|
|
||||||
|
pixbuf = rsvg_pixbuf_from_file_at_zoom (filename, load_vals.scale, load_vals.scale, NULL);
|
||||||
|
|
||||||
|
if (!pixbuf)
|
||||||
|
{
|
||||||
|
g_message (_("can't open \"%s\"\n"), filename);
|
||||||
|
gimp_quit ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runmode != GIMP_RUN_NONINTERACTIVE)
|
||||||
|
{
|
||||||
|
status = g_strdup_printf (_("Loading %s:"), filename);
|
||||||
|
gimp_progress_init (status);
|
||||||
|
g_free (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
image = gimp_image_new (gdk_pixbuf_get_width (pixbuf),
|
||||||
|
gdk_pixbuf_get_height (pixbuf),
|
||||||
|
GIMP_RGB);
|
||||||
|
if (image == -1)
|
||||||
|
{
|
||||||
|
g_message ("Can't allocate new image: %s\n", filename);
|
||||||
|
gimp_quit ();
|
||||||
|
}
|
||||||
|
|
||||||
|
gimp_image_set_filename (image, filename);
|
||||||
|
|
||||||
|
layer = gimp_layer_new (image, _("Background"),
|
||||||
|
gdk_pixbuf_get_width (pixbuf),
|
||||||
|
gdk_pixbuf_get_height (pixbuf),
|
||||||
|
GIMP_RGBA_IMAGE, 100, GIMP_NORMAL_MODE);
|
||||||
|
|
||||||
|
drawable = gimp_drawable_get (layer);
|
||||||
|
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0,
|
||||||
|
drawable->width, drawable->height, TRUE, FALSE);
|
||||||
|
|
||||||
|
gimp_pixel_rgn_set_rect (&pixel_rgn, gdk_pixbuf_get_pixels (pixbuf),
|
||||||
|
0, 0,
|
||||||
|
gdk_pixbuf_get_width (pixbuf),
|
||||||
|
gdk_pixbuf_get_height (pixbuf));
|
||||||
|
|
||||||
|
g_object_unref (G_OBJECT(pixbuf));
|
||||||
|
|
||||||
|
/* Tell the GIMP to display the image.
|
||||||
|
*/
|
||||||
|
gimp_image_add_layer (image, layer, 0);
|
||||||
|
gimp_drawable_flush (drawable);
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_ok_callback (GtkWidget *widget,
|
||||||
|
gpointer data)
|
||||||
|
|
||||||
|
{
|
||||||
|
LoadDialogVals *vals = (LoadDialogVals *)data;
|
||||||
|
|
||||||
|
/* Read scale */
|
||||||
|
load_vals.scale = pow (2, vals->scale->value);
|
||||||
|
|
||||||
|
load_interface.run = TRUE;
|
||||||
|
gtk_widget_destroy (GTK_WIDGET (vals->dialog));
|
||||||
|
}
|
||||||
|
|
||||||
|
static gint
|
||||||
|
load_dialog (gchar *file_name)
|
||||||
|
{
|
||||||
|
LoadDialogVals *vals;
|
||||||
|
GtkWidget *frame;
|
||||||
|
GtkWidget *vbox;
|
||||||
|
GtkWidget *label;
|
||||||
|
GtkWidget *table;
|
||||||
|
GtkWidget *slider;
|
||||||
|
|
||||||
|
gimp_ui_init ("svg", FALSE);
|
||||||
|
|
||||||
|
vals = g_new (LoadDialogVals, 1);
|
||||||
|
|
||||||
|
vals->dialog = gimp_dialog_new ( _("Load SVG"), "svg",
|
||||||
|
NULL, NULL,
|
||||||
|
GTK_WIN_POS_MOUSE,
|
||||||
|
FALSE, TRUE, FALSE,
|
||||||
|
|
||||||
|
GTK_STOCK_CANCEL, gtk_widget_destroy,
|
||||||
|
NULL, 1, NULL, FALSE, TRUE,
|
||||||
|
|
||||||
|
GTK_STOCK_OK, load_ok_callback,
|
||||||
|
vals, NULL, NULL, TRUE, FALSE,
|
||||||
|
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_signal_connect (vals->dialog, "destroy",
|
||||||
|
G_CALLBACK (gtk_main_quit),
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
/* Rendering */
|
||||||
|
frame = gtk_frame_new (g_strdup_printf ( _("Rendering %s"), file_name));
|
||||||
|
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
|
||||||
|
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
|
||||||
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (vals->dialog)->vbox), frame,
|
||||||
|
TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
vbox = gtk_vbox_new (FALSE, 4);
|
||||||
|
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
|
||||||
|
gtk_container_add (GTK_CONTAINER (frame), vbox);
|
||||||
|
|
||||||
|
/* Scale label */
|
||||||
|
table = gtk_table_new (1, 2, FALSE);
|
||||||
|
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
|
||||||
|
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
|
||||||
|
gtk_widget_show (table);
|
||||||
|
|
||||||
|
label = gtk_label_new ( _("Scale (log 2):"));
|
||||||
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
|
||||||
|
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
|
||||||
|
GTK_FILL, GTK_FILL, 0, 0);
|
||||||
|
gtk_widget_show (label);
|
||||||
|
|
||||||
|
/* Scale slider */
|
||||||
|
vals->scale = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, -2.0, 2.0, 0.2, 0.2, 0.0));
|
||||||
|
slider = gtk_hscale_new (vals->scale);
|
||||||
|
gtk_table_attach (GTK_TABLE (table), slider, 1, 2, 0, 1,
|
||||||
|
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
||||||
|
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
|
||||||
|
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
|
||||||
|
gtk_widget_show (slider);
|
||||||
|
|
||||||
|
gtk_widget_show (vbox);
|
||||||
|
gtk_widget_show (frame);
|
||||||
|
|
||||||
|
gtk_widget_show (vals->dialog);
|
||||||
|
|
||||||
|
gtk_main ();
|
||||||
|
gdk_flush ();
|
||||||
|
|
||||||
|
g_free (vals);
|
||||||
|
|
||||||
|
return load_interface.run;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 'query()' - Respond to a plug-in query...
|
* 'query()' - Respond to a plug-in query...
|
||||||
*/
|
*/
|
||||||
@ -67,11 +256,17 @@ query (void)
|
|||||||
{ GIMP_PDB_STRING, "filename", "The name of the file to load" },
|
{ GIMP_PDB_STRING, "filename", "The name of the file to load" },
|
||||||
{ GIMP_PDB_STRING, "raw_filename", "The name of the file to load" }
|
{ GIMP_PDB_STRING, "raw_filename", "The name of the file to load" }
|
||||||
};
|
};
|
||||||
|
|
||||||
static GimpParamDef load_return_vals[] =
|
static GimpParamDef load_return_vals[] =
|
||||||
{
|
{
|
||||||
{ GIMP_PDB_IMAGE, "image", "Output image" }
|
{ GIMP_PDB_IMAGE, "image", "Output image" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static GimpParamDef load_setargs_args[] =
|
||||||
|
{
|
||||||
|
{ GIMP_PDB_FLOAT, "scale", "Scale in which to load image" }
|
||||||
|
};
|
||||||
|
|
||||||
gimp_install_procedure ("file_svg_load",
|
gimp_install_procedure ("file_svg_load",
|
||||||
"Loads files in the SVG file format",
|
"Loads files in the SVG file format",
|
||||||
"Loads files in the SVG file format",
|
"Loads files in the SVG file format",
|
||||||
@ -85,6 +280,18 @@ query (void)
|
|||||||
G_N_ELEMENTS (load_return_vals),
|
G_N_ELEMENTS (load_return_vals),
|
||||||
load_args, load_return_vals);
|
load_args, load_return_vals);
|
||||||
|
|
||||||
|
gimp_install_procedure ("file_svg_load_setargs",
|
||||||
|
"set additional parameters for the procedure file_svg_load",
|
||||||
|
"set additional parameters for the procedure file_svg_load",
|
||||||
|
"Dom Lachowicz <cinamod@hotmail.com>",
|
||||||
|
"Dom Lachowicz",
|
||||||
|
"2003",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
GIMP_PLUGIN,
|
||||||
|
G_N_ELEMENTS (load_setargs_args), 0,
|
||||||
|
load_setargs_args, NULL);
|
||||||
|
|
||||||
gimp_register_magic_load_handler ("file_svg_load",
|
gimp_register_magic_load_handler ("file_svg_load",
|
||||||
"svg", "",
|
"svg", "",
|
||||||
"0,string,<?xml,0,string,<svg");
|
"0,string,<?xml,0,string,<svg");
|
||||||
@ -118,87 +325,45 @@ run (gchar *name,
|
|||||||
|
|
||||||
if (strcmp (name, "file_svg_load") == 0)
|
if (strcmp (name, "file_svg_load") == 0)
|
||||||
{
|
{
|
||||||
/* INIT_I18N_UI (); */
|
switch (run_mode)
|
||||||
image_ID = load_image (param[1].data.d_string, run_mode, FALSE);
|
{
|
||||||
|
case GIMP_RUN_INTERACTIVE:
|
||||||
|
gimp_get_data ("file_svg_load", &load_vals);
|
||||||
|
|
||||||
if (image_ID != -1)
|
if (!load_dialog (param[1].data.d_string))
|
||||||
{
|
status = GIMP_PDB_CANCEL;
|
||||||
*nreturn_vals = 2;
|
break;
|
||||||
values[1].type = GIMP_PDB_IMAGE;
|
|
||||||
values[1].data.d_image = image_ID;
|
case GIMP_RUN_NONINTERACTIVE:
|
||||||
|
gimp_get_data ("file_svg_load", &load_vals);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GIMP_RUN_WITH_LAST_VALS:
|
||||||
|
gimp_get_data ("file_svg_load", &load_vals);
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (status == GIMP_PDB_SUCCESS)
|
||||||
{
|
{
|
||||||
status = GIMP_PDB_EXECUTION_ERROR;
|
check_load_vals ();
|
||||||
|
|
||||||
|
image_ID = load_image (param[1].data.d_string, run_mode, FALSE);
|
||||||
|
gimp_set_data ("file_svg_load", &load_vals, sizeof (load_vals));
|
||||||
|
|
||||||
|
if (image_ID != -1)
|
||||||
|
{
|
||||||
|
*nreturn_vals = 2;
|
||||||
|
values[1].type = GIMP_PDB_IMAGE;
|
||||||
|
values[1].data.d_image = image_ID;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
status = GIMP_PDB_EXECUTION_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
status = GIMP_PDB_CALLING_ERROR;
|
||||||
|
|
||||||
values[0].data.d_status = status;
|
values[0].data.d_status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 'load_image()' - Load a SVG image into a new image window.
|
|
||||||
*/
|
|
||||||
static gint32
|
|
||||||
load_image (gchar *filename, /* I - File to load */
|
|
||||||
GimpRunMode runmode,
|
|
||||||
gboolean preview)
|
|
||||||
{
|
|
||||||
gint32 image; /* Image */
|
|
||||||
gint32 layer; /* Layer */
|
|
||||||
GimpDrawable *drawable; /* Drawable for layer */
|
|
||||||
GimpPixelRgn pixel_rgn; /* Pixel region for layer */
|
|
||||||
GdkPixbuf *pixbuf; /* SVG, rasterized */
|
|
||||||
gchar *status;
|
|
||||||
|
|
||||||
/* TODO: could possibly use preview abilities */
|
|
||||||
|
|
||||||
pixbuf = rsvg_pixbuf_from_file (filename, NULL);
|
|
||||||
|
|
||||||
if (!pixbuf)
|
|
||||||
{
|
|
||||||
g_message (_("can't open \"%s\"\n"), filename);
|
|
||||||
gimp_quit ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (runmode != GIMP_RUN_NONINTERACTIVE)
|
|
||||||
{
|
|
||||||
status = g_strdup_printf (_("Loading %s:"), filename);
|
|
||||||
gimp_progress_init (status);
|
|
||||||
g_free (status);
|
|
||||||
}
|
|
||||||
|
|
||||||
image = gimp_image_new (gdk_pixbuf_get_width (pixbuf),
|
|
||||||
gdk_pixbuf_get_height (pixbuf),
|
|
||||||
GIMP_RGB);
|
|
||||||
if (image == -1)
|
|
||||||
{
|
|
||||||
g_message ("Can't allocate new image\n%s", filename);
|
|
||||||
gimp_quit ();
|
|
||||||
}
|
|
||||||
|
|
||||||
gimp_image_set_filename (image, filename);
|
|
||||||
|
|
||||||
layer = gimp_layer_new (image, _("Background"),
|
|
||||||
gdk_pixbuf_get_width (pixbuf),
|
|
||||||
gdk_pixbuf_get_height (pixbuf),
|
|
||||||
GIMP_RGBA_IMAGE, 100, GIMP_NORMAL_MODE);
|
|
||||||
|
|
||||||
drawable = gimp_drawable_get (layer);
|
|
||||||
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0,
|
|
||||||
drawable->width, drawable->height, TRUE, FALSE);
|
|
||||||
|
|
||||||
gimp_pixel_rgn_set_rect (&pixel_rgn, gdk_pixbuf_get_pixels (pixbuf),
|
|
||||||
0, 0,
|
|
||||||
gdk_pixbuf_get_width (pixbuf),
|
|
||||||
gdk_pixbuf_get_height (pixbuf));
|
|
||||||
|
|
||||||
g_object_unref (G_OBJECT(pixbuf));
|
|
||||||
|
|
||||||
/* Tell the GIMP to display the image.
|
|
||||||
*/
|
|
||||||
gimp_image_add_layer (image, layer, 0);
|
|
||||||
gimp_drawable_flush (drawable);
|
|
||||||
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user