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