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;
+                    }
                 }
             }
         }



Reply via email to