[gimp] plug-ins: lots of cleanup in file-pdf-save before porting to GEGL
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: lots of cleanup in file-pdf-save before porting to GEGL
- Date: Wed, 21 Nov 2012 14:05:11 +0000 (UTC)
commit 55a9eb0d1a563162cfc09eb9caeed66fc575666d
Author: Michael Natterer <mitch gimp org>
Date: Wed Nov 21 15:04:15 2012 +0100
plug-ins: lots of cleanup in file-pdf-save before porting to GEGL
plug-ins/common/file-pdf-save.c | 584 +++++++++++++++++++++------------------
1 files changed, 314 insertions(+), 270 deletions(-)
---
diff --git a/plug-ins/common/file-pdf-save.c b/plug-ins/common/file-pdf-save.c
index af70384..398cea2 100644
--- a/plug-ins/common/file-pdf-save.c
+++ b/plug-ins/common/file-pdf-save.c
@@ -111,6 +111,7 @@
#include "libgimp/stdplugins-intl.h"
+
#define SAVE_PROC "file-pdf-save"
#define SAVE_MULTI_PROC "file-pdf-save-multi"
#define PLUG_IN_BINARY "file-pdf-save"
@@ -126,34 +127,40 @@
#define THUMB_WIDTH 90
#define THUMB_HEIGHT 120
-typedef struct {
+
+typedef struct
+{
gboolean vectorize;
gboolean ignore_hidden;
gboolean apply_masks;
} PdfOptimize;
-typedef struct {
- gint32 images[MAX_PAGE_COUNT];
+typedef struct
+{
+ gint32 images[MAX_PAGE_COUNT];
guint32 image_count;
- gchar file_name[MAX_FILE_NAME_LENGTH];
+ gchar file_name[MAX_FILE_NAME_LENGTH];
} PdfMultiPage;
-typedef struct {
- PdfOptimize optimize;
- GArray *images;
+typedef struct
+{
+ PdfOptimize optimize;
+ GArray *images;
} PdfMultiVals;
-enum {
+enum
+{
THUMB,
PAGE_NUMBER,
IMAGE_NAME,
IMAGE_ID
};
-typedef struct {
+typedef struct
+{
GdkPixbuf *thumb;
- gint32 page_number;
- gchar* image_name;
+ gint32 page_number;
+ gchar *image_name;
} Page;
@@ -186,10 +193,10 @@ static void remove_call (GtkTreeModel *tree_model,
gpointer user_data);
static void recount_pages (void);
-static cairo_surface_t *get_drawable_image (GimpDrawable *drawable);
-static GimpRGB get_layer_color (GimpDrawable *layer,
- gboolean *single);
-static void drawText (GimpDrawable* text_layer,
+static cairo_surface_t *get_drawable_image (gint32 drawable_ID);
+static GimpRGB get_layer_color (gint32 layer_ID,
+ gboolean *single);
+static void drawText (gint32 text_id,
gdouble opacity,
cairo_t *cr,
gdouble x_res,
@@ -202,30 +209,22 @@ static void run (const gchar *name,
gint *nreturn_vals,
GimpParam **return_vals);
-static gboolean dnd_remove = TRUE;
+static gboolean dnd_remove = TRUE;
static PdfMultiPage multi_page;
-static PdfOptimize optimize = {
+static PdfOptimize optimize =
+{
TRUE, /* vectorize */
TRUE, /* ignore_hidden */
TRUE /* apply_masks */
};
static GtkTreeModel *model;
-static GtkWidget *file_choose;
-static gchar* file_name;
+static GtkWidget *file_choose;
+static gchar *file_name;
-GimpPlugInInfo PLUG_IN_INFO =
- {
- NULL,
- NULL,
- query,
- run
- };
-
-MAIN()
-
-typedef enum {
+typedef enum
+{
SA_RUN_MODE,
SA_IMAGE,
SA_DRAWABLE,
@@ -239,7 +238,8 @@ typedef enum {
#define SA_ARG_COUNT_DEFAULT 5
-typedef enum {
+typedef enum
+{
SMA_RUN_MODE,
SMA_IMAGES,
SMA_COUNT,
@@ -251,6 +251,17 @@ typedef enum {
SMA_ARG_COUNT
} SaveMultiArgs;
+
+GimpPlugInInfo PLUG_IN_INFO =
+{
+ NULL,
+ NULL,
+ query,
+ run
+};
+
+MAIN()
+
static void
query (void)
{
@@ -334,41 +345,13 @@ run (const gchar *name,
static GimpParam values[1];
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
GimpRunMode run_mode;
-
- /* Plug-in variables */
gboolean single_image;
gboolean defaults_proc;
-
- /* Plug-In variables */
cairo_surface_t *pdf_file;
cairo_t *cr;
GimpExportCapabilities capabilities;
-
- guint32 i = 0;
- gint32 j = 0;
-
- gdouble x_res, y_res;
- gdouble x_scale, y_scale;
-
- gint32 image_id;
- gboolean exported;
- GimpImageBaseType type;
-
- gint32 temp;
-
- gint *layers;
- gint32 num_of_layers;
- GimpDrawable *layer;
- cairo_surface_t *layer_image;
- gdouble opacity;
- gint x, y;
- GimpRGB layer_color;
- gboolean single_color;
-
- gint32 mask_id = -1;
- GimpDrawable *mask = NULL;
- cairo_surface_t *mask_image = NULL;
FILE *fp;
+ gint i;
INIT_I18N ();
@@ -383,7 +366,7 @@ run (const gchar *name,
multi_page.image_count = 0;
if (! init_vals (name, nparams, param, &single_image,
- &defaults_proc, &run_mode))
+ &defaults_proc, &run_mode))
{
values[0].data.d_status = GIMP_PDB_CALLING_ERROR;
return;
@@ -415,143 +398,167 @@ run (const gchar *name,
}
fp = g_fopen (file_name, "wb");
+
pdf_file = cairo_pdf_surface_create_for_stream (write_func, fp, 1, 1);
+
if (cairo_surface_status (pdf_file) != CAIRO_STATUS_SUCCESS)
{
- char *str = g_strdup_printf
- (_("An error occured while creating the PDF file:\n"
- "%s\n"
- "Make sure you entered a valid filename and that the selected location isn't read only!"),
- cairo_status_to_string (cairo_surface_status (pdf_file)));
-
- gimp_message (str);
- g_free (str);
+ g_message (_("An error occured while creating the PDF file:\n"
+ "%s\n"
+ "Make sure you entered a valid filename and that the "
+ "selected location isn't read only!"),
+ cairo_status_to_string (cairo_surface_status (pdf_file)));
values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
return;
}
+
cr = cairo_create (pdf_file);
- capabilities = GIMP_EXPORT_CAN_HANDLE_RGB | GIMP_EXPORT_CAN_HANDLE_ALPHA |
- GIMP_EXPORT_CAN_HANDLE_GRAY | GIMP_EXPORT_CAN_HANDLE_LAYERS |
- GIMP_EXPORT_CAN_HANDLE_INDEXED;
+ capabilities = (GIMP_EXPORT_CAN_HANDLE_RGB |
+ GIMP_EXPORT_CAN_HANDLE_ALPHA |
+ GIMP_EXPORT_CAN_HANDLE_GRAY |
+ GIMP_EXPORT_CAN_HANDLE_LAYERS |
+ GIMP_EXPORT_CAN_HANDLE_INDEXED);
if (optimize.apply_masks)
capabilities |= GIMP_EXPORT_CAN_HANDLE_LAYER_MASKS;
for (i = 0; i < multi_page.image_count; i++)
{
- /* Save the state of the surface before any changes, so that settings
- * from one page won't affect all the others */
+ GimpImageBaseType type;
+ gint *layers;
+ gint32 image_ID;
+ gboolean exported;
+ gint32 num_of_layers;
+ gdouble x_res, y_res;
+ gdouble x_scale, y_scale;
+ gint32 temp;
+ gint j;
+
+ /* Save the state of the surface before any changes, so that
+ * settings from one page won't affect all the others
+ */
cairo_save (cr);
- image_id = multi_page.images[i];
+ image_ID = multi_page.images[i];
/* We need the active layer in order to use gimp_image_export */
- temp = gimp_image_get_active_drawable (image_id);
+ temp = gimp_image_get_active_drawable (image_ID);
if (temp == -1)
- exported = gimp_export_image (&image_id, &temp, NULL, capabilities) == GIMP_EXPORT_EXPORT;
+ exported = gimp_export_image (&image_ID, &temp, NULL, capabilities) == GIMP_EXPORT_EXPORT;
else
exported = FALSE;
- type = gimp_image_base_type (image_id);
- gimp_image_get_resolution (image_id, &x_res, &y_res);
+ type = gimp_image_base_type (image_ID);
+
+ gimp_image_get_resolution (image_ID, &x_res, &y_res);
x_scale = 72.0 / x_res;
y_scale = 72.0 / y_res;
cairo_pdf_surface_set_size (pdf_file,
- gimp_image_width (image_id) * x_scale,
- gimp_image_height (image_id) * y_scale);
+ gimp_image_width (image_ID) * x_scale,
+ gimp_image_height (image_ID) * y_scale);
/* This way we set how many pixels are there in every inch.
- * It's very important for PangoCairo */
+ * It's very important for PangoCairo
+ */
cairo_surface_set_fallback_resolution (pdf_file, x_res, y_res);
/* PDF is usually 72 points per inch. If we have a different resolution,
- * we will need this to fit our drawings */
+ * we will need this to fit our drawings
+ */
cairo_scale (cr, x_scale, y_scale);
/* Now, we should loop over the layers of each image */
- layers = gimp_image_get_layers (image_id, &num_of_layers);
+ layers = gimp_image_get_layers (image_ID, &num_of_layers);
for (j = 0; j < num_of_layers; j++)
{
- layer = gimp_drawable_get (layers [num_of_layers-j-1]);
- opacity = gimp_layer_get_opacity (layer->drawable_id)/100.0;
-
- /* Gimp doesn't display indexed layers with opacity below 50%
- * And if it's above 50%, it will be rounded to 100% */
- if (type == GIMP_INDEXED)
+ gint32 layer_ID = layers [num_of_layers - j - 1];
+ gint32 mask_ID = -1;
+ cairo_surface_t *mask_image = NULL;
+ gdouble opacity;
+ gboolean single_color;
+ gint x, y;
+
+ opacity = gimp_layer_get_opacity (layer_ID) / 100.0;
+
+ if (gimp_item_get_visible (layer_ID) &&
+ (! optimize.ignore_hidden ||
+ (optimize.ignore_hidden && opacity > 0.0)))
{
- if (opacity <= 0.5)
- opacity = 0.0;
- else
- opacity = 1.0;
- }
+ mask_ID = gimp_layer_get_mask (layer_ID);
+ if (mask_ID != -1)
+ mask_image = get_drawable_image (mask_ID);
- if (gimp_item_get_visible (layer->drawable_id)
- && (! optimize.ignore_hidden || (optimize.ignore_hidden && opacity > 0.0)))
- {
- mask_id = gimp_layer_get_mask (layer->drawable_id);
- if (mask_id != -1)
+ gimp_drawable_offsets (layer_ID, &x, &y);
+
+ if (! gimp_item_is_text_layer (layer_ID))
{
- mask = gimp_drawable_get (mask_id);
- mask_image = get_drawable_image (mask);
- }
+ /* For raster layers */
- gimp_drawable_offsets (layer->drawable_id, &x, &y);
+ GimpRGB layer_color;
- /* For raster layers */
- if (!gimp_item_is_text_layer (layer->drawable_id))
- {
- layer_color = get_layer_color (layer, &single_color);
- cairo_rectangle (cr, x, y, layer->width, layer->height);
+ layer_color = get_layer_color (layer_ID, &single_color);
+
+ cairo_rectangle (cr, x, y,
+ gimp_drawable_width (layer_ID),
+ gimp_drawable_height (layer_ID));
if (optimize.vectorize && single_color)
{
- cairo_set_source_rgba (cr, layer_color.r, layer_color.g, layer_color.b, layer_color.a * opacity);
- if (mask_id != -1)
+ cairo_set_source_rgba (cr,
+ layer_color.r,
+ layer_color.g,
+ layer_color.b,
+ layer_color.a * opacity);
+ if (mask_ID != -1)
cairo_mask_surface (cr, mask_image, x, y);
else
cairo_fill (cr);
}
else
{
+ cairo_surface_t *layer_image;
+
+ layer_image = get_drawable_image (layer_ID);
+
cairo_clip (cr);
- layer_image = get_drawable_image (layer);
+
cairo_set_source_surface (cr, layer_image, x, y);
cairo_push_group (cr);
cairo_paint_with_alpha (cr, opacity);
cairo_pop_group_to_source (cr);
- if (mask_id != -1)
+
+ if (mask_ID != -1)
cairo_mask_surface (cr, mask_image, x, y);
else
cairo_paint (cr);
+
cairo_reset_clip (cr);
cairo_surface_destroy (layer_image);
}
}
- /* For text layers */
else
{
- drawText (layer, opacity, cr, x_res, y_res);
+ /* For text layers */
+
+ drawText (layer_ID, opacity, cr, x_res, y_res);
}
}
/* We are done with the layer - time to free some resources */
- gimp_drawable_detach (layer);
- if (mask_id != -1)
- {
- gimp_drawable_detach (mask);
- cairo_surface_destroy (mask_image);
- }
+ if (mask_ID != -1)
+ cairo_surface_destroy (mask_image);
}
+
/* We are done with this image - Show it! */
cairo_show_page (cr);
cairo_restore (cr);
if (exported)
- gimp_image_delete (image_id);
+ gimp_image_delete (image_ID);
}
/* We are done with all the images - time to free the resources */
@@ -559,22 +566,23 @@ run (const gchar *name,
cairo_destroy (cr);
fclose (fp);
+
/* Finally done, let's save the parameters */
gimp_set_data (DATA_OPTIMIZE, &optimize, sizeof (optimize));
- if (!single_image)
+
+ if (! single_image)
{
g_strlcpy (multi_page.file_name, file_name, MAX_FILE_NAME_LENGTH);
gimp_set_data (DATA_IMAGE_LIST, &multi_page, sizeof (multi_page));
}
-
}
/******************************************************/
/* Begining of parameter handling functions */
/******************************************************/
-/* A function that takes care of loading the basic
- * parameters */
+/* A function that takes care of loading the basic parameters
+ */
static gboolean
init_vals (const gchar *name,
gint nparams,
@@ -627,7 +635,6 @@ init_vals (const gchar *name,
switch (*run_mode)
{
-
case GIMP_RUN_NONINTERACTIVE:
if (single)
{
@@ -654,12 +661,11 @@ init_vals (const gchar *name,
if (single || ! had_saved_list )
init_image_list_defaults (image);
-
break;
case GIMP_RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
- if (!single)
+ if (! single)
{
had_saved_list = gimp_get_data (DATA_IMAGE_LIST, &multi_page);
if (had_saved_list)
@@ -672,7 +678,6 @@ init_vals (const gchar *name,
init_image_list_defaults (image);
}
gimp_get_data (DATA_OPTIMIZE, &optimize);
-
break;
}
@@ -690,21 +695,23 @@ init_image_list_defaults (gint32 image)
{
if (image != -1)
{
- multi_page.images[0] = image;
+ multi_page.images[0] = image;
multi_page.image_count = 1;
}
- else {
- multi_page.image_count = 0;
- }
+ else
+ {
+ multi_page.image_count = 0;
+ }
}
-/* A function that removes images that are no longer valid from
- * the image list */
+/* A function that removes images that are no longer valid from the
+ * image list
+ */
static void
validate_image_list (void)
{
gint32 valid = 0;
- guint32 i = 0;
+ guint32 i = 0;
for (i = 0 ; i < MAX_PAGE_COUNT && i < multi_page.image_count ; i++)
{
@@ -714,23 +721,25 @@ validate_image_list (void)
valid++;
}
}
+
multi_page.image_count = valid;
}
+
/******************************************************/
/* Begining of GUI functions */
/******************************************************/
+
/* The main GUI function for saving single-paged PDFs */
+
static gboolean
gui_single (void)
{
GtkWidget *window;
GtkWidget *vbox;
-
GtkWidget *vectorize_c;
GtkWidget *ignore_hidden_c;
GtkWidget *apply_c;
-
gboolean run;
gimp_ui_init (PLUG_IN_BINARY, FALSE);
@@ -744,15 +753,18 @@ gui_single (void)
gtk_container_set_border_width (GTK_CONTAINER (window), 12);
ignore_hidden_c = gtk_check_button_new_with_label (_("Omit hidden layers and layers with zero opacity"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ignore_hidden_c), optimize.ignore_hidden);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ignore_hidden_c),
+ optimize.ignore_hidden);
gtk_box_pack_end (GTK_BOX (vbox), ignore_hidden_c, TRUE, TRUE, 0);
vectorize_c = gtk_check_button_new_with_label (_("Convert bitmaps to vector graphics where possible"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vectorize_c), optimize.vectorize);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vectorize_c),
+ optimize.vectorize);
gtk_box_pack_end (GTK_BOX (vbox), vectorize_c, TRUE, TRUE, 0);
apply_c = gtk_check_button_new_with_label (_("Apply layer masks before saving"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (apply_c), optimize.apply_masks);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (apply_c),
+ optimize.apply_masks);
gtk_box_pack_end (GTK_BOX (vbox), apply_c, TRUE, TRUE, 0);
gimp_help_set_help_data (apply_c, _("Keeping the masks will not change the output"), NULL);
@@ -760,39 +772,39 @@ gui_single (void)
run = gtk_dialog_run (GTK_DIALOG (window)) == GTK_RESPONSE_OK;
- optimize.ignore_hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ignore_hidden_c));
- optimize.vectorize = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vectorize_c));
- optimize.apply_masks = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (apply_c));
+ optimize.ignore_hidden =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ignore_hidden_c));
+ optimize.vectorize =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vectorize_c));
+ optimize.apply_masks =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (apply_c));
gtk_widget_destroy (window);
+
return run;
}
+
/* The main GUI function for saving multi-paged PDFs */
+
static gboolean
gui_multi (void)
{
GtkWidget *window;
GtkWidget *vbox;
-
GtkWidget *file_label;
GtkWidget *file_entry;
GtkWidget *file_browse;
GtkWidget *file_hbox;
-
GtkWidget *vectorize_c;
GtkWidget *ignore_hidden_c;
GtkWidget *apply_c;
-
GtkWidget *scroll;
GtkWidget *page_view;
-
GtkWidget *h_but_box;
GtkWidget *del;
-
GtkWidget *h_box;
GtkWidget *img_combo;
GtkWidget *add_image;
-
gboolean run;
const gchar *temp;
@@ -828,7 +840,8 @@ gui_multi (void)
model = create_model ();
gtk_icon_view_set_model (GTK_ICON_VIEW (page_view), model);
gtk_icon_view_set_reorderable (GTK_ICON_VIEW (page_view), TRUE);
- gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (page_view), GTK_SELECTION_MULTIPLE);
+ gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (page_view),
+ GTK_SELECTION_MULTIPLE);
gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (page_view), THUMB);
gtk_icon_view_set_text_column (GTK_ICON_VIEW (page_view), PAGE_NUMBER);
@@ -837,7 +850,8 @@ gui_multi (void)
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_set_size_request (scroll, -1, 300);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
gtk_container_add (GTK_CONTAINER (scroll), page_view);
gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
@@ -861,31 +875,38 @@ gui_multi (void)
gtk_box_pack_start (GTK_BOX (vbox), h_box, FALSE, FALSE, 0);
ignore_hidden_c = gtk_check_button_new_with_label (_("Omit hidden layers and layers with zero opacity"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ignore_hidden_c), optimize.ignore_hidden);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ignore_hidden_c),
+ optimize.ignore_hidden);
gtk_box_pack_end (GTK_BOX (vbox), ignore_hidden_c, FALSE, FALSE, 0);
vectorize_c = gtk_check_button_new_with_label (_("Convert bitmaps to vector graphics where possible"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vectorize_c), optimize.vectorize);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vectorize_c),
+ optimize.vectorize);
gtk_box_pack_end (GTK_BOX (vbox), vectorize_c, FALSE, FALSE, 0);
apply_c = gtk_check_button_new_with_label (_("Apply layer masks before saving"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (apply_c), optimize.apply_masks);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (apply_c),
+ optimize.apply_masks);
gtk_box_pack_end (GTK_BOX (vbox), apply_c, FALSE, FALSE, 0);
gimp_help_set_help_data (apply_c, _("Keeping the masks will not change the output"), NULL);
gtk_widget_show_all (window);
g_signal_connect (G_OBJECT (file_browse), "clicked",
- G_CALLBACK (choose_file_call), G_OBJECT (file_entry));
+ G_CALLBACK (choose_file_call),
+ file_entry);
g_signal_connect (G_OBJECT (add_image), "clicked",
- G_CALLBACK (add_image_call), G_OBJECT (img_combo));
+ G_CALLBACK (add_image_call),
+ img_combo);
g_signal_connect (G_OBJECT (del), "clicked",
- G_CALLBACK (del_image_call), G_OBJECT (page_view));
+ G_CALLBACK (del_image_call),
+ page_view);
g_signal_connect (G_OBJECT (model), "row-deleted",
- G_CALLBACK (remove_call), NULL);
+ G_CALLBACK (remove_call),
+ NULL);
run = gtk_dialog_run (GTK_DIALOG (window)) == GTK_RESPONSE_OK;
@@ -894,28 +915,35 @@ gui_multi (void)
temp = gtk_entry_get_text (GTK_ENTRY (file_entry));
g_stpcpy (file_name, temp);
- optimize.ignore_hidden = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ignore_hidden_c));
- optimize.vectorize = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vectorize_c));
- optimize.apply_masks = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (apply_c));
+ optimize.ignore_hidden =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ignore_hidden_c));
+ optimize.vectorize =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vectorize_c));
+ optimize.apply_masks =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (apply_c));
gtk_widget_destroy (window);
+
return run;
}
/* A function that is called when the button for browsing for file
- * locations was clicked */
+ * locations was clicked
+ */
static void
choose_file_call (GtkWidget *browse_button,
gpointer file_entry)
{
GFile *file = g_file_new_for_path (gtk_entry_get_text (GTK_ENTRY (file_entry)));
- gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (file_choose), g_file_get_uri (file));
+
+ gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (file_choose),
+ g_file_get_uri (file));
if (gtk_dialog_run (GTK_DIALOG (file_choose)) == GTK_RESPONSE_OK)
{
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (file_choose));
gtk_entry_set_text (GTK_ENTRY (file_entry), g_file_get_path (file));
- };
+ }
file_name = g_file_get_path (file);
gtk_widget_hide (file_choose);
@@ -926,12 +954,11 @@ static GtkTreeModel*
create_model (void)
{
GtkListStore *model;
- GtkTreeIter iter;
guint32 i;
- gint32 image = multi_page.images[0];
/* validate_image_list was called earlier, so all the images
- * up to multi_page.image_count are valid */
+ * up to multi_page.image_count are valid
+ */
model = gtk_list_store_new (4,
GDK_TYPE_PIXBUF, /* THUMB */
G_TYPE_STRING, /* PAGE_NUMBER */
@@ -940,54 +967,64 @@ create_model (void)
for (i = 0 ; i < multi_page.image_count && i < MAX_PAGE_COUNT ; i++)
{
- image = multi_page.images[i];
+ GtkTreeIter iter;
+ gint32 image = multi_page.images[i];
+ GdkPixbuf *pixbuf;
+
+ pixbuf = gimp_image_get_thumbnail (image, THUMB_WIDTH, THUMB_HEIGHT,
+ GIMP_PIXBUF_SMALL_CHECKS);
gtk_list_store_append (model, &iter);
gtk_list_store_set (model, &iter,
- THUMB, gimp_image_get_thumbnail (image, THUMB_WIDTH, THUMB_HEIGHT, GIMP_PIXBUF_SMALL_CHECKS),
- PAGE_NUMBER, g_strdup_printf ("Page %d", i+1),
- IMAGE_NAME, gimp_image_get_name (image),
- IMAGE_ID, image,
+ THUMB, pixbuf,
+ PAGE_NUMBER, g_strdup_printf (_("Page %d"), i + 1),
+ IMAGE_NAME, gimp_image_get_name (image),
+ IMAGE_ID, image,
-1);
+ g_object_unref (pixbuf);
}
return GTK_TREE_MODEL (model);
}
-/* A function that puts the images from the model inside the
- * images (pages) array */
+/* A function that puts the images from the model inside the images
+ * (pages) array
+ */
static gboolean
get_image_list (void)
{
GtkTreeIter iter;
- gboolean valid = gtk_tree_model_get_iter_first (model, &iter);
- gint32 image;
+ gboolean valid;
multi_page.image_count = 0;
- if (!valid)
+ for (valid = gtk_tree_model_get_iter_first (model, &iter);
+ valid;
+ valid = gtk_tree_model_iter_next (model, &iter))
{
- gimp_message (_("Error! In order to save the file, at least one image should be added!"));
- return FALSE;
- }
+ gint32 image;
- while (valid)
- {
gtk_tree_model_get (model, &iter,
IMAGE_ID, &image,
-1);
multi_page.images[multi_page.image_count] = image;
-
- valid = gtk_tree_model_iter_next (model, &iter);
multi_page.image_count++;
}
+ if (multi_page.image_count == 0)
+ {
+ g_message (_("Error! In order to save the file, at least one image "
+ "should be added!"));
+ return FALSE;
+ }
+
return TRUE;
}
-/* A function that is called when the button for adding an image
- * was clicked */
+/* A function that is called when the button for adding an image was
+ * clicked
+ */
static void
add_image_call (GtkWidget *widget,
gpointer img_combo)
@@ -995,6 +1032,7 @@ add_image_call (GtkWidget *widget,
GtkListStore *store;
GtkTreeIter iter;
gint32 image;
+ GdkPixbuf *pixbuf;
dnd_remove = FALSE;
@@ -1002,22 +1040,28 @@ add_image_call (GtkWidget *widget,
store = GTK_LIST_STORE (model);
+ pixbuf = gimp_image_get_thumbnail (image, THUMB_WIDTH, THUMB_HEIGHT,
+ GIMP_PIXBUF_SMALL_CHECKS);
+
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
- PAGE_NUMBER, g_strdup_printf ("Page %d", multi_page.image_count+1),
- THUMB, gimp_image_get_thumbnail (image, THUMB_WIDTH, THUMB_HEIGHT, GIMP_PIXBUF_SMALL_CHECKS),
- IMAGE_NAME, gimp_image_get_name (image),
- IMAGE_ID, image,
- -1
- );
+ PAGE_NUMBER, g_strdup_printf (_("Page %d"),
+ multi_page.image_count+1),
+ THUMB, pixbuf,
+ IMAGE_NAME, gimp_image_get_name (image),
+ IMAGE_ID, image,
+ -1);
+
+ g_object_unref (pixbuf);
multi_page.image_count++;
dnd_remove = TRUE;
}
-/* A function that is called when the button for deleting the
- * selected images was clicked */
+/* A function that is called when the button for deleting the selected
+ * images was clicked
+ */
static void
del_image_call (GtkWidget *widget,
gpointer icon_view)
@@ -1026,14 +1070,9 @@ del_image_call (GtkWidget *widget,
GtkTreeRowReference **items;
GtkTreePath *item_path;
GtkTreeIter item;
- guint32 i;
gpointer temp;
-
guint32 len;
- GdkPixbuf *thumb;
- gchar* name;
-
dnd_remove = FALSE;
list = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (icon_view));
@@ -1041,6 +1080,8 @@ del_image_call (GtkWidget *widget,
len = g_list_length (list);
if (len > 0)
{
+ gint i;
+
items = g_newa (GtkTreeRowReference*, len);
for (i = 0; i < len; i++)
@@ -1054,20 +1095,12 @@ del_image_call (GtkWidget *widget,
for (i = 0; i < len; i++)
{
item_path = gtk_tree_row_reference_get_path (items[i]);
- gtk_tree_model_get_iter (model, &item, item_path);
-
- /* Get the data that should be freed */
- gtk_tree_model_get (model, &item,
- THUMB, &thumb, IMAGE_NAME, &name, -1);
- /* Only after you have the pointers, remove them from the tree */
+ gtk_tree_model_get_iter (model, &item, item_path);
gtk_list_store_remove (GTK_LIST_STORE (model), &item);
- /* Now you can free the data */
- g_object_unref(thumb);
- g_free (name);
-
gtk_tree_path_free (item_path);
+
gtk_tree_row_reference_free (items[i]);
multi_page.image_count--;
}
@@ -1080,8 +1113,9 @@ del_image_call (GtkWidget *widget,
recount_pages ();
}
-/* A function that is called on rows-deleted signal. It will
- * call the function to relabel the pages */
+/* A function that is called on rows-deleted signal. It will call the
+ * function to relabel the pages
+ */
static void
remove_call (GtkTreeModel *tree_model,
GtkTreePath *path,
@@ -1093,8 +1127,9 @@ remove_call (GtkTreeModel *tree_model,
recount_pages ();
}
-/* A function to relabel the pages in the icon view, when
- * their order was changed */
+/* A function to relabel the pages in the icon view, when their order
+ * was changed
+ */
static void
recount_pages (void)
{
@@ -1105,13 +1140,13 @@ recount_pages (void)
store = GTK_LIST_STORE (model);
- valid = gtk_tree_model_get_iter_first (model, &iter);
- while (valid)
+ for (valid = gtk_tree_model_get_iter_first (model, &iter);
+ valid;
+ valid = gtk_tree_model_iter_next (model, &iter))
{
gtk_list_store_set (store, &iter,
- PAGE_NUMBER, g_strdup_printf ("Page %d", i + 1),
+ PAGE_NUMBER, g_strdup_printf (_("Page %d"), i + 1),
-1);
- valid = gtk_tree_model_iter_next (model, &iter);
i++;
}
}
@@ -1121,7 +1156,8 @@ recount_pages (void)
/******************************************************/
/* A function to get a cairo image surface from a drawable.
- * Some of the code was taken from the gimp-print plugin */
+ * Some of the code was taken from the gimp-print plugin
+ */
/* Gimp RGB (24 bit) to Cairo RGB (24 bit) */
static inline void
@@ -1226,28 +1262,32 @@ convert_from_indexeda_to_rgba (const guchar *src,
}
static cairo_surface_t *
-get_drawable_image (GimpDrawable *drawable)
+get_drawable_image (gint32 drawable_ID)
{
- gint32 drawable_ID = drawable->drawable_id;
+ GimpDrawable *drawable;
GimpPixelRgn region;
- GimpImageType image_type = gimp_drawable_type (drawable_ID);
+ GimpImageType image_type = gimp_drawable_type (drawable_ID);
cairo_surface_t *surface;
cairo_format_t format;
- const gint width = drawable->width;
- const gint height = drawable->height;
+ gint width;
+ gint height;
guchar cmap[3 * 256] = { 0, };
guchar *pixels;
gint stride;
gpointer pr;
- gboolean indexed = FALSE;
- int bpp = drawable->bpp;
+ int bpp;
+
+ drawable = gimp_drawable_get (drawable_ID);
+
+ width = drawable->width;
+ height = drawable->height;
+ bpp = drawable->bpp;
if (gimp_drawable_is_indexed (drawable_ID))
{
guchar *colors;
gint num_colors;
- indexed = TRUE;
colors = gimp_image_get_colormap (gimp_item_get_image (drawable_ID),
&num_colors);
memcpy (cmap, colors, 3 * num_colors);
@@ -1322,22 +1362,23 @@ get_drawable_image (GimpDrawable *drawable)
cairo_surface_mark_dirty (surface);
+ gimp_drawable_detach (drawable);
+
return surface;
}
-/* A function to check if a drawable is single colored
- * This allows to convert bitmaps to vector where possible */
+/* A function to check if a drawable is single colored This allows to
+ * convert bitmaps to vector where possible
+ */
static GimpRGB
-get_layer_color (GimpDrawable *layer,
- gboolean *single)
+get_layer_color (gint32 layer_ID,
+ gboolean *single)
{
GimpRGB col;
gdouble red, green, blue, alpha;
gdouble dev, devSum;
gdouble median, pixels, count, precentile;
- gint32 id;
- id = layer->drawable_id;
devSum = 0;
red = 0;
green = 0;
@@ -1345,7 +1386,7 @@ get_layer_color (GimpDrawable *layer,
alpha = 0;
dev = 0;
- if (gimp_drawable_is_indexed (id))
+ if (gimp_drawable_is_indexed (layer_ID))
{
/* FIXME: We can't do a propper histogram on indexed layers! */
*single = FALSE;
@@ -1353,26 +1394,34 @@ get_layer_color (GimpDrawable *layer,
return col;
}
- /* Are we in RGB mode? */
- if (layer->bpp >= 3)
+ if (gimp_drawable_bpp (layer_ID) >= 3)
{
- gimp_histogram (id, GIMP_HISTOGRAM_RED, 0, 255, &red, &dev, &median, &pixels, &count, &precentile);
+ /* Are we in RGB mode? */
+
+ gimp_histogram (layer_ID, GIMP_HISTOGRAM_RED, 0, 255,
+ &red, &dev, &median, &pixels, &count, &precentile);
devSum += dev;
- gimp_histogram (id, GIMP_HISTOGRAM_GREEN, 0, 255, &green, &dev, &median, &pixels, &count, &precentile);
+ gimp_histogram (layer_ID, GIMP_HISTOGRAM_GREEN, 0, 255,
+ &green, &dev, &median, &pixels, &count, &precentile);
devSum += dev;
- gimp_histogram (id, GIMP_HISTOGRAM_BLUE, 0, 255, &blue, &dev, &median, &pixels, &count, &precentile);
+ gimp_histogram (layer_ID, GIMP_HISTOGRAM_BLUE, 0, 255,
+ &blue, &dev, &median, &pixels, &count, &precentile);
devSum += dev;
}
- /* We are in Grayscale mode (or Indexed) */
else
{
- gimp_histogram (id, GIMP_HISTOGRAM_VALUE, 0, 255, &red, &dev, &median, &pixels, &count, &precentile);
+ /* We are in Grayscale mode (or Indexed) */
+
+ gimp_histogram (layer_ID, GIMP_HISTOGRAM_VALUE, 0, 255,
+ &red, &dev, &median, &pixels, &count, &precentile);
devSum += dev;
green = red;
blue = red;
}
- if (gimp_drawable_has_alpha (id))
- gimp_histogram (id, GIMP_HISTOGRAM_ALPHA, 0, 255, &alpha, &dev, &median, &pixels, &count, &precentile);
+
+ if (gimp_drawable_has_alpha (layer_ID))
+ gimp_histogram (layer_ID, GIMP_HISTOGRAM_ALPHA, 0, 255,
+ &alpha, &dev, &median, &pixels, &count, &precentile);
else
alpha = 255;
@@ -1393,41 +1442,31 @@ get_layer_color (GimpDrawable *layer,
* (freetype and pango differences)
*/
static void
-drawText (GimpDrawable *text_layer,
- gdouble opacity,
- cairo_t *cr,
- gdouble x_res,
- gdouble y_res)
+drawText (gint32 text_id,
+ gdouble opacity,
+ cairo_t *cr,
+ gdouble x_res,
+ gdouble y_res)
{
- gint32 text_id = text_layer->drawable_id;
- GimpImageType type = gimp_drawable_type (text_id);
-
- gchar *text = gimp_text_layer_get_text (text_id);
+ GimpImageType type = gimp_drawable_type (text_id);
+ gchar *text = gimp_text_layer_get_text (text_id);
gchar *markup = gimp_text_layer_get_markup (text_id);
gchar *font_family;
-
cairo_font_options_t *options;
-
gint x;
gint y;
-
GimpRGB color;
-
GimpUnit unit;
gdouble size;
-
GimpTextHintStyle hinting;
-
GimpTextJustification j;
gboolean justify;
PangoAlignment align;
GimpTextDirection dir;
PangoDirection pango_dir;
-
PangoLayout *layout;
PangoContext *context;
PangoFontDescription *font_description;
-
gdouble indent;
gdouble line_spacing;
gdouble letter_spacing;
@@ -1450,7 +1489,8 @@ drawText (GimpDrawable *text_layer,
if (type == GIMP_RGBA_IMAGE)
gimp_text_layer_get_color (text_id, &color);
else
- gimp_image_pick_color (gimp_item_get_image (text_id), text_id, x, y, FALSE, FALSE, 0, &color);
+ gimp_image_pick_color (gimp_item_get_image (text_id),
+ text_id, x, y, FALSE, FALSE, 0, &color);
cairo_set_source_rgba (cr, color.r, color.g, color.b, opacity);
@@ -1481,8 +1521,9 @@ drawText (GimpDrawable *text_layer,
else
cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_NONE);
- /* We are done with cairo's settings.
- * It's time to create the context */
+ /* We are done with cairo's settings. It's time to create the
+ * context
+ */
cairo_set_font_options (cr, options);
context = pango_cairo_create_context (cr);
pango_cairo_context_set_font_options (context, options);
@@ -1497,14 +1538,17 @@ drawText (GimpDrawable *text_layer,
pango_context_set_base_dir (context, pango_dir);
- /* We are done with the context's settings.
- * It's time to create the layout */
+ /* We are done with the context's settings. It's time to create the
+ * layout
+ */
layout = pango_layout_new (context);
/* Font */
font_family = gimp_text_layer_get_font (text_id);
- /* We need to find a way to convert GIMP's returned font name to
- * a normal Pango name... Hopefully GIMP 2.8 with Pango will fix it. */
+
+ /* We need to find a way to convert GIMP's returned font name to a
+ * normal Pango name... Hopefully GIMP 2.8 with Pango will fix it.
+ */
font_description = pango_font_description_from_string (font_family);
/* Font Size */
@@ -1515,8 +1559,8 @@ drawText (GimpDrawable *text_layer,
pango_layout_set_font_description (layout, font_description);
/* Width and height */
- pango_layout_set_width (layout, text_layer->width * PANGO_SCALE);
- pango_layout_set_height (layout, text_layer->height * PANGO_SCALE);
+ pango_layout_set_width (layout, gimp_drawable_width (text_id) * PANGO_SCALE);
+ pango_layout_set_height (layout, gimp_drawable_height (text_id) * PANGO_SCALE);
/* Justification, and Alignment */
justify = FALSE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]