blob: b0384e75062cc65d30ef2eafc7705aed3483a7e0 [file] [log] [blame]
reed@android.coma44b4cc2009-07-16 02:03:58 +00001#define SCALE_FILTER_NAME MAKENAME(_filter_DX_shaderproc)
2
3#ifndef PREAMBLE
4 #define PREAMBLE(state)
5 #define PREAMBLE_PARAM_X
6 #define PREAMBLE_PARAM_Y
7 #define PREAMBLE_ARG_X
8 #define PREAMBLE_ARG_Y
9#endif
10
11
12static void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
13 DSTTYPE* SK_RESTRICT colors, int count) {
14 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
15 SkMatrix::kScale_Mask)) == 0);
16 SkASSERT(s.fInvKy == 0);
17 SkASSERT(count > 0 && colors != NULL);
18 SkASSERT(s.fDoFilter);
19 SkDEBUGCODE(CHECKSTATE(s);)
reed@android.com48534f92009-07-16 20:53:26 +000020
reed@android.coma44b4cc2009-07-16 02:03:58 +000021 PREAMBLE(s);
reed@android.com48534f92009-07-16 20:53:26 +000022
reed@android.coma44b4cc2009-07-16 02:03:58 +000023 const unsigned maxX = s.fBitmap->width() - 1;
24 const SkFixed oneX = s.fFilterOneX;
25 const SkFixed dx = s.fInvSx;
26 SkFixed fx;
27 const SRCTYPE* SK_RESTRICT row0;
28 const SRCTYPE* SK_RESTRICT row1;
29 unsigned subY;
30
31 {
32 SkPoint pt;
33 s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
34 SkIntToScalar(y) + SK_ScalarHalf, &pt);
35 SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
36 const unsigned maxY = s.fBitmap->height() - 1;
37 // compute our two Y values up front
38 subY = TILEY_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.fBitmap->getPixels();
43 unsigned rb = s.fBitmap->rowBytes();
44 row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
45 row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
46 // now initialize fx
47 fx = SkScalarToFixed(pt.fX) - (oneX >> 1);
48 }
reed@android.com48534f92009-07-16 20:53:26 +000049
reed@android.coma44b4cc2009-07-16 02:03:58 +000050 do {
51 unsigned subX = TILEX_LOW_BITS(fx, maxX);
52 unsigned x0 = TILEX_PROCF(fx, maxX);
53 unsigned x1 = TILEX_PROCF((fx + oneX), maxX);
54
55 uint32_t c = FILTER_PROC(subX, subY,
56 SRC_TO_FILTER(row0[x0]),
57 SRC_TO_FILTER(row0[x1]),
58 SRC_TO_FILTER(row1[x0]),
59 SRC_TO_FILTER(row1[x1]));
60 *colors++ = FILTER_TO_DST(c);
reed@android.com48534f92009-07-16 20:53:26 +000061
reed@android.coma44b4cc2009-07-16 02:03:58 +000062 fx += dx;
63 } while (--count != 0);
64}
65
66///////////////////////////////////////////////////////////////////////////////
67
68#undef MAKENAME
69#undef TILEX_PROCF
70#undef TILEY_PROCF
71#undef TILEX_LOW_BITS
72#undef TILEY_LOW_BITS
73#ifdef CHECK_FOR_DECAL
74 #undef CHECK_FOR_DECAL
75#endif
76
77#undef SCALE_FILTER_NAME
78
79#undef PREAMBLE
80#undef PREAMBLE_PARAM_X
81#undef PREAMBLE_PARAM_Y
82#undef PREAMBLE_ARG_X
83#undef PREAMBLE_ARG_Y