[gimp] Bug 621363 - CMYK decompose broken



commit 731fa3081d74440e0eea24ab56dd3b1d4002212c
Author: Rupert Weber <rpwh gmx de>
Date:   Sat Jul 3 12:57:41 2010 +0200

    Bug 621363 - CMYK decompose broken
    
    The CMYK Decompose/Recompose plugin used its own (faulty) algorithm
    for RGB<->CMYK conversions. This fix changes the plugin to use the
    conversion routines provided by libgimpcolorspace.

 plug-ins/common/compose.c   |   48 +++++++++-----------
 plug-ins/common/decompose.c |  101 +++++++++++++++++++++++--------------------
 2 files changed, 75 insertions(+), 74 deletions(-)
---
diff --git a/plug-ins/common/compose.c b/plug-ins/common/compose.c
index fa8b912..ffc5ac4 100644
--- a/plug-ins/common/compose.c
+++ b/plug-ins/common/compose.c
@@ -1152,39 +1152,33 @@ compose_cmyk (guchar **src,
   register const guchar *black_src   = src[3];
   register       guchar *rgb_dst     = dst;
   register       gint    count       = numpix;
-  gint cyan, magenta, yellow, black;
-  gint cyan_incr    = incr_src[0];
-  gint magenta_incr = incr_src[1];
-  gint yellow_incr  = incr_src[2];
-  gint black_incr   = incr_src[3];
+  gint    cyan_incr    = incr_src[0];
+  gint    magenta_incr = incr_src[1];
+  gint    yellow_incr  = incr_src[2];
+  gint    black_incr   = incr_src[3];
+  GimpRGB grgb;
+
+  gimp_rgb_set(&grgb, 0, 0, 0);
 
   while (count-- > 0)
     {
-      black = (gint)*black_src;
-      if (black)
-        {
-          cyan    = (gint) *cyan_src;
-          magenta = (gint) *magenta_src;
-          yellow  = (gint) *yellow_src;
+      GimpCMYK gcmyk;
+      guchar   r, g, b;
 
-          cyan    += black; if (cyan > 255) cyan = 255;
-          magenta += black; if (magenta > 255) magenta = 255;
-          yellow  += black; if (yellow > 255) yellow = 255;
+      gimp_cmyk_set_uchar (&gcmyk,
+                           *cyan_src, *magenta_src, *yellow_src,
+                           *black_src);
+      gimp_cmyk_to_rgb (&gcmyk, &grgb);
+      gimp_rgb_get_uchar (&grgb, &r, &g, &b);
 
-          *(rgb_dst++) = 255 - cyan;
-          *(rgb_dst++) = 255 - magenta;
-          *(rgb_dst++) = 255 - yellow;
-        }
-      else
-        {
-          *(rgb_dst++) = 255 - *cyan_src;
-          *(rgb_dst++) = 255 - *magenta_src;
-          *(rgb_dst++) = 255 - *yellow_src;
-        }
-      cyan_src += cyan_incr;
+      *rgb_dst++ = r;
+      *rgb_dst++ = g;
+      *rgb_dst++ = b;
+
+      cyan_src    += cyan_incr;
       magenta_src += magenta_incr;
-      yellow_src += yellow_incr;
-      black_src += black_incr;
+      yellow_src  += yellow_incr;
+      black_src   += black_incr;
 
       if (dst_has_alpha)
         rgb_dst++;
diff --git a/plug-ins/common/decompose.c b/plug-ins/common/decompose.c
index d55e964..d304b0a 100644
--- a/plug-ins/common/decompose.c
+++ b/plug-ins/common/decompose.c
@@ -1158,28 +1158,25 @@ extract_cmyk (const guchar  *src,
   register guchar *magenta_dst = dst[1];
   register guchar *yellow_dst = dst[2];
   register guchar *black_dst = dst[3];
-  register guchar k, s;
   register gint count = numpix, offset = bpp-3;
+  GimpCMYK gcmyk;
+
+  gimp_cmyk_set (&gcmyk, 0, 0, 0, 0);
 
   while (count-- > 0)
     {
-      *cyan_dst = k = 255 - *(rgb_src++);
-      *magenta_dst = s = 255 - *(rgb_src++);
-      if (s < k)
-        k = s;
-      *yellow_dst = s = 255 - *(rgb_src++);
-      if (s < k)
-        k = s;                /* Black intensity is minimum of c, m, y */
-      if (k)
-        {
-          *cyan_dst -= k;     /* Remove common part of c, m, y */
-          *magenta_dst -= k;
-          *yellow_dst -= k;
-        }
-      cyan_dst++;
-      magenta_dst++;
-      yellow_dst++;
-      *(black_dst++) = k;
+      GimpRGB grgb;
+      guchar  r, g, b;
+
+      r = *rgb_src++;
+      g = *rgb_src++;
+      b = *rgb_src++;
+
+      gimp_rgb_set_uchar (&grgb, r,g,b);
+      gimp_rgb_to_cmyk (&grgb, 1.0, &gcmyk);
+      gimp_cmyk_get_uchar (&gcmyk,
+                           cyan_dst++, magenta_dst++, yellow_dst++,
+                           black_dst++);
 
       rgb_src += offset;
     }
@@ -1194,18 +1191,23 @@ extract_cyank (const guchar  *src,
 {
   register const guchar *rgb_src = src;
   register guchar *cyan_dst = dst[0];
-  register guchar s, k;
   register gint count = numpix, offset = bpp-3;
+  GimpCMYK gcmyk;
+
+  gimp_cmyk_set(&gcmyk, 0, 0, 0, 0);
 
   while (count-- > 0)
     {
-      *cyan_dst = k = 255 - *(rgb_src++);
-      s = 255 - *(rgb_src++);  /* magenta */
-      if (s < k) k = s;
-      s = 255 - *(rgb_src++);  /* yellow */
-      if (s < k) k = s;
-      if (k) *cyan_dst -= k;
-      cyan_dst++;
+      GimpRGB grgb;
+      guchar  r, g, b;
+
+      r = *rgb_src++;
+      g = *rgb_src++;
+      b = *rgb_src++;
+
+      gimp_rgb_set_uchar (&grgb, r,g,b);
+      gimp_rgb_to_cmyk (&grgb, 1.0, &gcmyk);
+      gimp_cmyk_get_uchar (&gcmyk, cyan_dst++, NULL, NULL, NULL);
 
       rgb_src += offset;
     }
@@ -1220,21 +1222,23 @@ extract_magentak (const guchar  *src,
 {
   register const guchar *rgb_src = src;
   register guchar *magenta_dst = dst[0];
-  register guchar s, k;
   register gint count = numpix, offset = bpp-3;
+  GimpCMYK gcmyk;
+
+  gimp_cmyk_set(&gcmyk, 0, 0, 0, 0);
 
   while (count-- > 0)
     {
-      k = 255 - *(rgb_src++);  /* cyan */
-      *magenta_dst = s = 255 - *(rgb_src++);  /* magenta */
-      if (s < k)
-        k = s;
-      s = 255 - *(rgb_src++);  /* yellow */
-      if (s < k)
-        k = s;
-      if (k)
-        *magenta_dst -= k;
-      magenta_dst++;
+      GimpRGB grgb;
+      guchar  r, g, b;
+
+      r = *rgb_src++;
+      g = *rgb_src++;
+      b = *rgb_src++;
+
+      gimp_rgb_set_uchar (&grgb, r,g,b);
+      gimp_rgb_to_cmyk (&grgb, 1.0, &gcmyk);
+      gimp_cmyk_get_uchar (&gcmyk, NULL, magenta_dst++, NULL, NULL);
 
       rgb_src += offset;
     }
@@ -1250,20 +1254,23 @@ extract_yellowk (const guchar  *src,
 {
   register const guchar *rgb_src = src;
   register guchar *yellow_dst = dst[0];
-  register guchar s, k;
   register gint count = numpix, offset = bpp-3;
+  GimpCMYK gcmyk;
+
+  gimp_cmyk_set(&gcmyk, 0, 0, 0, 0);
 
   while (count-- > 0)
     {
-      k = 255 - *(rgb_src++);  /* cyan */
-      s = 255 - *(rgb_src++);  /* magenta */
-      if (s < k) k = s;
-      *yellow_dst = s = 255 - *(rgb_src++);
-      if (s < k)
-        k = s;
-      if (k)
-        *yellow_dst -= k;
-      yellow_dst++;
+      GimpRGB grgb;
+      guchar  r, g, b;
+
+      r = *rgb_src++;
+      g = *rgb_src++;
+      b = *rgb_src++;
+
+      gimp_rgb_set_uchar (&grgb, r,g,b);
+      gimp_rgb_to_cmyk (&grgb, 1.0, &gcmyk);
+      gimp_cmyk_get_uchar (&gcmyk, NULL, NULL, yellow_dst++, NULL);
 
       rgb_src += offset;
     }



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