1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkMathPriv.h"
9
10#define SCALE_FILTER_NAME       MAKENAME(_filter_DX_shaderproc)
11
12// Can't be static in the general case because some of these implementations
13// will be defined and referenced in different object files.
14void SCALE_FILTER_NAME(const void* sIn, int x, int y, SkPMColor* SK_RESTRICT colors, int count);
15
16void SCALE_FILTER_NAME(const void* sIn, int x, int y, SkPMColor* SK_RESTRICT colors, int count) {
17    const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn);
18    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
19                             SkMatrix::kScale_Mask)) == 0);
20    SkASSERT(s.fInvKy == 0);
21    SkASSERT(count > 0 && colors != nullptr);
22    SkASSERT(s.fFilterQuality != kNone_SkFilterQuality);
23    SkDEBUGCODE(CHECKSTATE(s);)
24
25    const unsigned maxX = s.fPixmap.width() - 1;
26    const SkFixed oneX = s.fFilterOneX;
27    const SkFixed dx = s.fInvSx;
28    SkFixed fx;
29    const SRCTYPE* SK_RESTRICT row0;
30    const SRCTYPE* SK_RESTRICT row1;
31    unsigned subY;
32
33    {
34        const SkBitmapProcStateAutoMapper mapper(s, x, y);
35        SkFixed fy = mapper.fixedY();
36        const unsigned maxY = s.fPixmap.height() - 1;
37        // compute our two Y values up front
38        subY = EXTRACT_LOW_BITS(fy, maxY);
39        int y0 = TILEY_PROCF(fy, maxY);
40        int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY);
41
42        const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr();
43        size_t rb = s.fPixmap.rowBytes();
44        row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
45        row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
46        // now initialize fx
47        fx = mapper.fixedX();
48    }
49
50#ifdef PREAMBLE
51    PREAMBLE(s);
52#endif
53
54    do {
55        unsigned subX = EXTRACT_LOW_BITS(fx, maxX);
56        unsigned x0 = TILEX_PROCF(fx, maxX);
57        unsigned x1 = TILEX_PROCF((fx + oneX), maxX);
58
59        FILTER_PROC(subX, subY,
60                    SRC_TO_FILTER(row0[x0]),
61                    SRC_TO_FILTER(row0[x1]),
62                    SRC_TO_FILTER(row1[x0]),
63                    SRC_TO_FILTER(row1[x1]),
64                    colors);
65        colors += 1;
66
67        fx += dx;
68    } while (--count != 0);
69
70#ifdef POSTAMBLE
71    POSTAMBLE(s);
72#endif
73}
74
75///////////////////////////////////////////////////////////////////////////////
76
77#undef TILEX_PROCF
78#undef TILEY_PROCF
79#undef EXTRACT_LOW_BITS
80#undef MAKENAME
81#undef SRCTYPE
82#undef CHECKSTATE
83#undef SRC_TO_FILTER
84#undef FILTER_TO_DST
85#undef PREAMBLE
86#undef POSTAMBLE
87
88#undef SCALE_FILTER_NAME
89