[gimp] plug-ins: lots of cleanup in file-pdf-save before porting to GEGL



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]