Home | History | Annotate | Download | only in core
      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 "SkMath.h"
      9 #include "SkMathPriv.h"
     10 
     11 #define SCALE_FILTER_NAME       MAKENAME(_filter_scale)
     12 #define AFFINE_FILTER_NAME      MAKENAME(_filter_affine)
     13 
     14 #define PACK_FILTER_X_NAME  MAKENAME(_pack_filter_x)
     15 #define PACK_FILTER_Y_NAME  MAKENAME(_pack_filter_y)
     16 
     17 #ifndef PREAMBLE
     18     #define PREAMBLE(state)
     19     #define PREAMBLE_PARAM_X
     20     #define PREAMBLE_PARAM_Y
     21     #define PREAMBLE_ARG_X
     22     #define PREAMBLE_ARG_Y
     23 #endif
     24 
     25 // declare functions externally to suppress warnings.
     26 void SCALE_FILTER_NAME(const SkBitmapProcState& s,
     27                               uint32_t xy[], int count, int x, int y);
     28 void AFFINE_FILTER_NAME(const SkBitmapProcState& s,
     29                                uint32_t xy[], int count, int x, int y);
     30 
     31 static inline uint32_t PACK_FILTER_Y_NAME(SkFixed f, unsigned max,
     32                                           SkFixed one PREAMBLE_PARAM_Y) {
     33     unsigned i = TILEY_PROCF(f, max);
     34     i = (i << 4) | EXTRACT_LOW_BITS(f, max);
     35     return (i << 14) | (TILEY_PROCF((f + one), max));
     36 }
     37 
     38 static inline uint32_t PACK_FILTER_X_NAME(SkFixed f, unsigned max,
     39                                           SkFixed one PREAMBLE_PARAM_X) {
     40     unsigned i = TILEX_PROCF(f, max);
     41     i = (i << 4) | EXTRACT_LOW_BITS(f, max);
     42     return (i << 14) | (TILEX_PROCF((f + one), max));
     43 }
     44 
     45 void SCALE_FILTER_NAME(const SkBitmapProcState& s,
     46                               uint32_t xy[], int count, int x, int y) {
     47     SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
     48                              SkMatrix::kScale_Mask)) == 0);
     49     SkASSERT(s.fInvKy == 0);
     50 
     51     PREAMBLE(s);
     52 
     53     const unsigned maxX = s.fPixmap.width() - 1;
     54     const SkFixed one = s.fFilterOneX;
     55     const SkFractionalInt dx = s.fInvSxFractionalInt;
     56     SkFractionalInt fx;
     57 
     58     {
     59         const SkBitmapProcStateAutoMapper mapper(s, x, y);
     60         const SkFixed fy = mapper.fixedY();
     61         const unsigned maxY = s.fPixmap.height() - 1;
     62         // compute our two Y values up front
     63         *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y);
     64         // now initialize fx
     65         fx = mapper.fractionalIntX();
     66     }
     67 
     68 #ifdef CHECK_FOR_DECAL
     69     const SkFixed fixedFx = SkFractionalIntToFixed(fx);
     70     const SkFixed fixedDx = SkFractionalIntToFixed(dx);
     71     if (can_truncate_to_fixed_for_decal(fixedFx, fixedDx, count, maxX)) {
     72         decal_filter_scale(xy, fixedFx, fixedDx, count);
     73     } else
     74 #endif
     75     {
     76         do {
     77             SkFixed fixedFx = SkFractionalIntToFixed(fx);
     78             *xy++ = PACK_FILTER_X_NAME(fixedFx, maxX, one PREAMBLE_ARG_X);
     79             fx += dx;
     80         } while (--count != 0);
     81     }
     82 }
     83 
     84 void AFFINE_FILTER_NAME(const SkBitmapProcState& s,
     85                                uint32_t xy[], int count, int x, int y) {
     86     SkASSERT(s.fInvType & SkMatrix::kAffine_Mask);
     87     SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
     88                              SkMatrix::kScale_Mask |
     89                              SkMatrix::kAffine_Mask)) == 0);
     90 
     91     PREAMBLE(s);
     92     const SkBitmapProcStateAutoMapper mapper(s, x, y);
     93 
     94     SkFixed oneX = s.fFilterOneX;
     95     SkFixed oneY = s.fFilterOneY;
     96     SkFixed fx = mapper.fixedX();
     97     SkFixed fy = mapper.fixedY();
     98     SkFixed dx = s.fInvSx;
     99     SkFixed dy = s.fInvKy;
    100     unsigned maxX = s.fPixmap.width() - 1;
    101     unsigned maxY = s.fPixmap.height() - 1;
    102 
    103     do {
    104         *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y);
    105         fy += dy;
    106         *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneX PREAMBLE_ARG_X);
    107         fx += dx;
    108     } while (--count != 0);
    109 }
    110 
    111 #undef MAKENAME
    112 #undef TILEX_PROCF
    113 #undef TILEY_PROCF
    114 #ifdef CHECK_FOR_DECAL
    115     #undef CHECK_FOR_DECAL
    116 #endif
    117 
    118 #undef SCALE_FILTER_NAME
    119 #undef AFFINE_FILTER_NAME
    120 
    121 #undef PREAMBLE
    122 #undef PREAMBLE_PARAM_X
    123 #undef PREAMBLE_PARAM_Y
    124 #undef PREAMBLE_ARG_X
    125 #undef PREAMBLE_ARG_Y
    126 
    127 #undef EXTRACT_LOW_BITS
    128