1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10
11#define SCALE_FILTER_NAME       MAKENAME(_filter_DX_shaderproc)
12
13static void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
14                              DSTTYPE* SK_RESTRICT colors, int count) {
15    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
16                             SkMatrix::kScale_Mask)) == 0);
17    SkASSERT(s.fInvKy == 0);
18    SkASSERT(count > 0 && colors != NULL);
19    SkASSERT(s.fDoFilter);
20    SkDEBUGCODE(CHECKSTATE(s);)
21
22    const unsigned maxX = s.fBitmap->width() - 1;
23    const SkFixed oneX = s.fFilterOneX;
24    const SkFixed dx = s.fInvSx;
25    SkFixed fx;
26    const SRCTYPE* SK_RESTRICT row0;
27    const SRCTYPE* SK_RESTRICT row1;
28    unsigned subY;
29
30    {
31        SkPoint pt;
32        s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
33                   SkIntToScalar(y) + SK_ScalarHalf, &pt);
34        SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
35        const unsigned maxY = s.fBitmap->height() - 1;
36        // compute our two Y values up front
37        subY = TILEY_LOW_BITS(fy, maxY);
38        int y0 = TILEY_PROCF(fy, maxY);
39        int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY);
40
41        const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
42        unsigned rb = s.fBitmap->rowBytes();
43        row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
44        row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
45        // now initialize fx
46        fx = SkScalarToFixed(pt.fX) - (oneX >> 1);
47    }
48
49#ifdef PREAMBLE
50    PREAMBLE(s);
51#endif
52
53    do {
54        unsigned subX = TILEX_LOW_BITS(fx, maxX);
55        unsigned x0 = TILEX_PROCF(fx, maxX);
56        unsigned x1 = TILEX_PROCF((fx + oneX), maxX);
57
58        FILTER_PROC(subX, subY,
59                    SRC_TO_FILTER(row0[x0]),
60                    SRC_TO_FILTER(row0[x1]),
61                    SRC_TO_FILTER(row1[x0]),
62                    SRC_TO_FILTER(row1[x1]),
63                    colors);
64        colors += 1;
65
66        fx += dx;
67    } while (--count != 0);
68
69#ifdef POSTAMBLE
70    POSTAMBLE(s);
71#endif
72}
73
74///////////////////////////////////////////////////////////////////////////////
75
76#undef TILEX_PROCF
77#undef TILEY_PROCF
78#undef TILEX_LOW_BITS
79#undef TILEY_LOW_BITS
80#undef MAKENAME
81#undef SRCTYPE
82#undef DSTTYPE
83#undef CHECKSTATE
84#undef SRC_TO_FILTER
85#undef FILTER_TO_DST
86#undef PREAMBLE
87#undef POSTAMBLE
88
89#undef SCALE_FILTER_NAME
90