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