You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/05/14 17:24:42 UTC

[commons-imaging] 01/02: Fix broken encapsulation for TiffDirectory.entries

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 4a37330a3d6af9650d61f7b531294113d8effe6d
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun May 14 13:20:00 2023 -0400

    Fix broken encapsulation for TiffDirectory.entries
---
 .../commons/imaging/formats/tiff/TiffContents.java |  3 +-
 .../imaging/formats/tiff/TiffDirectory.java        | 46 +++++++++++++---------
 .../imaging/formats/tiff/TiffImageParser.java      | 25 ++----------
 3 files changed, 32 insertions(+), 42 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffContents.java b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffContents.java
index e87dbf47..c05b7630 100644
--- a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffContents.java
+++ b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffContents.java
@@ -83,8 +83,7 @@ public class TiffContents {
         for (final TiffDirectory directory : directories) {
             result.add(directory);
 
-            final List<TiffField> fields = directory.entries;
-            for (final TiffField field : fields) {
+            for (final TiffField field : directory) {
                 final TiffElement oversizeValue = field.getOversizeValueElement();
                 if (null != oversizeValue) {
                     result.add(oversizeValue);
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 8374ee24..b7d2bc96 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
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import org.apache.commons.imaging.ImageReadException;
@@ -63,7 +64,8 @@ import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoXpString;
  * for individual images or sets of metadata. While not all Directories contain
  * images, images are always stored in a Directory.
  */
-public class TiffDirectory extends TiffElement {
+public class TiffDirectory extends TiffElement implements Iterable<TiffField> {
+
     public static final class ImageDataElement extends TiffElement {
         public ImageDataElement(final long offset, final int length) {
             super(offset, length);
@@ -74,6 +76,7 @@ public class TiffDirectory extends TiffElement {
             return "ImageDataElement";
         }
     }
+
     public static String description(final int type) {
         switch (type) {
         case TiffDirectoryConstants.DIRECTORY_TYPE_UNKNOWN:
@@ -94,19 +97,22 @@ public class TiffDirectory extends TiffElement {
             return "Bad Type";
         }
     }
-    public final int type;
-    public final List<TiffField> entries;
-    public final long nextDirectoryOffset;
 
-    private TiffImageData tiffImageData;
+    private final List<TiffField> entries;
 
+    /**
+     * Preserves the byte order derived from the TIFF file header. Some of the legacy methods in this class require byte
+     * order as an argument, though that use could be phased out eventually.
+     */
+    private final ByteOrder headerByteOrder;
 
     private JpegImageData jpegImageData;
 
-    // Preservers the byte order derived from the TIFF file header.
-    // Some of the legacy methods in this class require byte order as an
-    // argument, though that use could be phased out eventually.
-    private final ByteOrder headerByteOrder;
+    public final long nextDirectoryOffset;
+
+    private TiffImageData tiffImageData;
+
+    public final int type;
 
     public TiffDirectory(
         final int type,
@@ -132,7 +138,6 @@ public class TiffDirectory extends TiffElement {
         for (final TiffField entry : entries) {
             entry.dump();
         }
-
     }
 
 
@@ -143,10 +148,6 @@ public class TiffDirectory extends TiffElement {
 
     public TiffField findField(final TagInfo tag, final boolean failIfMissing)
             throws ImageReadException {
-        if (entries == null) {
-            return null;
-        }
-
         for (final TiffField field : entries) {
             if (field.getTag() == tag.tag) {
                 return field;
@@ -852,10 +853,10 @@ public class TiffDirectory extends TiffElement {
         final TiffField stripOffsets = findField(TiffTagConstants.TIFF_TAG_STRIP_OFFSETS);
         final TiffField stripByteCounts = findField(TiffTagConstants.TIFF_TAG_STRIP_BYTE_COUNTS);
 
-        if ((tileOffsets != null) && (tileByteCounts != null)) {
+        if (tileOffsets != null && tileByteCounts != null) {
             return getRawImageDataElements(tileOffsets, tileByteCounts);
         }
-        if ((stripOffsets != null) && (stripByteCounts != null)) {
+        if (stripOffsets != null && stripByteCounts != null) {
             return getRawImageDataElements(stripOffsets, stripByteCounts);
         }
         throw new ImageReadException("Couldn't find image data.");
@@ -924,15 +925,20 @@ public class TiffDirectory extends TiffElement {
         final TiffField stripOffsets = findField(TiffTagConstants.TIFF_TAG_STRIP_OFFSETS);
         final TiffField stripByteCounts = findField(TiffTagConstants.TIFF_TAG_STRIP_BYTE_COUNTS);
 
-        if ((tileOffsets != null) && (tileByteCounts != null)) {
+        if (tileOffsets != null && tileByteCounts != null) {
             return false;
         }
-        if ((stripOffsets != null) && (stripByteCounts != null)) {
+        if (stripOffsets != null && stripByteCounts != null) {
             return true;
         }
         throw new ImageReadException("Couldn't find image data.");
     }
 
+    @Override
+    public Iterator<TiffField> iterator() {
+        return entries.iterator();
+    }
+
     public void setJpegImageData(final JpegImageData value) {
         this.jpegImageData = value;
     }
@@ -940,4 +946,8 @@ public class TiffDirectory extends TiffElement {
     public void setTiffImageData(final TiffImageData rawImageData) {
         this.tiffImageData = rawImageData;
     }
+
+    public int size() {
+        return entries.size();
+    }
 }
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 6fdf7ff7..44c602a7 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
@@ -137,15 +137,9 @@ public class TiffImageParser extends ImageParser<TiffImagingParameters> implemen
                 for (int d = 0; d < directories.size(); d++) {
                     final TiffDirectory directory = directories.get(d);
 
-                    final List<TiffField> entries = directory.entries;
-
-                    if (entries == null) {
-                        return false;
-                    }
-
                     // Debug.debug("directory offset", directory.offset);
 
-                    for (final TiffField field : entries) {
+                    for (final TiffField field : directory) {
                         field.dump(pw, Integer.toString(d));
                     }
                 }
@@ -255,12 +249,6 @@ public class TiffImageParser extends ImageParser<TiffImagingParameters> implemen
     protected BufferedImage getBufferedImage(final TiffDirectory directory,
             final ByteOrder byteOrder, final TiffImagingParameters params)
             throws ImageReadException, IOException {
-        final List<TiffField> entries = directory.entries;
-
-        if (entries == null) {
-            throw new ImageReadException("TIFF missing entries");
-        }
-
         final short compressionFieldValue;
         if (directory.findField(TiffTagConstants.TIFF_TAG_COMPRESSION) != null) {
             compressionFieldValue = directory.getFieldValue(TiffTagConstants.TIFF_TAG_COMPRESSION);
@@ -521,9 +509,8 @@ public class TiffImageParser extends ImageParser<TiffImagingParameters> implemen
         final int bitsPerPixel = bitsPerSample; // assume grayscale;
         // dunno if this handles colormapped images correctly.
 
-        final List<TiffField> entries = directory.entries;
-        final List<String> comments = Allocator.arrayList(entries.size());
-        for (final TiffField field : entries) {
+        final List<String> comments = Allocator.arrayList(directory.size());
+        for (final TiffField field : directory) {
             final String comment = field.toString();
             comments.add(comment);
         }
@@ -759,12 +746,6 @@ public class TiffImageParser extends ImageParser<TiffImagingParameters> implemen
             final ByteOrder byteOrder,
             TiffImagingParameters params)
             throws ImageReadException, IOException {
-        final List<TiffField> entries = directory.entries;
-
-        if (entries == null) {
-            throw new ImageReadException("TIFF missing entries");
-        }
-
         if (params == null) {
             params = this.getDefaultParameters();
         }