11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFilterProc.h" 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass BILERP_BITMAP16_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader { 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project BILERP_BITMAP16_SHADER_CLASS(const SkBitmap& src) 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : HasSpan16_Sampler_BitmapShader(src, true, 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkShader::kClamp_TileMode, 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkShader::kClamp_TileMode) 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count > 0); 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project U8CPU alpha = this->getPaintAlpha(); 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& inv = this->getTotalInverse(); 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkBitmap& srcBitmap = this->getSrcBitmap(); 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxX = srcBitmap.width() - 1; 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxY = srcBitmap.height() - 1; 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcRB = srcBitmap.rowBytes(); 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project BILERP_BITMAP16_SHADER_PREAMBLE(srcBitmap); 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFilterProc* proc_table = SkGetBilinearFilterProcTable(); 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const BILERP_BITMAP16_SHADER_TYPE* srcPixels = (const BILERP_BITMAP16_SHADER_TYPE*)srcBitmap.getPixels(); 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kPerspective_MatrixClass) 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, count); 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((count = iter.next()) != 0) 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed* srcXY = iter.getXY(); 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx = *srcXY++ - SK_FixedHalf; 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fy = *srcXY++ - SK_FixedHalf; 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int ix = fx >> 16; 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int iy = fy >> 16; 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int x = SkClampMax(ix, srcMaxX); 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int y = SkClampMax(iy, srcMaxY); 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)srcPixels + y * srcRB)) + x; 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)ix < srcMaxX) 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p01 += 1; 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = p00; 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = p01; 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)iy < srcMaxY) 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10 + srcRB); 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11 + srcRB); 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p00)), 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p01)), 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p10)), 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p11))); 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = expanded_rgb16_to_8888(c, alpha); 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else // linear case 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx, fy, dx, dy; 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // now init fx, fy, dx, dy 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint srcPt; 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHalf, 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf; 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf; 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kFixedStepInX_MatrixClass) 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dx = SkScalarToFixed(inv.getScaleX()); 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dy = SkScalarToFixed(inv.getSkewY()); 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int ix = fx >> 16; 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int iy = fy >> 16; 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)srcPixels + 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkClampMax(iy, srcMaxY) * srcRB)) + 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkClampMax(ix, srcMaxX); 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)ix < srcMaxX) 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p01 += 1; 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = p00; 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = p01; 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)iy < srcMaxY) 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10 + srcRB); 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11 + srcRB); 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p00)), 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p01)), 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p10)), 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p11))); 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = expanded_rgb16_to_8888(c, alpha); 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy += dy; 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project BILERP_BITMAP16_SHADER_POSTAMBLE(srcBitmap); 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count > 0); 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& inv = this->getTotalInverse(); 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkBitmap& srcBitmap = this->getSrcBitmap(); 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxX = srcBitmap.width() - 1; 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxY = srcBitmap.height() - 1; 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcRB = srcBitmap.rowBytes(); 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project BILERP_BITMAP16_SHADER_PREAMBLE(srcBitmap); 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFilterProc* proc_table = SkGetBilinearFilterProcTable(); 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const BILERP_BITMAP16_SHADER_TYPE* srcPixels = (const BILERP_BITMAP16_SHADER_TYPE*)srcBitmap.getPixels(); 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kPerspective_MatrixClass) 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, count); 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((count = iter.next()) != 0) 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed* srcXY = iter.getXY(); 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx = *srcXY++ - SK_FixedHalf; 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fy = *srcXY++ - SK_FixedHalf; 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int ix = fx >> 16; 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int iy = fy >> 16; 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)srcPixels + 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkClampMax(iy, srcMaxY) * srcRB)) + 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkClampMax(ix, srcMaxX); 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)ix < srcMaxX) 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p01 += 1; 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = p00; 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = p01; 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)iy < srcMaxY) 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10 + srcRB); 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11 + srcRB); 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p00)), 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p01)), 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p10)), 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p11))); 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = SkCompact_rgb_16(c); 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else // linear case 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx, fy, dx, dy; 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // now init fx, fy, dx, dy 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint srcPt; 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHalf, 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf; 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf; 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kFixedStepInX_MatrixClass) 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dx = SkScalarToFixed(inv.getScaleX()); 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dy = SkScalarToFixed(inv.getSkewY()); 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int ix = fx >> 16; 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int iy = fy >> 16; 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)srcPixels + 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkClampMax(iy, srcMaxY) * srcRB)) + 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkClampMax(ix, srcMaxX); 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)ix < srcMaxX) 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p01 += 1; 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = p00; 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = p01; 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)iy < srcMaxY) 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10 + srcRB); 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11 + srcRB); 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p00)), 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p01)), 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p10)), 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*p11))); 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = SkCompact_rgb_16(c); 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy += dy; 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project BILERP_BITMAP16_SHADER_POSTAMBLE(srcBitmap); 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef BILERP_BITMAP16_SHADER_CLASS 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef BILERP_BITMAP16_SHADER_TYPE 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef BILERP_BITMAP16_SHADER_PREAMBLE 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef BILERP_BITMAP16_SHADER_PIXEL 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef BILERP_BITMAP16_SHADER_POSTAMBLE 246