1 18 package org.apache.batik.ext.awt.image.rendered; 19 20 21 22 import java.awt.Transparency ; 23 import java.awt.color.ColorSpace ; 24 import java.awt.image.ComponentColorModel ; 25 import java.awt.image.DataBuffer ; 26 import java.awt.image.DataBufferByte ; 27 import java.awt.image.PixelInterleavedSampleModel ; 28 import java.awt.image.Raster ; 29 import java.awt.image.SampleModel ; 30 import java.awt.image.WritableRaster ; 31 32 import org.apache.batik.ext.awt.ColorSpaceHintKey; 33 34 39 public class FilterAsAlphaRed extends AbstractRed { 40 41 47 public FilterAsAlphaRed(CachableRed src) { 48 super(new Any2LumRed(src),src.getBounds(), 49 new ComponentColorModel 50 (ColorSpace.getInstance(ColorSpace.CS_GRAY), 51 new int [] {8}, false, false, 52 Transparency.OPAQUE, 53 DataBuffer.TYPE_BYTE), 54 new PixelInterleavedSampleModel 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 copyData(WritableRaster wr) { 69 CachableRed srcRed = (CachableRed)getSources().get(0); 71 72 SampleModel sm = srcRed.getSampleModel(); 73 if (sm.getNumBands() == 1) 74 return srcRed.copyData(wr); 76 77 82 Raster srcRas = srcRed.getData(wr.getBounds()); 83 PixelInterleavedSampleModel srcSM; 84 srcSM = (PixelInterleavedSampleModel )srcRas.getSampleModel(); 85 86 DataBufferByte srcDB = (DataBufferByte )srcRas.getDataBuffer(); 87 byte [] src = srcDB.getData(); 88 89 PixelInterleavedSampleModel dstSM; 90 dstSM = (PixelInterleavedSampleModel )wr.getSampleModel(); 91 92 DataBufferByte dstDB = (DataBufferByte )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 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; 116 while (dstI < dstE) { 117 dst[dstI++] = src[srcI]; 118 srcI += srcStep; } 120 srcY0++; 121 dstY0++; 122 } 123 } 124 else { 125 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; int sa = (src[srcI+srcAOff])&0xFF; 139 dst[dstI++] = (byte)((sl*sa+0x80)>>8); 141 142 srcI+= srcStep; } 144 srcY0++; 145 dstY0++; 146 } 147 } 148 149 return wr; 150 } 151 152 } 153 | Popular Tags |