From 71057388111f70566fcefc748dff6effd5744aba Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Fri, 24 Dec 2021 12:57:24 +0100 Subject: [PATCH] #651: Fix ExtraSamplesColorModel equals + hashcode to behave nicely with ImageTypeSpecifier comparison. (cherry picked from commit 98e4b762067344dc23fd3e30ee7e6cf9e143f950) --- .../plugins/tiff/ExtraSamplesColorModel.java | 41 +++++++++++++++++++ .../tiff/ExtraSamplesColorModelTest.java | 24 +++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java index 01b3a85c..d5c8ab7b 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java @@ -35,6 +35,7 @@ import com.twelvemonkeys.lang.Validate; import java.awt.*; import java.awt.color.ColorSpace; import java.awt.image.*; +import java.util.Objects; import static java.awt.image.DataBuffer.getDataTypeSize; @@ -119,4 +120,44 @@ final class ExtraSamplesColorModel extends ComponentColorModel { throw new IllegalArgumentException("This method has not been implemented for transferType " + transferType); } + + @Override + public boolean equals(final Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + + ExtraSamplesColorModel that = (ExtraSamplesColorModel) other; + + if (hasAlpha() != that.hasAlpha() || + isAlphaPremultiplied() != that.isAlphaPremultiplied() || + getPixelSize() != that.getPixelSize() || + getTransparency() != that.getTransparency() || + numComponents != that.numComponents) { + return false; + } + + int[] nBits = getComponentSize(); + int[] nb = that.getComponentSize(); + + if ((nBits == null) || (nb == null)) { + return ((nBits == null) && (nb == null)); + } + + for (int i = 0; i < nBits.length; i++) { + if (nBits[i] != nb[i]) { + return false; + } + } + + return true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), numComponents, componentSize); + } } diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModelTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModelTest.java index 50cb02af..705baebf 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModelTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModelTest.java @@ -40,15 +40,14 @@ import java.awt.color.ColorSpace; import java.awt.image.*; import java.util.Hashtable; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; public class ExtraSamplesColorModelTest { private BufferedImage createExtraSamplesImage(int w, int h, ColorSpace cs, boolean hasAlpha, int extraComponents) { int samplesPerPixel = cs.getNumComponents() + (hasAlpha ? 1 : 0) + extraComponents; - ExtraSamplesColorModel colorModel = new ExtraSamplesColorModel(cs, hasAlpha, true, DataBuffer.TYPE_BYTE, extraComponents); + ExtraSamplesColorModel colorModel = createExtraSamplesColorModel(cs, hasAlpha, extraComponents); SampleModel sampleModel = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, w, h, samplesPerPixel, samplesPerPixel * w, createOffsets(samplesPerPixel)); WritableRaster raster = Raster.createWritableRaster(sampleModel, new Point(0, 0)); @@ -56,6 +55,10 @@ public class ExtraSamplesColorModelTest { return new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), new Hashtable<>()); } + private ExtraSamplesColorModel createExtraSamplesColorModel(ColorSpace cs, boolean hasAlpha, int extraComponents) { + return new ExtraSamplesColorModel(cs, hasAlpha, true, DataBuffer.TYPE_BYTE, extraComponents); + } + private static int[] createOffsets(int samplesPerPixel) { int[] offsets = new int[samplesPerPixel]; for (int i = 0; i < samplesPerPixel; i++) { @@ -151,4 +154,19 @@ public class ExtraSamplesColorModelTest { assertEquals(Color.BLACK.getRGB(), image.getRGB(0, 0)); assertEquals(Color.WHITE.getRGB(), image.getRGB(1, 0)); } + + @Test + public void testEquals() { + ExtraSamplesColorModel original = createExtraSamplesColorModel(ColorSpaces.getColorSpace(ColorSpace.CS_sRGB), true, 1); + ExtraSamplesColorModel equal = createExtraSamplesColorModel(ColorSpaces.getColorSpace(ColorSpace.CS_sRGB), true, 1); + + assertEquals(original, equal); + assertEquals(equal, original); + + ExtraSamplesColorModel different = createExtraSamplesColorModel(ColorSpaces.getColorSpace(ColorSpace.CS_sRGB), true, 2); + ExtraSamplesColorModel differentToo = createExtraSamplesColorModel(ColorSpaces.getColorSpace(ColorSpace.CS_sRGB), false, 1); + + assertNotEquals(original, different); + assertNotEquals(original, differentToo); + } } \ No newline at end of file