blob: ead57f123ea44a9797ca92f4bddf7dd857e64936 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.com69d05552011-05-24 12:14:28 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * 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.
reed@google.com69d05552011-05-24 12:14:28 +00007 */
8
reed@google.com4b163ed2012-08-07 21:35:13 +00009#include "SkMathPriv.h"
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
reed@android.coma44b4cc2009-07-16 02:03:58 +000011#define SCALE_FILTER_NAME MAKENAME(_filter_DX_shaderproc)
12
reed@android.coma44b4cc2009-07-16 02:03:58 +000013static 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);)
reed@android.com48534f92009-07-16 20:53:26 +000021
reed@android.coma44b4cc2009-07-16 02:03:58 +000022 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 }
reed@android.com48534f92009-07-16 20:53:26 +000048
reed@android.comb577b412009-10-27 17:49:32 +000049#ifdef PREAMBLE
50 PREAMBLE(s);
51#endif
52
reed@android.coma44b4cc2009-07-16 02:03:58 +000053 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
reed@android.com152f7482009-08-07 19:14:34 +000058 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;
reed@android.com48534f92009-07-16 20:53:26 +000065
reed@android.coma44b4cc2009-07-16 02:03:58 +000066 fx += dx;
67 } while (--count != 0);
reed@android.comb577b412009-10-27 17:49:32 +000068
69#ifdef POSTAMBLE
70 POSTAMBLE(s);
71#endif
reed@android.coma44b4cc2009-07-16 02:03:58 +000072}
73
74///////////////////////////////////////////////////////////////////////////////
75
reed@android.coma44b4cc2009-07-16 02:03:58 +000076#undef TILEX_PROCF
77#undef TILEY_PROCF
78#undef TILEX_LOW_BITS
79#undef TILEY_LOW_BITS
reed@android.com01f82da2009-07-22 17:11:41 +000080#undef MAKENAME
81#undef SRCTYPE
reed@android.comaa9152a2009-07-17 21:24:56 +000082#undef DSTTYPE
reed@android.com01f82da2009-07-22 17:11:41 +000083#undef CHECKSTATE
84#undef SRC_TO_FILTER
85#undef FILTER_TO_DST
reed@android.comb577b412009-10-27 17:49:32 +000086#undef PREAMBLE
87#undef POSTAMBLE
reed@android.coma44b4cc2009-07-16 02:03:58 +000088
89#undef SCALE_FILTER_NAME