SkBitmapProcState.cpp revision 46402f8ee247238d734cdd90b8770caa46862a06
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState.h"
246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#include "SkBitmapProcState_filter.h"
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColorPriv.h"
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFilterProc.h"
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h"
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkShader.h"   // for tilemodes
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CPU_BENDIAN
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define UNPACK_PRIMARY_SHORT(packed)    ((uint32_t)(packed) >> 16)
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define UNPACK_SECONDARY_SHORT(packed)  ((packed) & 0xFFFF)
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define UNPACK_PRIMARY_SHORT(packed)    ((packed) & 0xFFFF)
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define UNPACK_SECONDARY_SHORT(packed)  ((uint32_t)(packed) >> 16)
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// returns expanded * 5bits
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline uint32_t Filter_565_Expanded(unsigned x, unsigned y,
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                           uint32_t a00, uint32_t a01,
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                           uint32_t a10, uint32_t a11) {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x <= 0xF);
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)y <= 0xF);
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a00 = SkExpand_rgb_16(a00);
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a01 = SkExpand_rgb_16(a01);
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a10 = SkExpand_rgb_16(a10);
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a11 = SkExpand_rgb_16(a11);
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int xy = x * y >> 3;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return  a00 * (32 - 2*y - 2*x + xy) +
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a01 * (2*x - xy) +
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a10 * (2*y - xy) +
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a11 * xy;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// turn an expanded 565 * 5bits into SkPMColor
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// g:11 | r:10 | x:1 | b:10
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline SkPMColor SkExpanded_565_To_PMColor(uint32_t c) {
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned r = (c >> 13) & 0xFF;
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned g = (c >> 24);
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned b = (c >> 2) & 0xFF;
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkPackARGB32(0xFF, r, g, b);
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// returns answer in SkPMColor format
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline SkPMColor Filter_4444_D32(unsigned x, unsigned y,
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                        uint32_t a00, uint32_t a01,
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                        uint32_t a10, uint32_t a11) {
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x <= 0xF);
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)y <= 0xF);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a00 = SkExpand_4444(a00);
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a01 = SkExpand_4444(a01);
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a10 = SkExpand_4444(a10);
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a11 = SkExpand_4444(a11);
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int xy = x * y >> 4;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t result =   a00 * (16 - y - x + xy) +
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a01 * (x - xy) +
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a10 * (y - xy) +
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a11 * xy;
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkCompact_8888(result);
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline U8CPU Filter_8(unsigned x, unsigned y,
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             U8CPU a00, U8CPU a01,
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             U8CPU a10, U8CPU a11) {
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x <= 0xF);
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)y <= 0xF);
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int xy = x * y;
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned result =   a00 * (256 - 16*y - 16*x + xy) +
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a01 * (16*x - xy) +
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a10 * (16*y - xy) +
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a11 * xy;
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return result >> 8;
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*****************************************************************************
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *  D32 functions
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 8888
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8846402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_opaque(x, y, a, b, c, d, dst)
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S32_opaque_D32 ## suffix
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          src
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9946402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
10046402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_alpha(x, y, a, b, c, d, dst, alphaScale)
10146402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S32_alpha_D32 ## suffix
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale < 256)
10746402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
10846402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(src, alphaScale)
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 565
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
11546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
11646402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
11746402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
11846402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkExpanded_565_To_PMColor(tmp);                \
11946402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S16_opaque_D32 ## suffix
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint16_t
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkPixel16ToPixel32(src)
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
13046402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
13146402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
13246402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                                    \
13346402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);               \
13446402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkAlphaMulQ(SkExpanded_565_To_PMColor(tmp), alphaScale);   \
13546402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
13646402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S16_alpha_D32 ## suffix
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint16_t
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale < 256)
14246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
14346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(SkPixel16ToPixel32(src), alphaScale)
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == Index8
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
15046402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_opaque(x, y, a, b, c, d, dst)
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SI8_opaque_D32 ## suffix
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PREAMBLE(state)         const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors()
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          table[src]
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      table[src]
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define POSTAMBLE(state)        state.fBitmap->getColorTable()->unlockColors(false)
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
16346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
16446402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_alpha(x, y, a, b, c, d, dst, alphaScale)
16546402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SI8_alpha_D32 ## suffix
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale < 256)
17146402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale; \
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors()
17346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(table[src], alphaScale)
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      table[src]
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define POSTAMBLE(state)        state.fBitmap->getColorTable()->unlockColors(false)
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 4444
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
18146402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)  *(dst) = Filter_4444_D32(x, y, a, b, c, d)
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S4444_opaque_D32 ## suffix
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor16
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \
18746402f8ee247238d734cdd90b8770caa46862a06Mike Reed                                SkASSERT(state.fAlphaScale == 256)
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkPixel4444ToPixel32(src)
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
19246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
19346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)  \
19446402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                    \
19546402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_4444_D32(x, y, a, b, c, d);   \
19646402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkAlphaMulQ(tmp, alphaScale);              \
19746402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
19846402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S4444_alpha_D32 ## suffix
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor16
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \
20346402f8ee247238d734cdd90b8770caa46862a06Mike Reed                                SkASSERT(state.fAlphaScale < 256)
20446402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
20546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(SkPixel4444ToPixel32(src), alphaScale)
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == A8
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
21246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
21346402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
21446402f8ee247238d734cdd90b8770caa46862a06Mike Reed        unsigned tmp = Filter_8(x, y, a, b, c, d);              \
21546402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkAlphaMulQ(pmColor, SkAlpha255To256(tmp));    \
21646402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SA8_alpha_D32 ## suffix
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kA8_Config); \
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PREAMBLE(state)         const SkPMColor pmColor = state.fPaintPMColor;
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkAlphaMulQ(pmColor, SkAlpha255To256(src))
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*****************************************************************************
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *  D16 functions
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 8888
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
23746402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
23846402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                \
23946402f8ee247238d734cdd90b8770caa46862a06Mike Reed        SkPMColor dstColor;                             \
24046402f8ee247238d734cdd90b8770caa46862a06Mike Reed        Filter_32_opaque(x, y, a, b, c, d, &dstColor);  \
24146402f8ee247238d734cdd90b8770caa46862a06Mike Reed        (*dst) = SkPixel32ToPixel16(dstColor);          \
24246402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S32_D16 ## suffix
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 16
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fBitmap->isOpaque())
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkPixel32ToPixel16(src)
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 565
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
25646402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
25746402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
25846402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
25946402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkCompact_rgb_16((tmp) >> 5);                  \
26046402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S16_D16 ## suffix
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 16
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint16_t
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config)
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          src
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == Index8
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
27346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
27446402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
27546402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
27646402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkCompact_rgb_16((tmp) >> 5);                  \
27746402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SI8_D16 ## suffix
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 16
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fBitmap->isOpaque())
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PREAMBLE(state)         const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->lock16BitCache()
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          table[src]
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      table[src]
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define POSTAMBLE(state)        state.fBitmap->getColorTable()->unlock16BitCache()
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
29060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed///////////////////////////////////////////////////////////////////////////////
29160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
29260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#undef FILTER_PROC
29346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
29446402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
29546402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
29646402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkCompact_rgb_16((tmp) >> 5);                  \
29746402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
29846402f8ee247238d734cdd90b8770caa46862a06Mike Reed
29960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
30060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEX_PROCF(fx, max)    SkClampMax((fx) >> 16, max)
30160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEY_PROCF(fy, max)    SkClampMax((fy) >> 16, max)
30260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF)
30360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF)
30460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
30560441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define MAKENAME(suffix)        Clamp_S16_D16 ## suffix
30660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define SRCTYPE                 uint16_t
30760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define DSTTYPE                 uint16_t
30860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config)
30960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define SRC_TO_FILTER(src)      src
31060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#include "SkBitmapProcState_shaderproc.h"
31160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
312cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed
313cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEX_PROCF(fx, max)    (((fx) & 0xFFFF) * ((max) + 1) >> 16)
314cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEY_PROCF(fy, max)    (((fy) & 0xFFFF) * ((max) + 1) >> 16)
315cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF)
316cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF)
317cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed
318cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define MAKENAME(suffix)        Repeat_S16_D16 ## suffix
319cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define SRCTYPE                 uint16_t
320cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define DSTTYPE                 uint16_t
321cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config)
322cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define SRC_TO_FILTER(src)      src
323cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#include "SkBitmapProcState_shaderproc.h"
324cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed
32560441ca59855d5289dd533aea1a40eb898b8a745Mike Reed///////////////////////////////////////////////////////////////////////////////
32660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool valid_for_filtering(unsigned dimension) {
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // for filtering, width and height must fit in 14bits, since we use steal
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // 2 bits from each to store our 4bit subpixel data
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (dimension & ~0x3FFF) == 0;
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fOrigBitmap.width() == 0 || fOrigBitmap.height() == 0) {
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMatrix* m;
33860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    bool clamp_clamp;
33960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (SkShader::kClamp_TileMode == fTileModeX &&
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkShader::kClamp_TileMode == fTileModeY) {
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        m = &inv;
34360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed        clamp_clamp = true;
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fUnitInvMatrix = inv;
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fUnitInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height());
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        m = &fUnitInvMatrix;
34860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed        clamp_clamp = false;
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fBitmap = &fOrigBitmap;
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fOrigBitmap.hasMipMap()) {
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int shift = fOrigBitmap.extractMipLevel(&fMipBitmap,
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                                SkScalarToFixed(m->getScaleX()),
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                                SkScalarToFixed(m->getSkewY()));
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (shift > 0) {
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (m != &fUnitInvMatrix) {
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fUnitInvMatrix = *m;
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                m = &fUnitInvMatrix;
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScalar scale = SkFixedToScalar(SK_Fixed1 >> shift);
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fUnitInvMatrix.postScale(scale, scale);
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            // now point here instead of fOrigBitmap
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fBitmap = &fMipBitmap;
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvMatrix      = m;
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvProc        = m->getMapXYProc();
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvType        = m->getType();
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvSx          = SkScalarToFixed(m->getScaleX());
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvKy          = SkScalarToFixed(m->getSkewY());
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fAlphaScale = SkAlpha255To256(paint.getAlpha());
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // pick-up filtering from the paint, but only if the matrix is
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // more complex than identity/translate (i.e. no need to pay the cost
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // of filtering if we're not scaled etc.).
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // note: we explicitly check inv, since m might be scaled due to unitinv
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //       trickery, but we don't want to see that for this test
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDoFilter = paint.isFilterBitmap() &&
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                (inv.getType() > SkMatrix::kTranslate_Mask &&
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 valid_for_filtering(fBitmap->width() | fBitmap->height()));
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
38860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fShaderProc32 = NULL;
38960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fShaderProc16 = NULL;
39060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fSampleProc32 = NULL;
39160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fSampleProc16 = NULL;
39260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fMatrixProc = this->chooseMatrixProc();
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (NULL == fMatrixProc) {
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = 0;
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fAlphaScale < 256) {  // note: this distinction is not used for D16
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index |= 1;
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) {
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index |= 2;
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fDoFilter) {
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index |= 4;
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // bits 3,4,5 encoding the source bitmap format
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (fBitmap->config()) {
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kARGB_8888_Config:
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 0;
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kRGB_565_Config:
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 8;
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kIndex8_Config:
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 16;
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kARGB_4444_Config:
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 24;
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kA8_Config:
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 32;
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fPaintPMColor = SkPreMultiplyColor(paint.getColor());
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static const SampleProc32 gSample32[] = {
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_nofilter_DXDY,
4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_nofilter_DXDY,
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_nofilter_DX,
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_nofilter_DX,
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_filter_DXDY,
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_filter_DXDY,
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_filter_DX,
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_filter_DX,
4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_nofilter_DXDY,
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_nofilter_DXDY,
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_nofilter_DX,
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_nofilter_DX,
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_filter_DXDY,
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_filter_DXDY,
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_filter_DX,
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_filter_DX,
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_nofilter_DXDY,
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_nofilter_DXDY,
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_nofilter_DX,
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_nofilter_DX,
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_filter_DXDY,
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_filter_DXDY,
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_filter_DX,
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_filter_DX,
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_nofilter_DXDY,
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_nofilter_DXDY,
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_nofilter_DX,
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_nofilter_DX,
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_filter_DXDY,
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_filter_DXDY,
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_filter_DX,
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_filter_DX,
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // A8 treats alpha/opauqe the same (equally efficient)
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DXDY,
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DXDY,
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DX,
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DX,
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DXDY,
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DXDY,
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DX,
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DX
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static const SampleProc16 gSample16[] = {
4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_nofilter_DXDY,
4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_nofilter_DX,
4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_filter_DXDY,
4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_filter_DX,
4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_nofilter_DXDY,
4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_nofilter_DX,
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_filter_DXDY,
4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_filter_DX,
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_nofilter_DXDY,
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_nofilter_DX,
4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_filter_DXDY,
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_filter_DX,
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // Don't support 4444 -> 565
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL, NULL, NULL, NULL,
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // Don't support A8 -> 565
4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL, NULL, NULL, NULL
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
50160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fSampleProc32 = gSample32[index];
5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index >>= 1;    // shift away any opaque/alpha distinction
5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fSampleProc16 = gSample16[index];
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
50660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    // our special-case shaderprocs
507cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed    if (S16_D16_filter_DX == fSampleProc16) {
508cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed        if (clamp_clamp) {
509cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed            fShaderProc16 = Clamp_S16_D16_filter_DX_shaderproc;
510cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed        } else if (SkShader::kRepeat_TileMode == fTileModeX &&
511cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed                   SkShader::kRepeat_TileMode == fTileModeY) {
512cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed            fShaderProc16 = Repeat_S16_D16_filter_DX_shaderproc;
513cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed        }
51460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    }
515aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed
516aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed    // see if our platform has any accelerated overrides
517aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed    this->platformProcs();
5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
521