Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2006 The Android Open Source Project
      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 #include "SkScanPriv.h"
     11 #include "SkPath.h"
     12 #include "SkMatrix.h"
     13 #include "SkBlitter.h"
     14 #include "SkRegion.h"
     15 #include "SkAntiRun.h"
     16 
     17 #define SHIFT   2
     18 #define SCALE   (1 << SHIFT)
     19 #define MASK    (SCALE - 1)
     20 
     21 /** @file
     22     We have two techniques for capturing the output of the supersampler:
     23     - SUPERMASK, which records a large mask-bitmap
     24         this is often faster for small, complex objects
     25     - RLE, which records a rle-encoded scanline
     26         this is often faster for large objects with big spans
     27 
     28     These blitters use two coordinate systems:
     29     - destination coordinates, scale equal to the output - often
     30         abbreviated with 'i' or 'I' in variable names
     31     - supersampled coordinates, scale equal to the output * SCALE
     32 
     33     NEW_AA is a set of code-changes to try to make both paths produce identical
     34     results. Its not quite there yet, though the remaining differences may be
     35     in the subsequent blits, and not in the different masks/runs...
     36 
     37     SK_USE_EXACT_COVERAGE makes coverage_to_partial_alpha() behave similarly to
     38     coverage_to_exact_alpha(). Enabling it will requrie rebaselining about 1/3
     39     of GMs for changes in the 3 least significant bits along the edges of
     40     antialiased spans.
     41  */
     42 //#define FORCE_SUPERMASK
     43 //#define FORCE_RLE
     44 //#define SK_SUPPORT_NEW_AA
     45 //#define SK_USE_EXACT_COVERAGE
     46 
     47 ///////////////////////////////////////////////////////////////////////////////
     48 
     49 /// Base class for a single-pass supersampled blitter.
     50 class BaseSuperBlitter : public SkBlitter {
     51 public:
     52     BaseSuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
     53                      const SkRegion& clip);
     54 
     55     /// Must be explicitly defined on subclasses.
     56     virtual void blitAntiH(int x, int y, const SkAlpha antialias[],
     57                            const int16_t runs[]) SK_OVERRIDE {
     58         SkDEBUGFAIL("How did I get here?");
     59     }
     60     /// May not be called on BaseSuperBlitter because it blits out of order.
     61     virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE {
     62         SkDEBUGFAIL("How did I get here?");
     63     }
     64 
     65 protected:
     66     SkBlitter*  fRealBlitter;
     67     /// Current y coordinate, in destination coordinates.
     68     int         fCurrIY;
     69     /// Widest row of region to be blitted, in destination coordinates.
     70     int         fWidth;
     71     /// Leftmost x coordinate in any row, in destination coordinates.
     72     int         fLeft;
     73     /// Leftmost x coordinate in any row, in supersampled coordinates.
     74     int         fSuperLeft;
     75 
     76     SkDEBUGCODE(int fCurrX;)
     77     /// Current y coordinate in supersampled coordinates.
     78     int fCurrY;
     79     /// Initial y coordinate (top of bounds).
     80     int fTop;
     81 };
     82 
     83 BaseSuperBlitter::BaseSuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
     84                                    const SkRegion& clip) {
     85     fRealBlitter = realBlitter;
     86 
     87     /*
     88      *  We use the clip bounds instead of the ir, since we may be asked to
     89      *  draw outside of the rect if we're a inverse filltype
     90      */
     91     const int left = clip.getBounds().fLeft;
     92     const int right = clip.getBounds().fRight;
     93 
     94     fLeft = left;
     95     fSuperLeft = left << SHIFT;
     96     fWidth = right - left;
     97 #if 0
     98     fCurrIY = -1;
     99     fCurrY = -1;
    100 #else
    101     fTop = ir.fTop;
    102     fCurrIY = ir.fTop - 1;
    103     fCurrY = (ir.fTop << SHIFT) - 1;
    104 #endif
    105     SkDEBUGCODE(fCurrX = -1;)
    106 }
    107 
    108 /// Run-length-encoded supersampling antialiased blitter.
    109 class SuperBlitter : public BaseSuperBlitter {
    110 public:
    111     SuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
    112                  const SkRegion& clip);
    113 
    114     virtual ~SuperBlitter() {
    115         this->flush();
    116         sk_free(fRuns.fRuns);
    117     }
    118 
    119     /// Once fRuns contains a complete supersampled row, flush() blits
    120     /// it out through the wrapped blitter.
    121     void flush();
    122 
    123     /// Blits a row of pixels, with location and width specified
    124     /// in supersampled coordinates.
    125     virtual void blitH(int x, int y, int width) SK_OVERRIDE;
    126     /// Blits a rectangle of pixels, with location and size specified
    127     /// in supersampled coordinates.
    128     virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
    129 
    130 private:
    131     SkAlphaRuns fRuns;
    132     int         fOffsetX;
    133 };
    134 
    135 SuperBlitter::SuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
    136                            const SkRegion& clip)
    137         : BaseSuperBlitter(realBlitter, ir, clip) {
    138     const int width = fWidth;
    139 
    140     // extra one to store the zero at the end
    141     fRuns.fRuns = (int16_t*)sk_malloc_throw((width + 1 + (width + 2)/2) * sizeof(int16_t));
    142     fRuns.fAlpha = (uint8_t*)(fRuns.fRuns + width + 1);
    143     fRuns.reset(width);
    144 
    145     fOffsetX = 0;
    146 }
    147 
    148 void SuperBlitter::flush() {
    149     if (fCurrIY >= fTop) {
    150         if (!fRuns.empty()) {
    151         //  SkDEBUGCODE(fRuns.dump();)
    152             fRealBlitter->blitAntiH(fLeft, fCurrIY, fRuns.fAlpha, fRuns.fRuns);
    153             fRuns.reset(fWidth);
    154             fOffsetX = 0;
    155         }
    156         fCurrIY = fTop - 1;
    157         SkDEBUGCODE(fCurrX = -1;)
    158     }
    159 }
    160 
    161 /** coverage_to_partial_alpha() is being used by SkAlphaRuns, which
    162     *accumulates* SCALE pixels worth of "alpha" in [0,(256/SCALE)]
    163     to produce a final value in [0, 255] and handles clamping 256->255
    164     itself, with the same (alpha - (alpha >> 8)) correction as
    165     coverage_to_exact_alpha().
    166 */
    167 static inline int coverage_to_partial_alpha(int aa) {
    168 #ifdef SK_USE_EXACT_COVERAGE
    169     return aa << (8 - 2 * SHIFT);
    170 #else
    171     aa <<= 8 - 2*SHIFT;
    172     aa -= aa >> (8 - SHIFT - 1);
    173     return aa;
    174 #endif
    175 }
    176 
    177 /** coverage_to_exact_alpha() is being used by our blitter, which wants
    178     a final value in [0, 255].
    179 */
    180 static inline int coverage_to_exact_alpha(int aa) {
    181     int alpha = (256 >> SHIFT) * aa;
    182     // clamp 256->255
    183     return alpha - (alpha >> 8);
    184 }
    185 
    186 void SuperBlitter::blitH(int x, int y, int width) {
    187     SkASSERT(width > 0);
    188 
    189     int iy = y >> SHIFT;
    190     SkASSERT(iy >= fCurrIY);
    191 
    192     x -= fSuperLeft;
    193     // hack, until I figure out why my cubics (I think) go beyond the bounds
    194     if (x < 0) {
    195         width += x;
    196         x = 0;
    197     }
    198 
    199 #ifdef SK_DEBUG
    200     SkASSERT(y != fCurrY || x >= fCurrX);
    201 #endif
    202     SkASSERT(y >= fCurrY);
    203     if (fCurrY != y) {
    204         fOffsetX = 0;
    205         fCurrY = y;
    206     }
    207 
    208     if (iy != fCurrIY) {  // new scanline
    209         this->flush();
    210         fCurrIY = iy;
    211     }
    212 
    213     int start = x;
    214     int stop = x + width;
    215 
    216     SkASSERT(start >= 0 && stop > start);
    217     // integer-pixel-aligned ends of blit, rounded out
    218     int fb = start & MASK;
    219     int fe = stop & MASK;
    220     int n = (stop >> SHIFT) - (start >> SHIFT) - 1;
    221 
    222     if (n < 0) {
    223         fb = fe - fb;
    224         n = 0;
    225         fe = 0;
    226     } else {
    227         if (fb == 0) {
    228             n += 1;
    229         } else {
    230             fb = SCALE - fb;
    231         }
    232     }
    233 
    234     fOffsetX = fRuns.add(x >> SHIFT, coverage_to_partial_alpha(fb),
    235                          n, coverage_to_partial_alpha(fe),
    236                          (1 << (8 - SHIFT)) - (((y & MASK) + 1) >> SHIFT),
    237                          fOffsetX);
    238 
    239 #ifdef SK_DEBUG
    240     fRuns.assertValid(y & MASK, (1 << (8 - SHIFT)));
    241     fCurrX = x + width;
    242 #endif
    243 }
    244 
    245 static void set_left_rite_runs(SkAlphaRuns& runs, int ileft, U8CPU leftA,
    246                                int n, U8CPU riteA) {
    247     SkASSERT(leftA <= 0xFF);
    248     SkASSERT(riteA <= 0xFF);
    249 
    250     int16_t* run = runs.fRuns;
    251     uint8_t* aa = runs.fAlpha;
    252 
    253     if (ileft > 0) {
    254         run[0] = ileft;
    255         aa[0] = 0;
    256         run += ileft;
    257         aa += ileft;
    258     }
    259 
    260     SkASSERT(leftA < 0xFF);
    261     if (leftA > 0) {
    262         *run++ = 1;
    263         *aa++ = leftA;
    264     }
    265 
    266     if (n > 0) {
    267         run[0] = n;
    268         aa[0] = 0xFF;
    269         run += n;
    270         aa += n;
    271     }
    272 
    273     SkASSERT(riteA < 0xFF);
    274     if (riteA > 0) {
    275         *run++ = 1;
    276         *aa++ = riteA;
    277     }
    278     run[0] = 0;
    279 }
    280 
    281 void SuperBlitter::blitRect(int x, int y, int width, int height) {
    282     SkASSERT(width > 0);
    283     SkASSERT(height > 0);
    284 
    285     // blit leading rows
    286     while ((y & MASK)) {
    287         this->blitH(x, y++, width);
    288         if (--height <= 0) {
    289             return;
    290         }
    291     }
    292     SkASSERT(height > 0);
    293 
    294     // Since this is a rect, instead of blitting supersampled rows one at a
    295     // time and then resolving to the destination canvas, we can blit
    296     // directly to the destintion canvas one row per SCALE supersampled rows.
    297     int start_y = y >> SHIFT;
    298     int stop_y = (y + height) >> SHIFT;
    299     int count = stop_y - start_y;
    300     if (count > 0) {
    301         y += count << SHIFT;
    302         height -= count << SHIFT;
    303 
    304         // save original X for our tail blitH() loop at the bottom
    305         int origX = x;
    306 
    307         x -= fSuperLeft;
    308         // hack, until I figure out why my cubics (I think) go beyond the bounds
    309         if (x < 0) {
    310             width += x;
    311             x = 0;
    312         }
    313 
    314         // There is always a left column, a middle, and a right column.
    315         // ileft is the destination x of the first pixel of the entire rect.
    316         // xleft is (SCALE - # of covered supersampled pixels) in that
    317         // destination pixel.
    318         int ileft = x >> SHIFT;
    319         int xleft = x & MASK;
    320         // irite is the destination x of the last pixel of the OPAQUE section.
    321         // xrite is the number of supersampled pixels extending beyond irite;
    322         // xrite/SCALE should give us alpha.
    323         int irite = (x + width) >> SHIFT;
    324         int xrite = (x + width) & MASK;
    325         if (!xrite) {
    326             xrite = SCALE;
    327             irite--;
    328         }
    329 
    330         // Need to call flush() to clean up pending draws before we
    331         // even consider blitV(), since otherwise it can look nonmonotonic.
    332         SkASSERT(start_y > fCurrIY);
    333         this->flush();
    334 
    335         int n = irite - ileft - 1;
    336         if (n < 0) {
    337             // If n < 0, we'll only have a single partially-transparent column
    338             // of pixels to render.
    339             xleft = xrite - xleft;
    340             SkASSERT(xleft <= SCALE);
    341             SkASSERT(xleft > 0);
    342             xrite = 0;
    343             fRealBlitter->blitV(ileft + fLeft, start_y, count,
    344                 coverage_to_exact_alpha(xleft));
    345         } else {
    346             // With n = 0, we have two possibly-transparent columns of pixels
    347             // to render; with n > 0, we have opaque columns between them.
    348 
    349             xleft = SCALE - xleft;
    350 
    351             // Using coverage_to_exact_alpha is not consistent with blitH()
    352             const int coverageL = coverage_to_exact_alpha(xleft);
    353             const int coverageR = coverage_to_exact_alpha(xrite);
    354 
    355             SkASSERT(coverageL > 0 || n > 0 || coverageR > 0);
    356             SkASSERT((coverageL != 0) + n + (coverageR != 0) <= fWidth);
    357 
    358             fRealBlitter->blitAntiRect(ileft + fLeft, start_y, n, count,
    359                                        coverageL, coverageR);
    360         }
    361 
    362         // preamble for our next call to blitH()
    363         fCurrIY = stop_y - 1;
    364         fOffsetX = 0;
    365         fCurrY = y - 1;
    366         fRuns.reset(fWidth);
    367         x = origX;
    368     }
    369 
    370     // catch any remaining few rows
    371     SkASSERT(height <= MASK);
    372     while (--height >= 0) {
    373         this->blitH(x, y++, width);
    374     }
    375 }
    376 
    377 ///////////////////////////////////////////////////////////////////////////////
    378 
    379 /// Masked supersampling antialiased blitter.
    380 class MaskSuperBlitter : public BaseSuperBlitter {
    381 public:
    382     MaskSuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
    383                      const SkRegion& clip);
    384     virtual ~MaskSuperBlitter() {
    385         fRealBlitter->blitMask(fMask, fClipRect);
    386     }
    387 
    388     virtual void blitH(int x, int y, int width) SK_OVERRIDE;
    389 
    390     static bool CanHandleRect(const SkIRect& bounds) {
    391 #ifdef FORCE_RLE
    392         return false;
    393 #endif
    394         int width = bounds.width();
    395         int64_t rb = SkAlign4(width);
    396         // use 64bits to detect overflow
    397         int64_t storage = rb * bounds.height();
    398 
    399         return (width <= MaskSuperBlitter::kMAX_WIDTH) &&
    400                (storage <= MaskSuperBlitter::kMAX_STORAGE);
    401     }
    402 
    403 private:
    404     enum {
    405 #ifdef FORCE_SUPERMASK
    406         kMAX_WIDTH = 2048,
    407         kMAX_STORAGE = 1024 * 1024 * 2
    408 #else
    409         kMAX_WIDTH = 32,    // so we don't try to do very wide things, where the RLE blitter would be faster
    410         kMAX_STORAGE = 1024
    411 #endif
    412     };
    413 
    414     SkMask      fMask;
    415     SkIRect     fClipRect;
    416     // we add 1 because add_aa_span can write (unchanged) 1 extra byte at the end, rather than
    417     // perform a test to see if stopAlpha != 0
    418     uint32_t    fStorage[(kMAX_STORAGE >> 2) + 1];
    419 };
    420 
    421 MaskSuperBlitter::MaskSuperBlitter(SkBlitter* realBlitter, const SkIRect& ir,
    422                                    const SkRegion& clip)
    423         : BaseSuperBlitter(realBlitter, ir, clip) {
    424     SkASSERT(CanHandleRect(ir));
    425 
    426     fMask.fImage    = (uint8_t*)fStorage;
    427     fMask.fBounds   = ir;
    428     fMask.fRowBytes = ir.width();
    429     fMask.fFormat   = SkMask::kA8_Format;
    430 
    431     fClipRect = ir;
    432     fClipRect.intersect(clip.getBounds());
    433 
    434     // For valgrind, write 1 extra byte at the end so we don't read
    435     // uninitialized memory. See comment in add_aa_span and fStorage[].
    436     memset(fStorage, 0, fMask.fBounds.height() * fMask.fRowBytes + 1);
    437 }
    438 
    439 static void add_aa_span(uint8_t* alpha, U8CPU startAlpha) {
    440     /*  I should be able to just add alpha[x] + startAlpha.
    441         However, if the trailing edge of the previous span and the leading
    442         edge of the current span round to the same super-sampled x value,
    443         I might overflow to 256 with this add, hence the funny subtract.
    444     */
    445     unsigned tmp = *alpha + startAlpha;
    446     SkASSERT(tmp <= 256);
    447     *alpha = SkToU8(tmp - (tmp >> 8));
    448 }
    449 
    450 static inline uint32_t quadplicate_byte(U8CPU value) {
    451     uint32_t pair = (value << 8) | value;
    452     return (pair << 16) | pair;
    453 }
    454 
    455 // minimum count before we want to setup an inner loop, adding 4-at-a-time
    456 #define MIN_COUNT_FOR_QUAD_LOOP  16
    457 
    458 static void add_aa_span(uint8_t* alpha, U8CPU startAlpha, int middleCount,
    459                         U8CPU stopAlpha, U8CPU maxValue) {
    460     SkASSERT(middleCount >= 0);
    461 
    462     /*  I should be able to just add alpha[x] + startAlpha.
    463         However, if the trailing edge of the previous span and the leading
    464         edge of the current span round to the same super-sampled x value,
    465         I might overflow to 256 with this add, hence the funny subtract.
    466     */
    467 #ifdef SK_SUPPORT_NEW_AA
    468     if (startAlpha) {
    469         unsigned tmp = *alpha + startAlpha;
    470         SkASSERT(tmp <= 256);
    471         *alpha++ = SkToU8(tmp - (tmp >> 8));
    472     }
    473 #else
    474     unsigned tmp = *alpha + startAlpha;
    475     SkASSERT(tmp <= 256);
    476     *alpha++ = SkToU8(tmp - (tmp >> 8));
    477 #endif
    478 
    479     if (middleCount >= MIN_COUNT_FOR_QUAD_LOOP) {
    480         // loop until we're quad-byte aligned
    481         while (SkTCast<intptr_t>(alpha) & 0x3) {
    482             alpha[0] = SkToU8(alpha[0] + maxValue);
    483             alpha += 1;
    484             middleCount -= 1;
    485         }
    486 
    487         int bigCount = middleCount >> 2;
    488         uint32_t* qptr = reinterpret_cast<uint32_t*>(alpha);
    489         uint32_t qval = quadplicate_byte(maxValue);
    490         do {
    491             *qptr++ += qval;
    492         } while (--bigCount > 0);
    493 
    494         middleCount &= 3;
    495         alpha = reinterpret_cast<uint8_t*> (qptr);
    496         // fall through to the following while-loop
    497     }
    498 
    499     while (--middleCount >= 0) {
    500         alpha[0] = SkToU8(alpha[0] + maxValue);
    501         alpha += 1;
    502     }
    503 
    504     // potentially this can be off the end of our "legal" alpha values, but that
    505     // only happens if stopAlpha is also 0. Rather than test for stopAlpha != 0
    506     // every time (slow), we just do it, and ensure that we've allocated extra space
    507     // (see the + 1 comment in fStorage[]
    508     *alpha = SkToU8(*alpha + stopAlpha);
    509 }
    510 
    511 void MaskSuperBlitter::blitH(int x, int y, int width) {
    512     int iy = (y >> SHIFT);
    513 
    514     SkASSERT(iy >= fMask.fBounds.fTop && iy < fMask.fBounds.fBottom);
    515     iy -= fMask.fBounds.fTop;   // make it relative to 0
    516 
    517     // This should never happen, but it does.  Until the true cause is
    518     // discovered, let's skip this span instead of crashing.
    519     // See http://crbug.com/17569.
    520     if (iy < 0) {
    521         return;
    522     }
    523 
    524 #ifdef SK_DEBUG
    525     {
    526         int ix = x >> SHIFT;
    527         SkASSERT(ix >= fMask.fBounds.fLeft && ix < fMask.fBounds.fRight);
    528     }
    529 #endif
    530 
    531     x -= (fMask.fBounds.fLeft << SHIFT);
    532 
    533     // hack, until I figure out why my cubics (I think) go beyond the bounds
    534     if (x < 0) {
    535         width += x;
    536         x = 0;
    537     }
    538 
    539     uint8_t* row = fMask.fImage + iy * fMask.fRowBytes + (x >> SHIFT);
    540 
    541     int start = x;
    542     int stop = x + width;
    543 
    544     SkASSERT(start >= 0 && stop > start);
    545     int fb = start & MASK;
    546     int fe = stop & MASK;
    547     int n = (stop >> SHIFT) - (start >> SHIFT) - 1;
    548 
    549 
    550     if (n < 0) {
    551         SkASSERT(row >= fMask.fImage);
    552         SkASSERT(row < fMask.fImage + kMAX_STORAGE + 1);
    553         add_aa_span(row, coverage_to_partial_alpha(fe - fb));
    554     } else {
    555 #ifdef SK_SUPPORT_NEW_AA
    556         if (0 == fb) {
    557             n += 1;
    558         } else {
    559             fb = SCALE - fb;
    560         }
    561 #else
    562         fb = SCALE - fb;
    563 #endif
    564         SkASSERT(row >= fMask.fImage);
    565         SkASSERT(row + n + 1 < fMask.fImage + kMAX_STORAGE + 1);
    566         add_aa_span(row,  coverage_to_partial_alpha(fb),
    567                     n, coverage_to_partial_alpha(fe),
    568                     (1 << (8 - SHIFT)) - (((y & MASK) + 1) >> SHIFT));
    569     }
    570 
    571 #ifdef SK_DEBUG
    572     fCurrX = x + width;
    573 #endif
    574 }
    575 
    576 ///////////////////////////////////////////////////////////////////////////////
    577 
    578 static bool fitsInsideLimit(const SkRect& r, SkScalar max) {
    579     const SkScalar min = -max;
    580     return  r.fLeft > min && r.fTop > min &&
    581             r.fRight < max && r.fBottom < max;
    582 }
    583 
    584 static int overflows_short_shift(int value, int shift) {
    585     const int s = 16 + shift;
    586     return (value << s >> s) - value;
    587 }
    588 
    589 /**
    590   Would any of the coordinates of this rectangle not fit in a short,
    591   when left-shifted by shift?
    592 */
    593 static int rect_overflows_short_shift(SkIRect rect, int shift) {
    594     SkASSERT(!overflows_short_shift(8191, SHIFT));
    595     SkASSERT(overflows_short_shift(8192, SHIFT));
    596     SkASSERT(!overflows_short_shift(32767, 0));
    597     SkASSERT(overflows_short_shift(32768, 0));
    598 
    599     // Since we expect these to succeed, we bit-or together
    600     // for a tiny extra bit of speed.
    601     return overflows_short_shift(rect.fLeft, SHIFT) |
    602            overflows_short_shift(rect.fRight, SHIFT) |
    603            overflows_short_shift(rect.fTop, SHIFT) |
    604            overflows_short_shift(rect.fBottom, SHIFT);
    605 }
    606 
    607 static bool safeRoundOut(const SkRect& src, SkIRect* dst, int32_t maxInt) {
    608 #ifdef SK_SCALAR_IS_FIXED
    609     // the max-int (shifted) is exactly what we want to compare against, to know
    610     // if we can survive shifting our fixed-point coordinates
    611     const SkFixed maxScalar = maxInt;
    612 #else
    613     const SkScalar maxScalar = SkIntToScalar(maxInt);
    614 #endif
    615     if (fitsInsideLimit(src, maxScalar)) {
    616         src.roundOut(dst);
    617         return true;
    618     }
    619     return false;
    620 }
    621 
    622 void SkScan::AntiFillPath(const SkPath& path, const SkRegion& origClip,
    623                           SkBlitter* blitter, bool forceRLE) {
    624     if (origClip.isEmpty()) {
    625         return;
    626     }
    627 
    628     SkIRect ir;
    629 
    630     if (!safeRoundOut(path.getBounds(), &ir, SK_MaxS32 >> SHIFT)) {
    631 #if 0
    632         const SkRect& r = path.getBounds();
    633         SkDebugf("--- bounds can't fit in SkIRect\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
    634 #endif
    635         return;
    636     }
    637     if (ir.isEmpty()) {
    638         if (path.isInverseFillType()) {
    639             blitter->blitRegion(origClip);
    640         }
    641         return;
    642     }
    643 
    644     // If the intersection of the path bounds and the clip bounds
    645     // will overflow 32767 when << by SHIFT, we can't supersample,
    646     // so draw without antialiasing.
    647     SkIRect clippedIR;
    648     if (path.isInverseFillType()) {
    649        // If the path is an inverse fill, it's going to fill the entire
    650        // clip, and we care whether the entire clip exceeds our limits.
    651        clippedIR = origClip.getBounds();
    652     } else {
    653        if (!clippedIR.intersect(ir, origClip.getBounds())) {
    654            return;
    655        }
    656     }
    657     if (rect_overflows_short_shift(clippedIR, SHIFT)) {
    658         SkScan::FillPath(path, origClip, blitter);
    659         return;
    660     }
    661 
    662     // Our antialiasing can't handle a clip larger than 32767, so we restrict
    663     // the clip to that limit here. (the runs[] uses int16_t for its index).
    664     //
    665     // A more general solution (one that could also eliminate the need to
    666     // disable aa based on ir bounds (see overflows_short_shift) would be
    667     // to tile the clip/target...
    668     SkRegion tmpClipStorage;
    669     const SkRegion* clipRgn = &origClip;
    670     {
    671         static const int32_t kMaxClipCoord = 32767;
    672         const SkIRect& bounds = origClip.getBounds();
    673         if (bounds.fRight > kMaxClipCoord || bounds.fBottom > kMaxClipCoord) {
    674             SkIRect limit = { 0, 0, kMaxClipCoord, kMaxClipCoord };
    675             tmpClipStorage.op(origClip, limit, SkRegion::kIntersect_Op);
    676             clipRgn = &tmpClipStorage;
    677         }
    678     }
    679     // for here down, use clipRgn, not origClip
    680 
    681     SkScanClipper   clipper(blitter, clipRgn, ir);
    682     const SkIRect*  clipRect = clipper.getClipRect();
    683 
    684     if (clipper.getBlitter() == NULL) { // clipped out
    685         if (path.isInverseFillType()) {
    686             blitter->blitRegion(*clipRgn);
    687         }
    688         return;
    689     }
    690 
    691     // now use the (possibly wrapped) blitter
    692     blitter = clipper.getBlitter();
    693 
    694     if (path.isInverseFillType()) {
    695         sk_blit_above(blitter, ir, *clipRgn);
    696     }
    697 
    698     SkIRect superRect, *superClipRect = NULL;
    699 
    700     if (clipRect) {
    701         superRect.set(  clipRect->fLeft << SHIFT, clipRect->fTop << SHIFT,
    702                         clipRect->fRight << SHIFT, clipRect->fBottom << SHIFT);
    703         superClipRect = &superRect;
    704     }
    705 
    706     SkASSERT(SkIntToScalar(ir.fTop) <= path.getBounds().fTop);
    707 
    708     // MaskSuperBlitter can't handle drawing outside of ir, so we can't use it
    709     // if we're an inverse filltype
    710     if (!path.isInverseFillType() && MaskSuperBlitter::CanHandleRect(ir) && !forceRLE) {
    711         MaskSuperBlitter    superBlit(blitter, ir, *clipRgn);
    712         SkASSERT(SkIntToScalar(ir.fTop) <= path.getBounds().fTop);
    713         sk_fill_path(path, superClipRect, &superBlit, ir.fTop, ir.fBottom, SHIFT, *clipRgn);
    714     } else {
    715         SuperBlitter    superBlit(blitter, ir, *clipRgn);
    716         sk_fill_path(path, superClipRect, &superBlit, ir.fTop, ir.fBottom, SHIFT, *clipRgn);
    717     }
    718 
    719     if (path.isInverseFillType()) {
    720         sk_blit_below(blitter, ir, *clipRgn);
    721     }
    722 }
    723 
    724 ///////////////////////////////////////////////////////////////////////////////
    725 
    726 #include "SkRasterClip.h"
    727 
    728 void SkScan::FillPath(const SkPath& path, const SkRasterClip& clip,
    729                           SkBlitter* blitter) {
    730     if (clip.isEmpty()) {
    731         return;
    732     }
    733 
    734     if (clip.isBW()) {
    735         FillPath(path, clip.bwRgn(), blitter);
    736     } else {
    737         SkRegion        tmp;
    738         SkAAClipBlitter aaBlitter;
    739 
    740         tmp.setRect(clip.getBounds());
    741         aaBlitter.init(blitter, &clip.aaRgn());
    742         SkScan::FillPath(path, tmp, &aaBlitter);
    743     }
    744 }
    745 
    746 void SkScan::AntiFillPath(const SkPath& path, const SkRasterClip& clip,
    747                           SkBlitter* blitter) {
    748     if (clip.isEmpty()) {
    749         return;
    750     }
    751 
    752     if (clip.isBW()) {
    753         AntiFillPath(path, clip.bwRgn(), blitter);
    754     } else {
    755         SkRegion        tmp;
    756         SkAAClipBlitter aaBlitter;
    757 
    758         tmp.setRect(clip.getBounds());
    759         aaBlitter.init(blitter, &clip.aaRgn());
    760         SkScan::AntiFillPath(path, tmp, &aaBlitter, true);
    761     }
    762 }
    763 
    764