[gimp] app: add gimp_gegl_convert_color_transform() to gimp-gegl-loops.[ch]
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add gimp_gegl_convert_color_transform() to gimp-gegl-loops.[ch]
- Date: Wed, 2 Sep 2015 18:46:13 +0000 (UTC)
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]