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()->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(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()->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(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 /*****************************************************************************
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(4 == state.fBitmap->bytesPerPixel()); \
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(kRGB_565_SkColorType == state.fBitmap->colorType())
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(kIndex_8_SkColorType == state.fBitmap->colorType()); \
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(kRGB_565_SkColorType == state.fBitmap->colorType())
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(kRGB_565_SkColorType == state.fBitmap->colorType())
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(kIndex_8_SkColorType == state.fBitmap->colorType())
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
344