OLD | NEW |
| (Empty) |
1 | |
2 #define TRANSLATE_NOFILTER_NAME MAKENAME(_nofilter_translate) | |
3 #define SCALE_NOFILTER_NAME MAKENAME(_nofilter_scale) | |
4 #define SCALE_FILTER_NAME MAKENAME(_filter_scale) | |
5 #define AFFINE_NOFILTER_NAME MAKENAME(_nofilter_affine) | |
6 #define AFFINE_FILTER_NAME MAKENAME(_filter_affine) | |
7 #define PERSP_NOFILTER_NAME MAKENAME(_nofilter_persp) | |
8 #define PERSP_FILTER_NAME MAKENAME(_filter_persp) | |
9 | |
10 #define PACK_FILTER_X_NAME MAKENAME(_pack_filter_x) | |
11 #define PACK_FILTER_Y_NAME MAKENAME(_pack_filter_y) | |
12 | |
13 #ifndef PREAMBLE | |
14 #define PREAMBLE(state) | |
15 #define PREAMBLE_PARAM_X | |
16 #define PREAMBLE_PARAM_Y | |
17 #define PREAMBLE_ARG_X | |
18 #define PREAMBLE_ARG_Y | |
19 #endif | |
20 | |
21 #ifndef PREAMBLE_TRANS | |
22 #define PREAMBLE_TRANS(state) | |
23 #endif | |
24 | |
25 static void TRANSLATE_NOFILTER_NAME(const SkBitmapProcState& s, | |
26 uint32_t xy[], int count, int x, int y) | |
27 { | |
28 SkASSERT((s.fInvType & ~SkMatrix::kTranslate_Mask) == 0); | |
29 | |
30 PREAMBLE_TRANS(s); | |
31 | |
32 x += SkScalarFloor(s.fInvMatrix->getTranslateX()); | |
33 y += SkScalarFloor(s.fInvMatrix->getTranslateY()); | |
34 | |
35 *xy++ = (uint32_t)TILEY_TRANS(y, (s.fBitmap->height() - 1)); | |
36 | |
37 unsigned maxX = s.fBitmap->width() - 1; | |
38 int i; | |
39 uint16_t* xx = (uint16_t*)xy; | |
40 for (i = (count >> 2); i > 0; --i) | |
41 { | |
42 *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; | |
43 *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; | |
44 *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; | |
45 *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; | |
46 } | |
47 for (i = (count & 3); i > 0; --i) | |
48 { | |
49 *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; | |
50 } | |
51 } | |
52 | |
53 static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s, | |
54 uint32_t xy[], int count, int x, int y) { | |
55 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | |
56 SkMatrix::kScale_Mask)) == 0); | |
57 | |
58 PREAMBLE(s); | |
59 // we store y, x, x, x, x, x | |
60 | |
61 // invert x+half, y+half and convert to fixed | |
62 SkFixed fx = s.fInvSy * y + s.fInvTyPlusHalf; | |
63 *xy++ = TILEY_PROCF(fx, (s.fBitmap->height() - 1)); | |
64 // invert X | |
65 SkFixed dx = s.fInvSx; | |
66 fx = dx * x + s.fInvTxPlusHalf; | |
67 unsigned maxX = s.fBitmap->width() - 1; | |
68 | |
69 #ifdef CHECK_FOR_DECAL | |
70 // test if we don't need to apply the tile proc | |
71 if ((unsigned)(fx >> 16) <= maxX && | |
72 (unsigned)((fx + dx * (count - 1)) >> 16) <= maxX) { | |
73 decal_nofilter_scale(xy, fx, dx, count); | |
74 } else | |
75 #endif | |
76 { | |
77 int i; | |
78 #if 0 | |
79 uint16_t* xx = (uint16_t*)xy; | |
80 for (i = (count >> 2); i > 0; --i) { | |
81 *xx++ = TILEX_PROCF(fx, maxX); fx += dx; | |
82 *xx++ = TILEX_PROCF(fx, maxX); fx += dx; | |
83 *xx++ = TILEX_PROCF(fx, maxX); fx += dx; | |
84 *xx++ = TILEX_PROCF(fx, maxX); fx += dx; | |
85 } | |
86 for (i = (count & 3); i > 0; --i) { | |
87 *xx++ = TILEX_PROCF(fx, maxX); fx += dx; | |
88 } | |
89 #else | |
90 for (i = (count >> 2); i > 0; --i) { | |
91 unsigned a, b; | |
92 a = TILEX_PROCF(fx, maxX); fx += dx; | |
93 b = TILEX_PROCF(fx, maxX); fx += dx; | |
94 #ifdef SK_CPU_BENDIAN | |
95 *xy++ = (a << 16) | b; | |
96 #else | |
97 *xy++ = (b << 16) | a; | |
98 #endif | |
99 a = TILEX_PROCF(fx, maxX); fx += dx; | |
100 b = TILEX_PROCF(fx, maxX); fx += dx; | |
101 #ifdef SK_CPU_BENDIAN | |
102 *xy++ = (a << 16) | b; | |
103 #else | |
104 *xy++ = (b << 16) | a; | |
105 #endif | |
106 } | |
107 uint16_t* xx = (uint16_t*)xy; | |
108 for (i = (count & 3); i > 0; --i) { | |
109 *xx++ = TILEX_PROCF(fx, maxX); fx += dx; | |
110 } | |
111 #endif | |
112 } | |
113 } | |
114 | |
115 // note: we could special-case on a matrix which is skewed in X but not Y. | |
116 // this would require a more general setup thatn SCALE does, but could use | |
117 // SCALE's inner loop that only looks at dx | |
118 | |
119 static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s, | |
120 uint32_t xy[], int count, int x, int y) { | |
121 SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); | |
122 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | |
123 SkMatrix::kScale_Mask | | |
124 SkMatrix::kAffine_Mask)) == 0); | |
125 | |
126 PREAMBLE(s); | |
127 SkPoint srcPt; | |
128 s.fInvProc(*s.fInvMatrix, | |
129 SkIntToScalar(x) + SK_ScalarHalf, | |
130 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | |
131 | |
132 SkFixed fx = SkScalarToFixed(srcPt.fX); | |
133 SkFixed fy = SkScalarToFixed(srcPt.fY); | |
134 SkFixed dx = s.fInvSx; | |
135 SkFixed dy = s.fInvKy; | |
136 int maxX = s.fBitmap->width() - 1; | |
137 int maxY = s.fBitmap->height() - 1; | |
138 | |
139 for (int i = count; i > 0; --i) { | |
140 *xy++ = (TILEY_PROCF(fy, maxY) << 16) | TILEX_PROCF(fx, maxX); | |
141 fx += dx; fy += dy; | |
142 } | |
143 } | |
144 | |
145 static void PERSP_NOFILTER_NAME(const SkBitmapProcState& s, | |
146 uint32_t* SK_RESTRICT xy, | |
147 int count, int x, int y) { | |
148 SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); | |
149 | |
150 PREAMBLE(s); | |
151 int maxX = s.fBitmap->width() - 1; | |
152 int maxY = s.fBitmap->height() - 1; | |
153 | |
154 SkPerspIter iter(*s.fInvMatrix, | |
155 SkIntToScalar(x) + SK_ScalarHalf, | |
156 SkIntToScalar(y) + SK_ScalarHalf, count); | |
157 | |
158 while ((count = iter.next()) != 0) { | |
159 const SkFixed* SK_RESTRICT srcXY = iter.getXY(); | |
160 while (--count >= 0) { | |
161 *xy++ = (TILEY_PROCF(srcXY[1], maxY) << 16) | | |
162 TILEX_PROCF(srcXY[0], maxX); | |
163 srcXY += 2; | |
164 } | |
165 } | |
166 } | |
167 | |
168 ////////////////////////////////////////////////////////////////////////////// | |
169 | |
170 static inline uint32_t PACK_FILTER_Y_NAME(SkFixed f, unsigned max, | |
171 SkFixed one PREAMBLE_PARAM_Y) { | |
172 unsigned i = TILEY_PROCF(f, max); | |
173 i = (i << 4) | TILEY_LOW_BITS(f, max); | |
174 return (i << 14) | (TILEY_PROCF((f + one), max)); | |
175 } | |
176 | |
177 static inline uint32_t PACK_FILTER_X_NAME(SkFixed f, unsigned max, | |
178 SkFixed one PREAMBLE_PARAM_X) { | |
179 unsigned i = TILEX_PROCF(f, max); | |
180 i = (i << 4) | TILEX_LOW_BITS(f, max); | |
181 return (i << 14) | (TILEX_PROCF((f + one), max)); | |
182 } | |
183 | |
184 static void SCALE_FILTER_NAME(const SkBitmapProcState& s, | |
185 uint32_t xy[], int count, int x, int y) { | |
186 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | |
187 SkMatrix::kScale_Mask)) == 0); | |
188 SkASSERT(s.fInvKy == 0); | |
189 | |
190 PREAMBLE(s); | |
191 // compute our two Y values up front | |
192 { | |
193 unsigned maxY = s.fBitmap->height() - 1; | |
194 SkFixed fy = s.fInvSy * y + s.fInvTyPlusHalf - (s.fFilterOneY >> 1); | |
195 *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y); | |
196 } | |
197 | |
198 unsigned maxX = s.fBitmap->width() - 1; | |
199 SkFixed one = s.fFilterOneX; | |
200 SkFixed dx = s.fInvSx; | |
201 SkFixed fx = dx * x + s.fInvTxPlusHalf - (one >> 1); | |
202 | |
203 #ifdef CHECK_FOR_DECAL | |
204 // test if we don't need to apply the tile proc | |
205 if (dx > 0 && | |
206 (unsigned)(fx >> 16) <= maxX && | |
207 (unsigned)((fx + dx * (count - 1)) >> 16) < maxX) { | |
208 decal_filter_scale(xy, fx, dx, count); | |
209 } else | |
210 #endif | |
211 { | |
212 do { | |
213 *xy++ = PACK_FILTER_X_NAME(fx, maxX, one PREAMBLE_ARG_X); | |
214 fx += dx; | |
215 } while (--count != 0); | |
216 } | |
217 } | |
218 | |
219 static void AFFINE_FILTER_NAME(const SkBitmapProcState& s, | |
220 uint32_t xy[], int count, int x, int y) { | |
221 SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); | |
222 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | |
223 SkMatrix::kScale_Mask | | |
224 SkMatrix::kAffine_Mask)) == 0); | |
225 | |
226 PREAMBLE(s); | |
227 SkPoint srcPt; | |
228 s.fInvProc(*s.fInvMatrix, | |
229 SkIntToScalar(x) + SK_ScalarHalf, | |
230 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | |
231 | |
232 SkFixed oneX = s.fFilterOneX; | |
233 SkFixed oneY = s.fFilterOneY; | |
234 SkFixed fx = SkScalarToFixed(srcPt.fX) - (oneX >> 1); | |
235 SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1); | |
236 SkFixed dx = s.fInvSx; | |
237 SkFixed dy = s.fInvKy; | |
238 unsigned maxX = s.fBitmap->width() - 1; | |
239 unsigned maxY = s.fBitmap->height() - 1; | |
240 | |
241 do { | |
242 *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y); | |
243 fy += dy; | |
244 *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneX PREAMBLE_ARG_X); | |
245 fx += dx; | |
246 } while (--count != 0); | |
247 } | |
248 | |
249 static void PERSP_FILTER_NAME(const SkBitmapProcState& s, | |
250 uint32_t* SK_RESTRICT xy, int count, | |
251 int x, int y) { | |
252 SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); | |
253 | |
254 PREAMBLE(s); | |
255 unsigned maxX = s.fBitmap->width() - 1; | |
256 unsigned maxY = s.fBitmap->height() - 1; | |
257 SkFixed oneX = s.fFilterOneX; | |
258 SkFixed oneY = s.fFilterOneY; | |
259 | |
260 SkPerspIter iter(*s.fInvMatrix, | |
261 SkIntToScalar(x) + SK_ScalarHalf, | |
262 SkIntToScalar(y) + SK_ScalarHalf, count); | |
263 | |
264 while ((count = iter.next()) != 0) { | |
265 const SkFixed* SK_RESTRICT srcXY = iter.getXY(); | |
266 do { | |
267 *xy++ = PACK_FILTER_Y_NAME(srcXY[1] - (oneY >> 1), maxY, | |
268 oneY PREAMBLE_ARG_Y); | |
269 *xy++ = PACK_FILTER_X_NAME(srcXY[0] - (oneX >> 1), maxX, | |
270 oneX PREAMBLE_ARG_X); | |
271 srcXY += 2; | |
272 } while (--count != 0); | |
273 } | |
274 } | |
275 | |
276 static SkBitmapProcState::MatrixProc MAKENAME(_Procs)[] = { | |
277 TRANSLATE_NOFILTER_NAME, | |
278 TRANSLATE_NOFILTER_NAME, // No need to do filtering if the matrix is no | |
279 // more complex than identity/translate. | |
280 SCALE_NOFILTER_NAME, | |
281 SCALE_FILTER_NAME, | |
282 AFFINE_NOFILTER_NAME, | |
283 AFFINE_FILTER_NAME, | |
284 PERSP_NOFILTER_NAME, | |
285 PERSP_FILTER_NAME | |
286 }; | |
287 | |
288 #undef MAKENAME | |
289 #undef TILEX_PROCF | |
290 #undef TILEY_PROCF | |
291 #ifdef CHECK_FOR_DECAL | |
292 #undef CHECK_FOR_DECAL | |
293 #endif | |
294 | |
295 #undef TILEX_TRANS | |
296 #undef TILEY_TRANS | |
297 | |
298 #undef TRANSLATE_NOFILTER_NAME | |
299 #undef SCALE_NOFILTER_NAME | |
300 #undef SCALE_FILTER_NAME | |
301 #undef AFFINE_NOFILTER_NAME | |
302 #undef AFFINE_FILTER_NAME | |
303 #undef PERSP_NOFILTER_NAME | |
304 #undef PERSP_FILTER_NAME | |
305 | |
306 #undef PREAMBLE | |
307 #undef PREAMBLE_PARAM_X | |
308 #undef PREAMBLE_PARAM_Y | |
309 #undef PREAMBLE_ARG_X | |
310 #undef PREAMBLE_ARG_Y | |
311 | |
312 #undef PREAMBLE_TRANS | |
313 | |
314 #undef TILEX_LOW_BITS | |
315 #undef TILEY_LOW_BITS | |
OLD | NEW |