[gimp] plug-ins: new "root-layers-only" argument to file-pdf-save.



commit 2be2c43c9c809fbacc767353e938cfc53dfbae2e
Author: Jehan <jehan girinstud io>
Date:   Sat Sep 10 22:56:01 2022 +0200

    plug-ins: new "root-layers-only" argument to file-pdf-save.
    
    Something I wanted to implement for a long time and today I finally took
    the time after I had one more annoying case where I had to merge all
    groups for exporting then undo for saving!
    
    Now this won't be needed anymore as the plug-in will allow to export
    only as pages any first-level layers (groups included, so you could
    gather your page compositions in root layer groups). For me, it's the
    only way I use this when making/editing PDFs with GIMP, but maybe some
    people would still want GIMP to crawl into groups and subgroups and
    export layers individually. That's why I make it an option, defaulting
    at TRUE.

 plug-ins/common/file-pdf-save.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/plug-ins/common/file-pdf-save.c b/plug-ins/common/file-pdf-save.c
index f941bae18b..2f562ed70f 100644
--- a/plug-ins/common/file-pdf-save.c
+++ b/plug-ins/common/file-pdf-save.c
@@ -251,6 +251,7 @@ static gboolean         draw_layer               (GimpLayer           **layers,
                                                   gboolean              show_progress,
                                                   gdouble               progress_start,
                                                   gdouble               progress_end,
+                                                  gint                  layer_level,
                                                   GError              **error);
 
 
@@ -363,6 +364,12 @@ pdf_create_procedure (GimpPlugIn  *plug_in,
                              FALSE,
                              G_PARAM_READWRITE);
 
+      GIMP_PROC_ARG_BOOLEAN (procedure, "root-layers-only",
+                             "Root layers only",
+                             "Only the root layers are considered pages",
+                             TRUE,
+                             G_PARAM_READWRITE);
+
       GIMP_PROC_ARG_BOOLEAN (procedure, "convert-text-layers",
                              "Convert text layers to image",
                              "Convert text layers to raster graphics",
@@ -831,7 +838,7 @@ pdf_save_image (GimpProcedure        *procedure,
                              */
                             (gdouble) j / n_layers,
                             (gdouble) (j + 1) / n_layers,
-                            error))
+                            0, error))
             {
               /* free the resources */
               g_free (layers);
@@ -939,6 +946,9 @@ gui_single (GimpProcedure       *procedure,
                                            GIMP_PROCEDURE_CONFIG (config),
                                            image);
 
+  gimp_procedure_dialog_fill_box (GIMP_PROCEDURE_DIALOG (window),
+                                  "pages-box",
+                                  "reverse-order", "root-layers-only", NULL);
   /* XXX the "layers-as-pages" checkbox label used to be changing,
    * showing "top layers first" or "bottom layers first" depending on
    * the value of "reverse-order". Should we want this? Or do it
@@ -946,7 +956,7 @@ gui_single (GimpProcedure       *procedure,
    */
   widget = gimp_procedure_dialog_fill_frame (GIMP_PROCEDURE_DIALOG (window),
                                             "pages-frame", "layers-as-pages", FALSE,
-                                            "reverse-order");
+                                            "pages-box");
   g_free (gimp_image_get_layers (multi_page.images[0], &n_layers));
   gtk_widget_set_sensitive (widget, n_layers > 1);
 
@@ -1826,6 +1836,7 @@ draw_layer (GimpLayer           **layers,
             gboolean              show_progress,
             gdouble               progress_start,
             gdouble               progress_end,
+            gint                  layer_level,
             GError              **error)
 {
   GimpLayer *layer;
@@ -1834,6 +1845,7 @@ draw_layer (GimpLayer           **layers,
   gboolean   ignore_hidden;
   gboolean   layers_as_pages;
   gboolean   reverse_order;
+  gboolean   root_layers_only;
   gboolean   convert_text;
 
   g_object_get (config,
@@ -1841,6 +1853,7 @@ draw_layer (GimpLayer           **layers,
                 "ignore-hidden",       &ignore_hidden,
                 "layers-as-pages",     &layers_as_pages,
                 "reverse-order",       &reverse_order,
+                "root-layers-only",    &root_layers_only,
                 "convert-text-layers", &convert_text,
                 NULL);
 
@@ -1869,13 +1882,17 @@ draw_layer (GimpLayer           **layers,
                             show_progress,
                             progress_start + i * (progress_end - progress_start) / children_num,
                             progress_end,
-                            error))
+                            layer_level + 1, error))
             {
               g_free (children);
               return FALSE;
             }
         }
       g_free (children);
+
+      if (root_layers_only && layers_as_pages &&
+          children_num > 0 && layer_level == 0)
+        cairo_show_page (cr);
     }
   else
     {
@@ -1957,7 +1974,7 @@ draw_layer (GimpLayer           **layers,
         }
 
       /* draw new page if "layers as pages" option is checked */
-      if (layers_as_pages)
+      if (layers_as_pages && (! root_layers_only || layer_level == 0))
         cairo_show_page (cr);
 
       /* We are done with the layer - time to free some resources */


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