OLD | NEW |
| (Empty) |
1 /* libs/graphics/sgl/SkBitmapShaderTemplate.h | |
2 ** | |
3 ** Copyright 2006, The Android Open Source Project | |
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 | |
19 #ifndef NOFILTER_BITMAP_SHADER_PREAMBLE | |
20 #define NOFILTER_BITMAP_SHADER_PREAMBLE(bitmap, rb) | |
21 #endif | |
22 #ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE | |
23 #define NOFILTER_BITMAP_SHADER_POSTAMBLE(bitmap) | |
24 #endif | |
25 #ifndef NOFILTER_BITMAP_SHADER_PREAMBLE16 | |
26 #define NOFILTER_BITMAP_SHADER_PREAMBLE16(bitmap, rb) | |
27 #endif | |
28 #ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE16 | |
29 #define NOFILTER_BITMAP_SHADER_POSTAMBLE16(bitmap) | |
30 #endif | |
31 | |
32 class NOFILTER_BITMAP_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader { | |
33 public: | |
34 NOFILTER_BITMAP_SHADER_CLASS(const SkBitmap& src) | |
35 : HasSpan16_Sampler_BitmapShader(src, false, | |
36 NOFILTER_BITMAP_SHADER_TILEMODE, | |
37 NOFILTER_BITMAP_SHADER_TILEMODE) | |
38 { | |
39 } | |
40 | |
41 virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const
SkMatrix& matrix) | |
42 { | |
43 if (!this->INHERITED::setContext(device, paint, matrix)) | |
44 return false; | |
45 | |
46 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
47 this->computeUnitInverse(); | |
48 #endif | |
49 return true; | |
50 } | |
51 | |
52 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) | |
53 { | |
54 SkASSERT(count > 0); | |
55 | |
56 #ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC32 | |
57 if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) ==
0) | |
58 { | |
59 NOFILTER_BITMAP_SHADER_SPRITEPROC32(this, x, y, dstC, count); | |
60 return; | |
61 } | |
62 #endif | |
63 | |
64 unsigned scale = SkAlpha255To256(this->getPaintAlpha()); | |
65 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
66 const SkMatrix& inv = this->getUnitInverse(); | |
67 SkMatrix::MapPtProc invProc = this->getUnitInverseProc(); | |
68 #else | |
69 const SkMatrix& inv = this->getTotalInverse(); | |
70 SkMatrix::MapPtProc invProc = this->getInverseMapPtProc(); | |
71 #endif | |
72 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
73 unsigned srcMaxX = srcBitmap.width() - 1; | |
74 unsigned srcMaxY = srcBitmap.height() - 1; | |
75 unsigned srcRB = srcBitmap.rowBytes(); | |
76 SkFixed fx, fy, dx, dy; | |
77 | |
78 const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
79 NOFILTER_BITMAP_SHADER_PREAMBLE(srcBitmap, srcRB); | |
80 | |
81 if (this->getInverseClass() == kPerspective_MatrixClass) | |
82 { | |
83 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
84 SkIntToScalar(y) + SK_ScalarHalf, count); | |
85 while ((count = iter.next()) != 0) | |
86 { | |
87 const SkFixed* srcXY = iter.getXY(); | |
88 | |
89 /* Do I need this? | |
90 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
91 fx >>= level; | |
92 fy >>= level; | |
93 #endif | |
94 */ | |
95 if (256 == scale) | |
96 { | |
97 while (--count >= 0) | |
98 { | |
99 fx = *srcXY++; | |
100 fy = *srcXY++; | |
101 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX
); | |
102 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY
); | |
103 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x,
y, srcRB); | |
104 } | |
105 } | |
106 else | |
107 { | |
108 while (--count >= 0) | |
109 { | |
110 fx = *srcXY++; | |
111 fy = *srcXY++; | |
112 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX
); | |
113 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY
); | |
114 uint32_t c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels,
x, y, srcRB); | |
115 *dstC++ = SkAlphaMulQ(c, scale); | |
116 } | |
117 } | |
118 } | |
119 return; | |
120 } | |
121 | |
122 // now init fx, fy, dx, dy | |
123 { | |
124 SkPoint srcPt; | |
125 invProc(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
126 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | |
127 | |
128 fx = SkScalarToFixed(srcPt.fX); | |
129 fy = SkScalarToFixed(srcPt.fY); | |
130 | |
131 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
132 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
133 else | |
134 { | |
135 dx = SkScalarToFixed(inv.getScaleX()); | |
136 dy = SkScalarToFixed(inv.getSkewY()); | |
137 } | |
138 } | |
139 | |
140 #if defined(SK_SUPPORT_MIPMAP) && !defined(NOFILTER_BITMAP_SHADER_USE_UNITINVERS
E) | |
141 { int level = this->getMipLevel() >> 16; | |
142 fx >>= level; | |
143 fy >>= level; | |
144 dx >>= level; | |
145 dy >>= level; | |
146 } | |
147 #endif | |
148 | |
149 if (dy == 0) | |
150 { | |
151 int y_index = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
152 // SkDEBUGF(("fy = %g, srcMaxY = %d, y_index = %d\n", SkFixedToFloat(fy
), srcMaxY, y_index)); | |
153 srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPix
els + y_index * srcRB); | |
154 if (scale == 256) | |
155 while (--count >= 0) | |
156 { | |
157 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
158 fx += dx; | |
159 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x); | |
160 } | |
161 else | |
162 while (--count >= 0) | |
163 { | |
164 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
165 SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x); | |
166 fx += dx; | |
167 *dstC++ = SkAlphaMulQ(c, scale); | |
168 } | |
169 } | |
170 else // dy != 0 | |
171 { | |
172 if (scale == 256) | |
173 while (--count >= 0) | |
174 { | |
175 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
176 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
177 fx += dx; | |
178 fy += dy; | |
179 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y,
srcRB); | |
180 } | |
181 else | |
182 while (--count >= 0) | |
183 { | |
184 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
185 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
186 SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x,
y, srcRB); | |
187 fx += dx; | |
188 fy += dy; | |
189 *dstC++ = SkAlphaMulQ(c, scale); | |
190 } | |
191 } | |
192 | |
193 NOFILTER_BITMAP_SHADER_POSTAMBLE(srcBitmap); | |
194 } | |
195 | |
196 virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) | |
197 { | |
198 SkASSERT(count > 0); | |
199 SkASSERT(this->getFlags() & SkShader::kHasSpan16_Flag); | |
200 | |
201 #ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC16 | |
202 if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) ==
0) | |
203 { | |
204 NOFILTER_BITMAP_SHADER_SPRITEPROC16(this, x, y, dstC, count); | |
205 return; | |
206 } | |
207 #endif | |
208 | |
209 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
210 const SkMatrix& inv = this->getUnitInverse(); | |
211 SkMatrix::MapPtProc invProc = this->getUnitInverseProc(); | |
212 #else | |
213 const SkMatrix& inv = this->getTotalInverse(); | |
214 SkMatrix::MapPtProc invProc = this->getInverseMapPtProc(); | |
215 #endif | |
216 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
217 unsigned srcMaxX = srcBitmap.width() - 1; | |
218 unsigned srcMaxY = srcBitmap.height() - 1; | |
219 unsigned srcRB = srcBitmap.rowBytes(); | |
220 SkFixed fx, fy, dx, dy; | |
221 | |
222 const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
223 NOFILTER_BITMAP_SHADER_PREAMBLE16(srcBitmap, srcRB); | |
224 | |
225 if (this->getInverseClass() == kPerspective_MatrixClass) | |
226 { | |
227 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
228 SkIntToScalar(y) + SK_ScalarHalf, count); | |
229 while ((count = iter.next()) != 0) | |
230 { | |
231 const SkFixed* srcXY = iter.getXY(); | |
232 | |
233 while (--count >= 0) | |
234 { | |
235 fx = *srcXY++; | |
236 fy = *srcXY++; | |
237 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
238 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
239 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y
, srcRB); | |
240 } | |
241 } | |
242 return; | |
243 } | |
244 | |
245 // now init fx, fy, dx, dy | |
246 { | |
247 SkPoint srcPt; | |
248 invProc(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
249 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | |
250 | |
251 fx = SkScalarToFixed(srcPt.fX); | |
252 fy = SkScalarToFixed(srcPt.fY); | |
253 | |
254 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
255 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
256 else | |
257 { | |
258 dx = SkScalarToFixed(inv.getScaleX()); | |
259 dy = SkScalarToFixed(inv.getSkewY()); | |
260 } | |
261 } | |
262 | |
263 #if defined(SK_SUPPORT_MIPMAP) && !defined(NOFILTER_BITMAP_SHADER_USE_UNITINVERS
E) | |
264 { int level = this->getMipLevel() >> 16; | |
265 fx >>= level; | |
266 fy >>= level; | |
267 dx >>= level; | |
268 dy >>= level; | |
269 } | |
270 #endif | |
271 | |
272 if (dy == 0) | |
273 { | |
274 srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPix
els + NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY) * srcRB); | |
275 do { | |
276 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
277 fx += dx; | |
278 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X16(srcPixels, x); | |
279 } while (--count != 0); | |
280 } | |
281 else // dy != 0 | |
282 { | |
283 do { | |
284 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
285 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
286 fx += dx; | |
287 fy += dy; | |
288 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y, sr
cRB); | |
289 } while (--count != 0); | |
290 } | |
291 | |
292 NOFILTER_BITMAP_SHADER_POSTAMBLE16(srcBitmap); | |
293 } | |
294 private: | |
295 typedef HasSpan16_Sampler_BitmapShader INHERITED; | |
296 }; | |
297 | |
298 #undef NOFILTER_BITMAP_SHADER_CLASS | |
299 #undef NOFILTER_BITMAP_SHADER_TYPE | |
300 #undef NOFILTER_BITMAP_SHADER_PREAMBLE | |
301 #undef NOFILTER_BITMAP_SHADER_POSTAMBLE | |
302 #undef NOFILTER_BITMAP_SHADER_SAMPLE_X //(x) | |
303 #undef NOFILTER_BITMAP_SHADER_SAMPLE_XY //(x, y, rowBytes) | |
304 #undef NOFILTER_BITMAP_SHADER_TILEMODE | |
305 #undef NOFILTER_BITMAP_SHADER_TILEPROC | |
306 | |
307 #undef NOFILTER_BITMAP_SHADER_PREAMBLE16 | |
308 #undef NOFILTER_BITMAP_SHADER_POSTAMBLE16 | |
309 #undef NOFILTER_BITMAP_SHADER_SAMPLE_X16 //(x) | |
310 #undef NOFILTER_BITMAP_SHADER_SAMPLE_XY16 //(x, y, rowBytes) | |
311 | |
312 #undef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
313 #undef NOFILTER_BITMAP_SHADER_SPRITEPROC16 | |
314 #undef NOFILTER_BITMAP_SHADER_SPRITEPROC32 | |
OLD | NEW |