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()
{