Here is a patch that will apply the white point correction after a call to
getXYZ(). This patch can be applied to current git.
Hal
diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc
index 1ca3289..19c4bc8 100644
--- a/poppler/GfxState.cc
+++ b/poppler/GfxState.cc
@@ -618,9 +618,10 @@ void GfxCalGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) {
double X, Y, Z;
getXYZ(color,&X,&Y,&Z);
- in[0] = clip01(X);
- in[1] = clip01(Y);
- in[2] = clip01(Z);
+ // do the white point correction
+ in[0] = clip01(X * whiteX);
+ in[1] = clip01(Y * whiteY);
+ in[2] = clip01(Z * whiteZ);
XYZ2DisplayTransform->doTransform(in,out,1);
*gray = byteToCol(out[0]);
return;
@@ -637,6 +638,10 @@ void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
double r, g, b;
getXYZ(color,&X,&Y,&Z);
+ // do the white point correction
+ X *= whiteX;
+ Y *= whiteY;
+ Z *= whiteZ;
#ifdef USE_CMS
if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) {
Guchar out[gfxColorMaxComps];
@@ -652,9 +657,6 @@ void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
return;
}
#endif
- X *= whiteX;
- Y *= whiteY;
- Z *= whiteZ;
// convert XYZ to RGB, including gamut mapping and gamma correction
r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z;
g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z;
@@ -676,9 +678,10 @@ void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
double X, Y, Z;
getXYZ(color,&X,&Y,&Z);
- in[0] = clip01(X);
- in[1] = clip01(Y);
- in[2] = clip01(Z);
+ // do the white point correction
+ in[0] = clip01(X * whiteX);
+ in[1] = clip01(Y * whiteY);
+ in[2] = clip01(Z * whiteZ);
XYZ2DisplayTransform->doTransform(in,out,1);
cmyk->c = byteToCol(out[0]);
@@ -914,9 +917,9 @@ void GfxCalRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) {
double X, Y, Z;
getXYZ(color,&X,&Y,&Z);
- in[0] = clip01(X);
- in[1] = clip01(Y);
- in[2] = clip01(Z);
+ in[0] = clip01(X * whiteX);
+ in[1] = clip01(Y * whiteY);
+ in[2] = clip01(Z * whiteZ);
XYZ2DisplayTransform->doTransform(in,out,1);
*gray = byteToCol(out[0]);
return;
@@ -933,14 +936,18 @@ void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
double r, g, b;
getXYZ(color,&X,&Y,&Z);
+ // do the white point correction
+ X *= whiteX;
+ Y *= whiteY;
+ Z *= whiteZ;
#ifdef USE_CMS
if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) {
Guchar out[gfxColorMaxComps];
double in[gfxColorMaxComps];
- in[0] = clip01(X/whiteX);
- in[1] = clip01(Y/whiteY);
- in[2] = clip01(Z/whiteZ);
+ in[0] = clip01(X);
+ in[1] = clip01(Y);
+ in[2] = clip01(Z);
XYZ2DisplayTransform->doTransform(in,out,1);
rgb->r = byteToCol(out[0]);
rgb->g = byteToCol(out[1]);
@@ -968,9 +975,10 @@ void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
double X, Y, Z;
getXYZ(color,&X,&Y,&Z);
- in[0] = clip01(X);
- in[1] = clip01(Y);
- in[2] = clip01(Z);
+ // do the white point correction
+ in[0] = clip01(X * whiteX);
+ in[1] = clip01(Y * whiteY);
+ in[2] = clip01(Z * whiteZ);
XYZ2DisplayTransform->doTransform(in,out,1);
cmyk->c = byteToCol(out[0]);
cmyk->m = byteToCol(out[1]);
@@ -1210,6 +1218,10 @@ void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) {
double in[gfxColorMaxComps];
getXYZ(color, &in[0], &in[1], &in[2]);
+ // do the white point correction
+ in[0] *= whiteX;
+ in[1] *= whiteY;
+ in[2] *= whiteZ;
XYZ2DisplayTransform->doTransform(in,out,1);
*gray = byteToCol(out[0]);
return;
@@ -1256,6 +1268,10 @@ void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
double r, g, b;
getXYZ(color, &X, &Y, &Z);
+ // do the white point correction
+ X *= whiteX;
+ Y *= whiteY;
+ Z *= whiteZ;
#ifdef USE_CMS
if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) {
Guchar out[gfxColorMaxComps];
@@ -1271,9 +1287,6 @@ void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
return;
}
#endif
- X *= whiteX;
- Y *= whiteY;
- Z *= whiteZ;
// convert XYZ to RGB, including gamut mapping and gamma correction
r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z;
g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z;
@@ -1293,6 +1306,10 @@ void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
Guchar out[gfxColorMaxComps];
getXYZ(color, &in[0], &in[1], &in[2]);
+ // do the white point correction
+ in[0] *= whiteX;
+ in[1] *= whiteY;
+ in[2] *= whiteZ;
XYZ2DisplayTransform->doTransform(in,out,1);
cmyk->c = byteToCol(out[0]);
cmyk->m = byteToCol(out[1]);
_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler