KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > batik > ext > awt > image > rendered > FilterAsAlphaRed


1 /*
2
3    Copyright 2001-2003 The Apache Software Foundation
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16
17  */

18 package org.apache.batik.ext.awt.image.rendered;
19
20
21
22 import java.awt.Transparency JavaDoc;
23 import java.awt.color.ColorSpace JavaDoc;
24 import java.awt.image.ComponentColorModel JavaDoc;
25 import java.awt.image.DataBuffer JavaDoc;
26 import java.awt.image.DataBufferByte JavaDoc;
27 import java.awt.image.PixelInterleavedSampleModel JavaDoc;
28 import java.awt.image.Raster JavaDoc;
29 import java.awt.image.SampleModel JavaDoc;
30 import java.awt.image.WritableRaster JavaDoc;
31
32 import org.apache.batik.ext.awt.ColorSpaceHintKey;
33
34 /**
35  * This converts any source into a mask according to the SVG masking rules.
36  *
37  * @author <a HREF="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
38  * @version $Id: FilterAsAlphaRed.java,v 1.5 2004/08/18 07:14:08 vhardy Exp $ */

39 public class FilterAsAlphaRed extends AbstractRed {
40
41     /**
42      * Construct an alpah channel from the given src, according to
43      * the SVG masking rules.
44      *
45      * @param src The image to convert to an alpha channel (mask image)
46      */

47     public FilterAsAlphaRed(CachableRed src) {
48         super(new Any2LumRed(src),src.getBounds(),
49               new ComponentColorModel JavaDoc
50                   (ColorSpace.getInstance(ColorSpace.CS_GRAY),
51                    new int [] {8}, false, false,
52                    Transparency.OPAQUE,
53                    DataBuffer.TYPE_BYTE),
54               new PixelInterleavedSampleModel JavaDoc
55                   (DataBuffer.TYPE_BYTE,
56                    src.getSampleModel().getWidth(),
57                    src.getSampleModel().getHeight(),
58                    1, src.getSampleModel().getWidth(),
59                    new int [] { 0 }),
60               src.getTileGridXOffset(),
61               src.getTileGridYOffset(),
62               null);
63
64         props.put(ColorSpaceHintKey.PROPERTY_COLORSPACE,
65                   ColorSpaceHintKey.VALUE_COLORSPACE_ALPHA);
66     }
67
68     public WritableRaster JavaDoc copyData(WritableRaster JavaDoc wr) {
69         // Get my source.
70
CachableRed srcRed = (CachableRed)getSources().get(0);
71
72         SampleModel JavaDoc sm = srcRed.getSampleModel();
73         if (sm.getNumBands() == 1)
74             // Already one band of data so we just use it...
75
return srcRed.copyData(wr);
76
77         // Two band case so we need to multiply them...
78
// Note: Our source will always have either one or two bands
79
// since we insert an Any2Lum transform before ourself in the
80
// rendering chain.
81

82         Raster JavaDoc srcRas = srcRed.getData(wr.getBounds());
83         PixelInterleavedSampleModel JavaDoc srcSM;
84         srcSM = (PixelInterleavedSampleModel JavaDoc)srcRas.getSampleModel();
85
86         DataBufferByte JavaDoc srcDB = (DataBufferByte JavaDoc)srcRas.getDataBuffer();
87         byte [] src = srcDB.getData();
88         
89         PixelInterleavedSampleModel JavaDoc dstSM;
90         dstSM = (PixelInterleavedSampleModel JavaDoc)wr.getSampleModel();
91
92         DataBufferByte JavaDoc dstDB = (DataBufferByte JavaDoc)wr.getDataBuffer();
93         byte [] dst = dstDB.getData();
94
95         int srcX0 = srcRas.getMinX()-srcRas.getSampleModelTranslateX();
96         int srcY0 = srcRas.getMinY()-srcRas.getSampleModelTranslateY();
97
98         int dstX0 = wr.getMinX()-wr.getSampleModelTranslateX();
99         int dstX1 = dstX0+wr.getWidth()-1;
100         int dstY0 = wr.getMinY()-wr.getSampleModelTranslateY();
101
102         int srcStep = srcSM.getPixelStride();
103         int [] offsets = srcSM.getBandOffsets();
104         int srcLOff = offsets[0];
105         int srcAOff = offsets[1];
106
107         if (srcRed.getColorModel().isAlphaPremultiplied()) {
108             // Lum is already multiplied by alpha so we just copy lum channel.
109
for (int y=0; y<srcRas.getHeight(); y++) {
110                 int srcI = srcDB.getOffset() + srcSM.getOffset(srcX0, srcY0);
111                 int dstI = dstDB.getOffset() + dstSM.getOffset(dstX0, dstY0);
112                 int dstE = dstDB.getOffset() + dstSM.getOffset(dstX1+1,dstY0);
113
114                 srcI += srcLOff; // Go to Lum Channel (already mult by alpha).
115

116                 while (dstI < dstE) {
117                     dst[dstI++] = src[srcI];
118                         srcI += srcStep; // Go to next pixel
119
}
120                 srcY0++;
121                 dstY0++;
122             }
123         }
124         else {
125             // This allows me to pre-adjust my index by srcLOff
126
// Then only add the offset for srcAOff
127
srcAOff = srcAOff-srcLOff;
128
129             for (int y=0; y<srcRas.getHeight(); y++) {
130                 int srcI = srcDB.getOffset() + srcSM.getOffset(srcX0, srcY0);
131                 int dstI = dstDB.getOffset() + dstSM.getOffset(dstX0, dstY0);
132                 int dstE = dstDB.getOffset() + dstSM.getOffset(dstX1+1,dstY0);
133
134                 srcI += srcLOff;
135
136                 while (dstI < dstE) {
137                     int sl = (src[srcI])&0xFF; // LOff already included
138
int sa = (src[srcI+srcAOff])&0xFF;
139                     // the + 0x80 forces proper rounding.
140
dst[dstI++] = (byte)((sl*sa+0x80)>>8);
141
142                     srcI+= srcStep; // next pixel
143
}
144                 srcY0++;
145                 dstY0++;
146             }
147         }
148
149         return wr;
150     }
151
152 }
153
Popular Tags