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.
This commit is contained in:
Rupert Weber 2010-07-03 12:57:41 +02:00 committed by Sven Neumann
parent 999f00bd27
commit 731fa3081d
2 changed files with 75 additions and 74 deletions

View File

@ -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++;

View File

@ -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;
}