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
commit 83e7540bc9654001825e0c2325801b1387bbe5ad Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat May 13 17:50:37 2023 -0400 Smarter allocation checking --- pom.xml | 6 +++ .../apache/commons/imaging/common/Allocator.java | 7 ++-- .../commons/imaging/common/BasicCParser.java | 2 +- .../commons/imaging/common/RationalNumber.java | 2 + .../imaging/formats/ico/IcoImageParser.java | 7 ++-- .../imaging/formats/jpeg/decoder/Block.java | 1 + .../imaging/formats/jpeg/decoder/JpegDecoder.java | 6 +-- .../formats/jpeg/decoder/JpegInputStream.java | 1 + .../imaging/formats/jpeg/segments/SofnSegment.java | 3 +- .../imaging/formats/jpeg/segments/SosSegment.java | 3 +- .../formats/tiff/fieldtypes/FieldTypeAscii.java | 2 +- .../formats/tiff/fieldtypes/FieldTypeRational.java | 6 ++- .../formats/tiff/taginfos/TagInfoAscii.java | 2 +- .../formats/tiff/write/ImageDataOffsets.java | 2 +- .../commons/imaging/icc/IccProfileParser.java | 2 +- .../commons/imaging/palette/ColorSpaceSubset.java | 1 + .../commons/imaging/palette/QuantizedPalette.java | 2 +- .../imaging/formats/ico/PrintShallowSizes.java} | 22 +++-------- .../formats/jpeg/decoder/PrintShallowSizes.java} | 21 +++------- .../formats/tiff/write/PrintShallowSizes.java} | 21 +++------- .../imaging/palette/PrintShallowSizes.java} | 21 +++------- .../imaging/test/util/PrintShallowObjectSizes.java | 45 ++++++++++++++++++++++ 22 files changed, 101 insertions(+), 84 deletions(-) diff --git a/pom.xml b/pom.xml index f724a2e5..d720bd4f 100644 --- a/pom.xml +++ b/pom.xml @@ -229,6 +229,12 @@ <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> + <dependency> + <groupId>org.openjdk.jol</groupId> + <artifactId>jol-core</artifactId> + <version>0.17</version> + <scope>test</scope> + </dependency> </dependencies> <reporting> 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 873250e9..979adeb4 100644 --- a/src/main/java/org/apache/commons/imaging/common/Allocator.java +++ b/src/main/java/org/apache/commons/imaging/common/Allocator.java @@ -55,14 +55,13 @@ public class Allocator { * @param <T> The return array type * @param request The requested size. * @param factory The array factory. + * @param shallowByteSize The shallow byte size. * @return a new byte array. * @throws AllocationRequestException Thrown when the request exceeds the limit. * @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)); + public static <T> T[] array(final int request, final IntFunction<T[]> factory, final int shallowByteSize) { + return factory.apply(check(request * shallowByteSize)); } /** diff --git a/src/main/java/org/apache/commons/imaging/common/BasicCParser.java b/src/main/java/org/apache/commons/imaging/common/BasicCParser.java index 2b4d67c6..3fbd432c 100644 --- a/src/main/java/org/apache/commons/imaging/common/BasicCParser.java +++ b/src/main/java/org/apache/commons/imaging/common/BasicCParser.java @@ -353,7 +353,7 @@ public class BasicCParser { ++numLiveTokens; } } - final String[] liveTokens = Allocator.array(numLiveTokens, String[]::new); + final String[] liveTokens = Allocator.array(numLiveTokens, String[]::new, 24); int next = 0; for (final String token : tokens) { if (token != null && !token.isEmpty()) { diff --git a/src/main/java/org/apache/commons/imaging/common/RationalNumber.java b/src/main/java/org/apache/commons/imaging/common/RationalNumber.java index 4e4eccf3..5312bce5 100644 --- a/src/main/java/org/apache/commons/imaging/common/RationalNumber.java +++ b/src/main/java/org/apache/commons/imaging/common/RationalNumber.java @@ -182,6 +182,8 @@ public class RationalNumber extends Number { public final boolean unsignedType; + public static final int SHALLOW_SIZE = 32; + /** * Constructs an instance based on signed integers * @param numerator a 32-bit signed integer 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 f650ce80..aaf16562 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 @@ -161,7 +161,7 @@ public class IcoImageParser extends ImageParser<IcoImagingParameters> { throws ImageReadException; } - private static class IconInfo { + static class IconInfo { public final byte width; public final byte height; public final byte colorCount; @@ -170,6 +170,7 @@ public class IcoImageParser extends ImageParser<IcoImagingParameters> { public final int bitCount; public final int imageSize; public final int imageOffset; + static final int SHALLOW_SIZE = 32; IconInfo(final byte width, final byte height, final byte colorCount, final byte reserved, final int planes, @@ -580,12 +581,12 @@ public class IcoImageParser extends ImageParser<IcoImagingParameters> { try (InputStream is = byteSource.getInputStream()) { final FileHeader fileHeader = readFileHeader(is); - final IconInfo[] fIconInfos = Allocator.array(fileHeader.iconCount, IconInfo[]::new); + final IconInfo[] fIconInfos = Allocator.array(fileHeader.iconCount, IconInfo[]::new, IconInfo.SHALLOW_SIZE); for (int i = 0; i < fileHeader.iconCount; i++) { fIconInfos[i] = readIconInfo(is); } - final IconData[] fIconDatas = Allocator.array(fileHeader.iconCount, IconData[]::new); + final IconData[] fIconDatas = Allocator.array(fileHeader.iconCount, IconData[]::new, 32); for (int i = 0; i < fileHeader.iconCount; i++) { final byte[] iconData = byteSource.getBlock( fIconInfos[i].imageOffset, fIconInfos[i].imageSize); diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java index 8fa21961..281f9b7e 100644 --- a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java +++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/Block.java @@ -21,6 +21,7 @@ final class Block { final int[] samples; final int width; final int height; + static final int SHALLOW_SIZE = 24; Block(final int width, final int height) { this.samples = Allocator.intArray(width * height); diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java index 75d9aeee..d91f3f0a 100644 --- a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java +++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegDecoder.java @@ -109,7 +109,7 @@ public class JpegDecoder extends BinaryFileParser implements JpegUtils.Visitor { final List<Integer> intervalStarts = getIntervalStartPositions(scanPayload); // get number of intervals in payload to init an array of appropriate length final int intervalCount = intervalStarts.size(); - final JpegInputStream[] streams = Allocator.array(intervalCount, JpegInputStream[]::new); + final JpegInputStream[] streams = Allocator.array(intervalCount, JpegInputStream[]::new, JpegInputStream.SHALLOW_SIZE); for (int i = 0; i < intervalCount; i++) { final int from = intervalStarts.get(i); int to; @@ -142,7 +142,7 @@ public class JpegDecoder extends BinaryFileParser implements JpegUtils.Visitor { private final float[] block = new float[64]; private Block[] allocateMCUMemory() throws ImageReadException { - final Block[] mcu = Allocator.array(sosSegment.numberOfComponents, Block[]::new); + final Block[] mcu = Allocator.array(sosSegment.numberOfComponents, Block[]::new, 24); for (int i = 0; i < sosSegment.numberOfComponents; i++) { final SosSegment.Component scanComponent = sosSegment.getComponents(i); SofnSegment.Component frameComponent = null; @@ -445,7 +445,7 @@ public class JpegDecoder extends BinaryFileParser implements JpegUtils.Visitor { final int xMCUs = (sofnSegment.width + hSize - 1) / hSize; final int yMCUs = (sofnSegment.height + vSize - 1) / vSize; final Block[] mcu = allocateMCUMemory(); - final Block[] scaledMCU = Allocator.array(mcu.length, Block[]::new); + final Block[] scaledMCU = Allocator.array(mcu.length, Block[]::new, Block.SHALLOW_SIZE); Arrays.setAll(scaledMCU, i -> new Block(hSize, vSize)); final int[] preds = Allocator.intArray(sofnSegment.numberOfComponents); ColorModel colorModel; diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java index a6fa6fcf..67cfbe98 100644 --- a/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java +++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/decoder/JpegInputStream.java @@ -27,6 +27,7 @@ class JpegInputStream { private int nextPos; private int cnt; private int b; + static final int SHALLOW_SIZE = 32; JpegInputStream(final int[] interval) { this.interval = Arrays.copyOf(interval, interval.length); diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java index 99278825..72f0aa27 100644 --- a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java +++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SofnSegment.java @@ -36,6 +36,7 @@ public class SofnSegment extends Segment { public final int horizontalSamplingFactor; public final int verticalSamplingFactor; public final int quantTabDestSelector; + static final int SHALLOW_SIZE = 32; public Component(final int componentIdentifier, final int horizontalSamplingFactor, final int veritcalSamplingFactor, final int quantTabDestSelector) { @@ -74,7 +75,7 @@ public class SofnSegment extends Segment { if (numberOfComponents < 0) { throw new ImageReadException("The number of components in a SOF0Segment cannot be less than 0!"); } - components = Allocator.array(numberOfComponents, Component[]::new); + components = Allocator.array(numberOfComponents, Component[]::new, Component.SHALLOW_SIZE); for (int i = 0; i < numberOfComponents; i++) { final int componentIdentifier = readByte("ComponentIdentifier", is, "Not a Valid JPEG File"); diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java index 620c885f..61a74532 100644 --- a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java +++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/SosSegment.java @@ -32,6 +32,7 @@ public class SosSegment extends Segment { public final int scanComponentSelector; public final int dcCodingTableSelector; public final int acCodingTableSelector; + static final int SHALLOW_SIZE = 24; public Component(final int scanComponentSelector, final int dcCodingTableSelector, final int acCodingTableSelector) { @@ -68,7 +69,7 @@ public class SosSegment extends Segment { // Debug.debug("number_of_components_in_scan", // numberOfComponents); - components = Allocator.array(numberOfComponents, Component[]::new); + components = Allocator.array(numberOfComponents, Component[]::new, Component.SHALLOW_SIZE); for (int i = 0; i < numberOfComponents; i++) { final int scanComponentSelector = readByte("scanComponentSelector", is, "Not a Valid JPEG File"); // Debug.debug("scanComponentSelector", scanComponentSelector); diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java index 5b354783..5ec277c5 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java +++ b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeAscii.java @@ -40,7 +40,7 @@ public class FieldTypeAscii extends FieldType { nullCount++; } } - final String[] strings = Allocator.array(nullCount, String[]::new); + final String[] strings = Allocator.array(nullCount, String[]::new, 24); int stringsAdded = 0; strings[0] = ""; // if we have a 0 length string int nextStringPos = 0; diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java index 04572b81..a0ae6839 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java +++ b/src/main/java/org/apache/commons/imaging/formats/tiff/fieldtypes/FieldTypeRational.java @@ -57,7 +57,8 @@ public class FieldTypeRational extends FieldType { } if (o instanceof Number[]) { final Number[] numbers = (Number[]) o; - final RationalNumber[] rationalNumbers = Allocator.array(numbers.length, RationalNumber[]::new); + final RationalNumber[] rationalNumbers = Allocator.array(numbers.length, RationalNumber[]::new, + RationalNumber.SHALLOW_SIZE); Arrays.setAll(rationalNumbers, RationalNumber::valueOf); return ByteConversions.toBytes(rationalNumbers, byteOrder); } @@ -65,7 +66,8 @@ public class FieldTypeRational extends FieldType { throw new ImageWriteException("Invalid data", o); } final double[] numbers = (double[]) o; - final RationalNumber[] rationalNumbers = Allocator.array(numbers.length, RationalNumber[]::new); + final RationalNumber[] rationalNumbers = Allocator.array(numbers.length, RationalNumber[]::new, + RationalNumber.SHALLOW_SIZE); Arrays.setAll(rationalNumbers, RationalNumber::valueOf); return ByteConversions.toBytes(rationalNumbers, byteOrder); } diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java b/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java index 2f14e99f..e7e52d12 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java +++ b/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java @@ -42,7 +42,7 @@ public class TagInfoAscii extends TagInfo { nullCount++; } } - final String[] strings = Allocator.array(nullCount + 1, String[]::new); + final String[] strings = Allocator.array(nullCount + 1, String[]::new, 24); int stringsAdded = 0; strings[0] = ""; // if we have a 0 length string int nextStringPos = 0; diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java b/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java index 8511009d..bc1f24e5 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java +++ b/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java @@ -30,7 +30,7 @@ class ImageDataOffsets { this.imageDataOffsets = imageDataOffsets; this.imageDataOffsetsField = imageDataOffsetsField; - outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new); + outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new, 24); Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image data", imageData[i].getData())); } diff --git a/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java b/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java index 90b85c62..559aea3e 100644 --- a/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java +++ b/src/main/java/org/apache/commons/imaging/icc/IccProfileParser.java @@ -249,7 +249,7 @@ public class IccProfileParser extends BinaryFileParser { final int tagCount = read4Bytes("TagCount", is, "Not a Valid ICC Profile", getByteOrder()); // List tags = new ArrayList(); - final IccTag[] tags = Allocator.array(tagCount, IccTag[]::new); + final IccTag[] tags = Allocator.array(tagCount, IccTag[]::new, 40); for (int i = 0; i < tagCount; i++) { final int tagSignature = read4Bytes("TagSignature[" + i + "]", is, "Not a Valid ICC Profile", getByteOrder()); diff --git a/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java b/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java index b96328f4..0bb19a1e 100644 --- a/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java +++ b/src/main/java/org/apache/commons/imaging/palette/ColorSpaceSubset.java @@ -43,6 +43,7 @@ class ColorSpaceSubset { // the index in the palette. private int index; + static final int SHALLOW_SIZE = 40; ColorSpaceSubset(final int total, final int precision) { this.total = total; diff --git a/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java b/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java index 4595bf29..80fe80db 100644 --- a/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java +++ b/src/main/java/org/apache/commons/imaging/palette/QuantizedPalette.java @@ -32,7 +32,7 @@ public class QuantizedPalette implements Palette { this.subsets = subsets == null ? Collections.emptyList() : Collections.unmodifiableList(subsets); this.precision = precision; - straight = Allocator.array(1 << (precision * 3), ColorSpaceSubset[]::new); + straight = Allocator.array(1 << (precision * 3), ColorSpaceSubset[]::new, ColorSpaceSubset.SHALLOW_SIZE); for (int i = 0; i < this.subsets.size(); i++) { final ColorSpaceSubset subset = subsets.get(i); diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java b/src/test/java/org/apache/commons/imaging/formats/ico/PrintShallowSizes.java similarity index 50% copy from src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java copy to src/test/java/org/apache/commons/imaging/formats/ico/PrintShallowSizes.java index 8511009d..cdfc6fb2 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java +++ b/src/test/java/org/apache/commons/imaging/formats/ico/PrintShallowSizes.java @@ -14,25 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.imaging.formats.tiff.write; -import java.util.Arrays; +package org.apache.commons.imaging.formats.ico; -import org.apache.commons.imaging.common.Allocator; -import org.apache.commons.imaging.formats.tiff.TiffElement; +import org.apache.commons.imaging.formats.ico.IcoImageParser.IconInfo; +import org.apache.commons.imaging.test.util.PrintShallowObjectSizes; -class ImageDataOffsets { - final int[] imageDataOffsets; - final TiffOutputField imageDataOffsetsField; - final TiffOutputItem[] outputItems; - - ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] imageDataOffsets, final TiffOutputField imageDataOffsetsField) { - this.imageDataOffsets = imageDataOffsets; - this.imageDataOffsetsField = imageDataOffsetsField; - - outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new); - Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image data", imageData[i].getData())); +public class PrintShallowSizes { + public static void main(final String[] args) { + PrintShallowObjectSizes.print(IconInfo.class); } - } diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java b/src/test/java/org/apache/commons/imaging/formats/jpeg/decoder/PrintShallowSizes.java similarity index 50% copy from src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java copy to src/test/java/org/apache/commons/imaging/formats/jpeg/decoder/PrintShallowSizes.java index 8511009d..16d6d957 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java +++ b/src/test/java/org/apache/commons/imaging/formats/jpeg/decoder/PrintShallowSizes.java @@ -14,25 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.imaging.formats.tiff.write; -import java.util.Arrays; +package org.apache.commons.imaging.formats.jpeg.decoder; -import org.apache.commons.imaging.common.Allocator; -import org.apache.commons.imaging.formats.tiff.TiffElement; +import org.apache.commons.imaging.test.util.PrintShallowObjectSizes; -class ImageDataOffsets { - final int[] imageDataOffsets; - final TiffOutputField imageDataOffsetsField; - final TiffOutputItem[] outputItems; - - ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] imageDataOffsets, final TiffOutputField imageDataOffsetsField) { - this.imageDataOffsets = imageDataOffsets; - this.imageDataOffsetsField = imageDataOffsetsField; - - outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new); - Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image data", imageData[i].getData())); +public class PrintShallowSizes { + public static void main(final String[] args) { + PrintShallowObjectSizes.print(Block.class, JpegInputStream.class); } - } diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java b/src/test/java/org/apache/commons/imaging/formats/tiff/write/PrintShallowSizes.java similarity index 54% copy from src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java copy to src/test/java/org/apache/commons/imaging/formats/tiff/write/PrintShallowSizes.java index 8511009d..23fc8e3f 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java +++ b/src/test/java/org/apache/commons/imaging/formats/tiff/write/PrintShallowSizes.java @@ -14,25 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.imaging.formats.tiff.write; - -import java.util.Arrays; - -import org.apache.commons.imaging.common.Allocator; -import org.apache.commons.imaging.formats.tiff.TiffElement; -class ImageDataOffsets { - final int[] imageDataOffsets; - final TiffOutputField imageDataOffsetsField; - final TiffOutputItem[] outputItems; +package org.apache.commons.imaging.formats.tiff.write; - ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] imageDataOffsets, final TiffOutputField imageDataOffsetsField) { - this.imageDataOffsets = imageDataOffsets; - this.imageDataOffsetsField = imageDataOffsetsField; +import org.apache.commons.imaging.test.util.PrintShallowObjectSizes; - outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new); - Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image data", imageData[i].getData())); +public class PrintShallowSizes { + public static void main(final String[] args) { + PrintShallowObjectSizes.print(TiffOutputItem.class); } - } diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java b/src/test/java/org/apache/commons/imaging/palette/PrintShallowSizes.java similarity index 50% copy from src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java copy to src/test/java/org/apache/commons/imaging/palette/PrintShallowSizes.java index 8511009d..4ef9bf1e 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/write/ImageDataOffsets.java +++ b/src/test/java/org/apache/commons/imaging/palette/PrintShallowSizes.java @@ -14,25 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.imaging.formats.tiff.write; -import java.util.Arrays; +package org.apache.commons.imaging.palette; -import org.apache.commons.imaging.common.Allocator; -import org.apache.commons.imaging.formats.tiff.TiffElement; +import org.apache.commons.imaging.test.util.PrintShallowObjectSizes; -class ImageDataOffsets { - final int[] imageDataOffsets; - final TiffOutputField imageDataOffsetsField; - final TiffOutputItem[] outputItems; - - ImageDataOffsets(final TiffElement.DataElement[] imageData, final int[] imageDataOffsets, final TiffOutputField imageDataOffsetsField) { - this.imageDataOffsets = imageDataOffsets; - this.imageDataOffsetsField = imageDataOffsetsField; - - outputItems = Allocator.array(imageData.length, TiffOutputItem[]::new); - Arrays.setAll(outputItems, i -> new TiffOutputItem.Value("TIFF image data", imageData[i].getData())); +public class PrintShallowSizes { + public static void main(final String[] args) { + PrintShallowObjectSizes.print(ColorSpaceSubset.class); } - } diff --git a/src/test/java/org/apache/commons/imaging/test/util/PrintShallowObjectSizes.java b/src/test/java/org/apache/commons/imaging/test/util/PrintShallowObjectSizes.java new file mode 100644 index 00000000..0f6c2685 --- /dev/null +++ b/src/test/java/org/apache/commons/imaging/test/util/PrintShallowObjectSizes.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.imaging.test.util; + +import org.apache.commons.imaging.common.RationalNumber; +import org.apache.commons.imaging.icc.IccTag; +import org.openjdk.jol.info.ClassLayout; + +public class PrintShallowObjectSizes { + + public static void print(final Class<?>... classes) { + new PrintShallowObjectSizes().go(classes); + } + + public static void main(final String[] args) { + new PrintShallowObjectSizes().go(String.class, + org.apache.commons.imaging.formats.jpeg.segments.SofnSegment.Component.class, + org.apache.commons.imaging.formats.jpeg.segments.SosSegment.Component.class, RationalNumber.class, + IccTag.class); + } + + public void go(final Class<?>... classes) { + for (final Class<?> cls : classes) { + final ClassLayout classLayout = ClassLayout.parseClass(cls); + // System.out.println(classLayout.toPrintable()); + System.out.printf("%s shallow size = %,d bytes%n", cls, classLayout.instanceSize()); + } + + } +}