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
14static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
15    blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
16}
17
18void 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
48void 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
56void 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
66void 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
81void 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
96void 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