mirror of
https://gitlab.gnome.org/GNOME/gimp
synced 2024-10-19 22:34:37 +00:00
improvements on the gimp plugin - allow for non-interactive use, image resolution dialog, and some other goodies
This commit is contained in:
parent
706de31960
commit
3d8cc9a2a1
|
@ -16,12 +16,11 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* SVG loading and saving file filter for the GIMP
|
||||
* -Dom Lachowicz <cinamod@hotmail.com>
|
||||
/* SVG loading file filter for the GIMP
|
||||
* -Dom Lachowicz <cinamod@hotmail.com> 2003
|
||||
*
|
||||
* TODO:
|
||||
* 1) size/zoom dialog, resultion setting
|
||||
* 2) image preview
|
||||
* *) image preview
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
@ -29,10 +28,38 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libgimp/gimp.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 */
|
||||
#define _(String) (String)
|
||||
|
||||
|
@ -42,9 +69,6 @@ static void run (gchar *name,
|
|||
GimpParam *param,
|
||||
gint *nreturn_vals,
|
||||
GimpParam **return_vals);
|
||||
static gint32 load_image (gchar *filename,
|
||||
GimpRunMode runmode,
|
||||
gboolean preview);
|
||||
|
||||
GimpPlugInInfo PLUG_IN_INFO = {
|
||||
NULL, /* init_proc */
|
||||
|
@ -55,6 +79,171 @@ GimpPlugInInfo PLUG_IN_INFO = {
|
|||
|
||||
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...
|
||||
*/
|
||||
|
@ -67,11 +256,17 @@ query (void)
|
|||
{ GIMP_PDB_STRING, "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[] =
|
||||
{
|
||||
{ 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",
|
||||
"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),
|
||||
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",
|
||||
"svg", "",
|
||||
"0,string,<?xml,0,string,<svg");
|
||||
|
@ -118,87 +325,45 @@ run (gchar *name,
|
|||
|
||||
if (strcmp (name, "file_svg_load") == 0)
|
||||
{
|
||||
/* INIT_I18N_UI (); */
|
||||
image_ID = load_image (param[1].data.d_string, run_mode, FALSE);
|
||||
switch (run_mode)
|
||||
{
|
||||
case GIMP_RUN_INTERACTIVE:
|
||||
gimp_get_data ("file_svg_load", &load_vals);
|
||||
|
||||
if (image_ID != -1)
|
||||
{
|
||||
*nreturn_vals = 2;
|
||||
values[1].type = GIMP_PDB_IMAGE;
|
||||
values[1].data.d_image = image_ID;
|
||||
if (!load_dialog (param[1].data.d_string))
|
||||
status = GIMP_PDB_CANCEL;
|
||||
break;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* '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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue