OLD | NEW |
| (Empty) |
1 /* libs/graphics/sgl/SkBitmapShader16BilerpTemplate.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 #include "SkFilterProc.h" | |
19 | |
20 class BILERP_BITMAP16_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader { | |
21 public: | |
22 BILERP_BITMAP16_SHADER_CLASS(const SkBitmap& src) | |
23 : HasSpan16_Sampler_BitmapShader(src, true, | |
24 SkShader::kClamp_TileMode, | |
25 SkShader::kClamp_TileMode) | |
26 { | |
27 } | |
28 | |
29 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) | |
30 { | |
31 SkASSERT(count > 0); | |
32 | |
33 U8CPU alpha = this->getPaintAlpha(); | |
34 | |
35 const SkMatrix& inv = this->getTotalInverse(); | |
36 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
37 unsigned srcMaxX = srcBitmap.width() - 1; | |
38 unsigned srcMaxY = srcBitmap.height() - 1; | |
39 unsigned srcRB = srcBitmap.rowBytes(); | |
40 | |
41 BILERP_BITMAP16_SHADER_PREAMBLE(srcBitmap); | |
42 | |
43 const SkFilterProc* proc_table = SkGetBilinearFilterProcTable(); | |
44 const BILERP_BITMAP16_SHADER_TYPE* srcPixels = (const BILERP_BITMAP16_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
45 | |
46 if (this->getInverseClass() == kPerspective_MatrixClass) | |
47 { | |
48 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
49 SkIntToScalar(y) + SK_ScalarHalf, count); | |
50 while ((count = iter.next()) != 0) | |
51 { | |
52 const SkFixed* srcXY = iter.getXY(); | |
53 while (--count >= 0) | |
54 { | |
55 SkFixed fx = *srcXY++ - SK_FixedHalf; | |
56 SkFixed fy = *srcXY++ - SK_FixedHalf; | |
57 int ix = fx >> 16; | |
58 int iy = fy >> 16; | |
59 int x = SkClampMax(ix, srcMaxX); | |
60 int y = SkClampMax(iy, srcMaxY); | |
61 | |
62 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
63 | |
64 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const cha
r*)srcPixels + y * srcRB)) + x; | |
65 if ((unsigned)ix < srcMaxX) | |
66 p01 += 1; | |
67 p10 = p00; | |
68 p11 = p01; | |
69 if ((unsigned)iy < srcMaxY) | |
70 { | |
71 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p10 + srcRB); | |
72 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p11 + srcRB); | |
73 } | |
74 | |
75 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx,
fy); | |
76 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p00)), | |
77 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p01)), | |
78 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p10)), | |
79 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p11))); | |
80 | |
81 *dstC++ = expanded_rgb16_to_8888(c, alpha); | |
82 } | |
83 } | |
84 } | |
85 else // linear case | |
86 { | |
87 SkFixed fx, fy, dx, dy; | |
88 | |
89 // now init fx, fy, dx, dy | |
90 { | |
91 SkPoint srcPt; | |
92 this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHal
f, | |
93 SkIntToScalar(y) + SK_ScalarHal
f, &srcPt); | |
94 | |
95 fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf; | |
96 fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf; | |
97 | |
98 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
99 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
100 else | |
101 { | |
102 dx = SkScalarToFixed(inv.getScaleX()); | |
103 dy = SkScalarToFixed(inv.getSkewY()); | |
104 } | |
105 } | |
106 | |
107 do { | |
108 int ix = fx >> 16; | |
109 int iy = fy >> 16; | |
110 | |
111 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
112 | |
113 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)s
rcPixels + | |
114 SkClampMax(iy
, srcMaxY) * srcRB)) + | |
115 SkClampMax(ix
, srcMaxX); | |
116 if ((unsigned)ix < srcMaxX) | |
117 p01 += 1; | |
118 p10 = p00; | |
119 p11 = p01; | |
120 if ((unsigned)iy < srcMaxY) | |
121 { | |
122 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10
+ srcRB); | |
123 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11
+ srcRB); | |
124 } | |
125 | |
126 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); | |
127 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p00)), | |
128 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p01)), | |
129 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p10)), | |
130 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p11))); | |
131 *dstC++ = expanded_rgb16_to_8888(c, alpha); | |
132 | |
133 fx += dx; | |
134 fy += dy; | |
135 } while (--count != 0); | |
136 } | |
137 BILERP_BITMAP16_SHADER_POSTAMBLE(srcBitmap); | |
138 } | |
139 | |
140 virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) | |
141 { | |
142 SkASSERT(count > 0); | |
143 | |
144 const SkMatrix& inv = this->getTotalInverse(); | |
145 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
146 unsigned srcMaxX = srcBitmap.width() - 1; | |
147 unsigned srcMaxY = srcBitmap.height() - 1; | |
148 unsigned srcRB = srcBitmap.rowBytes(); | |
149 | |
150 BILERP_BITMAP16_SHADER_PREAMBLE(srcBitmap); | |
151 | |
152 const SkFilterProc* proc_table = SkGetBilinearFilterProcTable(); | |
153 const BILERP_BITMAP16_SHADER_TYPE* srcPixels = (const BILERP_BITMAP16_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
154 | |
155 if (this->getInverseClass() == kPerspective_MatrixClass) | |
156 { | |
157 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
158 SkIntToScalar(y) + SK_ScalarHalf, count); | |
159 while ((count = iter.next()) != 0) | |
160 { | |
161 const SkFixed* srcXY = iter.getXY(); | |
162 while (--count >= 0) | |
163 { | |
164 SkFixed fx = *srcXY++ - SK_FixedHalf; | |
165 SkFixed fy = *srcXY++ - SK_FixedHalf; | |
166 int ix = fx >> 16; | |
167 int iy = fy >> 16; | |
168 | |
169 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
170 | |
171 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const cha
r*)srcPixels + | |
172 SkClampMax
(iy, srcMaxY) * srcRB)) + | |
173 SkClampMax
(ix, srcMaxX); | |
174 if ((unsigned)ix < srcMaxX) | |
175 p01 += 1; | |
176 p10 = p00; | |
177 p11 = p01; | |
178 if ((unsigned)iy < srcMaxY) | |
179 { | |
180 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p10 + srcRB); | |
181 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p11 + srcRB); | |
182 } | |
183 | |
184 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx,
fy); | |
185 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p00)), | |
186 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p01)), | |
187 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p10)), | |
188 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p11))); | |
189 *dstC++ = SkCompact_rgb_16(c); | |
190 } | |
191 } | |
192 } | |
193 else // linear case | |
194 { | |
195 SkFixed fx, fy, dx, dy; | |
196 | |
197 // now init fx, fy, dx, dy | |
198 { | |
199 SkPoint srcPt; | |
200 this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHal
f, | |
201 SkIntToScalar(y) + SK_ScalarHal
f, &srcPt); | |
202 | |
203 fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf; | |
204 fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf; | |
205 | |
206 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
207 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
208 else | |
209 { | |
210 dx = SkScalarToFixed(inv.getScaleX()); | |
211 dy = SkScalarToFixed(inv.getSkewY()); | |
212 } | |
213 } | |
214 | |
215 do { | |
216 int ix = fx >> 16; | |
217 int iy = fy >> 16; | |
218 | |
219 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
220 | |
221 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)s
rcPixels + | |
222 SkClampMax(iy,
srcMaxY) * srcRB)) + | |
223 SkClampMax(ix,
srcMaxX); | |
224 if ((unsigned)ix < srcMaxX) | |
225 p01 += 1; | |
226 p10 = p00; | |
227 p11 = p01; | |
228 if ((unsigned)iy < srcMaxY) | |
229 { | |
230 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10
+ srcRB); | |
231 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11
+ srcRB); | |
232 } | |
233 | |
234 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); | |
235 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p00)), | |
236 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p01)), | |
237 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p10)), | |
238 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p11))); | |
239 *dstC++ = SkCompact_rgb_16(c); | |
240 | |
241 fx += dx; | |
242 fy += dy; | |
243 } while (--count != 0); | |
244 } | |
245 BILERP_BITMAP16_SHADER_POSTAMBLE(srcBitmap); | |
246 } | |
247 }; | |
248 | |
249 #undef BILERP_BITMAP16_SHADER_CLASS | |
250 #undef BILERP_BITMAP16_SHADER_TYPE | |
251 #undef BILERP_BITMAP16_SHADER_PREAMBLE | |
252 #undef BILERP_BITMAP16_SHADER_PIXEL | |
253 #undef BILERP_BITMAP16_SHADER_POSTAMBLE | |
OLD | NEW |