indexcolormodel.java
来自「gcc3.2.1源代码」· Java 代码 · 共 356 行
JAVA
356 行
/* Copyright (C) 2000 Free Software Foundation This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License. Please consult the file "LIBGCJ_LICENSE" fordetails. */package java.awt.image;import java.awt.Transparency;import java.awt.color.ColorSpace;import gnu.java.awt.Buffers;/** * @author Rolf W. Rasmussen <rolfwr@ii.uib.no> */public class IndexColorModel extends ColorModel{ private byte[] r; private byte[] g; private byte[] b; private byte[] a; private int[] argb; private byte[] cmap; private int start; private int transparent; private int size; public IndexColorModel(int bits, int size, byte[] r, byte[] g, byte[] b) { super(bits, nArray(bits, 3), ColorSpace.getInstance(ColorSpace.CS_sRGB), false, // no transparency false, // no premultiplied Transparency.OPAQUE, Buffers.smallestAppropriateTransferType(bits)); this.r = r; this.g = g; this.b = b; this.size = size; } public IndexColorModel(int bits, int size, byte[] r, byte[] g, byte[] b, int transparent) { super(bits, nArray(bits, 4), ColorSpace.getInstance(ColorSpace.CS_sRGB), true, // has transparency false, Transparency.BITMASK, Buffers.smallestAppropriateTransferType(bits)); this.r = r; this.g = g; this.b = b; this.transparent = transparent; this.size = size; } public IndexColorModel(int bits, int size, byte[] r, byte[] g, byte[] b, byte[] a) { super(bits, nArray(bits, 4), ColorSpace.getInstance(ColorSpace.CS_sRGB), true, // has transparency false, Transparency.BITMASK, Buffers.smallestAppropriateTransferType(bits)); this.r = r; this.g = g; this.b = b; this.a = a; this.size = size; } public IndexColorModel(int bits, int size, byte[] cmap, int start, boolean hasAlpha) { super(bits, nArray(bits, hasAlpha ? 4 : 3), ColorSpace.getInstance(ColorSpace.CS_sRGB), hasAlpha, false, hasAlpha ? Transparency.TRANSLUCENT : Transparency.OPAQUE, Buffers.smallestAppropriateTransferType(bits)); this.cmap = cmap; this.start = start; this.size = size; } public IndexColorModel(int bits, int size, byte[] cmap, int start, boolean hasAlpha, int transparent, int transferType) { super(bits, nArray(bits, hasAlpha ? 4 : 3), ColorSpace.getInstance(ColorSpace.CS_sRGB), hasAlpha, false, hasAlpha ? Transparency.TRANSLUCENT : ((transparent < 0) ? Transparency.OPAQUE : Transparency.BITMASK), transferType); this.cmap = cmap; this.start = start; this.size = size; } public final int getMapSize() { return size; } public final int getTransparentPixel() { return transparent; } public final void getReds(byte r[]) { if (this.r == null) calcRGBArrays(); System.arraycopy(this.r, 0, r, 0, getMapSize()); } public final void getGreens(byte g[]) { if (this.g == null) calcRGBArrays(); System.arraycopy(this.g, 0, g, 0, getMapSize()); } public final void getBlues(byte b[]) { if (this.b == null) calcRGBArrays(); System.arraycopy(this.b, 0, b, 0, getMapSize()); } public final void getAlphas(byte a[]) { if (this.a == null) calcAlphaArray(); System.arraycopy(this.a, 0, a, 0, getMapSize()); } public final void getRGBs(int rgb[]) { if (this.argb == null) calcARGBArray(); System.arraycopy(this.argb, 0, rgb, 0, getMapSize()); } public int getRed(int pixel) { try { return r[pixel]; } catch (NullPointerException npe) { calcRGBArrays(); return r[pixel]; } } public int getGreen(int pixel) { try { return g[pixel]; } catch (NullPointerException npe) { calcRGBArrays(); return g[pixel]; } } public int getBlue(int pixel) { try { return b[pixel]; } catch (NullPointerException npe) { calcRGBArrays(); return b[pixel]; } } public int getAlpha(int pixel) { try { return a[pixel]; } catch (NullPointerException npe) { calcAlphaArray(); return a[pixel]; } } private void calcRGBArrays() { int j=0; boolean hasAlpha = hasAlpha(); r = new byte[size]; g = new byte[size]; b = new byte[size]; if (hasAlpha) a = new byte[size]; for (int i=0; i<size; i++) { r[i] = cmap[j++]; g[i] = cmap[j++]; b[i] = cmap[j++]; if (hasAlpha()) a[i] = cmap[j++]; } } private void calcAlphaArray() { int transparency = getTransparency(); switch (transparency) { case Transparency.OPAQUE: case Transparency.BITMASK: a = nArray((byte) 255, size); if (transparency == Transparency.BITMASK) a[transparent] = 0; break; case Transparency.TRANSLUCENT: calcRGBArrays(); } } private void calcARGBArray() { int mapSize = getMapSize(); argb = new int[mapSize]; for (int p=0; p<mapSize; p++) argb[p] = getRGB(p); } public int getRed(Object inData) { return getRed(getPixelFromArray(inData)); } public int getGreen(Object inData) { return getGreen(getPixelFromArray(inData)); } public int getBlue(Object inData) { return getBlue(getPixelFromArray(inData)); } public int getAlpha(Object inData) { return getAlpha(getPixelFromArray(inData)); } public int getRGB(Object inData) { return getRGB(getPixelFromArray(inData)); } public Object getDataElements(int rgb, Object pixel) { int av, rv, gv, bv; // using 8 bit values av = (rgb >>> 24) & 0xff; rv = (rgb >>> 16) & 0xff; gv = (rgb >>> 8) & 0xff; bv = (rgb >>> 0) & 0xff; int pixelValue = getPixelValue(av, rv, gv, bv); /* In this color model, the whole pixel fits in the first element of the array. */ DataBuffer buffer = Buffers.createBuffer(transferType, pixel, 1); buffer.setElem(0, pixelValue); return Buffers.getData(buffer); } private int getPixelValue(int av, int rv, int gv, int bv) { if (r == null) calcRGBArrays(); if (a == null) calcAlphaArray(); int minDAlpha = 1<<8; int minDRGB = (1<<8)*(1<<8)*3; int pixelValue = -1; for (int i=0; i<size; i++) { int dAlpha = Math.abs(av-(a[i]&0xff)); if (dAlpha > minDAlpha) continue; int dR = rv-(r[i]&0xff); int dG = gv-(g[i]&0xff); int dB = bv-(b[i]&0xff); int dRGB = dR*dR + dG*dG + dB*dB; if (dRGB >= minDRGB) continue; pixelValue = i; minDRGB = dRGB; } return pixelValue; } public int[] getComponents(int pixel, int[] components, int offset) { int numComponents = getNumComponents(); if (components == null) components = new int[offset + numComponents]; components[offset++] = (r[pixel]&0xff); components[offset++] = (g[pixel]&0xff); components[offset++] = (b[pixel]&0xff); if (hasAlpha()) components[offset++] = (a[pixel]&0xff); return components; } public final int[] getComponents(Object pixel, int[] components, int offset) { return getComponents(getPixelFromArray(pixel), components, offset); } public int getDataElement(int[] components, int offset) { int r = components[offset++]; int g = components[offset++]; int b = components[offset++]; int a = hasAlpha() ? components[offset++] : 255; return getPixelValue(a, r, g, b); } public Object getDataElements(int[] components, int offset, Object pixel) { int pixelValue = getDataElement(components, offset); /* In this color model, the whole pixel fits in the first element of the array. */ DataBuffer buffer = Buffers.createBuffer(transferType, pixel, 1); buffer.setElem(0, pixelValue); return Buffers.getData(buffer); } public SampleModel createCompatibleSampleModel(int w, int h) { int[] bandOffsets = {0}; return new ComponentSampleModel(transferType, w, h, 1, // pixel stride w, // scanline stride bandOffsets); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?