[gimp] app: add gimp_gegl_convert_color_transform() to gimp-gegl-loops.[ch]



commit fa584ef1c1b56edc480e9b6dd16e3ec36ea660ea
Author: Michael Natterer <mitch gimp org>
Date:   Wed Sep 2 20:44:10 2015 +0200

    app: add gimp_gegl_convert_color_transform() to gimp-gegl-loops.[ch]
    
    It's split out of gimp_gegl_convert_color_profile(), used from there,
    and will also be used to color manage image and layer previews.

 app/gegl/gimp-gegl-loops.c |   82 +++++++++++++++++++++++++++++--------------
 app/gegl/gimp-gegl-loops.h |    9 +++++
 2 files changed, 64 insertions(+), 27 deletions(-)
---
diff --git a/app/gegl/gimp-gegl-loops.c b/app/gegl/gimp-gegl-loops.c
index 5d6ac18..239892d 100644
--- a/app/gegl/gimp-gegl-loops.c
+++ b/app/gegl/gimp-gegl-loops.c
@@ -706,22 +706,17 @@ gimp_gegl_convert_color_profile (GeglBuffer               *src_buffer,
   cmsUInt32Number   flags;
   cmsHTRANSFORM     transform;
 
-  /*  FIXME: we need the unconditional full copy only in two cases:
-   *  - if we return without doing anything
-   *  - if there is an alpha channel, because lcms doesn't copy it
-   */
-  gegl_buffer_copy (src_buffer,  src_rect, GEGL_ABYSS_NONE,
-                    dest_buffer, dest_rect);
-
   src_format  = gegl_buffer_get_format (src_buffer);
   dest_format = gegl_buffer_get_format (dest_buffer);
 
   if ((gimp_babl_format_get_base_type (src_format)  != GIMP_RGB) ||
-      (gimp_babl_format_get_base_type (dest_format) != GIMP_RGB))
-    return;
-
-  if (gimp_color_profile_can_gegl_copy (src_profile, dest_profile))
-    return;
+      (gimp_babl_format_get_base_type (dest_format) != GIMP_RGB) ||
+      gimp_color_profile_can_gegl_copy (src_profile, dest_profile))
+    {
+      gegl_buffer_copy (src_buffer,  src_rect, GEGL_ABYSS_NONE,
+                        dest_buffer, dest_rect);
+      return;
+    }
 
   src_lcms  = gimp_color_profile_get_lcms_profile (src_profile);
   dest_lcms = gimp_color_profile_get_lcms_profile (dest_profile);
@@ -740,24 +735,57 @@ gimp_gegl_convert_color_profile (GeglBuffer               *src_buffer,
 
   if (transform)
     {
-      GeglBufferIterator *iter;
+      gimp_gegl_convert_color_transform (src_buffer,  src_rect,  src_format,
+                                         dest_buffer, dest_rect, dest_format,
+                                         transform);
+
+      cmsDeleteTransform (transform);
+    }
+  else
+    {
+      /* FIXME: no idea if this ever happens */
+      gegl_buffer_copy (src_buffer,  src_rect, GEGL_ABYSS_NONE,
+                        dest_buffer, dest_rect);
+    }
+}
+
+void
+gimp_gegl_convert_color_transform (GeglBuffer          *src_buffer,
+                                   const GeglRectangle *src_rect,
+                                   const Babl          *src_format,
+                                   GeglBuffer          *dest_buffer,
+                                   const GeglRectangle *dest_rect,
+                                   const Babl          *dest_format,
+                                   GimpColorTransform   transform)
+{
+  GeglBufferIterator *iter;
+  gboolean            has_alpha;
 
-      iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
-                                       src_format,
-                                       GEGL_ACCESS_READ,
-                                       GEGL_ABYSS_NONE);
+  has_alpha = babl_format_has_alpha (dest_format);
 
-      gegl_buffer_iterator_add (iter, dest_buffer, dest_rect, 0,
-                                dest_format,
-                                GEGL_ACCESS_WRITE,
-                                GEGL_ABYSS_NONE);
+  /* make sure the alpha channel is copied too, lcms doesn't copy it */
+  if (has_alpha)
+    gegl_buffer_copy (src_buffer,  src_rect, GEGL_ABYSS_NONE,
+                      dest_buffer, dest_rect);
 
-      while (gegl_buffer_iterator_next (iter))
-        {
-          cmsDoTransform (transform,
-                          iter->data[0], iter->data[1], iter->length);
-        }
+  iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
+                                   src_format,
+                                   GEGL_ACCESS_READ,
+                                   GEGL_ABYSS_NONE);
 
-      cmsDeleteTransform (transform);
+  gegl_buffer_iterator_add (iter, dest_buffer, dest_rect, 0,
+                            dest_format,
+                            /* use READWRITE for alpha surfaces
+                             * because we must use the alpha channel
+                             * that is already copied, see above
+                             */
+                            has_alpha ?
+                            GEGL_ACCESS_READWRITE: GEGL_ACCESS_WRITE,
+                            GEGL_ABYSS_NONE);
+
+  while (gegl_buffer_iterator_next (iter))
+    {
+      cmsDoTransform (transform,
+                      iter->data[0], iter->data[1], iter->length);
     }
 }
diff --git a/app/gegl/gimp-gegl-loops.h b/app/gegl/gimp-gegl-loops.h
index be6a87a..5a9a6bc 100644
--- a/app/gegl/gimp-gegl-loops.h
+++ b/app/gegl/gimp-gegl-loops.h
@@ -97,5 +97,14 @@ void   gimp_gegl_convert_color_profile (GeglBuffer               *src_buffer,
                                         GimpColorRenderingIntent  intent,
                                         gboolean                  bpc);
 
+void   gimp_gegl_convert_color_transform
+                                       (GeglBuffer               *src_buffer,
+                                        const GeglRectangle      *src_rect,
+                                        const Babl               *src_format,
+                                        GeglBuffer               *dest_buffer,
+                                        const GeglRectangle      *dest_rect,
+                                        const Babl               *dest_format,
+                                        GimpColorTransform        transform);
+
 
 #endif /* __GIMP_GEGL_LOOPS_H__ */


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