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/03/21 21:40:34 UTC

[commons-imaging] branch master updated (b72e9853 -> 1f48a619)

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

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


    from b72e9853 Normalize NPE messages
     new 9cc6da1f Allow fluent API use of ImagingParameters and subclasses
     new 7317d00e Allow fluent API use of ImagingParameters and subclasses
     new 1f48a619 Better internal class name

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/commons/imaging/ImageParser.java    |   4 +-
 .../java/org/apache/commons/imaging/Imaging.java   |  22 +--
 .../apache/commons/imaging/ImagingParameters.java  |  36 ++--
 .../imaging/common/XmpImagingParameters.java       |   7 +-
 .../imaging/formats/bmp/BmpImagingParameters.java  |   4 +-
 .../imaging/formats/gif/GifImagingParameters.java  |   4 +-
 .../formats/icns/IcnsImagingParameters.java        |   4 +-
 .../imaging/formats/ico/IcoImagingParameters.java  |   4 +-
 .../formats/jpeg/JpegImagingParameters.java        |   4 +-
 .../imaging/formats/pcx/PcxImagingParameters.java  |  27 +--
 .../imaging/formats/png/PngImagingParameters.java  |  62 ++++---
 .../imaging/formats/pnm/PnmImagingParameters.java  |  16 +-
 .../imaging/formats/psd/PsdImagingParameters.java  |   4 +-
 .../formats/rgbe/RgbeImagingParameters.java        |   4 +-
 .../formats/tiff/TiffImagingParameters.java        | 195 +++++++++++----------
 .../formats/wbmp/WbmpImagingParameters.java        |   4 +-
 .../imaging/formats/xbm/XbmImagingParameters.java  |   4 +-
 .../imaging/formats/xpm/XpmImagingParameters.java  |   4 +-
 .../{Util.java => ImageParserFactory.java}         |  28 +--
 .../common/bytesource/ByteSourceImageTest.java     |  21 ++-
 .../commons/imaging/formats/xmp/XmpUpdateTest.java |  28 +--
 .../commons/imaging/roundtrip/RoundtripBase.java   |   8 +-
 22 files changed, 275 insertions(+), 219 deletions(-)
 rename src/main/java/org/apache/commons/imaging/internal/{Util.java => ImageParserFactory.java} (72%)


[commons-imaging] 01/03: Allow fluent API use of ImagingParameters and subclasses

Posted by gg...@apache.org.
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 9cc6da1f131bd90225fd576f0aa70b6fc15d5cac
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Mar 21 16:07:24 2023 -0400

    Allow fluent API use of ImagingParameters and subclasses
---
 .../apache/commons/imaging/ImagingParameters.java  |  36 ++--
 .../imaging/common/XmpImagingParameters.java       |   6 +-
 .../imaging/formats/bmp/BmpImagingParameters.java  |   4 +-
 .../imaging/formats/gif/GifImagingParameters.java  |   4 +-
 .../formats/icns/IcnsImagingParameters.java        |   4 +-
 .../imaging/formats/ico/IcoImagingParameters.java  |   4 +-
 .../formats/jpeg/JpegImagingParameters.java        |   4 +-
 .../imaging/formats/pcx/PcxImagingParameters.java  |  27 +--
 .../imaging/formats/png/PngImagingParameters.java  |  62 ++++---
 .../imaging/formats/pnm/PnmImagingParameters.java  |  16 +-
 .../imaging/formats/psd/PsdImagingParameters.java  |   4 +-
 .../formats/rgbe/RgbeImagingParameters.java        |   4 +-
 .../formats/tiff/TiffImagingParameters.java        | 195 +++++++++++----------
 .../formats/wbmp/WbmpImagingParameters.java        |   4 +-
 .../imaging/formats/xbm/XbmImagingParameters.java  |   4 +-
 .../imaging/formats/xpm/XpmImagingParameters.java  |   4 +-
 16 files changed, 219 insertions(+), 163 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/ImagingParameters.java b/src/main/java/org/apache/commons/imaging/ImagingParameters.java
index 7ef1b3ac..4957ae63 100644
--- a/src/main/java/org/apache/commons/imaging/ImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/ImagingParameters.java
@@ -24,9 +24,10 @@ import org.apache.commons.imaging.common.BufferedImageFactory;
  * <p>Contains parameters that are common to all formats. Implementations must include
  * the specific parameters for each image format.</p>
  *
+ * @param <E> This type
  * @since 1.0-alpha3
  */
-public class ImagingParameters {
+public class ImagingParameters<E extends ImagingParameters<E>> {
 
     /**
      * Whether to throw an exception when any issue occurs during reading
@@ -54,35 +55,44 @@ public class ImagingParameters {
 
     // getters and setters
 
-    public boolean isStrict() {
-        return strict;
+    @SuppressWarnings("unchecked")
+    public E asThis() {
+        return (E) this;
     }
 
-    public void setStrict(final boolean strict) {
-        this.strict = strict;
+    public BufferedImageFactory getBufferedImageFactory() {
+        return bufferedImageFactory;
     }
 
     public String getFileName() {
         return fileName;
     }
 
-    public void setFileName(final String fileName) {
-        this.fileName = fileName;
+    public PixelDensity getPixelDensity() {
+        return pixelDensity;
     }
 
-    public BufferedImageFactory getBufferedImageFactory() {
-        return bufferedImageFactory;
+    public boolean isStrict() {
+        return strict;
     }
 
-    public void setBufferedImageFactory(final BufferedImageFactory bufferedImageFactory) {
+    public E setBufferedImageFactory(final BufferedImageFactory bufferedImageFactory) {
         this.bufferedImageFactory = bufferedImageFactory;
+        return asThis();
     }
 
-    public PixelDensity getPixelDensity() {
-        return pixelDensity;
+    public E setFileName(final String fileName) {
+        this.fileName = fileName;
+        return asThis();
     }
 
-    public void setPixelDensity(final PixelDensity pixelDensity) {
+    public E setPixelDensity(final PixelDensity pixelDensity) {
         this.pixelDensity = pixelDensity;
+        return asThis();
+    }
+
+    public E setStrict(final boolean strict) {
+        this.strict = strict;
+        return asThis();
     }
 }
diff --git a/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java b/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
index 810b22ab..f2f26ef8 100644
--- a/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
@@ -21,9 +21,10 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Parameters for formats that support Xmp.
+ *
  * @since 1.0-alpha3
  */
-public class XmpImagingParameters extends ImagingParameters {
+public class XmpImagingParameters<E extends XmpImagingParameters<E>> extends ImagingParameters<E> {
 
     private String xmpXml;
 
@@ -31,8 +32,9 @@ public class XmpImagingParameters extends ImagingParameters {
         return xmpXml;
     }
 
-    public void setXmpXml(final String xmpXml) {
+    public E setXmpXml(final String xmpXml) {
         this.xmpXml = xmpXml;
+        return asThis();
     }
 
 }
diff --git a/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImagingParameters.java
index 73cc8033..4b2110f1 100644
--- a/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImagingParameters.java
@@ -21,6 +21,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Bmp format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class BmpImagingParameters extends ImagingParameters {}
+public class BmpImagingParameters extends ImagingParameters<BmpImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/gif/GifImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/gif/GifImagingParameters.java
index 3a8490aa..66a11038 100644
--- a/src/main/java/org/apache/commons/imaging/formats/gif/GifImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/gif/GifImagingParameters.java
@@ -21,6 +21,8 @@ import org.apache.commons.imaging.common.XmpImagingParameters;
 
 /**
  * Gif format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class GifImagingParameters extends XmpImagingParameters {}
+public class GifImagingParameters extends XmpImagingParameters<GifImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImagingParameters.java
index c0475f8c..c155a817 100644
--- a/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImagingParameters.java
@@ -19,6 +19,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Icns format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class IcnsImagingParameters extends ImagingParameters {}
+public class IcnsImagingParameters extends ImagingParameters<IcnsImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImagingParameters.java
index 0ac95c8b..8311a15c 100644
--- a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImagingParameters.java
@@ -19,6 +19,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Ico format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class IcoImagingParameters extends ImagingParameters {}
+public class IcoImagingParameters extends ImagingParameters<IcoImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImagingParameters.java
index 1fed2d69..d7ed59be 100644
--- a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImagingParameters.java
@@ -19,6 +19,8 @@ import org.apache.commons.imaging.common.XmpImagingParameters;
 
 /**
  * Jpeg format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class JpegImagingParameters extends XmpImagingParameters {}
+public class JpegImagingParameters extends XmpImagingParameters<JpegImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImagingParameters.java
index 35b221b2..811e5e1e 100644
--- a/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImagingParameters.java
@@ -21,34 +21,37 @@ import org.apache.commons.imaging.ImagingParameters;
  * Parameters used by the Pcx format.
  * @since 1.0-alpha3
  */
-public class PcxImagingParameters extends ImagingParameters {
+public class PcxImagingParameters extends ImagingParameters<PcxImagingParameters> {
 
     private int planes = -1;
     private int bitDepth = -1;
     private int compression = PcxConstants.PCX_COMPRESSION_UNCOMPRESSED;
 
-    public int getPlanes() {
-        return planes;
+    public int getBitDepth() {
+        return bitDepth;
     }
 
-    public void setPlanes(final int planes) {
-        this.planes = planes;
+    public int getCompression() {
+        return compression;
     }
 
-    public int getBitDepth() {
-        return bitDepth;
+    public int getPlanes() {
+        return planes;
     }
 
-    public void setBitDepth(final int bitDepth) {
+    public PcxImagingParameters setBitDepth(final int bitDepth) {
         this.bitDepth = bitDepth;
+        return asThis();
     }
 
-    public int getCompression() {
-        return compression;
+    public PcxImagingParameters setCompression(final int compression) {
+        this.compression = compression;
+        return asThis();
     }
 
-    public void setCompression(final int compression) {
-        this.compression = compression;
+    public PcxImagingParameters setPlanes(final int planes) {
+        this.planes = planes;
+        return asThis();
     }
 
 }
diff --git a/src/main/java/org/apache/commons/imaging/formats/png/PngImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/png/PngImagingParameters.java
index 0eb6f297..90440506 100644
--- a/src/main/java/org/apache/commons/imaging/formats/png/PngImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/png/PngImagingParameters.java
@@ -24,7 +24,7 @@ import org.apache.commons.imaging.common.XmpImagingParameters;
  * Png format parameters.
  * @since 1.0-alpha3
  */
-public class PngImagingParameters extends XmpImagingParameters {
+public class PngImagingParameters extends XmpImagingParameters<PngImagingParameters> {
 
     public static final byte DEFAULT_BIT_DEPTH = 8;
 
@@ -59,49 +59,49 @@ public class PngImagingParameters extends XmpImagingParameters {
         return bitDepth;
     }
 
-    public void setBitDepth(final byte bitDepth) {
-        this.bitDepth = bitDepth;
+    public PhysicalScale getPhysicalScale() {
+        return physicalScale;
     }
 
-    public boolean isForceIndexedColor() {
-        return forceIndexedColor;
+    public List<? extends PngText> getTextChunks() {
+        return textChunks != null ? Collections.unmodifiableList(textChunks) : null;
     }
 
-    public void setForceIndexedColor(final boolean forceIndexedColor) {
-        this.forceIndexedColor = forceIndexedColor;
+    public boolean isForceIndexedColor() {
+        return forceIndexedColor;
     }
 
     public boolean isForceTrueColor() {
         return forceTrueColor;
     }
 
-    public void setForceTrueColor(final boolean forceTrueColor) {
-        this.forceTrueColor = forceTrueColor;
-    }
-
-    public PhysicalScale getPhysicalScale() {
-        return physicalScale;
+    /**
+     * Indicates that the PNG write operation should enable
+     * the predictor.
+     * @return true if the predictor is enabled; otherwise, false.
+     */
+    public boolean isPredictorEnabled(){
+        return predictorEnabled;
     }
 
-    public void setPhysicalScale(final PhysicalScale physicalScale) {
-        this.physicalScale = physicalScale;
+    public PngImagingParameters setBitDepth(final byte bitDepth) {
+        this.bitDepth = bitDepth;
+        return asThis();
     }
 
-    public List<? extends PngText> getTextChunks() {
-        return textChunks != null ? Collections.unmodifiableList(textChunks) : null;
+    public PngImagingParameters setForceIndexedColor(final boolean forceIndexedColor) {
+        this.forceIndexedColor = forceIndexedColor;
+        return asThis();
     }
 
-    public void setTextChunks(final List<? extends PngText> textChunks) {
-        this.textChunks = Collections.unmodifiableList(textChunks);
+    public PngImagingParameters setForceTrueColor(final boolean forceTrueColor) {
+        this.forceTrueColor = forceTrueColor;
+        return asThis();
     }
 
-    /**
-     * Indicates that the PNG write operation should enable
-     * the predictor.
-     * @return true if the predictor is enabled; otherwise, false.
-     */
-    public boolean isPredictorEnabled(){
-        return predictorEnabled;
+    public PngImagingParameters setPhysicalScale(final PhysicalScale physicalScale) {
+        this.physicalScale = physicalScale;
+        return asThis();
     }
 
     /**
@@ -112,9 +112,17 @@ public class PngImagingParameters extends XmpImagingParameters {
      * The specification of a predictor may result in an increased
      * processing time when writing an image, but will not affect the
      * time required to read an image.
+     *
      * @param predictorEnabled true if a predictor is enabled; otherwise, false.
+     * @return this
      */
-    public void setPredictorEnabled(final boolean predictorEnabled){
+    public PngImagingParameters setPredictorEnabled(final boolean predictorEnabled){
         this.predictorEnabled = predictorEnabled;
+        return asThis();
+    }
+
+    public PngImagingParameters setTextChunks(final List<? extends PngText> textChunks) {
+        this.textChunks = Collections.unmodifiableList(textChunks);
+        return asThis();
     }
 }
diff --git a/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImagingParameters.java
index 6cb95681..65f9c4eb 100644
--- a/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImagingParameters.java
@@ -23,7 +23,7 @@ import org.apache.commons.imaging.ImagingParameters;
  * Pnm format parameters.
  * @since 1.0-alpha3
  */
-public class PnmImagingParameters extends ImagingParameters {
+public class PnmImagingParameters extends ImagingParameters<PnmImagingParameters> {
 
     private boolean rawBits = true;
     /**
@@ -31,19 +31,21 @@ public class PnmImagingParameters extends ImagingParameters {
      */
     private ImageFormats subtype = null;
 
+    public ImageFormats getSubtype() {
+        return subtype;
+    }
+
     public boolean isRawBits() {
         return rawBits;
     }
 
-    public void setRawBits(final boolean rawBits) {
+    public PnmImagingParameters setRawBits(final boolean rawBits) {
         this.rawBits = rawBits;
+        return asThis();
     }
 
-    public ImageFormats getSubtype() {
-        return subtype;
-    }
-
-    public void setSubtype(final ImageFormats subtype) {
+    public PnmImagingParameters setSubtype(final ImageFormats subtype) {
         this.subtype = subtype;
+        return asThis();
     }
 }
diff --git a/src/main/java/org/apache/commons/imaging/formats/psd/PsdImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/psd/PsdImagingParameters.java
index d2889a7d..bdc6f70d 100644
--- a/src/main/java/org/apache/commons/imaging/formats/psd/PsdImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/psd/PsdImagingParameters.java
@@ -21,6 +21,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Psd format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class PsdImagingParameters extends ImagingParameters {}
+public class PsdImagingParameters extends ImagingParameters<PsdImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImagingParameters.java
index 09d8cf59..877436e2 100644
--- a/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImagingParameters.java
@@ -19,6 +19,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Rgbe format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class RgbeImagingParameters extends ImagingParameters {}
+public class RgbeImagingParameters extends ImagingParameters<RgbeImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImagingParameters.java
index bb64fddf..8823a244 100644
--- a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImagingParameters.java
@@ -21,9 +21,10 @@ import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
 
 /**
  * Tiff format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class TiffImagingParameters extends XmpImagingParameters {
+public class TiffImagingParameters extends XmpImagingParameters<TiffImagingParameters> {
 
     /**
      * Indicates whether to read embedded thumbnails or not. Only applies to read EXIF metadata from JPEG/JFIF files.
@@ -99,12 +100,25 @@ public class TiffImagingParameters extends XmpImagingParameters {
      */
     private Integer t6Options = null;
 
-    public boolean isReadThumbnails() {
-        return readThumbnails;
+    /**
+     * Clears settings for sub-image. Subsequent read operations will retrieve
+     * the entire image.
+     */
+    public void clearSubImage() {
+        subImageWidth = 0;
+        subImageHeight = 0;
     }
 
-    public void setReadThumbnails(final boolean readThumbnails) {
-        this.readThumbnails = readThumbnails;
+    public Integer getCompression() {
+        return compression;
+    }
+
+    public PhotometricInterpreter getCustomPhotometricInterpreter() {
+        return customPhotometricInterpreter;
+    }
+
+    public Integer getLzwCompressionBlockSize() {
+        return lzwCompressionBlockSize;
     }
 
     /**
@@ -116,64 +130,25 @@ public class TiffImagingParameters extends XmpImagingParameters {
     }
 
     /**
-     * Set the TIFF output set for writing TIFF files.  An output set
-     * may contain various types of TiffDirectories including image directories,
-     * EXIF directories, GPS-related directories, etc.
-     *
-     * @param tiffOutputSet A valid instance.
-     */
-    public void setOutputSet(final TiffOutputSet tiffOutputSet) {
-        this.tiffOutputSet = tiffOutputSet;
-    }
-
-    /**
-     * Sets parameters for performing a partial read operation on an image. This
-     * method is useful for reducing memory and run-time overhead when accessing
-     * large source images.
-     * <p>
-     * Note that the corner x and y coordinates must be positive integers (zero
-     * or greater). The width and height must be greater than zero.
+     * Gets the height for a sub-image setting. For a sub-image setting to be
+     * meaningful, both the width and height must be set.
      *
-     * @param x pixel coordinate of the upper-left corner of the source image,
-     * must be zero or greater.
-     * @param y pixel coordinate of the upper-left corner of the source image,
-     * must be zero or greater.
-     * @param width width of the image subset to be read, must be greater than
-     * zero.
-     * @param height height of the image subset to be read, must be greater than
-     * zero.
-     */
-    public void setSubImage(final int x, final int y, final int width, final int height) {
-        if (x < 0 || y < 0) {
-            throw new IllegalArgumentException(
-                    "Invalid sub-image specification: negative x and y values not allowed");
-        }
-        if (width <= 0 || height <= 0) {
-            throw new IllegalArgumentException(
-                    "Invalid sub-image specification width and height must be greater than zero");
-        }
-        subImageX = x;
-        subImageY = y;
-        subImageWidth = width;
-        subImageHeight = height;
-    }
-
-    /**
-     * Clears settings for sub-image. Subsequent read operations will retrieve
-     * the entire image.
+     * @return if the sub-image feature is enabled, a value greater than zero;
+     * otherwise, zero.
      */
-    public void clearSubImage() {
-        subImageWidth = 0;
-        subImageHeight = 0;
+    public int getSubImageHeight() {
+        return subImageHeight;
     }
 
     /**
-     * Indicates whether the application has set sub-image parameters.
+     * Gets the width for a sub-image setting. For a sub-image setting to be
+     * meaningful, both the width and height must be set.
      *
-     * @return true if the sub-image parameters are set; otherwise, false.
+     * @return if the sub-image feature is enabled, a value greater than zero;
+     * otherwise, zero.
      */
-    public boolean isSubImageSet() {
-        return subImageWidth > 0 && subImageHeight > 0;
+    public int getSubImageWidth() {
+        return subImageWidth;
     }
 
     /**
@@ -196,66 +171,102 @@ public class TiffImagingParameters extends XmpImagingParameters {
         return subImageY;
     }
 
-    /**
-     * Gets the width for a sub-image setting. For a sub-image setting to be
-     * meaningful, both the width and height must be set.
-     *
-     * @return if the sub-image feature is enabled, a value greater than zero;
-     * otherwise, zero.
-     */
-    public int getSubImageWidth() {
-        return subImageWidth;
+    public Integer getT4Options() {
+        return t4Options;
+    }
+
+    public Integer getT6Options() {
+        return t6Options;
+    }
+
+    public boolean isReadThumbnails() {
+        return readThumbnails;
     }
 
     /**
-     * Gets the height for a sub-image setting. For a sub-image setting to be
-     * meaningful, both the width and height must be set.
+     * Indicates whether the application has set sub-image parameters.
      *
-     * @return if the sub-image feature is enabled, a value greater than zero;
-     * otherwise, zero.
+     * @return true if the sub-image parameters are set; otherwise, false.
      */
-    public int getSubImageHeight() {
-        return subImageHeight;
+    public boolean isSubImageSet() {
+        return subImageWidth > 0 && subImageHeight > 0;
     }
 
-    public PhotometricInterpreter getCustomPhotometricInterpreter() {
-        return customPhotometricInterpreter;
+    public TiffImagingParameters setCompression(final Integer compression) {
+        this.compression = compression;
+        return asThis();
     }
 
-    public void setCustomPhotometricInterpreter(final PhotometricInterpreter customPhotometricInterpreter) {
+    public TiffImagingParameters setCustomPhotometricInterpreter(final PhotometricInterpreter customPhotometricInterpreter) {
         this.customPhotometricInterpreter = customPhotometricInterpreter;
+        return asThis();
     }
 
-    public Integer getCompression() {
-        return compression;
-    }
-
-    public void setCompression(final Integer compression) {
-        this.compression = compression;
+    public TiffImagingParameters setLzwCompressionBlockSize(final Integer lzwCompressionBlockSize) {
+        this.lzwCompressionBlockSize = lzwCompressionBlockSize;
+        return asThis();
     }
 
-    public Integer getLzwCompressionBlockSize() {
-        return lzwCompressionBlockSize;
+    /**
+     * Set the TIFF output set for writing TIFF files.  An output set
+     * may contain various types of TiffDirectories including image directories,
+     * EXIF directories, GPS-related directories, etc.
+     *
+     * @param tiffOutputSet A valid instance.
+     * @return this
+     */
+    public TiffImagingParameters setOutputSet(final TiffOutputSet tiffOutputSet) {
+        this.tiffOutputSet = tiffOutputSet;
+        return asThis();
     }
 
-    public void setLzwCompressionBlockSize(final Integer lzwCompressionBlockSize) {
-        this.lzwCompressionBlockSize = lzwCompressionBlockSize;
+    public TiffImagingParameters setReadThumbnails(final boolean readThumbnails) {
+        this.readThumbnails = readThumbnails;
+        return asThis();
     }
 
-    public Integer getT4Options() {
-        return t4Options;
+    /**
+     * Sets parameters for performing a partial read operation on an image. This
+     * method is useful for reducing memory and run-time overhead when accessing
+     * large source images.
+     * <p>
+     * Note that the corner x and y coordinates must be positive integers (zero
+     * or greater). The width and height must be greater than zero.
+     *
+     * @param x pixel coordinate of the upper-left corner of the source image,
+     * must be zero or greater.
+     * @param y pixel coordinate of the upper-left corner of the source image,
+     * must be zero or greater.
+     * @param width width of the image subset to be read, must be greater than
+     * zero.
+     * @param height height of the image subset to be read, must be greater than
+     * zero.
+     * @return this
+     */
+    public TiffImagingParameters setSubImage(final int x, final int y, final int width, final int height) {
+        if (x < 0 || y < 0) {
+            throw new IllegalArgumentException(
+                    "Invalid sub-image specification: negative x and y values not allowed");
+        }
+        if (width <= 0 || height <= 0) {
+            throw new IllegalArgumentException(
+                    "Invalid sub-image specification width and height must be greater than zero");
+        }
+        subImageX = x;
+        subImageY = y;
+        subImageWidth = width;
+        subImageHeight = height;
+        return asThis();
     }
 
-    public void setT4Options(final Integer t4Options) {
+    public TiffImagingParameters setT4Options(final Integer t4Options) {
         this.t4Options = t4Options;
+        return asThis();
     }
 
-    public Integer getT6Options() {
-        return t6Options;
-    }
-
-    public void setT6Options(final Integer t6Options) {
+    public TiffImagingParameters setT6Options(final Integer t6Options) {
         this.t6Options = t6Options;
+        return asThis();
     }
 
 }
diff --git a/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImagingParameters.java
index f74f28e8..73b6ee45 100644
--- a/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImagingParameters.java
@@ -19,6 +19,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Wbmp format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class WbmpImagingParameters extends ImagingParameters {}
+public class WbmpImagingParameters extends ImagingParameters<WbmpImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImagingParameters.java
index b0daa357..07a3243f 100644
--- a/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImagingParameters.java
@@ -19,6 +19,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Xbm format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class XbmImagingParameters extends ImagingParameters {}
+public class XbmImagingParameters extends ImagingParameters<XbmImagingParameters> {
+}
diff --git a/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImagingParameters.java b/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImagingParameters.java
index 36be8571..e21064f3 100644
--- a/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImagingParameters.java
@@ -18,6 +18,8 @@ import org.apache.commons.imaging.ImagingParameters;
 
 /**
  * Xpm format parameters.
+ *
  * @since 1.0-alpha3
  */
-public class XpmImagingParameters extends ImagingParameters {}
+public class XpmImagingParameters extends ImagingParameters<XpmImagingParameters> {
+}


[commons-imaging] 03/03: Better internal class name

Posted by gg...@apache.org.
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 1f48a6196d47b052b73bdb3674aa9e8802c98e1c
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Mar 21 17:35:01 2023 -0400

    Better internal class name
---
 .../java/org/apache/commons/imaging/Imaging.java   | 22 +++++++++++-----------
 .../{Util.java => ImageParserFactory.java}         |  8 ++++----
 .../common/bytesource/ByteSourceImageTest.java     |  4 ++--
 .../commons/imaging/formats/xmp/XmpUpdateTest.java |  4 ++--
 .../commons/imaging/roundtrip/RoundtripBase.java   |  8 ++++----
 5 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/Imaging.java b/src/main/java/org/apache/commons/imaging/Imaging.java
index b973b0ea..3e6fd062 100644
--- a/src/main/java/org/apache/commons/imaging/Imaging.java
+++ b/src/main/java/org/apache/commons/imaging/Imaging.java
@@ -24,7 +24,7 @@ import org.apache.commons.imaging.common.bytesource.ByteSourceFile;
 import org.apache.commons.imaging.common.bytesource.ByteSourceInputStream;
 import org.apache.commons.imaging.icc.IccProfileInfo;
 import org.apache.commons.imaging.icc.IccProfileParser;
-import org.apache.commons.imaging.internal.Util;
+import org.apache.commons.imaging.internal.ImageParserFactory;
 
 import java.awt.Dimension;
 import java.awt.color.ICC_Profile;
@@ -400,7 +400,7 @@ public final class Imaging {
     }
 
     private static byte[] getICCProfileBytes(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.getICCProfileBytes(byteSource, null);
     }
 
@@ -479,7 +479,7 @@ public final class Imaging {
     }
 
     private static ImageInfo getImageInfo(final ByteSource byteSource) throws ImageReadException, IOException {
-        return Util.getImageParser(byteSource).getImageInfo(byteSource, null);
+        return ImageParserFactory.getImageParser(byteSource).getImageInfo(byteSource, null);
     }
 
     /**
@@ -528,7 +528,7 @@ public final class Imaging {
      * @throws IOException if it fails to read the image data
      */
     public static Dimension getImageSize(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.getImageSize(byteSource, null);
     }
 
@@ -578,7 +578,7 @@ public final class Imaging {
      * @throws IOException if it fails to read the image data
      */
     public static String getXmpXml(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         if (imageParser instanceof XmpEmbeddable) {
             return ((XmpEmbeddable) imageParser).getXmpXml(byteSource, null);
         }
@@ -649,7 +649,7 @@ public final class Imaging {
     }
 
     private static ImageMetadata getMetadata(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.getMetadata(byteSource, null);
     }
 
@@ -678,7 +678,7 @@ public final class Imaging {
     }
 
     private static String dumpImageFile(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.dumpImageFile(byteSource);
     }
 
@@ -712,7 +712,7 @@ public final class Imaging {
     }
 
     private static FormatCompliance getFormatCompliance(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.getFormatCompliance(byteSource);
     }
 
@@ -754,7 +754,7 @@ public final class Imaging {
     }
 
     private static List<BufferedImage> getAllBufferedImages(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.getAllBufferedImages(byteSource);
     }
 
@@ -836,7 +836,7 @@ public final class Imaging {
     }
 
     private static BufferedImage getBufferedImage(final ByteSource byteSource) throws ImageReadException, IOException {
-        final ImageParser<?> imageParser = Util.getImageParser(byteSource);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(byteSource);
         return imageParser.getBufferedImage(byteSource, null);
     }
 
@@ -912,7 +912,7 @@ public final class Imaging {
         Objects.requireNonNull(outputStream, "outputStream");
         Objects.requireNonNull(format, "format");
 
-        final ImageParser<?> imageParser = Util.getImageParser(format);
+        final ImageParser<?> imageParser = ImageParserFactory.getImageParser(format);
         imageParser.writeImage(src, outputStream, null);
     }
 }
diff --git a/src/main/java/org/apache/commons/imaging/internal/Util.java b/src/main/java/org/apache/commons/imaging/internal/ImageParserFactory.java
similarity index 93%
rename from src/main/java/org/apache/commons/imaging/internal/Util.java
rename to src/main/java/org/apache/commons/imaging/internal/ImageParserFactory.java
index 355063cf..2923e289 100644
--- a/src/main/java/org/apache/commons/imaging/internal/Util.java
+++ b/src/main/java/org/apache/commons/imaging/internal/ImageParserFactory.java
@@ -32,9 +32,9 @@ import org.apache.commons.imaging.common.bytesource.ByteSource;
  *
  * @since 1.0-alpha3
  */
-public class Util {
+public class ImageParserFactory {
 
-    private Util() {}
+    private ImageParserFactory() {}
 
     public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final ImageFormat format) {
         return getImageParser(parser -> parser.canAcceptType(format), () -> new IllegalArgumentException("Unknown Format: " + format));
@@ -60,12 +60,12 @@ public class Util {
         // TODO: circular dependency between Imaging and internal Util class below.
         final ImageFormat format = Imaging.guessFormat(byteSource);
         if (!format.equals(ImageFormats.UNKNOWN)) {
-            return Util.getImageParser(format);
+            return ImageParserFactory.getImageParser(format);
         }
 
         final String fileName = byteSource.getFileName();
         if (fileName != null) {
-            return Util.getImageParser(fileName);
+            return ImageParserFactory.getImageParser(fileName);
         }
 
         throw new IllegalArgumentException("Can't parse this format.");
diff --git a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
index c9bb876a..dd42e596 100644
--- a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
+++ b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
@@ -27,7 +27,7 @@ import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.formats.jpeg.JpegImagingParameters;
 import org.apache.commons.imaging.formats.tiff.TiffImagingParameters;
 import org.apache.commons.imaging.internal.Debug;
-import org.apache.commons.imaging.internal.Util;
+import org.apache.commons.imaging.internal.ImageParserFactory;
 import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -172,7 +172,7 @@ public class ByteSourceImageTest extends ByteSourceTest {
             params = new JpegImagingParameters();
         }
 
-        final ImageParser imageParser = Util.getImageParser(imageFormat);
+        final ImageParser imageParser = ImageParserFactory.getImageParser(imageFormat);
 
         final ImageInfo imageInfoFile = imageParser.getImageInfo(imageFile, params);
 
diff --git a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
index 13ddafe9..8bee7faa 100644
--- a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
+++ b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
@@ -33,7 +33,7 @@ import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.ImagingTest;
 import org.apache.commons.imaging.common.XmpImagingParameters;
 import org.apache.commons.imaging.internal.Debug;
-import org.apache.commons.imaging.internal.Util;
+import org.apache.commons.imaging.internal.ImageParserFactory;
 import org.junit.jupiter.api.Test;
 
 public class XmpUpdateTest<E extends XmpImagingParameters<E>> extends ImagingTest {
@@ -68,7 +68,7 @@ public class XmpUpdateTest<E extends XmpImagingParameters<E>> extends ImagingTes
             final File tempFile = Files.createTempFile(imageFile.getName() + ".", "." + imageFormat.getDefaultExtension()).toFile();
             final BufferedImage image = Imaging.getBufferedImage(imageFile);
 
-            final ImageParser<E> parser = Util.getImageParser("." + imageFormat.getDefaultExtension());
+            final ImageParser<E> parser = ImageParserFactory.getImageParser("." + imageFormat.getDefaultExtension());
             final E params = parser.getDefaultParameters();
             params.setXmpXml(xmpXml);
             try (FileOutputStream fos = new FileOutputStream(tempFile)) {
diff --git a/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java b/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
index a466618a..12a8b5d7 100644
--- a/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
+++ b/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
@@ -22,7 +22,7 @@ import org.apache.commons.imaging.ImageWriteException;
 import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.common.RgbBufferedImageFactory;
 import org.apache.commons.imaging.internal.Debug;
-import org.apache.commons.imaging.internal.Util;
+import org.apache.commons.imaging.internal.ImageParserFactory;
 import org.junit.jupiter.params.provider.Arguments;
 
 import java.awt.image.BufferedImage;
@@ -43,14 +43,14 @@ public class RoundtripBase {
                 + formatInfo.format.getDefaultExtension()).toFile();
         Debug.debug("tempFile: " + temp1.getName());
 
-        final ImageParser imageParser = Util.getImageParser(formatInfo.format);
+        final ImageParser imageParser = ImageParserFactory.getImageParser(formatInfo.format);
 
-        final ImagingParameters params = Util.getImageParser(formatInfo.format).getDefaultParameters();
+        final ImagingParameters params = ImageParserFactory.getImageParser(formatInfo.format).getDefaultParameters();
         try (FileOutputStream fos = new FileOutputStream(temp1)) {
             imageParser.writeImage(testImage, fos, params);
         }
 
-        final ImagingParameters readParams = Util.getImageParser(formatInfo.format).getDefaultParameters();
+        final ImagingParameters readParams = ImageParserFactory.getImageParser(formatInfo.format).getDefaultParameters();
         readParams.setBufferedImageFactory(new RgbBufferedImageFactory());
         final BufferedImage image2 = imageParser.getBufferedImage(temp1, readParams);
         assertNotNull(image2);


[commons-imaging] 02/03: Allow fluent API use of ImagingParameters and subclasses

Posted by gg...@apache.org.
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 7317d00ec003210d93582aec80e69fb5a18cc7a5
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Mar 21 17:34:18 2023 -0400

    Allow fluent API use of ImagingParameters and subclasses
---
 .../org/apache/commons/imaging/ImageParser.java    |  4 +---
 .../imaging/common/XmpImagingParameters.java       |  1 +
 .../org/apache/commons/imaging/internal/Util.java  | 20 +++++++++--------
 .../common/bytesource/ByteSourceImageTest.java     | 17 +++++++-------
 .../commons/imaging/formats/xmp/XmpUpdateTest.java | 26 +++++++++++-----------
 5 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/ImageParser.java b/src/main/java/org/apache/commons/imaging/ImageParser.java
index 23cbac55..2ba98549 100644
--- a/src/main/java/org/apache/commons/imaging/ImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/ImageParser.java
@@ -90,7 +90,7 @@ import org.apache.commons.imaging.formats.xpm.XpmImageParser;
  *
  * @param <T> type of parameters used by this image parser
  */
-public abstract class ImageParser<T extends ImagingParameters> extends BinaryFileParser {
+public abstract class ImageParser<T extends ImagingParameters<T>> extends BinaryFileParser {
 
     private static final Logger LOGGER = Logger.getLogger(ImageParser.class.getName());
 
@@ -574,8 +574,6 @@ public abstract class ImageParser<T extends ImagingParameters> extends BinaryFil
      */
     public void writeImage(final BufferedImage src, final OutputStream os, final T params)
             throws ImageWriteException, IOException {
-        os.close(); // we are obligated to close stream.
-
         throw new ImageWriteException("This image format (" + getName() + ") cannot be written.");
     }
 
diff --git a/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java b/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
index f2f26ef8..53e7d67d 100644
--- a/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
@@ -22,6 +22,7 @@ import org.apache.commons.imaging.ImagingParameters;
 /**
  * Parameters for formats that support Xmp.
  *
+ * @param <E> this type
  * @since 1.0-alpha3
  */
 public class XmpImagingParameters<E extends XmpImagingParameters<E>> extends ImagingParameters<E> {
diff --git a/src/main/java/org/apache/commons/imaging/internal/Util.java b/src/main/java/org/apache/commons/imaging/internal/Util.java
index c3bd6d7a..355063cf 100644
--- a/src/main/java/org/apache/commons/imaging/internal/Util.java
+++ b/src/main/java/org/apache/commons/imaging/internal/Util.java
@@ -16,16 +16,17 @@
  */
 package org.apache.commons.imaging.internal;
 
+import java.io.IOException;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
 import org.apache.commons.imaging.ImageFormat;
 import org.apache.commons.imaging.ImageFormats;
 import org.apache.commons.imaging.ImageParser;
 import org.apache.commons.imaging.Imaging;
+import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.common.bytesource.ByteSource;
 
-import java.io.IOException;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
 /**
  * Internal utilities.
  *
@@ -35,18 +36,19 @@ public class Util {
 
     private Util() {}
 
-    public static ImageParser<?> getImageParser(final ImageFormat format) {
+    public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final ImageFormat format) {
         return getImageParser(parser -> parser.canAcceptType(format), () -> new IllegalArgumentException("Unknown Format: " + format));
     }
 
-    public static ImageParser<?> getImageParser(final String fileExtension) {
+    public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final String fileExtension) {
         return getImageParser(parser -> parser.canAcceptExtension(fileExtension), () -> new IllegalArgumentException("Unknown Extension: " + fileExtension));
     }
 
     // This generics suppression is as good as the predicate given. If the predicate violates a generics design,
     // then there will be an error during runtime.
-    private static ImageParser<?> getImageParser(final Predicate<ImageParser<?>> pred, final Supplier<? extends RuntimeException> supplier) {
-        return ImageParser
+    @SuppressWarnings("unchecked")
+    private static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final Predicate<ImageParser<?>> pred, final Supplier<? extends RuntimeException> supplier) {
+        return (ImageParser<T>) ImageParser
                 .getAllImageParsers()
                 .stream()
                 .filter(pred)
@@ -54,7 +56,7 @@ public class Util {
                 .orElseThrow(supplier);
     }
 
-    public static ImageParser<?> getImageParser(final ByteSource byteSource) throws IOException {
+    public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final ByteSource byteSource) throws IOException {
         // TODO: circular dependency between Imaging and internal Util class below.
         final ImageFormat format = Imaging.guessFormat(byteSource);
         if (!format.equals(ImageFormats.UNKNOWN)) {
diff --git a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
index e8fc0658..c9bb876a 100644
--- a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
+++ b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
@@ -160,13 +160,13 @@ public class ByteSourceImageTest extends ByteSourceTest {
         assertArrayEquals(iccBytesFile, iccBytesBytes);
     }
 
-    public void checkGetImageInfo(final File imageFile, final byte[] imageFileBytes) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ImageReadException {
+    public void checkGetImageInfo(final File imageFile, final byte[] imageFileBytes)
+            throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ImageReadException {
         final boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
         final ImageFormat imageFormat = Imaging.guessFormat(imageFile);
         ImagingParameters params = null;
         if (imageFormat == ImageFormats.TIFF) {
-            params = new TiffImagingParameters();
-            ((TiffImagingParameters) params).setReadThumbnails(!ignoreImageData);
+            params = new TiffImagingParameters().setReadThumbnails(!ignoreImageData);
         }
         if (imageFormat == ImageFormats.JPEG) {
             params = new JpegImagingParameters();
@@ -189,15 +189,14 @@ public class ByteSourceImageTest extends ByteSourceTest {
             if (!method2.getName().startsWith("get")) {
                 continue;
             }
-            if (method2.getName().equals("getClass"))
-             {
+            if (method2.getName().equals("getClass")) {
                 continue;
-            // if (method.getGenericParameterTypes().length > 0)
-            // continue;
+                // if (method.getGenericParameterTypes().length > 0)
+                // continue;
             }
 
-            final Object valueFile = method2.invoke(imageInfoFile, (Object[])null);
-            final Object valueBytes = method2.invoke(imageInfoBytes, (Object[])null);
+            final Object valueFile = method2.invoke(imageInfoFile, (Object[]) null);
+            final Object valueBytes = method2.invoke(imageInfoBytes, (Object[]) null);
 
             assertEquals(valueFile, valueBytes);
         }
diff --git a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
index a662b45c..13ddafe9 100644
--- a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
+++ b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
@@ -16,6 +16,15 @@
  */
 package org.apache.commons.imaging.formats.xmp;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.nio.file.Files;
+import java.util.List;
+
 import org.apache.commons.imaging.ImageFormat;
 import org.apache.commons.imaging.ImageFormats;
 import org.apache.commons.imaging.ImageParser;
@@ -27,16 +36,7 @@ import org.apache.commons.imaging.internal.Debug;
 import org.apache.commons.imaging.internal.Util;
 import org.junit.jupiter.api.Test;
 
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.nio.file.Files;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-public class XmpUpdateTest extends ImagingTest {
+public class XmpUpdateTest<E extends XmpImagingParameters<E>> extends ImagingTest {
 
     @Test
     public void test() throws Exception {
@@ -68,9 +68,9 @@ public class XmpUpdateTest extends ImagingTest {
             final File tempFile = Files.createTempFile(imageFile.getName() + ".", "." + imageFormat.getDefaultExtension()).toFile();
             final BufferedImage image = Imaging.getBufferedImage(imageFile);
 
-            final ImageParser parser = Util.getImageParser("." + imageFormat.getDefaultExtension());
-            final ImagingParameters params = parser.getDefaultParameters();
-            ((XmpImagingParameters) params).setXmpXml(xmpXml);
+            final ImageParser<E> parser = Util.getImageParser("." + imageFormat.getDefaultExtension());
+            final E params = parser.getDefaultParameters();
+            params.setXmpXml(xmpXml);
             try (FileOutputStream fos = new FileOutputStream(tempFile)) {
                 parser.writeImage(image, fos, params);
             }