From 2071f3bdc62c6d285b8e69e43f1431b7c633a77a Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Wed, 27 Feb 2019 00:06:17 +0100 Subject: [PATCH] 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 | 207 ++++++++++++++++++---------------- app/file-data/file-data-gbr.h | 32 +++--- 2 files changed, 130 insertions(+), 109 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,6 +254,113 @@ file_gbr_brush_to_layer (GimpImage *image, return layer; } +GimpBrush * +file_gbr_drawable_to_brush (GimpDrawable *drawable, + const GeglRectangle *rect, + const gchar *name, + gdouble spacing) +{ + GimpBrush *brush; + GeglBuffer *buffer; + GimpTempBuf *mask; + GimpTempBuf *pixmap = NULL; + 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 = rect->width; + height = rect->height; + + brush = g_object_new (GIMP_TYPE_BRUSH, + "name", name, + "mime-type", "image/x-gimp-gbr", + "spacing", spacing, + NULL); + + mask = gimp_temp_buf_new (width, height, babl_format ("Y u8")); + + if (gimp_drawable_is_gray (drawable)) + { + guchar *m = gimp_temp_buf_get_data (mask); + gint i; + + if (gimp_drawable_has_alpha (drawable)) + { + GeglBufferIterator *iter; + GimpRGB white; + + gimp_rgba_set_uchar (&white, 255, 255, 255, 255); + + iter = gegl_buffer_iterator_new (buffer, rect, 0, + babl_format ("Y'A u8"), + GEGL_ACCESS_READ, GEGL_ABYSS_NONE, + 1); + + while (gegl_buffer_iterator_next (iter)) + { + guint8 *data = (guint8 *) iter->items[0].data; + gint j; + + for (j = 0; j < iter->length; j++) + { + GimpRGB gray; + gint x, y; + gint dest; + + gimp_rgba_set_uchar (&gray, + data[0], data[0], data[0], + data[1]); + + gimp_rgb_composite (&gray, &white, + GIMP_RGB_COMPOSITE_BEHIND); + + x = iter->items[0].roi.x + j % iter->items[0].roi.width; + y = iter->items[0].roi.y + j / iter->items[0].roi.width; + + dest = y * width + x; + + gimp_rgba_get_uchar (&gray, &m[dest], NULL, NULL, NULL); + + data += 2; + } + } + } + else + { + gegl_buffer_get (buffer, rect, 1.0, + babl_format ("Y' u8"), m, + GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); + } + + /* invert */ + for (i = 0; i < width * height; i++) + m[i] = 255 - m[i]; + } + else + { + pixmap = gimp_temp_buf_new (width, height, babl_format ("R'G'B' u8")); + + 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, rect, 1.0, + babl_format ("A u8"), + gimp_temp_buf_get_data (mask), + GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); + } + + + brush->priv->mask = mask; + brush->priv->pixmap = pixmap; + + return brush; +} + /* private functions */ @@ -301,100 +408,10 @@ file_gbr_image_to_brush (GimpImage *image, const gchar *name, gdouble spacing) { - GimpBrush *brush; - GeglBuffer *buffer; - GimpTempBuf *mask; - GimpTempBuf *pixmap = NULL; - gint width; - gint height; + gint width = gimp_item_get_width (GIMP_ITEM (drawable)); + gint height = gimp_item_get_height (GIMP_ITEM (drawable)); - buffer = gimp_drawable_get_buffer (drawable); - width = gimp_item_get_width (GIMP_ITEM (drawable)); - height = gimp_item_get_height (GIMP_ITEM (drawable)); - - brush = g_object_new (GIMP_TYPE_BRUSH, - "name", name, - "mime-type", "image/x-gimp-gbr", - "spacing", spacing, - NULL); - - mask = gimp_temp_buf_new (width, height, babl_format ("Y u8")); - - if (gimp_drawable_is_gray (drawable)) - { - guchar *m = gimp_temp_buf_get_data (mask); - gint i; - - if (gimp_drawable_has_alpha (drawable)) - { - GeglBufferIterator *iter; - GimpRGB white; - - gimp_rgba_set_uchar (&white, 255, 255, 255, 255); - - iter = gegl_buffer_iterator_new (buffer, NULL, 0, - babl_format ("Y'A u8"), - GEGL_ACCESS_READ, GEGL_ABYSS_NONE, - 1); - - while (gegl_buffer_iterator_next (iter)) - { - guint8 *data = (guint8 *) iter->items[0].data; - gint j; - - for (j = 0; j < iter->length; j++) - { - GimpRGB gray; - gint x, y; - gint dest; - - gimp_rgba_set_uchar (&gray, - data[0], data[0], data[0], - data[1]); - - gimp_rgb_composite (&gray, &white, - GIMP_RGB_COMPOSITE_BEHIND); - - x = iter->items[0].roi.x + j % iter->items[0].roi.width; - y = iter->items[0].roi.y + j / iter->items[0].roi.width; - - dest = y * width + x; - - gimp_rgba_get_uchar (&gray, &m[dest], NULL, NULL, NULL); - - data += 2; - } - } - } - else - { - gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, width, height), 1.0, - babl_format ("Y' u8"), m, - GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); - } - - /* invert */ - for (i = 0; i < width * height; i++) - m[i] = 255 - m[i]; - } - else - { - 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, - 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, - babl_format ("A u8"), - gimp_temp_buf_get_data (mask), - GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE); - } - - - brush->priv->mask = mask; - brush->priv->pixmap = pixmap; - - return brush; + 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__ */