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 2921ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed// clamp 2931ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed 29460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) 29560441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) 29660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) 29760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) 29860441ca59855d5289dd533aea1a40eb898b8a745Mike Reed 29960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define MAKENAME(suffix) Clamp_S16_D16 ## suffix 30060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define SRCTYPE uint16_t 30160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define DSTTYPE uint16_t 30260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) 30360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#define SRC_TO_FILTER(src) src 30460441ca59855d5289dd533aea1a40eb898b8a745Mike Reed#include "SkBitmapProcState_shaderproc.h" 30560441ca59855d5289dd533aea1a40eb898b8a745Mike Reed 306cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed 307cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEX_PROCF(fx, max) (((fx) & 0xFFFF) * ((max) + 1) >> 16) 308cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEY_PROCF(fy, max) (((fy) & 0xFFFF) * ((max) + 1) >> 16) 309cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) 310cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) 311cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed 312cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define MAKENAME(suffix) Repeat_S16_D16 ## suffix 313cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define SRCTYPE uint16_t 314cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define DSTTYPE uint16_t 315cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) 316cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#define SRC_TO_FILTER(src) src 317cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed#include "SkBitmapProcState_shaderproc.h" 318cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed 3191ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed 3201ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) 3211ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) 3221ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) 3231ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) 3241ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed 3251ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#undef FILTER_PROC 3261ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define FILTER_PROC(x, y, a, b, c, d, dst) Filter_32_opaque(x, y, a, b, c, d, dst) 3271ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define MAKENAME(suffix) Clamp_SI8_opaque_D32 ## suffix 3281ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define SRCTYPE uint8_t 3291ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define DSTTYPE uint32_t 3301ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config) 3311ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() 3321ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define SRC_TO_FILTER(src) table[src] 3331ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors(false) 3341ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed#include "SkBitmapProcState_shaderproc.h" 3351ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed 33660441ca59855d5289dd533aea1a40eb898b8a745Mike Reed/////////////////////////////////////////////////////////////////////////////// 33760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed 3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool valid_for_filtering(unsigned dimension) { 3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // for filtering, width and height must fit in 14bits, since we use steal 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // 2 bits from each to store our 4bit subpixel data 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (dimension & ~0x3FFF) == 0; 3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { 3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fOrigBitmap.width() == 0 || fOrigBitmap.height() == 0) { 3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3489a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed 3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix* m; 3509a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed bool trivial_matrix = (inv.getType() & ~SkMatrix::kTranslate_Mask) == 0; 3519a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed bool clamp_clamp = SkShader::kClamp_TileMode == fTileModeX && 3529a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed SkShader::kClamp_TileMode == fTileModeY; 35360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed 3549a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed if (clamp_clamp || trivial_matrix) { 3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m = &inv; 3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fUnitInvMatrix = inv; 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fUnitInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); 3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m = &fUnitInvMatrix; 3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3619a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed 3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBitmap = &fOrigBitmap; 3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fOrigBitmap.hasMipMap()) { 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int shift = fOrigBitmap.extractMipLevel(&fMipBitmap, 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalarToFixed(m->getScaleX()), 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalarToFixed(m->getSkewY())); 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (shift > 0) { 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (m != &fUnitInvMatrix) { 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fUnitInvMatrix = *m; 3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project m = &fUnitInvMatrix; 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScalar scale = SkFixedToScalar(SK_Fixed1 >> shift); 3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fUnitInvMatrix.postScale(scale, scale); 3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // now point here instead of fOrigBitmap 3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBitmap = &fMipBitmap; 3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fInvMatrix = m; 3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fInvProc = m->getMapXYProc(); 3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fInvType = m->getType(); 3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fInvSx = SkScalarToFixed(m->getScaleX()); 3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fInvKy = SkScalarToFixed(m->getSkewY()); 3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fAlphaScale = SkAlpha255To256(paint.getAlpha()); 3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // pick-up filtering from the paint, but only if the matrix is 3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // more complex than identity/translate (i.e. no need to pay the cost 3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // of filtering if we're not scaled etc.). 3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // note: we explicitly check inv, since m might be scaled due to unitinv 3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // trickery, but we don't want to see that for this test 3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fDoFilter = paint.isFilterBitmap() && 3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (inv.getType() > SkMatrix::kTranslate_Mask && 3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project valid_for_filtering(fBitmap->width() | fBitmap->height())); 3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 39960441ca59855d5289dd533aea1a40eb898b8a745Mike Reed fShaderProc32 = NULL; 40060441ca59855d5289dd533aea1a40eb898b8a745Mike Reed fShaderProc16 = NULL; 40160441ca59855d5289dd533aea1a40eb898b8a745Mike Reed fSampleProc32 = NULL; 40260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed fSampleProc16 = NULL; 40360441ca59855d5289dd533aea1a40eb898b8a745Mike Reed 4049a5843c9b6ef01f25513bef72a91936f75cc4458Mike Reed fMatrixProc = this->chooseMatrixProc(trivial_matrix); 4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (NULL == fMatrixProc) { 4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /////////////////////////////////////////////////////////////////////// 4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int index = 0; 4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fAlphaScale < 256) { // note: this distinction is not used for D16 4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 1; 4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) { 4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 2; 4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fDoFilter) { 4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 4; 4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // bits 3,4,5 encoding the source bitmap format 4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project switch (fBitmap->config()) { 4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kARGB_8888_Config: 4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 0; 4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kRGB_565_Config: 4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 8; 4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kIndex8_Config: 4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 16; 4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kARGB_4444_Config: 4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 24; 4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project case SkBitmap::kA8_Config: 4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index |= 32; 4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fPaintPMColor = SkPreMultiplyColor(paint.getColor()); 4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project default: 4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static const SampleProc32 gSample32[] = { 4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_opaque_D32_nofilter_DXDY, 4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_alpha_D32_nofilter_DXDY, 4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_opaque_D32_nofilter_DX, 4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_alpha_D32_nofilter_DX, 4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_opaque_D32_filter_DXDY, 4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_alpha_D32_filter_DXDY, 4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_opaque_D32_filter_DX, 4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_alpha_D32_filter_DX, 4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_opaque_D32_nofilter_DXDY, 4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_alpha_D32_nofilter_DXDY, 4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_opaque_D32_nofilter_DX, 4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_alpha_D32_nofilter_DX, 4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_opaque_D32_filter_DXDY, 4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_alpha_D32_filter_DXDY, 4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_opaque_D32_filter_DX, 4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_alpha_D32_filter_DX, 4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_opaque_D32_nofilter_DXDY, 4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_alpha_D32_nofilter_DXDY, 4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_opaque_D32_nofilter_DX, 4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_alpha_D32_nofilter_DX, 4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_opaque_D32_filter_DXDY, 4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_alpha_D32_filter_DXDY, 4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_opaque_D32_filter_DX, 4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_alpha_D32_filter_DX, 4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_opaque_D32_nofilter_DXDY, 4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_alpha_D32_nofilter_DXDY, 4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_opaque_D32_nofilter_DX, 4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_alpha_D32_nofilter_DX, 4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_opaque_D32_filter_DXDY, 4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_alpha_D32_filter_DXDY, 4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_opaque_D32_filter_DX, 4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S4444_alpha_D32_filter_DX, 4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // A8 treats alpha/opauqe the same (equally efficient) 4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_nofilter_DXDY, 4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_nofilter_DXDY, 4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_nofilter_DX, 4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_nofilter_DX, 4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_filter_DXDY, 4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_filter_DXDY, 4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_filter_DX, 4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SA8_alpha_D32_filter_DX 4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static const SampleProc16 gSample16[] = { 4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_D16_nofilter_DXDY, 4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_D16_nofilter_DX, 4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_D16_filter_DXDY, 4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S32_D16_filter_DX, 4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_D16_nofilter_DXDY, 4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_D16_nofilter_DX, 4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_D16_filter_DXDY, 5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project S16_D16_filter_DX, 5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_D16_nofilter_DXDY, 5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_D16_nofilter_DX, 5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_D16_filter_DXDY, 5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SI8_D16_filter_DX, 5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // Don't support 4444 -> 565 5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NULL, NULL, NULL, NULL, 5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // Don't support A8 -> 565 5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NULL, NULL, NULL, NULL 5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 51260441ca59855d5289dd533aea1a40eb898b8a745Mike Reed 5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSampleProc32 = gSample32[index]; 5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project index >>= 1; // shift away any opaque/alpha distinction 5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fSampleProc16 = gSample16[index]; 5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 51760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed // our special-case shaderprocs 518cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed if (S16_D16_filter_DX == fSampleProc16) { 519cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed if (clamp_clamp) { 520cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed fShaderProc16 = Clamp_S16_D16_filter_DX_shaderproc; 521cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed } else if (SkShader::kRepeat_TileMode == fTileModeX && 522cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed SkShader::kRepeat_TileMode == fTileModeY) { 523cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed fShaderProc16 = Repeat_S16_D16_filter_DX_shaderproc; 524cac9f6a367de0788a55059ca6b34ed5b3f741390Mike Reed } 5251ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed } else if (SI8_opaque_D32_filter_DX == fSampleProc32 && clamp_clamp) { 5261ba87c2b414250b98cf5580cf105a80bbe7d311dMike Reed fShaderProc32 = Clamp_SI8_opaque_D32_filter_DX_shaderproc; 52760441ca59855d5289dd533aea1a40eb898b8a745Mike Reed } 528aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed 529aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed // see if our platform has any accelerated overrides 530aef24e041e1ec6bc910ff1dce404831c1dcfecc6Mike Reed this->platformProcs(); 5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 534c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed/////////////////////////////////////////////////////////////////////////////// 535c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed/* 536c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed The storage requirements for the different matrix procs are as follows, 537c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed where each X or Y is 2 bytes, and N is the number of pixels/elements: 538c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed 539c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed scale/translate nofilter Y(4bytes) + N * X 540c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed affine/perspective nofilter N * (X Y) 541c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed scale/translate filter Y Y + N * (X X) 542c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed affine/perspective filter N * (Y Y X X) 543c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed */ 544c1c43a17e7f2a87951739691056728a80e9aef6bMike Reedint SkBitmapProcState::maxCountForBufferSize(size_t bufferSize) const { 545c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed int32_t size = static_cast<int32_t>(bufferSize); 546c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed int perElemShift; 547c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed 548c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed size &= ~3; // only care about 4-byte aligned chunks 549c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) { 550c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed size -= 4; // the shared Y (or YY) coordinate 551c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed if (size < 0) { 552c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed size = 0; 553c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed } 554c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed perElemShift = fDoFilter ? 2 : 1; 555c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed } else { 556c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed perElemShift = fDoFilter ? 3 : 2; 557c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed } 558c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed 559c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed return size >> perElemShift; 560c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed} 561c1c43a17e7f2a87951739691056728a80e9aef6bMike Reed 562