Home | History | Annotate | Download | only in core
      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