SkBitmapProcState.cpp revision 9a5843c9b6ef01f25513bef72a91936f75cc4458
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// returns expanded * 5bits
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline uint32_t Filter_565_Expanded(unsigned x, unsigned y,
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                           uint32_t a00, uint32_t a01,
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                           uint32_t a10, uint32_t a11) {
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x <= 0xF);
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)y <= 0xF);
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a00 = SkExpand_rgb_16(a00);
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a01 = SkExpand_rgb_16(a01);
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a10 = SkExpand_rgb_16(a10);
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a11 = SkExpand_rgb_16(a11);
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int xy = x * y >> 3;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return  a00 * (32 - 2*y - 2*x + xy) +
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a01 * (2*x - xy) +
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a10 * (2*y - xy) +
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a11 * xy;
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// turn an expanded 565 * 5bits into SkPMColor
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// g:11 | r:10 | x:1 | b:10
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline SkPMColor SkExpanded_565_To_PMColor(uint32_t c) {
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned r = (c >> 13) & 0xFF;
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned g = (c >> 24);
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned b = (c >> 2) & 0xFF;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkPackARGB32(0xFF, r, g, b);
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// returns answer in SkPMColor format
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline SkPMColor Filter_4444_D32(unsigned x, unsigned y,
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                        uint32_t a00, uint32_t a01,
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                        uint32_t a10, uint32_t a11) {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x <= 0xF);
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)y <= 0xF);
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a00 = SkExpand_4444(a00);
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a01 = SkExpand_4444(a01);
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a10 = SkExpand_4444(a10);
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a11 = SkExpand_4444(a11);
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int xy = x * y >> 4;
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t result =   a00 * (16 - y - x + xy) +
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a01 * (x - xy) +
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a10 * (y - xy) +
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a11 * xy;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkCompact_8888(result);
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline U8CPU Filter_8(unsigned x, unsigned y,
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             U8CPU a00, U8CPU a01,
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             U8CPU a10, U8CPU a11) {
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)x <= 0xF);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)y <= 0xF);
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int xy = x * y;
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned result =   a00 * (256 - 16*y - 16*x + xy) +
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a01 * (16*x - xy) +
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a10 * (16*y - xy) +
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        a11 * xy;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return result >> 8;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*****************************************************************************
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *  D32 functions
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 8888
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8046402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_opaque(x, y, a, b, c, d, dst)
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S32_opaque_D32 ## suffix
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          src
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9146402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
9246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_alpha(x, y, a, b, c, d, dst, alphaScale)
9346402f8ee247238d734cdd90b8770caa46862a06Mike Reed
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S32_alpha_D32 ## suffix
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale < 256)
9946402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
10046402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(src, alphaScale)
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 565
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
10746402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
10846402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
10946402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
11046402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkExpanded_565_To_PMColor(tmp);                \
11146402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S16_opaque_D32 ## suffix
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint16_t
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkPixel16ToPixel32(src)
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
12246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
12346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
12446402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                                    \
12546402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);               \
12646402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkAlphaMulQ(SkExpanded_565_To_PMColor(tmp), alphaScale);   \
12746402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
12846402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S16_alpha_D32 ## suffix
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint16_t
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale < 256)
13446402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
13546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(SkPixel16ToPixel32(src), alphaScale)
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == Index8
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
14246402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_opaque(x, y, a, b, c, d, dst)
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SI8_opaque_D32 ## suffix
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PREAMBLE(state)         const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors()
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          table[src]
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      table[src]
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define POSTAMBLE(state)        state.fBitmap->getColorTable()->unlockColors(false)
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
15546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
15646402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)   Filter_32_alpha(x, y, a, b, c, d, dst, alphaScale)
15746402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SI8_alpha_D32 ## suffix
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale < 256)
16346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale; \
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors()
16546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(table[src], alphaScale)
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      table[src]
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define POSTAMBLE(state)        state.fBitmap->getColorTable()->unlockColors(false)
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 4444
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
17346402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)  *(dst) = Filter_4444_D32(x, y, a, b, c, d)
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S4444_opaque_D32 ## suffix
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor16
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \
17946402f8ee247238d734cdd90b8770caa46862a06Mike Reed                                SkASSERT(state.fAlphaScale == 256)
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkPixel4444ToPixel32(src)
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
18446402f8ee247238d734cdd90b8770caa46862a06Mike Reed#undef FILTER_PROC
18546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst)  \
18646402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                    \
18746402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_4444_D32(x, y, a, b, c, d);   \
18846402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkAlphaMulQ(tmp, alphaScale);              \
18946402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
19046402f8ee247238d734cdd90b8770caa46862a06Mike Reed
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S4444_alpha_D32 ## suffix
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor16
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \
19546402f8ee247238d734cdd90b8770caa46862a06Mike Reed                                SkASSERT(state.fAlphaScale < 256)
19646402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define PREAMBLE(state)         unsigned alphaScale = state.fAlphaScale
19746402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define RETURNDST(src)          SkAlphaMulQ(SkPixel4444ToPixel32(src), alphaScale)
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == A8
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
20446402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
20546402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
20646402f8ee247238d734cdd90b8770caa46862a06Mike Reed        unsigned tmp = Filter_8(x, y, a, b, c, d);              \
20746402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkAlphaMulQ(pmColor, SkAlpha255To256(tmp));    \
20846402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SA8_alpha_D32 ## suffix
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 32
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kA8_Config); \
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fAlphaScale == 256)
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PREAMBLE(state)         const SkPMColor pmColor = state.fPaintPMColor;
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkAlphaMulQ(pmColor, SkAlpha255To256(src))
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*****************************************************************************
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *  D16 functions
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 8888
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
22946402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
23046402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                \
23146402f8ee247238d734cdd90b8770caa46862a06Mike Reed        SkPMColor dstColor;                             \
23246402f8ee247238d734cdd90b8770caa46862a06Mike Reed        Filter_32_opaque(x, y, a, b, c, d, &dstColor);  \
23346402f8ee247238d734cdd90b8770caa46862a06Mike Reed        (*dst) = SkPixel32ToPixel16(dstColor);          \
23446402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S32_D16 ## suffix
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 16
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 SkPMColor
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fBitmap->isOpaque())
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          SkPixel32ToPixel16(src)
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == 565
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
24846402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
24946402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
25046402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
25146402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkCompact_rgb_16((tmp) >> 5);                  \
25246402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        S16_D16 ## suffix
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 16
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint16_t
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config)
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          src
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      src
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SRC == Index8
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC
26546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
26646402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
26746402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
26846402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkCompact_rgb_16((tmp) >> 5);                  \
26946402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define MAKENAME(suffix)        SI8_D16 ## suffix
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define DSTSIZE                 16
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRCTYPE                 uint8_t
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                SkASSERT(state.fBitmap->isOpaque())
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PREAMBLE(state)         const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->lock16BitCache()
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define RETURNDST(src)          table[src]
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SRC_TO_FILTER(src)      table[src]
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define POSTAMBLE(state)        state.fBitmap->getColorTable()->unlock16BitCache()
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapProcState_sample.h"
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
28260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed///////////////////////////////////////////////////////////////////////////////
28360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
28460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#undef FILTER_PROC
28546402f8ee247238d734cdd90b8770caa46862a06Mike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) \
28646402f8ee247238d734cdd90b8770caa46862a06Mike Reed    do {                                                        \
28746402f8ee247238d734cdd90b8770caa46862a06Mike Reed        uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d);   \
28846402f8ee247238d734cdd90b8770caa46862a06Mike Reed        *(dst) = SkCompact_rgb_16((tmp) >> 5);                  \
28946402f8ee247238d734cdd90b8770caa46862a06Mike Reed    } while (0)
29046402f8ee247238d734cdd90b8770caa46862a06Mike Reed
29160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
29260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEX_PROCF(fx, max)    SkClampMax((fx) >> 16, max)
29360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEY_PROCF(fy, max)    SkClampMax((fy) >> 16, max)
29460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF)
29560441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF)
29660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
29760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define MAKENAME(suffix)        Clamp_S16_D16 ## suffix
29860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define SRCTYPE                 uint16_t
29960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define DSTTYPE                 uint16_t
30060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config)
30160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define SRC_TO_FILTER(src)      src
30260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#include "SkBitmapProcState_shaderproc.h"
30360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
304cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed
305cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEX_PROCF(fx, max)    (((fx) & 0xFFFF) * ((max) + 1) >> 16)
306cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEY_PROCF(fy, max)    (((fy) & 0xFFFF) * ((max) + 1) >> 16)
307cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF)
308cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF)
309cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed
310cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define MAKENAME(suffix)        Repeat_S16_D16 ## suffix
311cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define SRCTYPE                 uint16_t
312cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define DSTTYPE                 uint16_t
313cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define CHECKSTATE(state)       SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config)
314cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define SRC_TO_FILTER(src)      src
315cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#include "SkBitmapProcState_shaderproc.h"
316cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed
31760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed///////////////////////////////////////////////////////////////////////////////
31860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool valid_for_filtering(unsigned dimension) {
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // for filtering, width and height must fit in 14bits, since we use steal
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // 2 bits from each to store our 4bit subpixel data
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (dimension & ~0x3FFF) == 0;
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fOrigBitmap.width() == 0 || fOrigBitmap.height() == 0) {
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3299a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMatrix* m;
3319a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed    bool trivial_matrix = (inv.getType() & ~SkMatrix::kTranslate_Mask) == 0;
3329a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed    bool clamp_clamp = SkShader::kClamp_TileMode == fTileModeX &&
3339a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed                       SkShader::kClamp_TileMode == fTileModeY;
33460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
3359a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed    if (clamp_clamp || trivial_matrix) {
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        m = &inv;
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fUnitInvMatrix = inv;
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fUnitInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height());
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        m = &fUnitInvMatrix;
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3429a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fBitmap = &fOrigBitmap;
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fOrigBitmap.hasMipMap()) {
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int shift = fOrigBitmap.extractMipLevel(&fMipBitmap,
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                                SkScalarToFixed(m->getScaleX()),
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                                SkScalarToFixed(m->getSkewY()));
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (shift > 0) {
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (m != &fUnitInvMatrix) {
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fUnitInvMatrix = *m;
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                m = &fUnitInvMatrix;
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScalar scale = SkFixedToScalar(SK_Fixed1 >> shift);
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fUnitInvMatrix.postScale(scale, scale);
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            // now point here instead of fOrigBitmap
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fBitmap = &fMipBitmap;
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvMatrix      = m;
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvProc        = m->getMapXYProc();
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvType        = m->getType();
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvSx          = SkScalarToFixed(m->getScaleX());
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fInvKy          = SkScalarToFixed(m->getSkewY());
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fAlphaScale = SkAlpha255To256(paint.getAlpha());
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // pick-up filtering from the paint, but only if the matrix is
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // more complex than identity/translate (i.e. no need to pay the cost
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // of filtering if we're not scaled etc.).
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // note: we explicitly check inv, since m might be scaled due to unitinv
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //       trickery, but we don't want to see that for this test
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDoFilter = paint.isFilterBitmap() &&
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                (inv.getType() > SkMatrix::kTranslate_Mask &&
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 valid_for_filtering(fBitmap->width() | fBitmap->height()));
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
38060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fShaderProc32 = NULL;
38160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fShaderProc16 = NULL;
38260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fSampleProc32 = NULL;
38360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    fSampleProc16 = NULL;
38460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
3859a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed    fMatrixProc = this->chooseMatrixProc(trivial_matrix);
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (NULL == fMatrixProc) {
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ///////////////////////////////////////////////////////////////////////
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = 0;
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fAlphaScale < 256) {  // note: this distinction is not used for D16
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index |= 1;
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) {
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index |= 2;
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fDoFilter) {
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index |= 4;
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // bits 3,4,5 encoding the source bitmap format
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (fBitmap->config()) {
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kARGB_8888_Config:
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 0;
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kRGB_565_Config:
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 8;
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kIndex8_Config:
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 16;
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kARGB_4444_Config:
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 24;
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kA8_Config:
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index |= 32;
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fPaintPMColor = SkPreMultiplyColor(paint.getColor());
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static const SampleProc32 gSample32[] = {
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_nofilter_DXDY,
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_nofilter_DXDY,
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_nofilter_DX,
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_nofilter_DX,
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_filter_DXDY,
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_filter_DXDY,
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_opaque_D32_filter_DX,
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_alpha_D32_filter_DX,
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_nofilter_DXDY,
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_nofilter_DXDY,
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_nofilter_DX,
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_nofilter_DX,
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_filter_DXDY,
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_filter_DXDY,
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_opaque_D32_filter_DX,
4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_alpha_D32_filter_DX,
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_nofilter_DXDY,
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_nofilter_DXDY,
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_nofilter_DX,
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_nofilter_DX,
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_filter_DXDY,
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_filter_DXDY,
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_opaque_D32_filter_DX,
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_alpha_D32_filter_DX,
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_nofilter_DXDY,
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_nofilter_DXDY,
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_nofilter_DX,
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_nofilter_DX,
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_filter_DXDY,
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_filter_DXDY,
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_opaque_D32_filter_DX,
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S4444_alpha_D32_filter_DX,
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // A8 treats alpha/opauqe the same (equally efficient)
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DXDY,
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DXDY,
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DX,
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_nofilter_DX,
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DXDY,
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DXDY,
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DX,
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SA8_alpha_D32_filter_DX
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static const SampleProc16 gSample16[] = {
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_nofilter_DXDY,
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_nofilter_DX,
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_filter_DXDY,
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S32_D16_filter_DX,
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_nofilter_DXDY,
4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_nofilter_DX,
4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_filter_DXDY,
4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        S16_D16_filter_DX,
4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_nofilter_DXDY,
4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_nofilter_DX,
4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_filter_DXDY,
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SI8_D16_filter_DX,
4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // Don't support 4444 -> 565
4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL, NULL, NULL, NULL,
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // Don't support A8 -> 565
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL, NULL, NULL, NULL
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
49360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fSampleProc32 = gSample32[index];
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index >>= 1;    // shift away any opaque/alpha distinction
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fSampleProc16 = gSample16[index];
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
49860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    // our special-case shaderprocs
499cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed    if (S16_D16_filter_DX == fSampleProc16) {
500cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed        if (clamp_clamp) {
501cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed            fShaderProc16 = Clamp_S16_D16_filter_DX_shaderproc;
502cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed        } else if (SkShader::kRepeat_TileMode == fTileModeX &&
503cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed                   SkShader::kRepeat_TileMode == fTileModeY) {
504cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed            fShaderProc16 = Repeat_S16_D16_filter_DX_shaderproc;
505cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed        }
50660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed    }
507aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed
508aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed    // see if our platform has any accelerated overrides
509aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed    this->platformProcs();
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
513