SkBitmapProcState_shaderproc.h revision 152f748386143475daf9da31aceb424dc7c8a7e6
1#define SCALE_FILTER_NAME       MAKENAME(_filter_DX_shaderproc)
2
3static void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
4                              DSTTYPE* SK_RESTRICT colors, int count) {
5    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
6                             SkMatrix::kScale_Mask)) == 0);
7    SkASSERT(s.fInvKy == 0);
8    SkASSERT(count > 0 && colors != NULL);
9    SkASSERT(s.fDoFilter);
10    SkDEBUGCODE(CHECKSTATE(s);)
11
12    const unsigned maxX = s.fBitmap->width() - 1;
13    const SkFixed oneX = s.fFilterOneX;
14    const SkFixed dx = s.fInvSx;
15    SkFixed fx;
16    const SRCTYPE* SK_RESTRICT row0;
17    const SRCTYPE* SK_RESTRICT row1;
18    unsigned subY;
19
20    {
21        SkPoint pt;
22        s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
23                   SkIntToScalar(y) + SK_ScalarHalf, &pt);
24        SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
25        const unsigned maxY = s.fBitmap->height() - 1;
26        // compute our two Y values up front
27        subY = TILEY_LOW_BITS(fy, maxY);
28        int y0 = TILEY_PROCF(fy, maxY);
29        int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY);
30
31        const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
32        unsigned rb = s.fBitmap->rowBytes();
33        row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
34        row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
35        // now initialize fx
36        fx = SkScalarToFixed(pt.fX) - (oneX >> 1);
37    }
38
39    do {
40        unsigned subX = TILEX_LOW_BITS(fx, maxX);
41        unsigned x0 = TILEX_PROCF(fx, maxX);
42        unsigned x1 = TILEX_PROCF((fx + oneX), maxX);
43
44        FILTER_PROC(subX, subY,
45                    SRC_TO_FILTER(row0[x0]),
46                    SRC_TO_FILTER(row0[x1]),
47                    SRC_TO_FILTER(row1[x0]),
48                    SRC_TO_FILTER(row1[x1]),
49                    colors);
50        colors += 1;
51
52        fx += dx;
53    } while (--count != 0);
54}
55
56///////////////////////////////////////////////////////////////////////////////
57
58#undef TILEX_PROCF
59#undef TILEY_PROCF
60#undef TILEX_LOW_BITS
61#undef TILEY_LOW_BITS
62#undef MAKENAME
63#undef SRCTYPE
64#undef DSTTYPE
65#undef CHECKSTATE
66#undef SRC_TO_FILTER
67#undef FILTER_TO_DST
68
69#undef SCALE_FILTER_NAME
70