• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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