< 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 >