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