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

Reply via email to