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