10b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
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.
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkMath.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SCALE_NOFILTER_NAME     MAKENAME(_nofilter_scale)
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SCALE_FILTER_NAME       MAKENAME(_filter_scale)
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define AFFINE_NOFILTER_NAME    MAKENAME(_nofilter_affine)
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define AFFINE_FILTER_NAME      MAKENAME(_filter_affine)
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PERSP_NOFILTER_NAME     MAKENAME(_nofilter_persp)
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PERSP_FILTER_NAME       MAKENAME(_filter_persp)
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PACK_FILTER_X_NAME  MAKENAME(_pack_filter_x)
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PACK_FILTER_Y_NAME  MAKENAME(_pack_filter_y)
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef PREAMBLE
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define PREAMBLE(state)
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define PREAMBLE_PARAM_X
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define PREAMBLE_PARAM_Y
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define PREAMBLE_ARG_X
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define PREAMBLE_ARG_Y
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
30030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                uint32_t xy[], int count, int x, int y) {
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             SkMatrix::kScale_Mask)) == 0);
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // we store y, x, x, x, x, x
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const unsigned maxX = s.fBitmap->width() - 1;
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed fx;
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPoint pt;
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  SkIntToScalar(y) + SK_ScalarHalf, &pt);
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fx = SkScalarToFixed(pt.fY);
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const unsigned maxY = s.fBitmap->height() - 1;
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *xy++ = TILEY_PROCF(fx, maxY);
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fx = SkScalarToFixed(pt.fX);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (0 == maxX) {
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // all of the following X values must be 0
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        memset(xy, 0, count * sizeof(uint16_t));
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFixed dx = s.fInvSx;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef CHECK_FOR_DECAL
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // test if we don't need to apply the tile proc
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if ((unsigned)(fx >> 16) <= maxX &&
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        (unsigned)((fx + dx * (count - 1)) >> 16) <= maxX) {
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        decal_nofilter_scale(xy, fx, dx, count);
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int i;
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (i = (count >> 2); i > 0; --i) {
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            unsigned a, b;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a = TILEX_PROCF(fx, maxX); fx += dx;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            b = TILEX_PROCF(fx, maxX); fx += dx;
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CPU_BENDIAN
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = (a << 16) | b;
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = (b << 16) | a;
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            a = TILEX_PROCF(fx, maxX); fx += dx;
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            b = TILEX_PROCF(fx, maxX); fx += dx;
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CPU_BENDIAN
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = (a << 16) | b;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = (b << 16) | a;
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint16_t* xx = (uint16_t*)xy;
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (i = (count & 3); i > 0; --i) {
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xx++ = TILEX_PROCF(fx, maxX); fx += dx;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// note: we could special-case on a matrix which is skewed in X but not Y.
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// this would require a more general setup thatn SCALE does, but could use
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SCALE's inner loop that only looks at dx
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
95030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid AFFINE_NOFILTER_NAME(const SkBitmapProcState& s,
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                 uint32_t xy[], int count, int x, int y) {
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fInvType & SkMatrix::kAffine_Mask);
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             SkMatrix::kScale_Mask |
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             SkMatrix::kAffine_Mask)) == 0);
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint srcPt;
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    s.fInvProc(*s.fInvMatrix,
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project               SkIntToScalar(x) + SK_ScalarHalf,
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project               SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed fx = SkScalarToFixed(srcPt.fX);
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed fy = SkScalarToFixed(srcPt.fY);
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed dx = s.fInvSx;
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed dy = s.fInvKy;
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int maxX = s.fBitmap->width() - 1;
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int maxY = s.fBitmap->height() - 1;
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int i = count; i > 0; --i) {
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *xy++ = (TILEY_PROCF(fy, maxY) << 16) | TILEX_PROCF(fx, maxX);
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fx += dx; fy += dy;
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
121030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid PERSP_NOFILTER_NAME(const SkBitmapProcState& s,
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                uint32_t* SK_RESTRICT xy,
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                int count, int x, int y) {
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int maxX = s.fBitmap->width() - 1;
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int maxY = s.fBitmap->height() - 1;
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPerspIter   iter(*s.fInvMatrix,
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       SkIntToScalar(x) + SK_ScalarHalf,
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       SkIntToScalar(y) + SK_ScalarHalf, count);
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while ((count = iter.next()) != 0) {
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFixed* SK_RESTRICT srcXY = iter.getXY();
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        while (--count >= 0) {
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = (TILEY_PROCF(srcXY[1], maxY) << 16) |
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                     TILEX_PROCF(srcXY[0], maxX);
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            srcXY += 2;
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//////////////////////////////////////////////////////////////////////////////
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline uint32_t PACK_FILTER_Y_NAME(SkFixed f, unsigned max,
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                          SkFixed one PREAMBLE_PARAM_Y) {
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned i = TILEY_PROCF(f, max);
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    i = (i << 4) | TILEY_LOW_BITS(f, max);
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (i << 14) | (TILEY_PROCF((f + one), max));
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline uint32_t PACK_FILTER_X_NAME(SkFixed f, unsigned max,
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                          SkFixed one PREAMBLE_PARAM_X) {
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned i = TILEX_PROCF(f, max);
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    i = (i << 4) | TILEX_LOW_BITS(f, max);
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (i << 14) | (TILEX_PROCF((f + one), max));
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid SCALE_FILTER_NAME(const SkBitmapProcState& s,
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              uint32_t xy[], int count, int x, int y) {
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             SkMatrix::kScale_Mask)) == 0);
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fInvKy == 0);
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const unsigned maxX = s.fBitmap->width() - 1;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFixed one = s.fFilterOneX;
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFixed dx = s.fInvSx;
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed fx;
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPoint pt;
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  SkIntToScalar(y) + SK_ScalarHalf, &pt);
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const unsigned maxY = s.fBitmap->height() - 1;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // compute our two Y values up front
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y);
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // now initialize fx
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fx = SkScalarToFixed(pt.fX) - (one >> 1);
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef CHECK_FOR_DECAL
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // test if we don't need to apply the tile proc
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (dx > 0 &&
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            (unsigned)(fx >> 16) <= maxX &&
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            (unsigned)((fx + dx * (count - 1)) >> 16) < maxX) {
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        decal_filter_scale(xy, fx, dx, count);
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        do {
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = PACK_FILTER_X_NAME(fx, maxX, one PREAMBLE_ARG_X);
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fx += dx;
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } while (--count != 0);
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
201030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid AFFINE_FILTER_NAME(const SkBitmapProcState& s,
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                               uint32_t xy[], int count, int x, int y) {
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fInvType & SkMatrix::kAffine_Mask);
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             SkMatrix::kScale_Mask |
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             SkMatrix::kAffine_Mask)) == 0);
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPoint srcPt;
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    s.fInvProc(*s.fInvMatrix,
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project               SkIntToScalar(x) + SK_ScalarHalf,
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project               SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed oneX = s.fFilterOneX;
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed oneY = s.fFilterOneY;
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed fx = SkScalarToFixed(srcPt.fX) - (oneX >> 1);
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1);
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed dx = s.fInvSx;
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed dy = s.fInvKy;
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned maxX = s.fBitmap->width() - 1;
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned maxY = s.fBitmap->height() - 1;
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y);
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fy += dy;
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneX PREAMBLE_ARG_X);
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fx += dx;
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (--count != 0);
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
231030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid PERSP_FILTER_NAME(const SkBitmapProcState& s,
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              uint32_t* SK_RESTRICT xy, int count,
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              int x, int y) {
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned maxX = s.fBitmap->width() - 1;
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned maxY = s.fBitmap->height() - 1;
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed oneX = s.fFilterOneX;
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFixed oneY = s.fFilterOneY;
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPerspIter   iter(*s.fInvMatrix,
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       SkIntToScalar(x) + SK_ScalarHalf,
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                       SkIntToScalar(y) + SK_ScalarHalf, count);
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while ((count = iter.next()) != 0) {
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkFixed* SK_RESTRICT srcXY = iter.getXY();
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        do {
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = PACK_FILTER_Y_NAME(srcXY[1] - (oneY >> 1), maxY,
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                       oneY PREAMBLE_ARG_Y);
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *xy++ = PACK_FILTER_X_NAME(srcXY[0] - (oneX >> 1), maxX,
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                       oneX PREAMBLE_ARG_X);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            srcXY += 2;
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } while (--count != 0);
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkBitmapProcState::MatrixProc MAKENAME(_Procs)[] = {
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SCALE_NOFILTER_NAME,
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SCALE_FILTER_NAME,
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    AFFINE_NOFILTER_NAME,
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    AFFINE_FILTER_NAME,
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PERSP_NOFILTER_NAME,
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PERSP_FILTER_NAME
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef MAKENAME
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEX_PROCF
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEY_PROCF
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef CHECK_FOR_DECAL
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #undef CHECK_FOR_DECAL
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef SCALE_NOFILTER_NAME
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef SCALE_FILTER_NAME
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef AFFINE_NOFILTER_NAME
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef AFFINE_FILTER_NAME
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PERSP_NOFILTER_NAME
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PERSP_FILTER_NAME
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_PARAM_X
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_PARAM_Y
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_ARG_X
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_ARG_Y
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEX_LOW_BITS
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEY_LOW_BITS
289