[gimp/gimp-2-10] app: factor file_gbr_drawable_to_brush() out of file_gbr_image_to_brush()



commit 2071f3bdc62c6d285b8e69e43f1431b7c633a77a
Author: Michael Natterer <mitch gimp org>
Date:   Wed Feb 27 00:06:17 2019 +0100

    app: factor file_gbr_drawable_to_brush() out of file_gbr_image_to_brush()
    
    (cherry picked from commit 861106a0b3e9d30e5f5622a52036e463d4f44176)

 app/file-data/file-data-gbr.c | 121 ++++++++++++++++++++++++------------------
 app/file-data/file-data-gbr.h |  32 ++++++-----
 2 files changed, 87 insertions(+), 66 deletions(-)
---
diff --git a/app/file-data/file-data-gbr.c b/app/file-data/file-data-gbr.c
index 7a4c25bfed..d1df78e6f4 100644
--- a/app/file-data/file-data-gbr.c
+++ b/app/file-data/file-data-gbr.c
@@ -254,52 +254,11 @@ file_gbr_brush_to_layer (GimpImage *image,
   return layer;
 }
 
-
-/*  private functions  */
-
-static GimpImage *
-file_gbr_brush_to_image (Gimp      *gimp,
-                         GimpBrush *brush)
-{
-  GimpImage         *image;
-  GimpLayer         *layer;
-  const gchar       *name;
-  GimpImageBaseType  base_type;
-  gint               width;
-  gint               height;
-  GimpTempBuf       *mask   = gimp_brush_get_mask   (brush);
-  GimpTempBuf       *pixmap = gimp_brush_get_pixmap (brush);
-  GimpParasite      *parasite;
-
-  if (pixmap)
-    base_type = GIMP_RGB;
-  else
-    base_type = GIMP_GRAY;
-
-  name   = gimp_object_get_name (brush);
-  width  = gimp_temp_buf_get_width  (mask);
-  height = gimp_temp_buf_get_height (mask);
-
-  image = gimp_image_new (gimp, width, height, base_type,
-                          GIMP_PRECISION_U8_GAMMA);
-
-  parasite = gimp_parasite_new ("gimp-brush-name",
-                                GIMP_PARASITE_PERSISTENT,
-                                strlen (name) + 1, name);
-  gimp_image_parasite_attach (image, parasite);
-  gimp_parasite_free (parasite);
-
-  layer = file_gbr_brush_to_layer (image, brush);
-  gimp_image_add_layer (image, layer, NULL, 0, FALSE);
-
-  return image;
-}
-
-static GimpBrush *
-file_gbr_image_to_brush (GimpImage    *image,
-                         GimpDrawable *drawable,
-                         const gchar  *name,
-                         gdouble       spacing)
+GimpBrush *
+file_gbr_drawable_to_brush (GimpDrawable        *drawable,
+                            const GeglRectangle *rect,
+                            const gchar         *name,
+                            gdouble              spacing)
 {
   GimpBrush   *brush;
   GeglBuffer  *buffer;
@@ -308,9 +267,12 @@ file_gbr_image_to_brush (GimpImage    *image,
   gint         width;
   gint         height;
 
+  g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
+  g_return_val_if_fail (rect != NULL, NULL);
+
   buffer = gimp_drawable_get_buffer (drawable);
-  width  = gimp_item_get_width  (GIMP_ITEM (drawable));
-  height = gimp_item_get_height (GIMP_ITEM (drawable));
+  width  = rect->width;
+  height = rect->height;
 
   brush = g_object_new (GIMP_TYPE_BRUSH,
                         "name",      name,
@@ -332,7 +294,7 @@ file_gbr_image_to_brush (GimpImage    *image,
 
           gimp_rgba_set_uchar (&white, 255, 255, 255, 255);
 
-          iter = gegl_buffer_iterator_new (buffer, NULL, 0,
+          iter = gegl_buffer_iterator_new (buffer, rect, 0,
                                            babl_format ("Y'A u8"),
                                            GEGL_ACCESS_READ, GEGL_ABYSS_NONE,
                                            1);
@@ -368,7 +330,7 @@ file_gbr_image_to_brush (GimpImage    *image,
         }
       else
         {
-          gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0,
+          gegl_buffer_get (buffer, rect, 1.0,
                            babl_format ("Y' u8"), m,
                            GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
         }
@@ -381,12 +343,12 @@ file_gbr_image_to_brush (GimpImage    *image,
     {
       pixmap = gimp_temp_buf_new (width, height, babl_format ("R'G'B' u8"));
 
-      gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0,
+      gegl_buffer_get (buffer, rect, 1.0,
                        babl_format ("R'G'B' u8"),
                        gimp_temp_buf_get_data (pixmap),
                        GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
 
-      gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0,
+      gegl_buffer_get (buffer, rect, 1.0,
                        babl_format ("A u8"),
                        gimp_temp_buf_get_data (mask),
                        GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
@@ -398,3 +360,58 @@ file_gbr_image_to_brush (GimpImage    *image,
 
   return brush;
 }
+
+
+/*  private functions  */
+
+static GimpImage *
+file_gbr_brush_to_image (Gimp      *gimp,
+                         GimpBrush *brush)
+{
+  GimpImage         *image;
+  GimpLayer         *layer;
+  const gchar       *name;
+  GimpImageBaseType  base_type;
+  gint               width;
+  gint               height;
+  GimpTempBuf       *mask   = gimp_brush_get_mask   (brush);
+  GimpTempBuf       *pixmap = gimp_brush_get_pixmap (brush);
+  GimpParasite      *parasite;
+
+  if (pixmap)
+    base_type = GIMP_RGB;
+  else
+    base_type = GIMP_GRAY;
+
+  name   = gimp_object_get_name (brush);
+  width  = gimp_temp_buf_get_width  (mask);
+  height = gimp_temp_buf_get_height (mask);
+
+  image = gimp_image_new (gimp, width, height, base_type,
+                          GIMP_PRECISION_U8_GAMMA);
+
+  parasite = gimp_parasite_new ("gimp-brush-name",
+                                GIMP_PARASITE_PERSISTENT,
+                                strlen (name) + 1, name);
+  gimp_image_parasite_attach (image, parasite);
+  gimp_parasite_free (parasite);
+
+  layer = file_gbr_brush_to_layer (image, brush);
+  gimp_image_add_layer (image, layer, NULL, 0, FALSE);
+
+  return image;
+}
+
+static GimpBrush *
+file_gbr_image_to_brush (GimpImage    *image,
+                         GimpDrawable *drawable,
+                         const gchar  *name,
+                         gdouble       spacing)
+{
+  gint width  = gimp_item_get_width  (GIMP_ITEM (drawable));
+  gint height = gimp_item_get_height (GIMP_ITEM (drawable));
+
+  return file_gbr_drawable_to_brush (drawable,
+                                     GEGL_RECTANGLE (0, 0, width, height),
+                                     name, spacing);
+}
diff --git a/app/file-data/file-data-gbr.h b/app/file-data/file-data-gbr.h
index 02fc57490c..fb3bf47ff3 100644
--- a/app/file-data/file-data-gbr.h
+++ b/app/file-data/file-data-gbr.h
@@ -19,22 +19,26 @@
 #define __FILE_DATA_GBR_H__
 
 
-GimpValueArray * file_gbr_load_invoker   (GimpProcedure         *procedure,
-                                          Gimp                  *gimp,
-                                          GimpContext           *context,
-                                          GimpProgress          *progress,
-                                          const GimpValueArray  *args,
-                                          GError               **error);
+GimpValueArray * file_gbr_load_invoker      (GimpProcedure         *procedure,
+                                             Gimp                  *gimp,
+                                             GimpContext           *context,
+                                             GimpProgress          *progress,
+                                             const GimpValueArray  *args,
+                                             GError               **error);
 
-GimpValueArray * file_gbr_save_invoker   (GimpProcedure         *procedure,
-                                          Gimp                  *gimp,
-                                          GimpContext           *context,
-                                          GimpProgress          *progress,
-                                          const GimpValueArray  *args,
-                                          GError               **error);
+GimpValueArray * file_gbr_save_invoker      (GimpProcedure         *procedure,
+                                             Gimp                  *gimp,
+                                             GimpContext           *context,
+                                             GimpProgress          *progress,
+                                             const GimpValueArray  *args,
+                                             GError               **error);
 
-GimpLayer     *  file_gbr_brush_to_layer (GimpImage             *image,
-                                          GimpBrush             *brush);
+GimpLayer      * file_gbr_brush_to_layer    (GimpImage             *image,
+                                             GimpBrush             *brush);
+GimpBrush      * file_gbr_drawable_to_brush (GimpDrawable          *drawable,
+                                             const GeglRectangle   *rect,
+                                             const gchar           *name,
+                                             gdouble                spacing);
 
 
 #endif /* __FILE_DATA_GBR_H__ */


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