1 2 /* 3 * 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. 7 */ 8 9 #include "SkMathPriv.h" 10 11 #define SCALE_FILTER_NAME MAKENAME(_filter_DX_shaderproc) 12 13 // Can't be static in the general case because some of these implementations 14 // will be defined and referenced in different object files. 15 void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y, 16 DSTTYPE* SK_RESTRICT colors, int count); 17 18 void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y, 19 DSTTYPE* SK_RESTRICT colors, int count) { 20 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 21 SkMatrix::kScale_Mask)) == 0); 22 SkASSERT(s.fInvKy == 0); 23 SkASSERT(count > 0 && colors != NULL); 24 SkASSERT(s.fFilterLevel != SkPaint::kNone_FilterLevel); 25 SkDEBUGCODE(CHECKSTATE(s);) 26 27 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; 37 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 38 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(); 47 size_t rb = s.fBitmap->rowBytes(); 48 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 } 53 54 #ifdef PREAMBLE 55 PREAMBLE(s); 56 #endif 57 58 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 63 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; 70 71 fx += dx; 72 } while (--count != 0); 73 74 #ifdef POSTAMBLE 75 POSTAMBLE(s); 76 #endif 77 } 78 79 /////////////////////////////////////////////////////////////////////////////// 80 81 #undef TILEX_PROCF 82 #undef TILEY_PROCF 83 #undef TILEX_LOW_BITS 84 #undef TILEY_LOW_BITS 85 #undef MAKENAME 86 #undef SRCTYPE 87 #undef DSTTYPE 88 #undef CHECKSTATE 89 #undef SRC_TO_FILTER 90 #undef FILTER_TO_DST 91 #undef PREAMBLE 92 #undef POSTAMBLE 93 94 #undef SCALE_FILTER_NAME 95