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