|
1 |
|
2 /* |
|
3 * Copyright 2011 Google Inc. |
|
4 * |
|
5 * Use of this source code is governed by a BSD-style license that can be |
|
6 * found in the LICENSE file. |
|
7 */ |
|
8 |
|
9 // Define NAME_WRAP(x) before including this header to perform name-wrapping |
|
10 // E.g. for ARM NEON, defined it as 'x ## _neon' to ensure all important |
|
11 // identifiers have a _neon suffix. |
|
12 #ifndef NAME_WRAP |
|
13 #error "Please define NAME_WRAP() before including this file" |
|
14 #endif |
|
15 |
|
16 // returns expanded * 5bits |
|
17 static inline uint32_t Filter_565_Expanded(unsigned x, unsigned y, |
|
18 uint32_t a00, uint32_t a01, |
|
19 uint32_t a10, uint32_t a11) { |
|
20 SkASSERT((unsigned)x <= 0xF); |
|
21 SkASSERT((unsigned)y <= 0xF); |
|
22 |
|
23 a00 = SkExpand_rgb_16(a00); |
|
24 a01 = SkExpand_rgb_16(a01); |
|
25 a10 = SkExpand_rgb_16(a10); |
|
26 a11 = SkExpand_rgb_16(a11); |
|
27 |
|
28 int xy = x * y >> 3; |
|
29 return a00 * (32 - 2*y - 2*x + xy) + |
|
30 a01 * (2*x - xy) + |
|
31 a10 * (2*y - xy) + |
|
32 a11 * xy; |
|
33 } |
|
34 |
|
35 // turn an expanded 565 * 5bits into SkPMColor |
|
36 // g:11 | r:10 | x:1 | b:10 |
|
37 static inline SkPMColor SkExpanded_565_To_PMColor(uint32_t c) { |
|
38 unsigned r = (c >> 13) & 0xFF; |
|
39 unsigned g = (c >> 24); |
|
40 unsigned b = (c >> 2) & 0xFF; |
|
41 return SkPackARGB32(0xFF, r, g, b); |
|
42 } |
|
43 |
|
44 // returns answer in SkPMColor format |
|
45 static inline SkPMColor Filter_4444_D32(unsigned x, unsigned y, |
|
46 uint32_t a00, uint32_t a01, |
|
47 uint32_t a10, uint32_t a11) { |
|
48 SkASSERT((unsigned)x <= 0xF); |
|
49 SkASSERT((unsigned)y <= 0xF); |
|
50 |
|
51 a00 = SkExpand_4444(a00); |
|
52 a01 = SkExpand_4444(a01); |
|
53 a10 = SkExpand_4444(a10); |
|
54 a11 = SkExpand_4444(a11); |
|
55 |
|
56 int xy = x * y >> 4; |
|
57 uint32_t result = a00 * (16 - y - x + xy) + |
|
58 a01 * (x - xy) + |
|
59 a10 * (y - xy) + |
|
60 a11 * xy; |
|
61 |
|
62 return SkCompact_8888(result); |
|
63 } |
|
64 |
|
65 static inline U8CPU Filter_8(unsigned x, unsigned y, |
|
66 U8CPU a00, U8CPU a01, |
|
67 U8CPU a10, U8CPU a11) { |
|
68 SkASSERT((unsigned)x <= 0xF); |
|
69 SkASSERT((unsigned)y <= 0xF); |
|
70 |
|
71 int xy = x * y; |
|
72 unsigned result = a00 * (256 - 16*y - 16*x + xy) + |
|
73 a01 * (16*x - xy) + |
|
74 a10 * (16*y - xy) + |
|
75 a11 * xy; |
|
76 |
|
77 return result >> 8; |
|
78 } |
|
79 |
|
80 /***************************************************************************** |
|
81 * |
|
82 * D32 functions |
|
83 * |
|
84 */ |
|
85 |
|
86 // SRC == 8888 |
|
87 |
|
88 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) |
|
89 |
|
90 #define MAKENAME(suffix) NAME_WRAP(S32_opaque_D32 ## suffix) |
|
91 #define DSTSIZE 32 |
|
92 #define SRCTYPE SkPMColor |
|
93 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \ |
|
94 SkASSERT(state.fAlphaScale == 256) |
|
95 #define RETURNDST(src) src |
|
96 #define SRC_TO_FILTER(src) src |
|
97 #include "SkBitmapProcState_sample.h" |
|
98 |
|
99 #undef FILTER_PROC |
|
100 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_alpha)(x, y, a, b, c, d, dst, alphaScale) |
|
101 |
|
102 #define MAKENAME(suffix) NAME_WRAP(S32_alpha_D32 ## suffix) |
|
103 #define DSTSIZE 32 |
|
104 #define SRCTYPE SkPMColor |
|
105 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \ |
|
106 SkASSERT(state.fAlphaScale < 256) |
|
107 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale |
|
108 #define RETURNDST(src) SkAlphaMulQ(src, alphaScale) |
|
109 #define SRC_TO_FILTER(src) src |
|
110 #include "SkBitmapProcState_sample.h" |
|
111 |
|
112 // SRC == 565 |
|
113 |
|
114 #undef FILTER_PROC |
|
115 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
116 do { \ |
|
117 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ |
|
118 *(dst) = SkExpanded_565_To_PMColor(tmp); \ |
|
119 } while (0) |
|
120 |
|
121 #define MAKENAME(suffix) NAME_WRAP(S16_opaque_D32 ## suffix) |
|
122 #define DSTSIZE 32 |
|
123 #define SRCTYPE uint16_t |
|
124 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \ |
|
125 SkASSERT(state.fAlphaScale == 256) |
|
126 #define RETURNDST(src) SkPixel16ToPixel32(src) |
|
127 #define SRC_TO_FILTER(src) src |
|
128 #include "SkBitmapProcState_sample.h" |
|
129 |
|
130 #undef FILTER_PROC |
|
131 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
132 do { \ |
|
133 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ |
|
134 *(dst) = SkAlphaMulQ(SkExpanded_565_To_PMColor(tmp), alphaScale); \ |
|
135 } while (0) |
|
136 |
|
137 #define MAKENAME(suffix) NAME_WRAP(S16_alpha_D32 ## suffix) |
|
138 #define DSTSIZE 32 |
|
139 #define SRCTYPE uint16_t |
|
140 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \ |
|
141 SkASSERT(state.fAlphaScale < 256) |
|
142 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale |
|
143 #define RETURNDST(src) SkAlphaMulQ(SkPixel16ToPixel32(src), alphaScale) |
|
144 #define SRC_TO_FILTER(src) src |
|
145 #include "SkBitmapProcState_sample.h" |
|
146 |
|
147 // SRC == Index8 |
|
148 |
|
149 #undef FILTER_PROC |
|
150 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) |
|
151 |
|
152 #define MAKENAME(suffix) NAME_WRAP(SI8_opaque_D32 ## suffix) |
|
153 #define DSTSIZE 32 |
|
154 #define SRCTYPE uint8_t |
|
155 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \ |
|
156 SkASSERT(state.fAlphaScale == 256) |
|
157 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() |
|
158 #define RETURNDST(src) table[src] |
|
159 #define SRC_TO_FILTER(src) table[src] |
|
160 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors() |
|
161 #include "SkBitmapProcState_sample.h" |
|
162 |
|
163 #undef FILTER_PROC |
|
164 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_alpha)(x, y, a, b, c, d, dst, alphaScale) |
|
165 |
|
166 #define MAKENAME(suffix) NAME_WRAP(SI8_alpha_D32 ## suffix) |
|
167 #define DSTSIZE 32 |
|
168 #define SRCTYPE uint8_t |
|
169 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \ |
|
170 SkASSERT(state.fAlphaScale < 256) |
|
171 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale; \ |
|
172 const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() |
|
173 #define RETURNDST(src) SkAlphaMulQ(table[src], alphaScale) |
|
174 #define SRC_TO_FILTER(src) table[src] |
|
175 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors() |
|
176 #include "SkBitmapProcState_sample.h" |
|
177 |
|
178 // SRC == 4444 |
|
179 |
|
180 #undef FILTER_PROC |
|
181 #define FILTER_PROC(x, y, a, b, c, d, dst) *(dst) = Filter_4444_D32(x, y, a, b, c, d) |
|
182 |
|
183 #define MAKENAME(suffix) NAME_WRAP(S4444_opaque_D32 ## suffix) |
|
184 #define DSTSIZE 32 |
|
185 #define SRCTYPE SkPMColor16 |
|
186 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \ |
|
187 SkASSERT(state.fAlphaScale == 256) |
|
188 #define RETURNDST(src) SkPixel4444ToPixel32(src) |
|
189 #define SRC_TO_FILTER(src) src |
|
190 #include "SkBitmapProcState_sample.h" |
|
191 |
|
192 #undef FILTER_PROC |
|
193 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
194 do { \ |
|
195 uint32_t tmp = Filter_4444_D32(x, y, a, b, c, d); \ |
|
196 *(dst) = SkAlphaMulQ(tmp, alphaScale); \ |
|
197 } while (0) |
|
198 |
|
199 #define MAKENAME(suffix) NAME_WRAP(S4444_alpha_D32 ## suffix) |
|
200 #define DSTSIZE 32 |
|
201 #define SRCTYPE SkPMColor16 |
|
202 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \ |
|
203 SkASSERT(state.fAlphaScale < 256) |
|
204 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale |
|
205 #define RETURNDST(src) SkAlphaMulQ(SkPixel4444ToPixel32(src), alphaScale) |
|
206 #define SRC_TO_FILTER(src) src |
|
207 #include "SkBitmapProcState_sample.h" |
|
208 |
|
209 // SRC == A8 |
|
210 |
|
211 #undef FILTER_PROC |
|
212 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
213 do { \ |
|
214 unsigned tmp = Filter_8(x, y, a, b, c, d); \ |
|
215 *(dst) = SkAlphaMulQ(pmColor, SkAlpha255To256(tmp)); \ |
|
216 } while (0) |
|
217 |
|
218 #define MAKENAME(suffix) NAME_WRAP(SA8_alpha_D32 ## suffix) |
|
219 #define DSTSIZE 32 |
|
220 #define SRCTYPE uint8_t |
|
221 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kA8_Config); |
|
222 #define PREAMBLE(state) const SkPMColor pmColor = state.fPaintPMColor; |
|
223 #define RETURNDST(src) SkAlphaMulQ(pmColor, SkAlpha255To256(src)) |
|
224 #define SRC_TO_FILTER(src) src |
|
225 #include "SkBitmapProcState_sample.h" |
|
226 |
|
227 /***************************************************************************** |
|
228 * |
|
229 * D16 functions |
|
230 * |
|
231 */ |
|
232 |
|
233 // SRC == 8888 |
|
234 |
|
235 #undef FILTER_PROC |
|
236 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
237 do { \ |
|
238 SkPMColor dstColor; \ |
|
239 NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, &dstColor); \ |
|
240 (*dst) = SkPixel32ToPixel16(dstColor); \ |
|
241 } while (0) |
|
242 |
|
243 #define MAKENAME(suffix) NAME_WRAP(S32_D16 ## suffix) |
|
244 #define DSTSIZE 16 |
|
245 #define SRCTYPE SkPMColor |
|
246 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \ |
|
247 SkASSERT(state.fBitmap->isOpaque()) |
|
248 #define RETURNDST(src) SkPixel32ToPixel16(src) |
|
249 #define SRC_TO_FILTER(src) src |
|
250 #include "SkBitmapProcState_sample.h" |
|
251 |
|
252 // SRC == 565 |
|
253 |
|
254 #undef FILTER_PROC |
|
255 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
256 do { \ |
|
257 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ |
|
258 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ |
|
259 } while (0) |
|
260 |
|
261 #define MAKENAME(suffix) NAME_WRAP(S16_D16 ## suffix) |
|
262 #define DSTSIZE 16 |
|
263 #define SRCTYPE uint16_t |
|
264 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) |
|
265 #define RETURNDST(src) src |
|
266 #define SRC_TO_FILTER(src) src |
|
267 #include "SkBitmapProcState_sample.h" |
|
268 |
|
269 // SRC == Index8 |
|
270 |
|
271 #undef FILTER_PROC |
|
272 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
273 do { \ |
|
274 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ |
|
275 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ |
|
276 } while (0) |
|
277 |
|
278 #define MAKENAME(suffix) NAME_WRAP(SI8_D16 ## suffix) |
|
279 #define DSTSIZE 16 |
|
280 #define SRCTYPE uint8_t |
|
281 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \ |
|
282 SkASSERT(state.fBitmap->isOpaque()) |
|
283 #define PREAMBLE(state) const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->lock16BitCache() |
|
284 #define RETURNDST(src) table[src] |
|
285 #define SRC_TO_FILTER(src) table[src] |
|
286 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlock16BitCache() |
|
287 #include "SkBitmapProcState_sample.h" |
|
288 |
|
289 /////////////////////////////////////////////////////////////////////////////// |
|
290 |
|
291 #undef FILTER_PROC |
|
292 #define FILTER_PROC(x, y, a, b, c, d, dst) \ |
|
293 do { \ |
|
294 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ |
|
295 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ |
|
296 } while (0) |
|
297 |
|
298 |
|
299 // clamp |
|
300 |
|
301 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) |
|
302 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) |
|
303 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) |
|
304 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) |
|
305 |
|
306 #define MAKENAME(suffix) NAME_WRAP(Clamp_S16_D16 ## suffix) |
|
307 #define SRCTYPE uint16_t |
|
308 #define DSTTYPE uint16_t |
|
309 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) |
|
310 #define SRC_TO_FILTER(src) src |
|
311 #include "SkBitmapProcState_shaderproc.h" |
|
312 |
|
313 |
|
314 #define TILEX_PROCF(fx, max) (((fx) & 0xFFFF) * ((max) + 1) >> 16) |
|
315 #define TILEY_PROCF(fy, max) (((fy) & 0xFFFF) * ((max) + 1) >> 16) |
|
316 #define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) |
|
317 #define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) |
|
318 |
|
319 #define MAKENAME(suffix) NAME_WRAP(Repeat_S16_D16 ## suffix) |
|
320 #define SRCTYPE uint16_t |
|
321 #define DSTTYPE uint16_t |
|
322 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) |
|
323 #define SRC_TO_FILTER(src) src |
|
324 #include "SkBitmapProcState_shaderproc.h" |
|
325 |
|
326 |
|
327 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) |
|
328 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) |
|
329 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) |
|
330 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) |
|
331 |
|
332 #undef FILTER_PROC |
|
333 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) |
|
334 #define MAKENAME(suffix) NAME_WRAP(Clamp_SI8_opaque_D32 ## suffix) |
|
335 #define SRCTYPE uint8_t |
|
336 #define DSTTYPE uint32_t |
|
337 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config) |
|
338 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() |
|
339 #define SRC_TO_FILTER(src) table[src] |
|
340 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors() |
|
341 #include "SkBitmapProcState_shaderproc.h" |
|
342 |
|
343 #undef NAME_WRAP |