Author: lehmi
Date: Sun Sep 15 15:02:06 2024
New Revision: 1920687
URL: http://svn.apache.org/viewvc?rev=1920687&view=rev
Log:
PDFBOX-5660: close InputStream as MemoryCacheImageInputStream doesn't do it
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDMeshBasedShadingType.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java?rev=1920687&r1=1920686&r2=1920687&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
Sun Sep 15 15:02:06 2024
@@ -275,84 +275,89 @@ final class SampledImageReader
final float[] decode = getDecodeArray(pdImage);
DecodeOptions options = new DecodeOptions();
- // read bit stream
- try (ImageInputStream iis = new
MemoryCacheImageInputStream(pdImage.createInputStream(options)))
+ // MemoryCacheImageInputStream doesn't close the wrapped stream
+ try (InputStream imageStream = pdImage.createInputStream(options))
{
- final int inputWidth = pdImage.getWidth();
- final int scanWidth = pdImage.getWidth();
- final int scanHeight = pdImage.getHeight();
+ // read bit stream
+ try (ImageInputStream iis = new
MemoryCacheImageInputStream(imageStream))
+ {
+ final int inputWidth = pdImage.getWidth();
+ final int scanWidth = pdImage.getWidth();
+ final int scanHeight = pdImage.getHeight();
- // create stream
- final float sampleMax = (float) Math.pow(2, bitsPerComponent) - 1f;
- final boolean isIndexed = colorSpace instanceof PDIndexed;
+ // create stream
+ final float sampleMax = (float) Math.pow(2, bitsPerComponent)
- 1f;
+ final boolean isIndexed = colorSpace instanceof PDIndexed;
- // calculate row padding
- int padding = 0;
- if (inputWidth * numComponents * bitsPerComponent % 8 > 0)
- {
- padding = 8 - (inputWidth * numComponents * bitsPerComponent %
8);
- }
+ // calculate row padding
+ int padding = 0;
+ if (inputWidth * numComponents * bitsPerComponent % 8 > 0)
+ {
+ padding = 8 - (inputWidth * numComponents *
bitsPerComponent % 8);
+ }
- // read stream
- final boolean isShort = raster.getDataBuffer().getDataType() ==
DataBuffer.TYPE_USHORT;
- assert !isIndexed || !isShort;
- final byte[] srcColorValuesBytes = isShort ? null : new
byte[numComponents];
- final short[] srcColorValuesShort = isShort ? new
short[numComponents] : null;
- for (int y = 0; y < scanHeight; y++)
- {
- for (int x = 0; x < scanWidth; x++)
+ // read stream
+ final boolean isShort = raster.getDataBuffer()
+ .getDataType() == DataBuffer.TYPE_USHORT;
+ assert !isIndexed || !isShort;
+ final byte[] srcColorValuesBytes = isShort ? null : new
byte[numComponents];
+ final short[] srcColorValuesShort = isShort ? new
short[numComponents] : null;
+ for (int y = 0; y < scanHeight; y++)
{
- for (int c = 0; c < numComponents; c++)
+ for (int x = 0; x < scanWidth; x++)
{
- int value = (int) iis.readBits(bitsPerComponent);
+ for (int c = 0; c < numComponents; c++)
+ {
+ int value = (int) iis.readBits(bitsPerComponent);
- // decode array
- final float dMin = decode[c * 2];
- final float dMax = decode[(c * 2) + 1];
+ // decode array
+ final float dMin = decode[c * 2];
+ final float dMax = decode[(c * 2) + 1];
- // interpolate to domain
- float output = dMin + (value * ((dMax - dMin) /
sampleMax));
+ // interpolate to domain
+ float output = dMin + (value * ((dMax - dMin) /
sampleMax));
- if (isIndexed)
- {
- // indexed color spaces get the raw value, because
the TYPE_BYTE
- // below cannot be reversed by the color space
without it having
- // knowledge of the number of bits per component
- srcColorValuesBytes[c] = (byte) Math.round(output);
- }
- else
- {
- if (isShort)
+ if (isIndexed)
{
- // interpolate to TYPE_SHORT
- int outputShort = Math
- .round(((output - Math.min(dMin,
dMax)) / Math.abs(dMax - dMin)) * 65535f);
-
- srcColorValuesShort[c] = (short) outputShort;
+ // indexed color spaces get the raw value,
because the TYPE_BYTE
+ // below cannot be reversed by the color space
without it having
+ // knowledge of the number of bits per
component
+ srcColorValuesBytes[c] = (byte)
Math.round(output);
}
else
{
- // interpolate to TYPE_BYTE
- int outputByte = Math
- .round(((output - Math.min(dMin,
dMax)) / Math.abs(dMax - dMin)) * 255f);
+ if (isShort)
+ {
+ // interpolate to TYPE_SHORT
+ int outputShort = Math.round(((output -
Math.min(dMin, dMax))
+ / Math.abs(dMax - dMin)) * 65535f);
- srcColorValuesBytes[c] = (byte) outputByte;
+ srcColorValuesShort[c] = (short)
outputShort;
+ }
+ else
+ {
+ // interpolate to TYPE_BYTE
+ int outputByte = Math.round(((output -
Math.min(dMin, dMax))
+ / Math.abs(dMax - dMin)) * 255f);
+
+ srcColorValuesBytes[c] = (byte) outputByte;
+ }
}
}
- }
- if (isShort)
- {
- raster.setDataElements(x, y, srcColorValuesShort);
- }
- else
- {
- raster.setDataElements(x, y, srcColorValuesBytes);
+ if (isShort)
+ {
+ raster.setDataElements(x, y, srcColorValuesShort);
+ }
+ else
+ {
+ raster.setDataElements(x, y, srcColorValuesBytes);
+ }
}
- }
- // rows are padded to the nearest byte
- iis.readBits(padding);
+ // rows are padded to the nearest byte
+ iis.readBits(padding);
+ }
}
}
}
@@ -564,131 +569,141 @@ final class SampledImageReader
DecodeOptions options = new DecodeOptions(currentSubsampling);
options.setSourceRegion(clipped);
- // read bit stream
- try (ImageInputStream iis = new
MemoryCacheImageInputStream(pdImage.createInputStream(options)))
+ // MemoryCacheImageInputStream doesn't close the wrapped stream
+ try (InputStream imageStream = pdImage.createInputStream(options))
{
- final int inputWidth;
- final int startx;
- final int starty;
- final int scanWidth;
- final int scanHeight;
- if (options.isFilterSubsampled())
- {
- // Decode options were honored, and so there is no need for
additional clipping or subsampling
- inputWidth = width;
- startx = 0;
- starty = 0;
- scanWidth = width;
- scanHeight = height;
- currentSubsampling = 1;
- }
- else
+ // read bit stream
+ try (ImageInputStream iis = new
MemoryCacheImageInputStream(imageStream))
{
- // Decode options not honored, so we need to clip and
subsample ourselves.
- inputWidth = pdImage.getWidth();
- startx = clipped.x;
- starty = clipped.y;
- scanWidth = clipped.width;
- scanHeight = clipped.height;
- }
- final float sampleMax = (float) Math.pow(2, bitsPerComponent) - 1f;
- final boolean isIndexed = colorSpace instanceof PDIndexed;
-
- // init color key mask
- float[] colorKeyRanges = null;
- BufferedImage colorKeyMask = null;
- if (colorKey != null)
- {
- if (colorKey.size() >= numComponents * 2)
- {
- colorKeyRanges = colorKey.toFloatArray();
- colorKeyMask = new BufferedImage(width, height,
BufferedImage.TYPE_BYTE_GRAY);
+ final int inputWidth;
+ final int startx;
+ final int starty;
+ final int scanWidth;
+ final int scanHeight;
+ if (options.isFilterSubsampled())
+ {
+ // Decode options were honored, and so there is no need
for additional clipping or subsampling
+ inputWidth = width;
+ startx = 0;
+ starty = 0;
+ scanWidth = width;
+ scanHeight = height;
+ currentSubsampling = 1;
}
else
{
- LOG.warn("colorKey mask size is {}, should be {},
ignored", colorKey.size(),
- numComponents * 2);
+ // Decode options not honored, so we need to clip and
subsample ourselves.
+ inputWidth = pdImage.getWidth();
+ startx = clipped.x;
+ starty = clipped.y;
+ scanWidth = clipped.width;
+ scanHeight = clipped.height;
+ }
+ final float sampleMax = (float) Math.pow(2, bitsPerComponent)
- 1f;
+ final boolean isIndexed = colorSpace instanceof PDIndexed;
+
+ // init color key mask
+ float[] colorKeyRanges = null;
+ BufferedImage colorKeyMask = null;
+ if (colorKey != null)
+ {
+ if (colorKey.size() >= numComponents * 2)
+ {
+ colorKeyRanges = colorKey.toFloatArray();
+ colorKeyMask = new BufferedImage(width, height,
+ BufferedImage.TYPE_BYTE_GRAY);
+ }
+ else
+ {
+ LOG.warn("colorKey mask size is {}, should be {},
ignored", colorKey.size(),
+ numComponents * 2);
+ }
}
- }
- // calculate row padding
- int padding = 0;
- if (inputWidth * numComponents * bitsPerComponent % 8 > 0)
- {
- padding = 8 - (inputWidth * numComponents * bitsPerComponent %
8);
- }
+ // calculate row padding
+ int padding = 0;
+ if (inputWidth * numComponents * bitsPerComponent % 8 > 0)
+ {
+ padding = 8 - (inputWidth * numComponents *
bitsPerComponent % 8);
+ }
- // read stream
- byte[] srcColorValues = new byte[numComponents];
- byte[] alpha = new byte[1];
- for (int y = 0; y < starty + scanHeight; y++)
- {
- for (int x = 0; x < startx + scanWidth; x++)
+ // read stream
+ byte[] srcColorValues = new byte[numComponents];
+ byte[] alpha = new byte[1];
+ for (int y = 0; y < starty + scanHeight; y++)
{
- boolean isMasked = true;
- for (int c = 0; c < numComponents; c++)
+ for (int x = 0; x < startx + scanWidth; x++)
{
- int value = (int)iis.readBits(bitsPerComponent);
-
- // color key mask requires values before they are
decoded
- if (colorKeyRanges != null)
+ boolean isMasked = true;
+ for (int c = 0; c < numComponents; c++)
{
- isMasked &= value >= colorKeyRanges[c * 2] &&
- value <= colorKeyRanges[c * 2 + 1];
- }
+ int value = (int) iis.readBits(bitsPerComponent);
+
+ // color key mask requires values before they are
decoded
+ if (colorKeyRanges != null)
+ {
+ isMasked &= value >= colorKeyRanges[c * 2]
+ && value <= colorKeyRanges[c * 2 + 1];
+ }
- // decode array
- final float dMin = decode[c * 2];
- final float dMax = decode[(c * 2) + 1];
+ // decode array
+ final float dMin = decode[c * 2];
+ final float dMax = decode[(c * 2) + 1];
- // interpolate to domain
- float output = dMin + (value * ((dMax - dMin) /
sampleMax));
+ // interpolate to domain
+ float output = dMin + (value * ((dMax - dMin) /
sampleMax));
- if (isIndexed)
- {
- // indexed color spaces get the raw value, because
the TYPE_BYTE
- // below cannot be reversed by the color space
without it having
- // knowledge of the number of bits per component
- srcColorValues[c] = (byte)Math.round(output);
+ if (isIndexed)
+ {
+ // indexed color spaces get the raw value,
because the TYPE_BYTE
+ // below cannot be reversed by the color space
without it having
+ // knowledge of the number of bits per
component
+ srcColorValues[c] = (byte) Math.round(output);
+ }
+ else
+ {
+ // interpolate to TYPE_BYTE
+ int outputByte = Math.round(
+ ((output - Math.min(dMin, dMax)) /
Math.abs(dMax - dMin))
+ * 255f);
+
+ srcColorValues[c] = (byte) outputByte;
+ }
}
- else
+ // only write to output if within requested region and
subsample.
+ if (x >= startx && y >= starty && x %
currentSubsampling == 0
+ && y % currentSubsampling == 0)
{
- // interpolate to TYPE_BYTE
- int outputByte = Math.round(((output -
Math.min(dMin, dMax)) /
- Math.abs(dMax - dMin)) * 255f);
+ raster.setDataElements((x - startx) /
currentSubsampling,
+ (y - starty) / currentSubsampling,
srcColorValues);
- srcColorValues[c] = (byte)outputByte;
+ // set alpha channel in color key mask, if any
+ if (colorKeyMask != null)
+ {
+ alpha[0] = (byte) (isMasked ? 255 : 0);
+ colorKeyMask.getRaster().setDataElements(
+ (x - startx) / currentSubsampling,
+ (y - starty) / currentSubsampling,
alpha);
+ }
}
}
- // only write to output if within requested region and
subsample.
- if (x >= startx && y >= starty && x % currentSubsampling
== 0 && y % currentSubsampling == 0)
- {
- raster.setDataElements((x - startx) /
currentSubsampling, (y - starty) / currentSubsampling, srcColorValues);
- // set alpha channel in color key mask, if any
- if (colorKeyMask != null)
- {
- alpha[0] = (byte)(isMasked ? 255 : 0);
- colorKeyMask.getRaster().setDataElements((x -
startx) / currentSubsampling, (y - starty) / currentSubsampling, alpha);
- }
- }
+ // rows are padded to the nearest byte
+ iis.readBits(padding);
}
- // rows are padded to the nearest byte
- iis.readBits(padding);
- }
-
- // use the color space to convert the image to RGB
- BufferedImage rgbImage = colorSpace.toRGBImage(raster);
+ // use the color space to convert the image to RGB
+ BufferedImage rgbImage = colorSpace.toRGBImage(raster);
- // apply color mask, if any
- if (colorKeyMask != null)
- {
- return applyColorKeyMask(rgbImage, colorKeyMask);
- }
- else
- {
- return rgbImage;
+ // apply color mask, if any
+ if (colorKeyMask != null)
+ {
+ return applyColorKeyMask(rgbImage, colorKeyMask);
+ }
+ else
+ {
+ return rgbImage;
+ }
}
}
}
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDMeshBasedShadingType.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDMeshBasedShadingType.java?rev=1920687&r1=1920686&r2=1920687&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDMeshBasedShadingType.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDMeshBasedShadingType.java
Sun Sep 15 15:02:06 2024
@@ -21,6 +21,7 @@ import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.EOFException;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -87,64 +88,66 @@ abstract class PDMeshBasedShadingType ex
List<Patch> list = new ArrayList<>();
long maxSrcCoord = (long) Math.pow(2, getBitsPerCoordinate()) - 1;
long maxSrcColor = (long) Math.pow(2, getBitsPerComponent()) - 1;
- COSStream cosStream = (COSStream) dict;
- try (ImageInputStream mciis = new MemoryCacheImageInputStream(
- cosStream.createInputStream()))
+ // MemoryCacheImageInputStream doesn't close the wrapped stream
+ try (InputStream imageStream = ((COSStream) dict).createInputStream())
{
- Point2D[] implicitEdge = new Point2D[4];
- float[][] implicitCornerColor = new float[2][colRange.length];
- byte flag = 0;
-
- try
- {
- flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
- }
- catch (EOFException ex)
- {
- LOG.error(ex);
- return list;
- }
-
- boolean eof = false;
- while (!eof)
+ try (ImageInputStream mciis = new
MemoryCacheImageInputStream(imageStream))
{
+ Point2D[] implicitEdge = new Point2D[4];
+ float[][] implicitCornerColor = new float[2][colRange.length];
+ byte flag = 0;
+
try
{
- boolean isFree = (flag == 0);
- Patch current = readPatch(mciis, isFree, implicitEdge,
implicitCornerColor,
- maxSrcCoord, maxSrcColor, rangeX, rangeY,
colRange, matrix, xform,
- controlPoints);
- if (current == null)
- {
- break;
- }
- list.add(current);
flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
- switch (flag)
- {
- case 0:
- break;
- case 1:
- implicitEdge = current.getFlag1Edge();
- implicitCornerColor = current.getFlag1Color();
- break;
- case 2:
- implicitEdge = current.getFlag2Edge();
- implicitCornerColor = current.getFlag2Color();
- break;
- case 3:
- implicitEdge = current.getFlag3Edge();
- implicitCornerColor = current.getFlag3Color();
- break;
- default:
- LOG.warn("bad flag: {}", flag);
- break;
- }
}
catch (EOFException ex)
{
- eof = true;
+ LOG.error(ex);
+ return list;
+ }
+
+ boolean eof = false;
+ while (!eof)
+ {
+ try
+ {
+ boolean isFree = (flag == 0);
+ Patch current = readPatch(mciis, isFree, implicitEdge,
implicitCornerColor,
+ maxSrcCoord, maxSrcColor, rangeX, rangeY,
colRange, matrix, xform,
+ controlPoints);
+ if (current == null)
+ {
+ break;
+ }
+ list.add(current);
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
+ switch (flag)
+ {
+ case 0:
+ break;
+ case 1:
+ implicitEdge = current.getFlag1Edge();
+ implicitCornerColor = current.getFlag1Color();
+ break;
+ case 2:
+ implicitEdge = current.getFlag2Edge();
+ implicitCornerColor = current.getFlag2Color();
+ break;
+ case 3:
+ implicitEdge = current.getFlag3Edge();
+ implicitCornerColor = current.getFlag3Color();
+ break;
+ default:
+ LOG.warn("bad flag: {}", flag);
+ break;
+ }
+ }
+ catch (EOFException ex)
+ {
+ eof = true;
+ }
}
}
}
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java?rev=1920687&r1=1920686&r2=1920687&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java
Sun Sep 15 15:02:06 2024
@@ -21,6 +21,7 @@ import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.io.EOFException;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -117,86 +118,89 @@ public class PDShadingType4 extends PDTr
List<ShadedTriangle> list = new ArrayList<>();
long maxSrcCoord = (long) Math.pow(2, getBitsPerCoordinate()) - 1;
long maxSrcColor = (long) Math.pow(2, getBitsPerComponent()) - 1;
- COSStream stream = (COSStream) dict;
- try (ImageInputStream mciis = new
MemoryCacheImageInputStream(stream.createInputStream()))
+ // MemoryCacheImageInputStream doesn't close the wrapped stream
+ try (InputStream imageStream = ((COSStream) dict).createInputStream())
{
- byte flag = (byte) 0;
- try
+ try (ImageInputStream mciis = new
MemoryCacheImageInputStream(imageStream))
{
- flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
- }
- catch (EOFException ex)
- {
- LOG.error(ex);
- }
-
- boolean eof = false;
- while (!eof)
- {
- Vertex p0;
- Vertex p1;
- Vertex p2;
- Point2D[] ps;
- float[][] cs;
- int lastIndex;
+ byte flag = (byte) 0;
try
{
- switch (flag)
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
+ }
+ catch (EOFException ex)
+ {
+ LOG.error(ex);
+ }
+
+ boolean eof = false;
+ while (!eof)
+ {
+ Vertex p0;
+ Vertex p1;
+ Vertex p2;
+ Point2D[] ps;
+ float[][] cs;
+ int lastIndex;
+ try
{
+ switch (flag)
+ {
case 0:
- p0 = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY, colRange,
- matrix, xform);
+ p0 = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY,
+ colRange, matrix, xform);
flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
if (flag != 0)
{
LOG.error("bad triangle: {}", flag);
}
- p1 = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY, colRange,
- matrix, xform);
+ p1 = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY,
+ colRange, matrix, xform);
mciis.readBits(bitsPerFlag);
if (flag != 0)
{
LOG.error("bad triangle: {}", flag);
}
- p2 = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY, colRange,
- matrix, xform);
+ p2 = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY,
+ colRange, matrix, xform);
ps = new Point2D[] { p0.point, p1.point, p2.point
};
cs = new float[][] { p0.color, p1.color, p2.color
};
- list.add(new ShadedTriangle(ps, cs));
- flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
- break;
- case 1:
- case 2:
- lastIndex = list.size() - 1;
- if (lastIndex < 0)
- {
- LOG.error("broken data stream: {}",
list.size());
- }
- else
- {
- ShadedTriangle preTri = list.get(lastIndex);
- p2 = readVertex(mciis, maxSrcCoord,
maxSrcColor, rangeX, rangeY,
- colRange, matrix, xform);
- ps = new Point2D[] { flag == 1 ?
preTri.corner[1] : preTri.corner[0],
- preTri.corner[2],
- p2.point };
- cs = new float[][] { flag == 1 ?
preTri.color[1] : preTri.color[0],
- preTri.color[2],
- p2.color };
list.add(new ShadedTriangle(ps, cs));
flag = (byte) (mciis.readBits(bitsPerFlag) &
3);
+ break;
+ case 1:
+ case 2:
+ lastIndex = list.size() - 1;
+ if (lastIndex < 0)
+ {
+ LOG.error("broken data stream: {}",
list.size());
+ }
+ else
+ {
+ ShadedTriangle preTri =
list.get(lastIndex);
+ p2 = readVertex(mciis, maxSrcCoord,
maxSrcColor, rangeX, rangeY,
+ colRange, matrix, xform);
+ ps = new Point2D[] {
+ flag == 1 ? preTri.corner[1] :
preTri.corner[0],
+ preTri.corner[2], p2.point };
+ cs = new float[][] {
+ flag == 1 ? preTri.color[1] :
preTri.color[0],
+ preTri.color[2], p2.color };
+ list.add(new ShadedTriangle(ps, cs));
+ flag = (byte) (mciis.readBits(bitsPerFlag)
& 3);
+ }
+ break;
+ default:
+ LOG.warn("bad flag: {}", flag);
+ break;
}
- break;
- default:
- LOG.warn("bad flag: {}", flag);
- break;
+ }
+ catch (EOFException ex)
+ {
+ eof = true;
}
}
- catch (EOFException ex)
- {
- eof = true;
- }
}
}
return list;
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java?rev=1920687&r1=1920686&r2=1920687&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java
Sun Sep 15 15:02:06 2024
@@ -21,6 +21,7 @@ import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.io.EOFException;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -112,22 +113,26 @@ public class PDShadingType5 extends PDTr
List<Vertex> vlist = new ArrayList<>();
long maxSrcCoord = (long) Math.pow(2, getBitsPerCoordinate()) - 1;
long maxSrcColor = (long) Math.pow(2, getBitsPerComponent()) - 1;
- COSStream cosStream = (COSStream) dict;
- try (ImageInputStream mciis = new
MemoryCacheImageInputStream(cosStream.createInputStream()))
+ // MemoryCacheImageInputStream doesn't close the wrapped stream
+ try (InputStream imageStream = ((COSStream) dict).createInputStream())
{
- boolean eof = false;
- while (!eof)
+ try (ImageInputStream mciis = new
MemoryCacheImageInputStream(imageStream))
{
- Vertex p;
- try
+ boolean eof = false;
+ while (!eof)
{
- p = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX,
rangeY, colRange, matrix, xform);
- vlist.add(p);
- }
- catch (EOFException ex)
- {
- eof = true;
+ Vertex p;
+ try
+ {
+ p = readVertex(mciis, maxSrcCoord, maxSrcColor,
rangeX, rangeY, colRange,
+ matrix, xform);
+ vlist.add(p);
+ }
+ catch (EOFException ex)
+ {
+ eof = true;
+ }
}
}
}