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