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