@Override
  public int hashCode() {
    int hash = 0;
    int tmp;

    if (hasAlpha) {
      hash ^= 1;
      hash <<= 8;
    }
    if (isAlphaPremultiplied) {
      hash ^= 1;
      hash <<= 8;
    }

    tmp = hash >>> 24;
    hash ^= numColorComponents;
    hash <<= 8;
    hash |= tmp;

    tmp = hash >>> 24;
    hash ^= transparency;
    hash <<= 8;
    hash |= tmp;

    tmp = hash >>> 24;
    hash ^= cs.getType();
    hash <<= 8;
    hash |= tmp;

    tmp = hash >>> 24;
    hash ^= pixel_bits;
    hash <<= 8;
    hash |= tmp;

    tmp = hash >>> 24;
    hash ^= transferType;
    hash <<= 8;
    hash |= tmp;

    if (bits != null) {

      for (int element : bits) {
        tmp = hash >>> 24;
        hash ^= element;
        hash <<= 8;
        hash |= tmp;
      }
    }

    return hash;
  }
  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof ColorModel)) {
      return false;
    }
    ColorModel cm = (ColorModel) obj;

    return (pixel_bits == cm.getPixelSize()
        && transferType == cm.getTransferType()
        && cs.getType() == cm.getColorSpace().getType()
        && hasAlpha == cm.hasAlpha()
        && isAlphaPremultiplied == cm.isAlphaPremultiplied()
        && transparency == cm.getTransparency()
        && numColorComponents == cm.getNumColorComponents()
        && numComponents == cm.getNumComponents()
        && Arrays.equals(bits, cm.getComponentSize()));
  }