169d05551332e61e22da4bd3b61fc6d065b461d4areed@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
769d05551332e61e22da4bd3b61fc6d065b461d4areed@google.com */
869d05551332e61e22da4bd3b61fc6d065b461d4areed@google.com
94b163ed2c22facbe8891616874ae07ba7827d9c9reed@google.com#include "SkMathPriv.h"
10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
11a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#define SCALE_FILTER_NAME       MAKENAME(_filter_DX_shaderproc)
12a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
133ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.com// Can't be static in the general case because some of these implementations
143ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.com// will be defined and referenced in different object files.
153ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.comvoid SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
16100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com                       DSTTYPE* SK_RESTRICT colors, int count);
17100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com
18100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.comvoid SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
193ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.com                       DSTTYPE* SK_RESTRICT colors, int count) {
20a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
21a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com                             SkMatrix::kScale_Mask)) == 0);
22a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    SkASSERT(s.fInvKy == 0);
23a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    SkASSERT(count > 0 && colors != NULL);
249cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com    SkASSERT(s.fFilterLevel != SkPaint::kNone_FilterLevel);
25a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    SkDEBUGCODE(CHECKSTATE(s);)
2648534f96b9ccb747cecbdf3818bfbd3523a4d034reed@android.com
27a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    const unsigned maxX = s.fBitmap->width() - 1;
28a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    const SkFixed oneX = s.fFilterOneX;
29a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    const SkFixed dx = s.fInvSx;
30a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    SkFixed fx;
31a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    const SRCTYPE* SK_RESTRICT row0;
32a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    const SRCTYPE* SK_RESTRICT row1;
33a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    unsigned subY;
34a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
35a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    {
36a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        SkPoint pt;
379c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com        s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
38a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com                   SkIntToScalar(y) + SK_ScalarHalf, &pt);
39a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
40a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        const unsigned maxY = s.fBitmap->height() - 1;
41a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        // compute our two Y values up front
42a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        subY = TILEY_LOW_BITS(fy, maxY);
43a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        int y0 = TILEY_PROCF(fy, maxY);
44a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY);
45a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
46a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
47e5f48243bdbed2662be7a31be0888abc273b09e8scroggo@google.com        size_t rb = s.fBitmap->rowBytes();
48a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
49a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
50a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        // now initialize fx
51a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        fx = SkScalarToFixed(pt.fX) - (oneX >> 1);
52a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    }
5348534f96b9ccb747cecbdf3818bfbd3523a4d034reed@android.com
54b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#ifdef PREAMBLE
55b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com    PREAMBLE(s);
56b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#endif
57fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
58a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    do {
59a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        unsigned subX = TILEX_LOW_BITS(fx, maxX);
60a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        unsigned x0 = TILEX_PROCF(fx, maxX);
61a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        unsigned x1 = TILEX_PROCF((fx + oneX), maxX);
62a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
63152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com        FILTER_PROC(subX, subY,
64152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com                    SRC_TO_FILTER(row0[x0]),
65152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com                    SRC_TO_FILTER(row0[x1]),
66152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com                    SRC_TO_FILTER(row1[x0]),
67152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com                    SRC_TO_FILTER(row1[x1]),
68152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com                    colors);
69152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com        colors += 1;
7048534f96b9ccb747cecbdf3818bfbd3523a4d034reed@android.com
71a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com        fx += dx;
72a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com    } while (--count != 0);
73b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com
74b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#ifdef POSTAMBLE
75b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com    POSTAMBLE(s);
76b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#endif
77a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com}
78a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
79a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com///////////////////////////////////////////////////////////////////////////////
80a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
81a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEX_PROCF
82a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEY_PROCF
83a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEX_LOW_BITS
84a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEY_LOW_BITS
8501f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef MAKENAME
8601f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef SRCTYPE
87aa9152abbca3a958a9379f4e5067a1c37486d677reed@android.com#undef DSTTYPE
8801f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef CHECKSTATE
8901f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef SRC_TO_FILTER
9001f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef FILTER_TO_DST
91b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#undef PREAMBLE
92b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#undef POSTAMBLE
93a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com
94a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef SCALE_FILTER_NAME
95