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 10 11#define SCALE_FILTER_NAME MAKENAME(_filter_DX_shaderproc) 12 13static void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y, 14 DSTTYPE* SK_RESTRICT colors, int count) { 15 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 16 SkMatrix::kScale_Mask)) == 0); 17 SkASSERT(s.fInvKy == 0); 18 SkASSERT(count > 0 && colors != NULL); 19 SkASSERT(s.fDoFilter); 20 SkDEBUGCODE(CHECKSTATE(s);) 21 22 const unsigned maxX = s.fBitmap->width() - 1; 23 const SkFixed oneX = s.fFilterOneX; 24 const SkFixed dx = s.fInvSx; 25 SkFixed fx; 26 const SRCTYPE* SK_RESTRICT row0; 27 const SRCTYPE* SK_RESTRICT row1; 28 unsigned subY; 29 30 { 31 SkPoint pt; 32 s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 33 SkIntToScalar(y) + SK_ScalarHalf, &pt); 34 SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); 35 const unsigned maxY = s.fBitmap->height() - 1; 36 // compute our two Y values up front 37 subY = TILEY_LOW_BITS(fy, maxY); 38 int y0 = TILEY_PROCF(fy, maxY); 39 int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY); 40 41 const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels(); 42 unsigned rb = s.fBitmap->rowBytes(); 43 row0 = (const SRCTYPE*)(srcAddr + y0 * rb); 44 row1 = (const SRCTYPE*)(srcAddr + y1 * rb); 45 // now initialize fx 46 fx = SkScalarToFixed(pt.fX) - (oneX >> 1); 47 } 48 49#ifdef PREAMBLE 50 PREAMBLE(s); 51#endif 52 53 do { 54 unsigned subX = TILEX_LOW_BITS(fx, maxX); 55 unsigned x0 = TILEX_PROCF(fx, maxX); 56 unsigned x1 = TILEX_PROCF((fx + oneX), maxX); 57 58 FILTER_PROC(subX, subY, 59 SRC_TO_FILTER(row0[x0]), 60 SRC_TO_FILTER(row0[x1]), 61 SRC_TO_FILTER(row1[x0]), 62 SRC_TO_FILTER(row1[x1]), 63 colors); 64 colors += 1; 65 66 fx += dx; 67 } while (--count != 0); 68 69#ifdef POSTAMBLE 70 POSTAMBLE(s); 71#endif 72} 73 74/////////////////////////////////////////////////////////////////////////////// 75 76#undef TILEX_PROCF 77#undef TILEY_PROCF 78#undef TILEX_LOW_BITS 79#undef TILEY_LOW_BITS 80#undef MAKENAME 81#undef SRCTYPE 82#undef DSTTYPE 83#undef CHECKSTATE 84#undef SRC_TO_FILTER 85#undef FILTER_TO_DST 86#undef PREAMBLE 87#undef POSTAMBLE 88 89#undef SCALE_FILTER_NAME 90