xref: /third_party/skia/src/core/SkScan.cpp (revision cb93a386)
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
13std::atomic<bool> gSkUseAnalyticAA{true};
14std::atomic<bool> gSkForceAnalyticAA{false};
15
16static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
17    blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
18}
19
20void 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
50void 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
58void 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
68void 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
83void 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
98void 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