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 2020/08/26 18:15:10 UTC

svn commit: r1881225 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java

Author: tilman
Date: Wed Aug 26 18:15:10 2020
New Revision: 1881225

URL: http://svn.apache.org/viewvc?rev=1881225&view=rev
Log:
PDFBOX-4847: refactor, split large method

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java?rev=1881225&r1=1881224&r2=1881225&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java Wed Aug 26 18:15:10 2020
@@ -83,6 +83,10 @@ final class PNGConverter
     private static final int CHUNK_SPLT = 0x73504C54; // sPLT: 115 80 76 84
     private static final int CHUNK_TIME = 0x74494D45; // tIME: 116 73 77 69
 
+    // CRC Reference Implementation, see
+    // https://www.w3.org/TR/2003/REC-PNG-20031110/#D-CRCAppendix
+    // for details
+
     /* Table of CRCs of all 8-bit messages. */
     private static final int[] CRC_TABLE = new int[256];
 
@@ -400,71 +404,81 @@ final class PNGConverter
         if (state.iCCP != null || state.sRGB != null)
         {
             // We have got a color profile, which we must attach
+            COSStream cosStream = createCOSStreamwithIccProfile(document, colorSpace, state);
+            if (cosStream == null)
+            {
+                return null;
+            }
             COSArray array = new COSArray();
             array.add(COSName.ICCBASED);
-            PDStream pdStream = new PDStream(document);
-            array.add(pdStream);
-            COSStream cosStream = pdStream.getCOSObject();
-            cosStream.setInt(COSName.N, colorSpace.getNumberOfComponents());
-            cosStream.setItem(COSName.ALTERNATE, colorSpace.getNumberOfComponents()
-                    == 1 ? COSName.DEVICEGRAY : COSName.DEVICERGB);
-            cosStream.setItem(COSName.FILTER, COSName.FLATE_DECODE);
-            if (state.iCCP != null)
-            {
-                // We need to skip over the name
-                int iccProfileDataStart = 0;
-                while (iccProfileDataStart < 80 && iccProfileDataStart < state.iCCP.length)
-                {
-                    if (state.iCCP.bytes[state.iCCP.start + iccProfileDataStart] == 0)
-                        break;
-                    iccProfileDataStart++;
-                }
-                iccProfileDataStart++;
-                if (iccProfileDataStart >= state.iCCP.length)
-                {
-                    LOG.error("Invalid iCCP chunk, to few bytes");
-                    return null;
-                }
-                byte compressionMethod = state.iCCP.bytes[state.iCCP.start + iccProfileDataStart];
-                if (compressionMethod != 0)
-                {
-                    LOG.error(String.format("iCCP chunk: invalid compression method %d",
-                            compressionMethod));
-                    return null;
-                }
-                // Skip over the compression method
-                iccProfileDataStart++;
+            array.add(cosStream);
+            PDICCBased profile = PDICCBased.create(array, null);
+            imageXObject.setColorSpace(profile);
+        }
+        return imageXObject;
+    }
 
-                OutputStream rawOutputStream = cosStream.createRawOutputStream();
-                try
-                {
-                    rawOutputStream.write(state.iCCP.bytes, state.iCCP.start + iccProfileDataStart,
-                            state.iCCP.length - iccProfileDataStart);
-                }
-                finally
+    private static COSStream createCOSStreamwithIccProfile
+        (PDDocument document, PDColorSpace colorSpace, PNGConverterState state) throws IOException
+    {
+        COSStream cosStream = document.getDocument().createCOSStream();
+        cosStream.setInt(COSName.N, colorSpace.getNumberOfComponents());
+        cosStream.setItem(COSName.ALTERNATE, colorSpace.getNumberOfComponents()
+                == 1 ? COSName.DEVICEGRAY : COSName.DEVICERGB);
+        cosStream.setItem(COSName.FILTER, COSName.FLATE_DECODE);
+        if (state.iCCP != null)
+        {
+            // We need to skip over the name
+            int iccProfileDataStart = 0;
+            while (iccProfileDataStart < 80 && iccProfileDataStart < state.iCCP.length)
+            {
+                if (state.iCCP.bytes[state.iCCP.start + iccProfileDataStart] == 0)
                 {
-                    rawOutputStream.close();
+                    break;
                 }
+                iccProfileDataStart++;
             }
-            else
+            iccProfileDataStart++;
+            if (iccProfileDataStart >= state.iCCP.length)
             {
-                // We tag the image with the sRGB profile
-                ICC_Profile rgbProfile = ICC_Profile.getInstance(ColorSpace.CS_sRGB);
-                OutputStream outputStream = cosStream.createOutputStream();
-                try
-                {
-                    outputStream.write(rgbProfile.getData());
-                }
-                finally
-                {
-                    outputStream.close();
-                }
+                LOG.error("Invalid iCCP chunk, to few bytes");
+                return null;
+            }
+            byte compressionMethod = state.iCCP.bytes[state.iCCP.start + iccProfileDataStart];
+            if (compressionMethod != 0)
+            {
+                LOG.error(String.format("iCCP chunk: invalid compression method %d",
+                        compressionMethod));
+                return null;
+            }
+            // Skip over the compression method
+            iccProfileDataStart++;
+            OutputStream rawOutputStream = cosStream.createRawOutputStream();
+            try
+            {
+                rawOutputStream.write(state.iCCP.bytes, state.iCCP.start + iccProfileDataStart,
+                        state.iCCP.length - iccProfileDataStart);
+            }
+            finally
+            {
+                rawOutputStream.close();
             }
-
-            PDICCBased profile = PDICCBased.create(array, null);
-            imageXObject.setColorSpace(profile);
         }
-        return imageXObject;
+        else
+        {
+            // We tag the image with the sRGB profile
+            ICC_Profile rgbProfile = ICC_Profile.getInstance(ColorSpace.CS_sRGB);
+            OutputStream outputStream = cosStream.createOutputStream();
+            try
+            {
+                outputStream.write(rgbProfile.getData());
+            }
+            finally
+            {
+                outputStream.close();
+            }
+        }
+        return cosStream;
     }
 
     private static COSDictionary buildDecodeParams(PNGConverterState state, PDColorSpace colorSpace)
@@ -896,10 +910,6 @@ final class PNGConverter
         return null;
     }
 
-    // CRC Reference Implementation, see
-    // https://www.w3.org/TR/2003/REC-PNG-20031110/#D-CRCAppendix
-    // for details
-
     /* Make the table for a fast CRC. */
     private static void makeCrcTable()
     {