diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc index ab796f7..dc41e66 100644 --- a/poppler/GfxState.cc +++ b/poppler/GfxState.cc @@ -2864,12 +2864,16 @@ void GfxSeparationColorSpace::getGray(GfxColor *color, GfxGray *gray) { GfxColor color2; int i; - x = colToDbl(color->c[0]); - func->transform(&x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); + if (alt->getMode() == csDeviceGray && name->cmp("Black") == 0) { + *gray = clip01(gfxColorComp1 - color->c[0]); + } else { + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getGray(&color2, gray); } - alt->getGray(&color2, gray); } void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { @@ -2878,12 +2882,18 @@ void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { GfxColor color2; int i; - x = colToDbl(color->c[0]); - func->transform(&x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); + if (alt->getMode() == csDeviceGray && name->cmp("Black") == 0) { + rgb->r = clip01(gfxColorComp1 - color->c[0]); + rgb->g = clip01(gfxColorComp1 - color->c[0]); + rgb->b = clip01(gfxColorComp1 - color->c[0]); + } else { + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getRGB(&color2, rgb); } - alt->getRGB(&color2, rgb); } void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { @@ -2892,12 +2902,34 @@ void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { GfxColor color2; int i; - x = colToDbl(color->c[0]); - func->transform(&x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); + if (name->cmp("Black") == 0) { + cmyk->c = 0; + cmyk->m = 0; + cmyk->y = 0; + cmyk->k = color->c[0]; + } else if (name->cmp("Cyan") == 0) { + cmyk->c = color->c[0]; + cmyk->m = 0; + cmyk->y = 0; + cmyk->k = 0; + } else if (name->cmp("Magenta") == 0) { + cmyk->c = 0; + cmyk->m = color->c[0]; + cmyk->y = 0; + cmyk->k = 0; + } else if (name->cmp("Yellow") == 0) { + cmyk->c = 0; + cmyk->m = 0; + cmyk->y = color->c[0]; + cmyk->k = 0; + } else { + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getCMYK(&color2, cmyk); } - alt->getCMYK(&color2, cmyk); } void GfxSeparationColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) {