You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2023/12/19 10:00:49 UTC

svn commit: r1914769 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java

Author: tilman
Date: Tue Dec 19 10:00:49 2023
New Revision: 1914769

URL: http://svn.apache.org/viewvc?rev=1914769&view=rev
Log:
PDFBOX-5738: revert workaround from 5488 and ignore 4 channel YCbCr and remove related code, as suggested by Harald Kuhr; see also twelvemonkeys github issue #878

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java?rev=1914769&r1=1914768&r2=1914769&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java Tue Dec 19 10:00:49 2023
@@ -21,6 +21,7 @@ import java.awt.image.BufferedImage;
 import java.awt.image.DataBufferByte;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -32,13 +33,12 @@ import javax.imageio.ImageReader;
 import javax.imageio.metadata.IIOMetadata;
 import javax.imageio.metadata.IIOMetadataNode;
 import javax.imageio.stream.ImageInputStream;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.pdfbox.cos.COSDictionary;
+
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
@@ -55,21 +55,6 @@ final class DCTFilter extends Filter
     private static final int POS_TRANSFORM = 11;
     private static final String ADOBE = "Adobe";
 
-    private static XPathExpression xPathExpression;
-
-    static
-    {
-        try
-        {
-            xPathExpression = XPathFactory.newInstance().newXPath().compile("Chroma/ColorSpaceType/@name");
-        }
-        catch (XPathExpressionException ex)
-        {
-            // shouldn't happen unless you changed the expression
-            LOG.error(ex.getMessage(), ex);
-        }
-    }
-
     @Override
     public DecodeResult decode(InputStream encoded, OutputStream decoded, COSDictionary
             parameters, int index, DecodeOptions options) throws IOException
@@ -146,14 +131,14 @@ final class DCTFilter extends Filter
                 int colorTransform = transform != null ? transform : 0;
 
                 // 0 = Unknown (RGB or CMYK), 1 = YCbCr, 2 = YCCK
+                // https://exiftool.org/TagNames/JPEG.html#Adobe
                 switch (colorTransform)
                 {
                     case 0:
                         // already CMYK
                         break;
                     case 1:
-                        raster = fromYCbCrtoCMYK(raster);
-                        break;
+                        LOG.warn("There is no 4 channel YCbCr, using YCCK");
                     case 2:
                         raster = fromYCCKtoCMYK(raster);
                         break;
@@ -212,24 +197,6 @@ final class DCTFilter extends Filter
                 return Integer.valueOf(adobe.getAttribute("transform"));
             }
         }
-
-        // PDFBOX-5488: plan B: use ColorSpaceType from the other metadata tree.
-        try
-        {
-            String value = xPathExpression.evaluate(metadata.getAsTree("javax_imageio_1.0"));
-            if ("YCbCr".equals(value))
-            {
-                return 1;
-            }
-            if ("YCCK".equals(value))
-            {
-                return 2;
-            }
-        }
-        catch (XPathExpressionException ex)
-        {
-            return 0;
-        }
         return 0;
     }
 
@@ -304,44 +271,6 @@ final class DCTFilter extends Filter
 
                 // naive RGB to CMYK
                 int cyan = 255 - r;
-                int magenta = 255 - g;
-                int yellow = 255 - b;
-
-                // update new raster
-                value[0] = cyan;
-                value[1] = magenta;
-                value[2] = yellow;
-                value[3] = (int)K;
-                writableRaster.setPixel(x, y, value);
-            }
-        }
-        return writableRaster;
-    }
-
-    private WritableRaster fromYCbCrtoCMYK(Raster raster)
-    {
-        WritableRaster writableRaster = raster.createCompatibleWritableRaster();
-
-        int[] value = new int[4];
-        for (int y = 0, height = raster.getHeight(); y < height; y++)
-        {
-            for (int x = 0, width = raster.getWidth(); x < width; x++)
-            {
-                raster.getPixel(x, y, value);
-
-                // 4-channels 0..255
-                float Y = value[0];
-                float Cb = value[1];
-                float Cr = value[2];
-                float K = value[3];
-
-                // YCbCr to RGB, see http://www.equasys.de/colorconversion.html
-                int r = clamp( (1.164f * (Y-16)) + (1.596f * (Cr - 128)) );
-                int g = clamp( (1.164f * (Y-16)) + (-0.392f * (Cb-128)) + (-0.813f * (Cr-128)));
-                int b = clamp( (1.164f * (Y-16)) + (2.017f * (Cb-128)));
-
-                // naive RGB to CMYK
-                int cyan = 255 - r;
                 int magenta = 255 - g;
                 int yellow = 255 - b;