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