blob: 307993f31092164be91e8fb41e92399ce09aaa06 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00008
9#include "SkScan.h"
10#include "SkBlitter.h"
reed@google.comda965632011-10-13 15:29:01 +000011#include "SkRasterClip.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012
Yuqian Li522101f2017-08-04 14:33:17 -040013std::atomic<bool> gSkUseAnalyticAA{true};
Yuqian Li550148b2017-01-13 10:13:13 -050014std::atomic<bool> gSkForceAnalyticAA{false};
15
Yuqian Li49fd5d52017-08-03 13:03:03 -040016#if defined(SK_SUPPORT_LEGACY_DELTA_AA) || (defined(_MSC_VER) && !defined(__clang__))
Yuqian Li2f145bf2017-07-27 14:15:09 -040017 std::atomic<bool> gSkUseDeltaAA{false};
18#else
19 std::atomic<bool> gSkUseDeltaAA{true};
20#endif
Yuqian Lidf60e362017-07-25 11:26:31 -040021
22std::atomic<bool> gSkForceDeltaAA{false};
23
reed@android.com8a1c16f2008-12-17 15:59:43 +000024static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
25 blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
26}
27
28void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip,
29 SkBlitter* blitter) {
30 if (!r.isEmpty()) {
31 if (clip) {
32 if (clip->isRect()) {
33 const SkIRect& clipBounds = clip->getBounds();
rmistry@google.comfbfcd562012-08-23 18:09:54 +000034
reed@android.com8a1c16f2008-12-17 15:59:43 +000035 if (clipBounds.contains(r)) {
36 blitrect(blitter, r);
37 } else {
38 SkIRect rr = r;
39 if (rr.intersect(clipBounds)) {
40 blitrect(blitter, rr);
41 }
42 }
43 } else {
44 SkRegion::Cliperator cliper(*clip, r);
45 const SkIRect& rr = cliper.rect();
rmistry@google.comfbfcd562012-08-23 18:09:54 +000046
reed@android.com8a1c16f2008-12-17 15:59:43 +000047 while (!cliper.done()) {
48 blitrect(blitter, rr);
49 cliper.next();
50 }
51 }
52 } else {
53 blitrect(blitter, r);
54 }
55 }
56}
57
58void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip,
59 SkBlitter* blitter) {
60 SkIRect r;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000061
reed@android.com8a1c16f2008-12-17 15:59:43 +000062 XRect_round(xr, &r);
63 SkScan::FillIRect(r, clip, blitter);
64}
65
reed@android.com8a1c16f2008-12-17 15:59:43 +000066void SkScan::FillRect(const SkRect& r, const SkRegion* clip,
67 SkBlitter* blitter) {
68 SkIRect ir;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000069
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 r.round(&ir);
71 SkScan::FillIRect(ir, clip, blitter);
72}
73
reed@google.comda965632011-10-13 15:29:01 +000074///////////////////////////////////////////////////////////////////////////////
75
76void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip,
77 SkBlitter* blitter) {
78 if (clip.isEmpty() || r.isEmpty()) {
79 return;
80 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000081
reed@google.comda965632011-10-13 15:29:01 +000082 if (clip.isBW()) {
83 FillIRect(r, &clip.bwRgn(), blitter);
84 return;
85 }
86
reed@google.com045e62d2011-10-24 12:19:46 +000087 SkAAClipBlitterWrapper wrapper(clip, blitter);
88 FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter());
reed@google.comda965632011-10-13 15:29:01 +000089}
90
reed@google.com045e62d2011-10-24 12:19:46 +000091void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip,
92 SkBlitter* blitter) {
93 if (clip.isEmpty() || xr.isEmpty()) {
94 return;
95 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000096
reed@google.com045e62d2011-10-24 12:19:46 +000097 if (clip.isBW()) {
98 FillXRect(xr, &clip.bwRgn(), blitter);
99 return;
100 }
101
102 SkAAClipBlitterWrapper wrapper(clip, blitter);
103 FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
104}
105
reed@google.com045e62d2011-10-24 12:19:46 +0000106void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip,
107 SkBlitter* blitter) {
108 if (clip.isEmpty() || r.isEmpty()) {
109 return;
110 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000111
reed@google.com045e62d2011-10-24 12:19:46 +0000112 if (clip.isBW()) {
113 FillRect(r, &clip.bwRgn(), blitter);
114 return;
115 }
116
117 SkAAClipBlitterWrapper wrapper(clip, blitter);
118 FillRect(r, &wrapper.getRgn(), wrapper.getBlitter());
119}