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
56 #ifdef SK_SCALAR_IS_FLOAT
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 #endif
67
68 ///////////////////////////////////////////////////////////////////////////////
69
FillIRect(const SkIRect & r,const SkRasterClip & clip,SkBlitter * blitter)70 void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip,
71 SkBlitter* blitter) {
72 if (clip.isEmpty() || r.isEmpty()) {
73 return;
74 }
75
76 if (clip.isBW()) {
77 FillIRect(r, &clip.bwRgn(), blitter);
78 return;
79 }
80
81 SkAAClipBlitterWrapper wrapper(clip, blitter);
82 FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter());
83 }
84
FillXRect(const SkXRect & xr,const SkRasterClip & clip,SkBlitter * blitter)85 void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip,
86 SkBlitter* blitter) {
87 if (clip.isEmpty() || xr.isEmpty()) {
88 return;
89 }
90
91 if (clip.isBW()) {
92 FillXRect(xr, &clip.bwRgn(), blitter);
93 return;
94 }
95
96 SkAAClipBlitterWrapper wrapper(clip, blitter);
97 FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
98 }
99
100 #ifdef SK_SCALAR_IS_FLOAT
101
FillRect(const SkRect & r,const SkRasterClip & clip,SkBlitter * blitter)102 void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip,
103 SkBlitter* blitter) {
104 if (clip.isEmpty() || r.isEmpty()) {
105 return;
106 }
107
108 if (clip.isBW()) {
109 FillRect(r, &clip.bwRgn(), blitter);
110 return;
111 }
112
113 SkAAClipBlitterWrapper wrapper(clip, blitter);
114 FillRect(r, &wrapper.getRgn(), wrapper.getBlitter());
115 }
116
117 #endif
118
119