< prev index next >
src/java.desktop/share/classes/java/awt/image/ColorModel.java
Print this page
*** 29,42 ****
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import sun.java2d.cmm.CMSManager;
import sun.java2d.cmm.ColorTransform;
import sun.java2d.cmm.PCMM;
! import java.awt.Toolkit;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
/**
* The {@code ColorModel} abstract class encapsulates the
* methods for translating a pixel value to color components
* (for example, red, green, and blue) and an alpha component.
--- 29,43 ----
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import sun.java2d.cmm.CMSManager;
import sun.java2d.cmm.ColorTransform;
import sun.java2d.cmm.PCMM;
! import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
+ import java.util.Objects;
/**
* The {@code ColorModel} abstract class encapsulates the
* methods for translating a pixel value to color components
* (for example, red, green, and blue) and an alpha component.
*** 168,177 ****
--- 169,179 ----
int numColorComponents = -1;
ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
int colorSpaceType = ColorSpace.TYPE_RGB;
int maxBits;
boolean is_sRGB = true;
+ private volatile int hashCode;
/**
* Data type of the array used to represent pixel values.
*/
protected int transferType;
*** 360,370 ****
else {
this.isAlphaPremultiplied = isAlphaPremultiplied;
this.transparency = transparency;
}
! nBits = bits.clone();
this.pixel_bits = pixel_bits;
if (pixel_bits <= 0) {
throw new IllegalArgumentException("Number of pixel bits must "+
"be > 0");
}
--- 362,379 ----
else {
this.isAlphaPremultiplied = isAlphaPremultiplied;
this.transparency = transparency;
}
! /*
! * We need significant bits value only for the length
! * of number of components, so we truncate remaining part.
! * It also helps in hashCode calculation since bits[] can contain
! * different values after the length of number of components between
! * two ColorModels.
! */
! nBits = Arrays.copyOf(bits, numComponents);
this.pixel_bits = pixel_bits;
if (pixel_bits <= 0) {
throw new IllegalArgumentException("Number of pixel bits must "+
"be > 0");
}
*** 1439,1470 ****
return getNormalizedComponents(components, 0,
normComponents, normOffset);
}
/**
! * Tests if the specified {@code Object} is an instance of
! * {@code ColorModel} and if it equals this
* {@code ColorModel}.
* @param obj the {@code Object} to test for equality
* @return {@code true} if the specified {@code Object}
! * is an instance of {@code ColorModel} and equals this
! * {@code ColorModel}; {@code false} otherwise.
*/
public boolean equals(Object obj) {
! if (!(obj instanceof ColorModel)) {
return false;
}
- ColorModel cm = (ColorModel) obj;
! if (this == cm) {
! return true;
! }
if (supportsAlpha != cm.hasAlpha() ||
isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
pixel_bits != cm.getPixelSize() ||
transparency != cm.getTransparency() ||
! numComponents != cm.getNumComponents())
{
return false;
}
int[] nb = cm.getComponentSize();
--- 1448,1499 ----
return getNormalizedComponents(components, 0,
normComponents, normOffset);
}
/**
! * Tests if the specified {@code Object} equals this
* {@code ColorModel}.
+ * 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}.
+ * <p>
+ * The target object and this object will be equal if the
+ * following properties are same:
+ *
+ * <ul>
+ * <li>Support for alpha component.
+ * <li>Is alpha premultiplied.
+ * <li>Number of bits per pixel.
+ * <li>Type of transparency like Opaque, Bitmask or Translucent.
+ * <li>Number of components in a pixel.
+ * <li>{@code ColorSpace} type.
+ * <li>Type of the array used to represent pixel values.
+ * <li>Number of significant bits per color and alpha component.
+ * </ul>
+ * <p>
* @param obj the {@code Object} to test for equality
* @return {@code true} if the specified {@code Object}
! * equals this {@code ColorModel}; {@code false} otherwise.
*/
+ @Override
public boolean equals(Object obj) {
! if (this == obj) {
! return true;
! }
! if ((obj == null) || (obj.getClass() != getClass())) {
return false;
}
! ColorModel cm = (ColorModel) obj;
if (supportsAlpha != cm.hasAlpha() ||
isAlphaPremultiplied != cm.isAlphaPremultiplied() ||
pixel_bits != cm.getPixelSize() ||
transparency != cm.getTransparency() ||
! numComponents != cm.getNumComponents() ||
! (!(colorSpace.equals(cm.colorSpace))) ||
! transferType != cm.transferType)
{
return false;
}
int[] nb = cm.getComponentSize();
*** 1485,1510 ****
/**
* Returns the hash code for this ColorModel.
*
* @return a hash code for this ColorModel.
*/
public int hashCode() {
!
! int result = 0;
!
! result = (supportsAlpha ? 2 : 3) +
! (isAlphaPremultiplied ? 4 : 5) +
! pixel_bits * 6 +
! transparency * 7 +
! numComponents * 8;
!
! if (nBits != null) {
! for (int i = 0; i < numComponents; i++) {
! result = result + nBits[i] * (i + 9);
}
- }
-
return result;
}
/**
* Returns the {@code ColorSpace} associated with this
--- 1514,1538 ----
/**
* Returns the hash code for this ColorModel.
*
* @return a hash code for this ColorModel.
*/
+ @Override
public int hashCode() {
! int result = hashCode;
! if (result == 0) {
! result = 7;
! result = 89 * result + this.pixel_bits;
! result = 89 * result + Arrays.hashCode(this.nBits);
! result = 89 * result + this.transparency;
! result = 89 * result + (this.supportsAlpha ? 1 : 0);
! result = 89 * result + (this.isAlphaPremultiplied ? 1 : 0);
! result = 89 * result + this.numComponents;
! result = 89 * result + Objects.hashCode(this.colorSpace);
! result = 89 * result + this.transferType;
! hashCode = result;
}
return result;
}
/**
* Returns the {@code ColorSpace} associated with this
< prev index next >