| |
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 |