blob: 0014b4a526f5bef7fd98d0902855b952600dc5f5 [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
digit@google.com3ada0ef2012-08-13 14:06:34 +000013// Can't be static in the general case because some of these implementations
14// will be defined and referenced in different object files.
15void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
bsalomon@google.com100abf42012-09-05 17:40:04 +000016 DSTTYPE* SK_RESTRICT colors, int count);
17
18void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
digit@google.com3ada0ef2012-08-13 14:06:34 +000019 DSTTYPE* SK_RESTRICT colors, int count) {
reed@android.coma44b4cc2009-07-16 02:03:58 +000020 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
21 SkMatrix::kScale_Mask)) == 0);
22 SkASSERT(s.fInvKy == 0);
23 SkASSERT(count > 0 && colors != NULL);
reed@google.com9cfc83c2013-07-22 17:18:18 +000024 SkASSERT(s.fFilterLevel != SkPaint::kNone_FilterLevel);
reed@android.coma44b4cc2009-07-16 02:03:58 +000025 SkDEBUGCODE(CHECKSTATE(s);)
reed@android.com48534f92009-07-16 20:53:26 +000026
reed@android.coma44b4cc2009-07-16 02:03:58 +000027 const unsigned maxX = s.fBitmap->width() - 1;
28 const SkFixed oneX = s.fFilterOneX;
29 const SkFixed dx = s.fInvSx;
30 SkFixed fx;
31 const SRCTYPE* SK_RESTRICT row0;
32 const SRCTYPE* SK_RESTRICT row1;
33 unsigned subY;
34
35 {
36 SkPoint pt;
humper@google.com9c96d4b2013-07-14 01:44:59 +000037 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
reed@android.coma44b4cc2009-07-16 02:03:58 +000038 SkIntToScalar(y) + SK_ScalarHalf, &pt);
39 SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
40 const unsigned maxY = s.fBitmap->height() - 1;
41 // compute our two Y values up front
42 subY = TILEY_LOW_BITS(fy, maxY);
43 int y0 = TILEY_PROCF(fy, maxY);
44 int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY);
45
46 const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
scroggo@google.come5f48242013-02-25 21:47:41 +000047 size_t rb = s.fBitmap->rowBytes();
reed@android.coma44b4cc2009-07-16 02:03:58 +000048 row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
49 row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
50 // now initialize fx
51 fx = SkScalarToFixed(pt.fX) - (oneX >> 1);
52 }
reed@android.com48534f92009-07-16 20:53:26 +000053
reed@android.comb577b412009-10-27 17:49:32 +000054#ifdef PREAMBLE
55 PREAMBLE(s);
56#endif
rmistry@google.comfbfcd562012-08-23 18:09:54 +000057
reed@android.coma44b4cc2009-07-16 02:03:58 +000058 do {
59 unsigned subX = TILEX_LOW_BITS(fx, maxX);
60 unsigned x0 = TILEX_PROCF(fx, maxX);
61 unsigned x1 = TILEX_PROCF((fx + oneX), maxX);
62
reed@android.com152f7482009-08-07 19:14:34 +000063 FILTER_PROC(subX, subY,
64 SRC_TO_FILTER(row0[x0]),
65 SRC_TO_FILTER(row0[x1]),
66 SRC_TO_FILTER(row1[x0]),
67 SRC_TO_FILTER(row1[x1]),
68 colors);
69 colors += 1;
reed@android.com48534f92009-07-16 20:53:26 +000070
reed@android.coma44b4cc2009-07-16 02:03:58 +000071 fx += dx;
72 } while (--count != 0);
reed@android.comb577b412009-10-27 17:49:32 +000073
74#ifdef POSTAMBLE
75 POSTAMBLE(s);
76#endif
reed@android.coma44b4cc2009-07-16 02:03:58 +000077}
78
79///////////////////////////////////////////////////////////////////////////////
80
reed@android.coma44b4cc2009-07-16 02:03:58 +000081#undef TILEX_PROCF
82#undef TILEY_PROCF
83#undef TILEX_LOW_BITS
84#undef TILEY_LOW_BITS
reed@android.com01f82da2009-07-22 17:11:41 +000085#undef MAKENAME
86#undef SRCTYPE
reed@android.comaa9152a2009-07-17 21:24:56 +000087#undef DSTTYPE
reed@android.com01f82da2009-07-22 17:11:41 +000088#undef CHECKSTATE
89#undef SRC_TO_FILTER
90#undef FILTER_TO_DST
reed@android.comb577b412009-10-27 17:49:32 +000091#undef PREAMBLE
92#undef POSTAMBLE
reed@android.coma44b4cc2009-07-16 02:03:58 +000093
94#undef SCALE_FILTER_NAME