| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "SkMathPriv.h" | |
| #define SCALE_FILTER_NAME MAKENAME(_filter_DX_shaderproc) | |
| // Can't be static in the general case because some of these implementations | |
| // will be defined and referenced in different object files. | |
| void SCALE_FILTER_NAME(const void* sIn, int x, int y, SkPMColor* SK_RESTRICT colors, int count); | |
| void SCALE_FILTER_NAME(const void* sIn, int x, int y, SkPMColor* SK_RESTRICT colors, int count) { | |
| const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn); | |
| SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | |
| SkMatrix::kScale_Mask)) == 0); | |
| SkASSERT(s.fInvKy == 0); | |
| SkASSERT(count > 0 && colors != nullptr); | |
| SkASSERT(s.fFilterQuality != kNone_SkFilterQuality); | |
| SkDEBUGCODE(CHECKSTATE(s);) | |
| const unsigned maxX = s.fPixmap.width() - 1; | |
| const SkFixed oneX = s.fFilterOneX; | |
| const SkFixed dx = s.fInvSx; | |
| SkFixed fx; | |
| const SRCTYPE* SK_RESTRICT row0; | |
| const SRCTYPE* SK_RESTRICT row1; | |
| unsigned subY; | |
| { | |
| const SkBitmapProcStateAutoMapper mapper(s, x, y); | |
| SkFixed fy = mapper.fixedY(); | |
| const unsigned maxY = s.fPixmap.height() - 1; | |
| // compute our two Y values up front | |
| subY = EXTRACT_LOW_BITS(fy, maxY); | |
| int y0 = TILEY_PROCF(fy, maxY); | |
| int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY); | |
| const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr(); | |
| size_t rb = s.fPixmap.rowBytes(); | |
| row0 = (const SRCTYPE*)(srcAddr + y0 * rb); | |
| row1 = (const SRCTYPE*)(srcAddr + y1 * rb); | |
| // now initialize fx | |
| fx = mapper.fixedX(); | |
| } | |
| #ifdef PREAMBLE | |
| PREAMBLE(s); | |
| #endif | |
| do { | |
| unsigned subX = EXTRACT_LOW_BITS(fx, maxX); | |
| unsigned x0 = TILEX_PROCF(fx, maxX); | |
| unsigned x1 = TILEX_PROCF((fx + oneX), maxX); | |
| FILTER_PROC(subX, subY, | |
| SRC_TO_FILTER(row0[x0]), | |
| SRC_TO_FILTER(row0[x1]), | |
| SRC_TO_FILTER(row1[x0]), | |
| SRC_TO_FILTER(row1[x1]), | |
| colors); | |
| colors += 1; | |
| fx += dx; | |
| } while (--count != 0); | |
| #ifdef POSTAMBLE | |
| POSTAMBLE(s); | |
| #endif | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| #undef TILEX_PROCF | |
| #undef TILEY_PROCF | |
| #undef EXTRACT_LOW_BITS | |
| #undef MAKENAME | |
| #undef SRCTYPE | |
| #undef CHECKSTATE | |
| #undef SRC_TO_FILTER | |
| #undef FILTER_TO_DST | |
| #undef PREAMBLE | |
| #undef POSTAMBLE | |
| #undef SCALE_FILTER_NAME |