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