This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-imaging.git


The following commit(s) were added to refs/heads/master by this push:
     new b15e99bc Reuse Allocator
b15e99bc is described below

commit b15e99bcb7fee887555586bee36fba1e030df52e
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sat May 13 15:54:45 2023 -0400

    Reuse Allocator
---
 .../apache/commons/imaging/common/Allocator.java   | 32 +++++++++++++++++++++-
 .../apache/commons/imaging/common/ZlibDeflate.java |  2 +-
 .../imaging/common/mylzw/MyLzwCompressor.java      |  4 ++-
 .../imaging/formats/dcx/DcxImageParser.java        |  3 +-
 .../imaging/formats/gif/GifImageParser.java        |  6 ++--
 .../imaging/formats/ico/IcoImageParser.java        |  5 ++--
 .../imaging/formats/jpeg/JpegImageParser.java      |  2 +-
 .../imaging/formats/png/PngImageParser.java        |  7 +++--
 .../imaging/formats/tiff/TiffDirectory.java        |  3 +-
 .../imaging/formats/tiff/TiffImageParser.java      |  3 +-
 10 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/common/Allocator.java 
b/src/main/java/org/apache/commons/imaging/common/Allocator.java
index 26a50038..873250e9 100644
--- a/src/main/java/org/apache/commons/imaging/common/Allocator.java
+++ b/src/main/java/org/apache/commons/imaging/common/Allocator.java
@@ -17,6 +17,7 @@
 
 package org.apache.commons.imaging.common;
 
+import java.util.ArrayList;
 import java.util.function.IntFunction;
 
 /**
@@ -35,7 +36,21 @@ public class Allocator {
     }
 
     /**
-     * Allocates an Object array of type T of the requested size.
+     * Allocates an Object of type T of the requested size.
+     *
+     * @param <T> The return array type
+     * @param request The requested size.
+     * @param factory The array factory.
+     * @return a new byte array.
+     * @throws AllocationRequestException Thrown when the request exceeds the 
limit.
+     * @see #check(int)
+     */
+    public static <T> T apply(final int request, final IntFunction<T> factory) 
{
+        return factory.apply(check(request));
+    }
+
+    /**
+     * Allocates an array of type T of the requested size.
      *
      * @param <T> The return array type
      * @param request The requested size.
@@ -45,9 +60,24 @@ public class Allocator {
      * @see #check(int)
      */
     public static <T> T[] array(final int request, final IntFunction<T[]> 
factory) {
+        // We could pass in a shallow object byte size to multiply with the 
request.
+        // The shallow byte size would need to be computed and hard-coded in 
statics.
         return factory.apply(check(request));
     }
 
+    /**
+     * Allocates an Object array of type T of the requested size.
+     *
+     * @param <T> The return array type
+     * @param request The requested size.
+     * @return a new byte array.
+     * @throws AllocationRequestException Thrown when the request exceeds the 
limit.
+     * @see #check(int)
+     */
+    public static <T> ArrayList<T> arrayList(final int request) {
+        return apply(request, ArrayList::new);
+    }
+
     /**
      * Allocates a byte array of the requested size.
      *
diff --git a/src/main/java/org/apache/commons/imaging/common/ZlibDeflate.java 
b/src/main/java/org/apache/commons/imaging/common/ZlibDeflate.java
index f2180fe7..68b72457 100644
--- a/src/main/java/org/apache/commons/imaging/common/ZlibDeflate.java
+++ b/src/main/java/org/apache/commons/imaging/common/ZlibDeflate.java
@@ -48,7 +48,7 @@ public class ZlibDeflate {
      * @see DeflaterOutputStream
      */
     public static byte[] compress(final byte[] bytes) throws 
ImageWriteException {
-        final ByteArrayOutputStream out = new 
ByteArrayOutputStream(bytes.length / 2);
+        final ByteArrayOutputStream out = new 
ByteArrayOutputStream(Allocator.check(bytes.length / 2));
         try (DeflaterOutputStream compressOut = new DeflaterOutputStream(out)) 
{
             compressOut.write(bytes);
         } catch (final IOException e) {
diff --git 
a/src/main/java/org/apache/commons/imaging/common/mylzw/MyLzwCompressor.java 
b/src/main/java/org/apache/commons/imaging/common/mylzw/MyLzwCompressor.java
index c0edebfa..91b2aa42 100644
--- a/src/main/java/org/apache/commons/imaging/common/mylzw/MyLzwCompressor.java
+++ b/src/main/java/org/apache/commons/imaging/common/mylzw/MyLzwCompressor.java
@@ -22,6 +22,8 @@ import java.nio.ByteOrder;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.imaging.common.Allocator;
+
 public class MyLzwCompressor {
     private static final class ByteArray {
         private final byte[] bytes;
@@ -173,7 +175,7 @@ public class MyLzwCompressor {
     }
 
     public byte[] compress(final byte[] bytes) throws IOException {
-        final ByteArrayOutputStream baos = new 
ByteArrayOutputStream(bytes.length);
+        final ByteArrayOutputStream baos = new 
ByteArrayOutputStream(Allocator.check(bytes.length));
         final MyBitOutputStream bos = new MyBitOutputStream(baos, byteOrder);
 
         initializeStringTable();
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
index 630b6dac..d83a8599 100644
--- a/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
@@ -34,6 +34,7 @@ import org.apache.commons.imaging.ImageInfo;
 import org.apache.commons.imaging.ImageParser;
 import org.apache.commons.imaging.ImageReadException;
 import org.apache.commons.imaging.ImageWriteException;
+import org.apache.commons.imaging.common.Allocator;
 import org.apache.commons.imaging.common.BinaryOutputStream;
 import org.apache.commons.imaging.common.ImageMetadata;
 import org.apache.commons.imaging.common.bytesource.ByteSource;
@@ -158,7 +159,7 @@ public class DcxImageParser extends 
ImageParser<PcxImagingParameters> {
             throws ImageReadException, IOException {
         try (InputStream is = byteSource.getInputStream()) {
             final int id = read4Bytes("Id", is, "Not a Valid DCX File", 
getByteOrder());
-            final List<Long> pageTable = new ArrayList<>(1024);
+            final List<Long> pageTable = Allocator.arrayList(1024);
             for (int i = 0; i < 1024; i++) {
                 final long pageOffset = 0xFFFFffffL & read4Bytes("PageTable", 
is, "Not a Valid DCX File", getByteOrder());
                 if (pageOffset == 0) {
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java
index 4359f5cf..cfdf5546 100644
--- a/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java
@@ -177,7 +177,7 @@ public class GifImageParser extends 
ImageParser<GifImagingParameters> implements
             throw new ImageReadException("GIF: Invalid amount of Graphic 
Control Extensions");
         }
 
-        final List<GifImageData> imageData = new 
ArrayList<>(descriptors.size());
+        final List<GifImageData> imageData = 
Allocator.arrayList(descriptors.size());
         for(int i = 0; i < descriptors.size(); i++) {
             final ImageDescriptor descriptor = descriptors.get(i);
             if (descriptor == null) {
@@ -237,7 +237,7 @@ public class GifImageParser extends 
ImageParser<GifImagingParameters> implements
         }
 
         final List<GifImageData> imageData = findAllImageData(imageContents);
-        final List<BufferedImage> result = new ArrayList<>(imageData.size());
+        final List<BufferedImage> result = 
Allocator.arrayList(imageData.size());
         for(final GifImageData id : imageData) {
             result.add(getBufferedImage(ghi, id, 
imageContents.globalColorTable));
         }
@@ -492,7 +492,7 @@ public class GifImageParser extends 
ImageParser<GifImagingParameters> implements
         }
 
         final List<GifImageData> imageData = findAllImageData(imageContents);
-        final List<GifImageMetadataItem> metadataItems = new 
ArrayList<>(imageData.size());
+        final List<GifImageMetadataItem> metadataItems = 
Allocator.arrayList(imageData.size());
         for(final GifImageData id : imageData) {
             final DisposalMethod disposalMethod = 
createDisposalMethodFromIntValue(id.gce.dispose);
             metadataItems.add(new GifImageMetadataItem(id.gce.delay, 
id.descriptor.imageLeftPosition, id.descriptor.imageTopPosition, 
disposalMethod));
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
index 00df52b6..f650ce80 100644
--- a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
@@ -30,7 +30,6 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.nio.ByteOrder;
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.imaging.ImageFormat;
@@ -265,7 +264,7 @@ public class IcoImageParser extends 
ImageParser<IcoImagingParameters> {
         final ImageContents contents = readImage(byteSource);
 
         final FileHeader fileHeader = contents.fileHeader;
-        final List<BufferedImage> result = new 
ArrayList<>(fileHeader.iconCount);
+        final List<BufferedImage> result = 
Allocator.arrayList(fileHeader.iconCount);
         for (int i = 0; i < fileHeader.iconCount; i++) {
             result.add(contents.iconDatas[i].readBufferedImage());
         }
@@ -437,7 +436,7 @@ public class IcoImageParser extends 
ImageParser<IcoImagingParameters> {
                 : colorsUsed);
         final int bitmapSize = 14 + 56 + restOfFile.length;
 
-        final ByteArrayOutputStream baos = new 
ByteArrayOutputStream(bitmapSize);
+        final ByteArrayOutputStream baos = new 
ByteArrayOutputStream(Allocator.check(bitmapSize));
         try (BinaryOutputStream bos = BinaryOutputStream.littleEndian(baos)) {
             bos.write('B');
             bos.write('M');
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
index 8ca31d3e..4dad4ba4 100644
--- a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
@@ -464,7 +464,7 @@ public class JpegImageParser extends 
ImageParser<JpegImagingParameters> implemen
 
         final List<Segment> commentSegments = readSegments(byteSource,
                 new int[] { JpegConstants.COM_MARKER}, false);
-        final List<String> comments = new ArrayList<>(commentSegments.size());
+        final List<String> comments = 
Allocator.arrayList(commentSegments.size());
         for (final Segment commentSegment : commentSegments) {
             final ComSegment comSegment = (ComSegment) commentSegment;
             comments.add(new String(comSegment.getComment(), 
StandardCharsets.UTF_8));
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java
index 0ea28510..39a60f4d 100644
--- a/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java
@@ -47,6 +47,7 @@ import org.apache.commons.imaging.ImageInfo;
 import org.apache.commons.imaging.ImageParser;
 import org.apache.commons.imaging.ImageReadException;
 import org.apache.commons.imaging.ImageWriteException;
+import org.apache.commons.imaging.common.Allocator;
 import org.apache.commons.imaging.common.GenericImageMetadata;
 import org.apache.commons.imaging.common.ImageMetadata;
 import org.apache.commons.imaging.common.XmpEmbeddable;
@@ -335,7 +336,7 @@ public class PngImageParser extends 
ImageParser<PngImagingParameters>  implement
     public List<String> getChunkTypes(final InputStream is)
             throws ImageReadException, IOException {
         final List<PngChunk> chunks = readChunks(is, null, false);
-        final List<String> chunkTypes = new ArrayList<>(chunks.size());
+        final List<String> chunkTypes = Allocator.arrayList(chunks.size());
         for (final PngChunk chunk : chunks) {
             chunkTypes.add(getChunkTypeName(chunk.chunkType));
         }
@@ -442,8 +443,8 @@ public class PngImageParser extends 
ImageParser<PngImagingParameters>  implement
         final List<PngChunk> iTXts = filterChunks(chunks, ChunkType.iTXt);
 
         final int chunkCount = tEXts.size() + zTXts.size() + iTXts.size();
-        final List<String> comments = new ArrayList<>(chunkCount);
-        final List<PngText> textChunks = new ArrayList<>(chunkCount);
+        final List<String> comments = Allocator.arrayList(chunkCount);
+        final List<PngText> textChunks = Allocator.arrayList(chunkCount);
 
         for (final PngChunk tEXt : tEXts) {
             final PngChunkText pngChunktEXt = (PngChunkText) tEXt;
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java 
b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
index 6ade7bef..8374ee24 100644
--- a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
+++ b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.commons.imaging.ImageReadException;
+import org.apache.commons.imaging.common.Allocator;
 import org.apache.commons.imaging.common.ByteConversions;
 import org.apache.commons.imaging.common.RationalNumber;
 import org.apache.commons.imaging.formats.tiff.constants.TiffConstants;
@@ -727,7 +728,7 @@ public class TiffDirectory extends TiffElement {
                     + ") != byteCounts.length(" + byteCounts.length + ")");
         }
 
-        final List<ImageDataElement> result = new ArrayList<>(offsets.length);
+        final List<ImageDataElement> result = 
Allocator.arrayList(offsets.length);
         for (int i = 0; i < offsets.length; i++) {
             result.add(new ImageDataElement(offsets[i], byteCounts[i]));
         }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
index cfd7aa79..a1e83a6b 100644
--- a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
@@ -43,6 +43,7 @@ import org.apache.commons.imaging.ImageInfo;
 import org.apache.commons.imaging.ImageParser;
 import org.apache.commons.imaging.ImageReadException;
 import org.apache.commons.imaging.ImageWriteException;
+import org.apache.commons.imaging.common.Allocator;
 import org.apache.commons.imaging.common.ImageBuilder;
 import org.apache.commons.imaging.common.ImageMetadata;
 import org.apache.commons.imaging.common.XmpEmbeddable;
@@ -520,7 +521,7 @@ public class TiffImageParser extends 
ImageParser<TiffImagingParameters> implemen
         // dunno if this handles colormapped images correctly.
 
         final List<TiffField> entries = directory.entries;
-        final List<String> comments = new ArrayList<>(entries.size());
+        final List<String> comments = Allocator.arrayList(entries.size());
         for (final TiffField field : entries) {
             final String comment = field.toString();
             comments.add(comment);

Reply via email to