indexcolormodel.java

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· Java 代码 · 共 517 行 · 第 1/2 页

JAVA
517
字号
        && transferType != DataBuffer.TYPE_USHORT)      throw new IllegalArgumentException();    if (bits > 16)      throw new IllegalArgumentException("bits > 16");    if (size < 1)      throw new IllegalArgumentException("size < 1");    map_size = size;    opaque = !hasAlpha;    this.trans = trans;    rgb = new int[size];    if (!hasAlpha)      for (int i = 0; i < size; i++)	rgb[i] = cmap[i + start] | 0xff000000;    else      System.arraycopy(cmap, start, rgb, 0, size);    // Generate a bigint with 1's for every pixel    validBits = validBits.setBit(size).subtract(BigInteger.ONE);  }  /**   * Construct an IndexColorModel using a colormap with holes.   *    * The IndexColorModel is built from the array of ints defining the   * colormap.  Each element contains red, green, blue, and alpha   * components.    The ColorSpace is sRGB.  The transparency value is   * automatically determined.   *    * This constructor permits indicating which colormap entries are valid,   * using the validBits argument.  Each entry in cmap is valid if the   * corresponding bit in validBits is set.     *    * @param bits the number of bits needed to represent <code>size</code> colors   * @param size the number of colors in the color map   * @param cmap packed color components   * @param start the offset of the first color component in <code>cmap</code>   * @param transferType DataBuffer.TYPE_BYTE or DataBuffer.TYPE_USHORT   * @throws IllegalArgumentException if bits < 1, bits > 16, or size < 1.   * @throws IllegalArgumentException if transferType is something other than   * TYPE_BYTE or TYPE_USHORT.   */  public IndexColorModel (int bits, int size, int[] cmap, int start,                           int transferType, BigInteger validBits)  {    super(bits * 4, // total bits, sRGB, four channels	  nArray(bits, 4), // bits for each channel	  ColorSpace.getInstance(ColorSpace.CS_sRGB), // sRGB	  true, // has alpha	  false, // not premultiplied	  TRANSLUCENT, transferType);    if (transferType != DataBuffer.TYPE_BYTE        && transferType != DataBuffer.TYPE_USHORT)      throw new IllegalArgumentException();    if (bits > 16)      throw new IllegalArgumentException("bits > 16");    if (size < 1)      throw new IllegalArgumentException("size < 1");    map_size = size;    opaque = false;    this.trans = -1;    this.validBits = validBits;    rgb = new int[size];    if (!hasAlpha)      for (int i = 0; i < size; i++)	rgb[i] = cmap[i + start] | 0xff000000;    else      System.arraycopy(cmap, start, rgb, 0, size);  }  public final int getMapSize ()  {    return map_size;  }  /**   * Get the index of the transparent color in this color model   */  public final int getTransparentPixel ()  {    return trans;  }  /**   * <br>   */  public final void getReds (byte[] r)  {    getComponents (r, 2);  }  /**   * <br>   */  public final void getGreens (byte[] g)  {    getComponents (g, 1);  }  /**   * <br>   */  public final void getBlues (byte[] b)  {    getComponents (b, 0);  }  /**   * <br>   */  public final void getAlphas (byte[] a)  {    getComponents (a, 3);  }  private void getComponents (byte[] c, int ci)  {    int i, max = (map_size < c.length) ? map_size : c.length;    for (i = 0; i < max; i++)	    c[i] = (byte) ((generateMask (ci)  & rgb[i]) >> (ci * pixel_bits));  }   /**   * Get the red component of the given pixel.   */  public final int getRed (int pixel)  {    if (pixel < map_size)	    return (int) ((generateMask (2) & rgb[pixel]) >> (2 * pixel_bits));        return 0;  }  /**   * Get the green component of the given pixel.   */  public final int getGreen (int pixel)  {    if (pixel < map_size)	    return (int) ((generateMask (1) & rgb[pixel]) >> (1 * pixel_bits));        return 0;  }  /**   * Get the blue component of the given pixel.   */  public final int getBlue (int pixel)  {    if (pixel < map_size) 	    return (int) (generateMask (0) & rgb[pixel]);        return 0;  }  /**   * Get the alpha component of the given pixel.   */  public final int getAlpha (int pixel)  {    if (opaque || pixel >= map_size)      return 255;    return (int) ((generateMask (3) & rgb[pixel]) >> (3 * pixel_bits));  }  /**   * Get the RGB color value of the given pixel using the default   * RGB color model.    *   * @param pixel a pixel value   */  public final int getRGB (int pixel)  {    if (pixel < map_size)	    return rgb[pixel];        return 0;  }      /**   * Get the RGB color values of all pixels in the map using the default   * RGB color model.    *   * @param rgb The destination array.   */  public final void getRGBs (int[] rgb)  {    System.arraycopy(this.rgb, 0, rgb, 0, map_size);  }       //pixel_bits is number of bits to be in generated mask  private int generateMask (int offset)  {    return (((2 << pixel_bits ) - 1) << (pixel_bits * offset));  }  /** Return true if pixel is valid, false otherwise. */  public boolean isValid(int pixel)  {    return validBits.testBit(pixel);  }    /** Return true if all pixels are valid, false otherwise. */  public boolean isValid()  {    // Generate a bigint with 1's for every pixel    BigInteger allbits = new BigInteger("0");    allbits.setBit(map_size);    allbits.subtract(new BigInteger("1"));    return allbits.equals(validBits);  }    /**    * Returns a BigInteger where each bit represents an entry in the color   * model.  If the bit is on, the entry is valid.   */  public BigInteger getValidPixels()  {    return validBits;  }    /**   * Construct a BufferedImage with rgb pixel values from a Raster.   *    * Constructs a new BufferedImage in which each pixel is an RGBA int from   * a Raster with index-valued pixels.  If this model has no alpha component   * or transparent pixel, the type of the new BufferedImage is TYPE_INT_RGB.   * Otherwise the type is TYPE_INT_ARGB.  If forceARGB is true, the type is   * forced to be TYPE_INT_ARGB no matter what.   *    * @param raster The source of pixel values.   * @param forceARGB True if type must be TYPE_INT_ARGB.   * @return New BufferedImage with RBGA int pixel values.   */  public BufferedImage convertToIntDiscrete(Raster raster, boolean forceARGB)  {    int type = forceARGB ? BufferedImage.TYPE_INT_ARGB      : ((opaque && trans == -1) ? BufferedImage.TYPE_INT_RGB :	 BufferedImage.TYPE_INT_ARGB);     // FIXME: assuming that raster has only 1 band since pixels are supposed    // to be int indexes.    // FIXME: it would likely be more efficient to fetch a complete array,    // but it would take much more memory.    // FIXME: I'm not sure if transparent pixels or alpha values need special    // handling here.    BufferedImage im = new BufferedImage(raster.width, raster.height, type);    for (int x = raster.minX; x < raster.width + raster.minX; x++)      for (int y = raster.minY; y < raster.height + raster.minY; y++)        im.setRGB(x, y, rgb[raster.getSample(x, y, 0)]);    return im;  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?