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