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