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 + -
显示快捷键?