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:35 UTC

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

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