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
Filter_565_Expanded(unsigned x,unsigned y,uint32_t a00,uint32_t a01,uint32_t a10,uint32_t a11)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
SkExpanded_565_To_PMColor(uint32_t c)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
Filter_4444_D32(unsigned x,unsigned y,uint32_t a00,uint32_t a01,uint32_t a10,uint32_t a11)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
Filter_8(unsigned x,unsigned y,U8CPU a00,U8CPU a01,U8CPU a10,U8CPU a11)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(4 == state.fBitmap->bytesPerPixel()); \
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(4 == state.fBitmap->bytesPerPixel()); \
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(kRGB_565_SkColorType == state.fBitmap->colorType()); \
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(kRGB_565_SkColorType == state.fBitmap->colorType()); \
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(kIndex_8_SkColorType == state.fBitmap->colorType()); \
156 SkASSERT(state.fAlphaScale == 256)
157 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors()
158 #define RETURNDST(src) table[src]
159 #define SRC_TO_FILTER(src) table[src]
160 #define POSTAMBLE(state)
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(kIndex_8_SkColorType == state.fBitmap->colorType()); \
170 SkASSERT(state.fAlphaScale < 256)
171 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale; \
172 const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors()
173 #define RETURNDST(src) SkAlphaMulQ(table[src], alphaScale)
174 #define SRC_TO_FILTER(src) table[src]
175 #define POSTAMBLE(state)
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(kARGB_4444_SkColorType == state.fBitmap->colorType()); \
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(kARGB_4444_SkColorType == state.fBitmap->colorType()); \
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(kAlpha_8_SkColorType == state.fBitmap->colorType());
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 // SRC == Gray8
228
229 #undef FILTER_PROC
230 #define FILTER_PROC(x, y, a, b, c, d, dst) \
231 do { \
232 unsigned tmp = Filter_8(x, y, a, b, c, d); \
233 SkPMColor color = SkPackARGB32(0xFF, tmp, tmp, tmp); \
234 *(dst) = SkAlphaMulQ(color, alphaScale); \
235 } while (0)
236
237 #define MAKENAME(suffix) NAME_WRAP(SG8_alpha_D32 ## suffix)
238 #define DSTSIZE 32
239 #define SRCTYPE uint8_t
240 #define CHECKSTATE(state) SkASSERT(kGray_8_SkColorType == state.fBitmap->colorType());
241 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale
242 #define RETURNDST(src) SkAlphaMulQ(SkPackARGB32(0xFF, src, src, src), alphaScale)
243 #define SRC_TO_FILTER(src) src
244 #include "SkBitmapProcState_sample.h"
245
246 /*****************************************************************************
247 *
248 * D16 functions
249 *
250 */
251
252 // SRC == 8888
253
254 #undef FILTER_PROC
255 #define FILTER_PROC(x, y, a, b, c, d, dst) \
256 do { \
257 SkPMColor dstColor; \
258 NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, &dstColor); \
259 (*dst) = SkPixel32ToPixel16(dstColor); \
260 } while (0)
261
262 #define MAKENAME(suffix) NAME_WRAP(S32_D16 ## suffix)
263 #define DSTSIZE 16
264 #define SRCTYPE SkPMColor
265 #define CHECKSTATE(state) SkASSERT(4 == state.fBitmap->bytesPerPixel()); \
266 SkASSERT(state.fBitmap->isOpaque())
267 #define RETURNDST(src) SkPixel32ToPixel16(src)
268 #define SRC_TO_FILTER(src) src
269 #include "SkBitmapProcState_sample.h"
270
271 // SRC == 565
272
273 #undef FILTER_PROC
274 #define FILTER_PROC(x, y, a, b, c, d, dst) \
275 do { \
276 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \
277 *(dst) = SkCompact_rgb_16((tmp) >> 5); \
278 } while (0)
279
280 #define MAKENAME(suffix) NAME_WRAP(S16_D16 ## suffix)
281 #define DSTSIZE 16
282 #define SRCTYPE uint16_t
283 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType())
284 #define RETURNDST(src) src
285 #define SRC_TO_FILTER(src) src
286 #include "SkBitmapProcState_sample.h"
287
288 // SRC == Index8
289
290 #undef FILTER_PROC
291 #define FILTER_PROC(x, y, a, b, c, d, dst) \
292 do { \
293 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \
294 *(dst) = SkCompact_rgb_16((tmp) >> 5); \
295 } while (0)
296
297 #define MAKENAME(suffix) NAME_WRAP(SI8_D16 ## suffix)
298 #define DSTSIZE 16
299 #define SRCTYPE uint8_t
300 #define CHECKSTATE(state) SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \
301 SkASSERT(state.fBitmap->isOpaque())
302 #define PREAMBLE(state) const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->read16BitCache()
303 #define RETURNDST(src) table[src]
304 #define SRC_TO_FILTER(src) table[src]
305 #define POSTAMBLE(state)
306 #include "SkBitmapProcState_sample.h"
307
308 ///////////////////////////////////////////////////////////////////////////////
309
310 #undef FILTER_PROC
311 #define FILTER_PROC(x, y, a, b, c, d, dst) \
312 do { \
313 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \
314 *(dst) = SkCompact_rgb_16((tmp) >> 5); \
315 } while (0)
316
317
318 // clamp
319
320 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max)
321 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max)
322 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF)
323 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF)
324
325 #define MAKENAME(suffix) NAME_WRAP(Clamp_S16_D16 ## suffix)
326 #define SRCTYPE uint16_t
327 #define DSTTYPE uint16_t
328 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType())
329 #define SRC_TO_FILTER(src) src
330 #include "SkBitmapProcState_shaderproc.h"
331
332
333 #define TILEX_PROCF(fx, max) (((fx) & 0xFFFF) * ((max) + 1) >> 16)
334 #define TILEY_PROCF(fy, max) (((fy) & 0xFFFF) * ((max) + 1) >> 16)
335 #define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF)
336 #define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF)
337
338 #define MAKENAME(suffix) NAME_WRAP(Repeat_S16_D16 ## suffix)
339 #define SRCTYPE uint16_t
340 #define DSTTYPE uint16_t
341 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType())
342 #define SRC_TO_FILTER(src) src
343 #include "SkBitmapProcState_shaderproc.h"
344
345
346 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max)
347 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max)
348 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF)
349 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF)
350
351 #undef FILTER_PROC
352 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst)
353 #define MAKENAME(suffix) NAME_WRAP(Clamp_SI8_opaque_D32 ## suffix)
354 #define SRCTYPE uint8_t
355 #define DSTTYPE uint32_t
356 #define CHECKSTATE(state) SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType())
357 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors()
358 #define SRC_TO_FILTER(src) table[src]
359 #define POSTAMBLE(state)
360 #include "SkBitmapProcState_shaderproc.h"
361
362 #undef NAME_WRAP
363