Home | History | Annotate | Download | only in core
      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(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