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