Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2006 The Android Open Source Project
      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 
      9 #include "SkScan.h"
     10 #include "SkBlitter.h"
     11 #include "SkRasterClip.h"
     12 
     13 std::atomic<bool> gSkUseAnalyticAA{true};
     14 std::atomic<bool> gSkForceAnalyticAA{false};
     15 
     16 #if defined(SK_SUPPORT_LEGACY_DELTA_AA)
     17     std::atomic<bool> gSkUseDeltaAA{false};
     18 #else
     19     std::atomic<bool> gSkUseDeltaAA{true};
     20 #endif
     21 
     22 std::atomic<bool> gSkForceDeltaAA{false};
     23 
     24 static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
     25     blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
     26 }
     27 
     28 void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip,
     29                        SkBlitter* blitter) {
     30     if (!r.isEmpty()) {
     31         if (clip) {
     32             if (clip->isRect()) {
     33                 const SkIRect& clipBounds = clip->getBounds();
     34 
     35                 if (clipBounds.contains(r)) {
     36                     blitrect(blitter, r);
     37                 } else {
     38                     SkIRect rr = r;
     39                     if (rr.intersect(clipBounds)) {
     40                         blitrect(blitter, rr);
     41                     }
     42                 }
     43             } else {
     44                 SkRegion::Cliperator    cliper(*clip, r);
     45                 const SkIRect&          rr = cliper.rect();
     46 
     47                 while (!cliper.done()) {
     48                     blitrect(blitter, rr);
     49                     cliper.next();
     50                 }
     51             }
     52         } else {
     53             blitrect(blitter, r);
     54         }
     55     }
     56 }
     57 
     58 void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip,
     59                        SkBlitter* blitter) {
     60     SkIRect r;
     61 
     62     XRect_round(xr, &r);
     63     SkScan::FillIRect(r, clip, blitter);
     64 }
     65 
     66 void SkScan::FillRect(const SkRect& r, const SkRegion* clip,
     67                        SkBlitter* blitter) {
     68     SkIRect ir;
     69 
     70     r.round(&ir);
     71     SkScan::FillIRect(ir, clip, blitter);
     72 }
     73 
     74 ///////////////////////////////////////////////////////////////////////////////
     75 
     76 void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip,
     77                        SkBlitter* blitter) {
     78     if (clip.isEmpty() || r.isEmpty()) {
     79         return;
     80     }
     81 
     82     if (clip.isBW()) {
     83         FillIRect(r, &clip.bwRgn(), blitter);
     84         return;
     85     }
     86 
     87     SkAAClipBlitterWrapper wrapper(clip, blitter);
     88     FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter());
     89 }
     90 
     91 void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip,
     92                        SkBlitter* blitter) {
     93     if (clip.isEmpty() || xr.isEmpty()) {
     94         return;
     95     }
     96 
     97     if (clip.isBW()) {
     98         FillXRect(xr, &clip.bwRgn(), blitter);
     99         return;
    100     }
    101 
    102     SkAAClipBlitterWrapper wrapper(clip, blitter);
    103     FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
    104 }
    105 
    106 void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip,
    107                       SkBlitter* blitter) {
    108     if (clip.isEmpty() || r.isEmpty()) {
    109         return;
    110     }
    111 
    112     if (clip.isBW()) {
    113         FillRect(r, &clip.bwRgn(), blitter);
    114         return;
    115     }
    116 
    117     SkAAClipBlitterWrapper wrapper(clip, blitter);
    118     FillRect(r, &wrapper.getRgn(), wrapper.getBlitter());
    119 }
    120