diff -rup plug-ins/common/compose.c ../gimp-2.6.9-rpwh/plug-ins/common/compose.c
--- plug-ins/common/compose.c	2009-07-20 22:20:51.000000000 +0200
+++ ../gimp-2.6.9-rpwh/plug-ins/common/compose.c	2010-06-29 01:15:37.000000000 +0200
@@ -1153,35 +1153,30 @@ 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];
+  GimpRGB grgb;
+  GimpCMYK gcmyk;
+  guchar r,g,b;
+
+  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;
-
-	  cyan    += black; if (cyan > 255) cyan = 255;
-	  magenta += black; if (magenta > 255) magenta = 255;
-	  yellow  += black; if (yellow > 255) yellow = 255;
-
-	  *(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;
-	}
+      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++ = r;
+      *rgb_dst++ = g;
+      *rgb_dst++ = b;
+
       cyan_src += cyan_incr;
       magenta_src += magenta_incr;
       yellow_src += yellow_incr;
diff -rup plug-ins/common/decompose.c ../gimp-2.6.9-rpwh/plug-ins/common/decompose.c
--- plug-ins/common/decompose.c	2009-07-20 22:20:51.000000000 +0200
+++ ../gimp-2.6.9-rpwh/plug-ins/common/decompose.c	2010-06-29 01:15:37.000000000 +0200
@@ -1159,28 +1159,26 @@ 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;
+  GimpRGB grgb;
+  GimpCMYK gcmyk;
+  guchar r,g,b;
+
+  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;
+      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;
     }
@@ -1195,18 +1193,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;
+  GimpRGB grgb;
+  GimpCMYK gcmyk;
+  guchar r,g,b;
+
+  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++;
+      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;
     }
@@ -1221,22 +1224,24 @@ 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;
+  GimpRGB grgb;
+  GimpCMYK gcmyk;
+  guchar r,g,b;
+
+  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++;
+      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;
     }
 }
@@ -1251,20 +1256,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;
+  GimpRGB grgb;
+  GimpCMYK gcmyk;
+  guchar r,g,b;
+
+  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++;
+      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;
     }
