[gimp/gimp-2-10] plug-ins: #5896. add option for reversing order of layers when importing PDF



commit de95be80a4ecf903ae107312a1ca1baf3b89a557
Author: Stanislav Grinkov <43956-stanislavgrinkov users noreply gitlab gnome org>
Date:   Mon Jan 25 00:46:34 2021 +0600

    plug-ins: #5896. add option for reversing order of layers when importing PDF
    
    This feature adds new 'Load in reverse order' toggle box to allow
    selection of order of PDF pages before importing them as a layers
    or images.

 plug-ins/common/file-pdf-load.c | 41 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 36 insertions(+), 5 deletions(-)
---
diff --git a/plug-ins/common/file-pdf-load.c b/plug-ins/common/file-pdf-load.c
index 60e625fbc8..58b3489e55 100644
--- a/plug-ins/common/file-pdf-load.c
+++ b/plug-ins/common/file-pdf-load.c
@@ -56,15 +56,17 @@ typedef struct
   GimpPageSelectorTarget  target;
   gdouble                 resolution;
   gboolean                antialias;
+  gboolean                reverse_order;
   gchar                  *PDF_password;
 } PdfLoadVals;
 
 static PdfLoadVals loadvals =
 {
   GIMP_PAGE_SELECTOR_TARGET_LAYERS,
-  100.00,  /* 100 dpi   */
-  TRUE,
-  NULL
+  100.00,  /* resolution in dpi   */
+  TRUE,    /* antialias */
+  FALSE,   /* reverse_order */
+  NULL     /* pdf_password */
 };
 
 typedef struct
@@ -87,6 +89,7 @@ static gint32            load_image        (PopplerDocument        *doc,
                                             GimpPageSelectorTarget  target,
                                             gdouble                 resolution,
                                             gboolean                antialias,
+                                            gboolean                reverse_order,
                                             PdfSelectedPages       *pages);
 
 static GimpPDBStatusType load_dialog       (PopplerDocument        *doc,
@@ -538,6 +541,7 @@ run (const gchar      *name,
                                  loadvals.target,
                                  loadvals.resolution,
                                  loadvals.antialias,
+                                 loadvals.reverse_order,
                                  &pages);
 
           if (image_ID != -1)
@@ -1021,6 +1025,7 @@ load_image (PopplerDocument        *doc,
             GimpPageSelectorTarget  target,
             gdouble                 resolution,
             gboolean                antialias,
+            gboolean                reverse_order,
             PdfSelectedPages       *pages)
 {
   gint32   image_ID = 0;
@@ -1028,6 +1033,14 @@ load_image (PopplerDocument        *doc,
   gint     i;
   gdouble  scale;
   gdouble  doc_progress = 0;
+  gint     base_index   = 0;
+  gint     sign         = 1;
+
+  if (reverse_order && pages->n_pages > 0)
+    {
+      base_index = pages->n_pages - 1;
+      sign = -1;
+    }
 
   if (target == GIMP_PAGE_SELECTOR_TARGET_IMAGES)
     images = g_new0 (gint32, pages->n_pages);
@@ -1049,8 +1062,11 @@ load_image (PopplerDocument        *doc,
       cairo_surface_t *surface;
       gint             width;
       gint             height;
+      gint             page_index;
+
+      page_index = base_index + sign * i;
 
-      page = poppler_document_get_page (doc, pages->pages[i]);
+      page = poppler_document_get_page (doc, pages->pages[page_index]);
 
       poppler_page_get_size (page, &page_width, &page_height);
       width  = page_width  * scale;
@@ -1245,6 +1261,8 @@ load_dialog (PopplerDocument  *doc,
   GtkWidget  *resolution;
   GtkWidget  *antialias;
   GtkWidget  *hbox;
+  GtkWidget  *reverse_order;
+  GtkWidget  *separator;
 
   ThreadData  thread_data;
   GThread    *thread;
@@ -1335,8 +1353,21 @@ load_dialog (PopplerDocument  *doc,
 
   thread = g_thread_new ("thumbnailer", thumbnail_thread, &thread_data);
 
-  /* Resolution */
+  /* "Load in reverse order" toggle button */
+  reverse_order = gtk_check_button_new_with_mnemonic (_("Load in reverse order"));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (reverse_order), loadvals.reverse_order);
+  gtk_box_pack_start (GTK_BOX (vbox), reverse_order, FALSE, FALSE, 0);
+
+  g_signal_connect (reverse_order, "toggled",
+                    G_CALLBACK (gimp_toggle_button_update), &loadvals.reverse_order);
+  gtk_widget_show (reverse_order);
 
+  /* Separator */
+  separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+  gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);
+  gtk_widget_show (separator);
+
+  /* Resolution */
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
   gtk_widget_show (hbox);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]