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 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef NOFILTER_BITMAP_SHADER_PREAMBLE 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define NOFILTER_BITMAP_SHADER_PREAMBLE(bitmap, rb) 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define NOFILTER_BITMAP_SHADER_POSTAMBLE(bitmap) 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef NOFILTER_BITMAP_SHADER_PREAMBLE16 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define NOFILTER_BITMAP_SHADER_PREAMBLE16(bitmap, rb) 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE16 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define NOFILTER_BITMAP_SHADER_POSTAMBLE16(bitmap) 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass NOFILTER_BITMAP_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader { 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_CLASS(const SkBitmap& src) 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project : HasSpan16_Sampler_BitmapShader(src, false, 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_TILEMODE, 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_TILEMODE) 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const SkMatrix& matrix) 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!this->INHERITED::setContext(device, paint, matrix)) 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project this->computeUnitInverse(); 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count > 0); 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC32 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) == 0) 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_SPRITEPROC32(this, x, y, dstC, count); 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned scale = SkAlpha255To256(this->getPaintAlpha()); 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& inv = this->getUnitInverse(); 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::MapPtProc invProc = this->getUnitInverseProc(); 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& inv = this->getTotalInverse(); 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::MapPtProc invProc = this->getInverseMapPtProc(); 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkBitmap& srcBitmap = this->getSrcBitmap(); 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxX = srcBitmap.width() - 1; 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxY = srcBitmap.height() - 1; 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcRB = srcBitmap.rowBytes(); 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx, fy, dx, dy; 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)srcBitmap.getPixels(); 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_PREAMBLE(srcBitmap, srcRB); 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kPerspective_MatrixClass) 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, count); 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((count = iter.next()) != 0) 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed* srcXY = iter.getXY(); 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* Do I need this? 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx >>= level; 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy >>= level; 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (256 == scale) 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = *srcXY++; 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = *srcXY++; 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB); 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = *srcXY++; 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = *srcXY++; 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB); 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = SkAlphaMulQ(c, scale); 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // now init fx, fy, dx, dy 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint srcPt; 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project invProc(inv, SkIntToScalar(x) + SK_ScalarHalf, 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(srcPt.fX); 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = SkScalarToFixed(srcPt.fY); 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kFixedStepInX_MatrixClass) 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dx = SkScalarToFixed(inv.getScaleX()); 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dy = SkScalarToFixed(inv.getSkewY()); 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 132b1fd0813e0219e9f536ee5f43e988d10f4e147e6Mike Reed#ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { int level = this->getMipLevel() >> 16; 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx >>= level; 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy >>= level; 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dx >>= level; 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dy >>= level; 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (dy == 0) 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int y_index = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SkDEBUGF(("fy = %g, srcMaxY = %d, y_index = %d\n", SkFixedToFloat(fy), srcMaxY, y_index)); 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPixels + y_index * srcRB); 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (scale == 256) 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x); 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x); 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = SkAlphaMulQ(c, scale); 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else // dy != 0 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (scale == 256) 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy += dy; 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB); 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y, srcRB); 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy += dy; 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = SkAlphaMulQ(c, scale); 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_POSTAMBLE(srcBitmap); 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(count > 0); 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(this->getFlags() & SkShader::kHasSpan16_Flag); 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC16 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) == 0) 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_SPRITEPROC16(this, x, y, dstC, count); 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& inv = this->getUnitInverse(); 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::MapPtProc invProc = this->getUnitInverseProc(); 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& inv = this->getTotalInverse(); 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::MapPtProc invProc = this->getInverseMapPtProc(); 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkBitmap& srcBitmap = this->getSrcBitmap(); 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxX = srcBitmap.width() - 1; 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcMaxY = srcBitmap.height() - 1; 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned srcRB = srcBitmap.rowBytes(); 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx, fy, dx, dy; 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)srcBitmap.getPixels(); 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_PREAMBLE16(srcBitmap, srcRB); 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kPerspective_MatrixClass) 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, count); 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((count = iter.next()) != 0) 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed* srcXY = iter.getXY(); 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = *srcXY++; 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = *srcXY++; 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y, srcRB); 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // now init fx, fy, dx, dy 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint srcPt; 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project invProc(inv, SkIntToScalar(x) + SK_ScalarHalf, 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(srcPt.fX); 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy = SkScalarToFixed(srcPt.fY); 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (this->getInverseClass() == kFixedStepInX_MatrixClass) 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dx = SkScalarToFixed(inv.getScaleX()); 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dy = SkScalarToFixed(inv.getSkewY()); 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 255b1fd0813e0219e9f536ee5f43e988d10f4e147e6Mike Reed#ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { int level = this->getMipLevel() >> 16; 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx >>= level; 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy >>= level; 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dx >>= level; 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dy >>= level; 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (dy == 0) 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPixels + NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY) * srcRB); 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X16(srcPixels, x); 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else // dy != 0 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy += dy; 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y, srcRB); 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project NOFILTER_BITMAP_SHADER_POSTAMBLE16(srcBitmap); 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef HasSpan16_Sampler_BitmapShader INHERITED; 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_CLASS 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_TYPE 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_PREAMBLE 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_POSTAMBLE 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_SAMPLE_X //(x) 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_SAMPLE_XY //(x, y, rowBytes) 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_TILEMODE 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_TILEPROC 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_PREAMBLE16 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_POSTAMBLE16 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_SAMPLE_X16 //(x) 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_SAMPLE_XY16 //(x, y, rowBytes) 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_SPRITEPROC16 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef NOFILTER_BITMAP_SHADER_SPRITEPROC32 307