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.
14 void SCALE_FILTER_NAME(const void* sIn, int x, int y, SkPMColor* SK_RESTRICT colors, int count);
15
SCALE_FILTER_NAME(const void * sIn,int x,int y,SkPMColor * SK_RESTRICT colors,int count)16 void 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.fFilterLevel != 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 = 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.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 = TILEX_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 TILEX_LOW_BITS
80 #undef TILEY_LOW_BITS
81 #undef MAKENAME
82 #undef SRCTYPE
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