[gegl] gegl/buffer: use a tempbuf for pix conversions when setting cols



commit 267f9aa40272ec444ecbcc37af029769294b0f88
Author: Øyvind Kolås <pippin gimp org>
Date:   Wed Dec 27 14:08:30 2017 +0100

    gegl/buffer: use a tempbuf for pix conversions when setting cols

 gegl/buffer/gegl-buffer-access.c |   29 +++++++++++++++++++++++++----
 1 files changed, 25 insertions(+), 4 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 21b488c..d3b4ef3 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -1607,10 +1607,31 @@ gegl_buffer_set (GeglBuffer          *buffer,
   if (format == NULL)
     format = buffer->soft_format;
 
-  if (rect && (rect->width == 1 && rect->height == 1))
-      _gegl_buffer_set_pixel (buffer, rect->x, rect->y, format, src,
-                              GEGL_BUFFER_SET_FLAG_LOCK|GEGL_BUFFER_SET_FLAG_NOTIFY);
-  else
+  if (rect && (rect->width == 1))
+    {
+      if (rect->height == 1)
+        {
+          _gegl_buffer_set_pixel (buffer, rect->x, rect->y,
+                                  format, src,
+                                  GEGL_BUFFER_SET_FLAG_LOCK|
+                                  GEGL_BUFFER_SET_FLAG_NOTIFY);
+          return;
+        }
+      else
+        {
+          int bpp = babl_format_get_bytes_per_pixel (buffer->soft_format);
+          if (buffer->soft_format != format)
+            {
+              uint8_t tmp[rect->width * rect->height * bpp];
+              babl_process (babl_fish (format, buffer->soft_format),
+                            src, &tmp[0], rect->height);
+              _gegl_buffer_set_with_flags (buffer, rect, level, buffer->soft_format, tmp, rowstride,
+                        GEGL_BUFFER_SET_FLAG_LOCK|
+                        GEGL_BUFFER_SET_FLAG_NOTIFY);
+            }
+        }
+    }
+
     _gegl_buffer_set_with_flags (buffer, rect, level, format, src, rowstride,
                                  GEGL_BUFFER_SET_FLAG_LOCK|
                                  GEGL_BUFFER_SET_FLAG_NOTIFY);


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