< prev index next >
src/java.desktop/share/classes/java/awt/image/PackedColorModel.java
Print this page
@@ -25,10 +25,11 @@
package java.awt.image;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
+import java.util.Arrays;
/**
* The {@code PackedColorModel} class is an abstract
* {@link ColorModel} class that works with pixel values which represent
* color and alpha information as separate samples and which pack all
@@ -86,10 +87,11 @@
public abstract class PackedColorModel extends ColorModel {
int[] maskArray;
int[] maskOffsets;
float[] scaleFactors;
+ private volatile int hashCode;
/**
* Constructs a {@code PackedColorModel} from a color mask array,
* which specifies which bits in an {@code int} pixel representation
* contain each of the color samples, and an alpha mask. Color
@@ -383,23 +385,30 @@
raster.getHeight(), x, y,
band);
}
/**
- * Tests if the specified {@code Object} is an instance
- * of {@code PackedColorModel} and equals this
+ * Tests if the specified {@code Object} equals this
* {@code PackedColorModel}.
+ * In order to protect the symmetry property of
+ * {@code (a.equals(b) == b.equals(a))},
+ * the target object must be the same class (and not a subclass)
+ * as this object to evaluate as {equals}.
+ * The target object and this object will be equal if all of the
+ * properties checked by the {equals} method of {ColorModel} are
+ * valid, additionally for PackedColorModel we also check the masks
+ * of the color and alpha samples.
* @param obj the {@code Object} to test for equality
* @return {@code true} if the specified {@code Object}
- * is an instance of {@code PackedColorModel} and equals this
- * {@code PackedColorModel}; {@code false} otherwise.
+ * equals this {@code PackedColorModel}; {@code false} otherwise.
*/
+ @Override
public boolean equals(Object obj) {
- if (!(obj instanceof PackedColorModel)) {
- return false;
- }
-
+ /*
+ * We verify the type of argument obj in super.equals() where we check
+ * for equality of class name.
+ */
if (!super.equals(obj)) {
return false;
}
PackedColorModel cm = (PackedColorModel) obj;
@@ -410,10 +419,26 @@
}
}
return true;
}
+ /**
+ * Returns the hash code for this PackedColorModel.
+ *
+ * @return a hash code for this PackedColorModel.
+ */
+ @Override
+ public int hashCode() {
+ int result = hashCode;
+ if (result == 0) {
+ result = super.hashCode();
+ result = 89 * result + Arrays.hashCode(this.maskArray);
+ hashCode = result;
+ }
+ return result;
+ }
+
private static final int[] createBitsArray(int[]colorMaskArray,
int alphaMask) {
int numColors = colorMaskArray.length;
int numAlpha = (alphaMask == 0 ? 0 : 1);
int[] arr = new int[numColors+numAlpha];
< prev index next >