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.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