1:
36:
37:
38: package ;
39:
40: import ;
41:
42: import ;
43: import ;
44:
45:
48: public abstract class PackedColorModel extends ColorModel
49: {
50: private int masks[];
51:
52:
53: int shifts[];
54:
55: public PackedColorModel(ColorSpace cspace, int pixelBits,
56: int[] colorMaskArray, int alphaMask,
57: boolean isAlphaPremultiplied,
58: int transparency,
59: int transferType)
60: {
61: super(pixelBits, calcBitsPerComponent(colorMaskArray, alphaMask),
62: cspace, (alphaMask != 0), isAlphaPremultiplied, transparency,
63: transferType);
64: initMasks(colorMaskArray, alphaMask);
65: if ((pixelBits<1) || (pixelBits>32)) {
66: throw new IllegalArgumentException("pixels per bits must be " +
67: "in the range [1, 32]");
68: }
69: }
70:
71: private static int[] calcBitsPerComponent(int[] colorMaskArray,
72: int alphaMask)
73: {
74: int numComponents = colorMaskArray.length;
75: if (alphaMask != 0) numComponents++;
76:
77: int[] bitsPerComponent = new int[numComponents];
78:
79: BitMaskExtent extent = new BitMaskExtent();
80: for (int b=0; b<colorMaskArray.length; b++)
81: {
82: extent.setMask(colorMaskArray[b]);
83: bitsPerComponent[b] = extent.bitWidth;
84: }
85: if (alphaMask != 0)
86: {
87: extent.setMask(alphaMask);
88: bitsPerComponent[numComponents-1] = extent.bitWidth;
89: }
90: return bitsPerComponent;
91: }
92:
93:
98: private void initMasks(int[] colorMaskArray, int alphaMask)
99: {
100: int numComponents = colorMaskArray.length;
101: if (alphaMask == 0)
102: {
103: masks = colorMaskArray;
104: }
105: else
106: {
107: masks = new int[numComponents+1];
108: System.arraycopy(colorMaskArray, 0,
109: masks, 0,
110: numComponents);
111: masks[numComponents++] = alphaMask;
112: }
113:
114: shifts = new int[numComponents];
115:
116:
117: BitMaskExtent extent = new BitMaskExtent();
118: for (int b=0; b<numComponents; b++)
119: {
120: extent.setMask(masks[b]);
121: shifts[b] = extent.leastSignificantBit;
122: }
123: }
124:
125: public PackedColorModel(ColorSpace cspace, int pixelBits,
126: int rmask, int gmask, int bmask,
127: int amask, boolean isAlphaPremultiplied,
128: int transparency,
129: int transferType)
130: {
131: this(cspace, pixelBits, makeColorMaskArray(rmask, gmask, bmask),
132: amask, isAlphaPremultiplied, transparency, transferType);
133: }
134:
135:
140:
141: private static int[] makeColorMaskArray(int rmask, int gmask, int bmask)
142: {
143: int[] colorMaskArray = { rmask, gmask, bmask };
144: return colorMaskArray;
145: }
146:
147: public final int getMask(int index)
148: {
149: return masks[index];
150: }
151:
152: public final int[] getMasks()
153: {
154: return masks;
155: }
156:
157: public SampleModel createCompatibleSampleModel(int w, int h)
158: {
159: return new SinglePixelPackedSampleModel(transferType, w, h, masks);
160: }
161:
162: public boolean isCompatibleSampleModel(SampleModel sm)
163: {
164: if (!super.isCompatibleSampleModel(sm)) return false;
165: if (!(sm instanceof SinglePixelPackedSampleModel)) return false;
166:
167: SinglePixelPackedSampleModel sppsm =
168: (SinglePixelPackedSampleModel) sm;
169: return java.util.Arrays.equals(sppsm.getBitMasks(), masks);
170: }
171:
172: public WritableRaster getAlphaRaster(WritableRaster raster) {
173: if (!hasAlpha()) return null;
174:
175: SampleModel sm = raster.getSampleModel();
176: int[] alphaBand = { sm.getNumBands() - 1 };
177: SampleModel alphaModel = sm.createSubsetSampleModel(alphaBand);
178: DataBuffer buffer = raster.getDataBuffer();
179: Point origin = new Point(0, 0);
180: return Raster.createWritableRaster(alphaModel, buffer, origin);
181: }
182:
183: public boolean equals(Object obj)
184: {
185: if (!super.equals(obj)) return false;
186: if (!(obj instanceof PackedColorModel)) return false;
187:
188: PackedColorModel other = (PackedColorModel) obj;
189:
190: return java.util.Arrays.equals(masks, other.masks);
191: }
192: }