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