SkRasterClip.cpp revision 202ab2a5cabaf25a1e6ec47c0003da3213a79864
1d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com/*
2d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com * Copyright 2010 Google Inc.
3d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com *
4d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com * Use of this source code is governed by a BSD-style license that can be
5d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com * found in the LICENSE file.
6d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com */
7d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
8d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com#include "SkRasterClip.h"
9d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
10d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
11d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.comSkRasterClip::SkRasterClip() {
12d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fIsBW = true;
13a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsEmpty = true;
14a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsRect = false;
15a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkDEBUGCODE(this->validate();)
16d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
17d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
1834f7e47a3593911d03307a08e5af625b218ceec3reed@google.comSkRasterClip::SkRasterClip(const SkRasterClip& src) {
19045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(src);
20fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
2134f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    fIsBW = src.fIsBW;
2234f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (fIsBW) {
2334f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        fBW = src.fBW;
2434f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    } else {
2534f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        fAA = src.fAA;
2634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
27a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com
28a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsEmpty = src.isEmpty();
29a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsRect = src.isRect();
30a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkDEBUGCODE(this->validate();)
3134f7e47a3593911d03307a08e5af625b218ceec3reed@google.com}
3234f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
33ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.comSkRasterClip::SkRasterClip(const SkIRect& bounds) : fBW(bounds) {
34ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    fIsBW = true;
35a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsEmpty = this->computeIsEmpty();  // bounds might be empty, so compute
36a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsRect = !fIsEmpty;
37a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkDEBUGCODE(this->validate();)
38ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com}
39ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com
40045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkRasterClip::~SkRasterClip() {
41a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkDEBUGCODE(this->validate();)
42d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
43d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
44d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::isComplex() const {
45d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    return fIsBW ? fBW.isComplex() : !fAA.isEmpty();
46d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
47d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
48d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.comconst SkIRect& SkRasterClip::getBounds() const {
49d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    return fIsBW ? fBW.getBounds() : fAA.getBounds();
50d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
51d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
52d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::setEmpty() {
53045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
54045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
55d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fIsBW = true;
56d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fBW.setEmpty();
57d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fAA.setEmpty();
58a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsEmpty = true;
59a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsRect = false;
60d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    return false;
61d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
62d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
63ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.combool SkRasterClip::setRect(const SkIRect& rect) {
64045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
65fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
66d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fIsBW = true;
67d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fAA.setEmpty();
68a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsRect = fBW.setRect(rect);
69a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsEmpty = !fIsRect;
70a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return fIsRect;
71d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
72d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
73d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::setPath(const SkPath& path, const SkRegion& clip, bool doAA) {
74045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
75045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
76d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    if (this->isBW() && !doAA) {
77a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.setPath(path, clip);
78d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    } else {
79897fc41934e6aecec62f89d093c93b917cfa5345reed@google.com        // TODO: since we are going to over-write fAA completely (aren't we?)
80897fc41934e6aecec62f89d093c93b917cfa5345reed@google.com        // we should just clear our BW data (if any) and set fIsAA=true
81d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        if (this->isBW()) {
82d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            this->convertToAA();
83d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        }
84a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.setPath(path, &clip, doAA);
85d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    }
86a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
87d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
88d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
89d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::setPath(const SkPath& path, const SkIRect& clip, bool doAA) {
90d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    SkRegion tmp;
91d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    tmp.setRect(clip);
92d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    return this->setPath(path, tmp, doAA);
93d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
94d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
95d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::op(const SkIRect& rect, SkRegion::Op op) {
96045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
97fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
98a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsBW ? fBW.op(rect, op) : fAA.op(rect, op);
99a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
100d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
101d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
102ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.combool SkRasterClip::op(const SkRegion& rgn, SkRegion::Op op) {
103045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
104fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
105ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    if (fIsBW) {
106a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.op(rgn, op);
107ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    } else {
108ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com        SkAAClip tmp;
109ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com        tmp.setRegion(rgn);
110a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.op(tmp, op);
111ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    }
112a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
113ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com}
114ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com
115d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::op(const SkRasterClip& clip, SkRegion::Op op) {
116045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
117045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    clip.validate();
118045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
119d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    if (this->isBW() && clip.isBW()) {
120a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.op(clip.fBW, op);
121d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    } else {
122d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        SkAAClip tmp;
123d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        const SkAAClip* other;
124d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
125d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        if (this->isBW()) {
126d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            this->convertToAA();
127d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        }
128d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        if (clip.isBW()) {
129d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            tmp.setRegion(clip.bwRgn());
130d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            other = &tmp;
131d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        } else {
132d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            other = &clip.aaRgn();
133d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        }
134a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.op(*other, op);
135d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    }
136a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
137d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
138d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
13918c464b460d062142ab7198724431a4d2ad7070dreed@google.com/**
14018c464b460d062142ab7198724431a4d2ad7070dreed@google.com *  Our antialiasing currently has a granularity of 1/4 of a pixel along each
14118c464b460d062142ab7198724431a4d2ad7070dreed@google.com *  axis. Thus we can treat an axis coordinate as an integer if it differs
14218c464b460d062142ab7198724431a4d2ad7070dreed@google.com *  from its nearest int by < half of that value (1.8 in this case).
14318c464b460d062142ab7198724431a4d2ad7070dreed@google.com */
14418c464b460d062142ab7198724431a4d2ad7070dreed@google.comstatic bool nearly_integral(SkScalar x) {
14518c464b460d062142ab7198724431a4d2ad7070dreed@google.com    static const SkScalar domain = SK_Scalar1 / 4;
14618c464b460d062142ab7198724431a4d2ad7070dreed@google.com    static const SkScalar halfDomain = domain / 2;
14718c464b460d062142ab7198724431a4d2ad7070dreed@google.com
14818c464b460d062142ab7198724431a4d2ad7070dreed@google.com    x += halfDomain;
14918c464b460d062142ab7198724431a4d2ad7070dreed@google.com    return x - SkScalarFloorToScalar(x) < domain;
1500017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com}
1510017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com
1520017708a5bcb6d0fbff0fac565085bef65de7433reed@google.combool SkRasterClip::op(const SkRect& r, SkRegion::Op op, bool doAA) {
153045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
154fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
155420f74fa720272b1164eae55d7b6c10e07d41601reed@google.com    if (fIsBW && doAA) {
15618c464b460d062142ab7198724431a4d2ad7070dreed@google.com        // check that the rect really needs aa, or is it close enought to
15718c464b460d062142ab7198724431a4d2ad7070dreed@google.com        // integer boundaries that we can just treat it as a BW rect?
15818c464b460d062142ab7198724431a4d2ad7070dreed@google.com        if (nearly_integral(r.fLeft) && nearly_integral(r.fTop) &&
15918c464b460d062142ab7198724431a4d2ad7070dreed@google.com            nearly_integral(r.fRight) && nearly_integral(r.fBottom)) {
1600017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com            doAA = false;
1610017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        }
1620017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    }
1630017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com
1640017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    if (fIsBW && !doAA) {
1650017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        SkIRect ir;
1660017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        r.round(&ir);
167a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.op(ir, op);
1680017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    } else {
1690017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        if (fIsBW) {
1700017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com            this->convertToAA();
1710017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        }
172a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.op(r, op, doAA);
1730017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    }
174a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
1750017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com}
1760017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com
17734f7e47a3593911d03307a08e5af625b218ceec3reed@google.comvoid SkRasterClip::translate(int dx, int dy, SkRasterClip* dst) const {
17834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (NULL == dst) {
17934f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        return;
18034f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
18134f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
182045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
183fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
18434f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (this->isEmpty()) {
18534f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        dst->setEmpty();
18634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        return;
18734f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
18834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (0 == (dx | dy)) {
18934f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        *dst = *this;
19034f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        return;
19134f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
19234f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
19334f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    dst->fIsBW = fIsBW;
19434f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (fIsBW) {
19534f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        fBW.translate(dx, dy, &dst->fBW);
19634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        dst->fAA.setEmpty();
19734f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    } else {
19834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        fAA.translate(dx, dy, &dst->fAA);
19934f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        dst->fBW.setEmpty();
20034f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
201a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    dst->updateCacheAndReturnNonEmpty();
20234f7e47a3593911d03307a08e5af625b218ceec3reed@google.com}
20334f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
204045e62d715f5ee9b03deb5af3c750f8318096179reed@google.combool SkRasterClip::quickContains(const SkIRect& ir) const {
205045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    return fIsBW ? fBW.quickContains(ir) : fAA.quickContains(ir);
206045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
207045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
20834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com///////////////////////////////////////////////////////////////////////////////
20934f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
210ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.comconst SkRegion& SkRasterClip::forceGetBW() {
211045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
212fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
213ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    if (!fIsBW) {
214ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com        fBW.setRect(fAA.getBounds());
215ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    }
216ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    return fBW;
217ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com}
218ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com
219d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.comvoid SkRasterClip::convertToAA() {
220045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
221fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
222d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    SkASSERT(fIsBW);
223d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fAA.setRegion(fBW);
224d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fIsBW = false;
225202ab2a5cabaf25a1e6ec47c0003da3213a79864reed
226202ab2a5cabaf25a1e6ec47c0003da3213a79864reed    // since we are being explicitly asked to convert-to-aa, we pass false so we don't "optimize"
227202ab2a5cabaf25a1e6ec47c0003da3213a79864reed    // ourselves back to BW.
228202ab2a5cabaf25a1e6ec47c0003da3213a79864reed    (void)this->updateCacheAndReturnNonEmpty(false);
229d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
230d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
231045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#ifdef SK_DEBUG
232045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkRasterClip::validate() const {
233045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    // can't ever assert that fBW is empty, since we may have called forceGetBW
234045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    if (fIsBW) {
235045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        SkASSERT(fAA.isEmpty());
236045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    }
237045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
238045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fBW.validate();
239045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fAA.validate();
240a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com
241a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkASSERT(this->computeIsEmpty() == fIsEmpty);
242a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkASSERT(this->computeIsRect() == fIsRect);
243045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
244045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#endif
245045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
246045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com///////////////////////////////////////////////////////////////////////////////
247045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
248045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkAAClipBlitterWrapper::SkAAClipBlitterWrapper() {
249045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkDEBUGCODE(fClipRgn = NULL;)
250045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkDEBUGCODE(fBlitter = NULL;)
251045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
252045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
253045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkRasterClip& clip,
254045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                                               SkBlitter* blitter) {
255045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    this->init(clip, blitter);
256045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
257045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
258045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkAAClip* aaclip,
259045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                                               SkBlitter* blitter) {
260045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkASSERT(blitter);
261045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkASSERT(aaclip);
262045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fBWRgn.setRect(aaclip->getBounds());
263045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fAABlitter.init(blitter, aaclip);
264045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    // now our return values
265045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fClipRgn = &fBWRgn;
266045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fBlitter = &fAABlitter;
267045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
268045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
269045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkAAClipBlitterWrapper::init(const SkRasterClip& clip, SkBlitter* blitter) {
270045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkASSERT(blitter);
271045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    if (clip.isBW()) {
272045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fClipRgn = &clip.bwRgn();
273045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fBlitter = blitter;
274045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    } else {
275045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        const SkAAClip& aaclip = clip.aaRgn();
276045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fBWRgn.setRect(aaclip.getBounds());
277045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fAABlitter.init(blitter, &aaclip);
278045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        // now our return values
279045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fClipRgn = &fBWRgn;
280045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fBlitter = &fAABlitter;
281045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    }
282045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
283