SkRasterClip.cpp revision 420f74fa720272b1164eae55d7b6c10e07d41601
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);
20045e62d715f5ee9b03deb5af3c750f8318096179reed@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);
65045e62d715f5ee9b03deb5af3c750f8318096179reed@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::setPath(const SkPath& path, const SkRasterClip& clip,
96d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com                           bool doAA) {
97d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    if (clip.isBW()) {
98d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        return this->setPath(path, clip.bwRgn(), doAA);
99d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    } else {
100d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        SkRegion tmp;
101d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        tmp.setRect(clip.getBounds());
102d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        if (!this->setPath(path, clip, doAA)) {
103d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            return false;
104d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        }
105d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        return this->op(clip, SkRegion::kIntersect_Op);
106d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    }
107d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
108d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
109d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::op(const SkIRect& rect, SkRegion::Op op) {
110045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
111045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
112a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    fIsBW ? fBW.op(rect, op) : fAA.op(rect, op);
113a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
114d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
115d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
116ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.combool SkRasterClip::op(const SkRegion& rgn, SkRegion::Op op) {
117045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
118045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
119ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    if (fIsBW) {
120a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.op(rgn, op);
121ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    } else {
122ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com        SkAAClip tmp;
123ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com        tmp.setRegion(rgn);
124a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.op(tmp, op);
125ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    }
126a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
127ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com}
128ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com
129d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.combool SkRasterClip::op(const SkRasterClip& clip, SkRegion::Op op) {
130045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
131045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    clip.validate();
132045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
133d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    if (this->isBW() && clip.isBW()) {
134a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.op(clip.fBW, op);
135d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    } else {
136d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        SkAAClip tmp;
137d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        const SkAAClip* other;
138d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
139d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        if (this->isBW()) {
140d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            this->convertToAA();
141d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        }
142d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        if (clip.isBW()) {
143d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            tmp.setRegion(clip.bwRgn());
144d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            other = &tmp;
145d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        } else {
146d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com            other = &clip.aaRgn();
147d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com        }
148a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.op(*other, op);
149d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    }
150a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
151d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
152d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
153045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com// return true if x is nearly integral (within 1/16) since that is the highest
1540017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com// precision our aa code can have.
1550017708a5bcb6d0fbff0fac565085bef65de7433reed@google.comstatic bool is_integral(SkScalar x) {
1560017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    int ix = SkScalarRoundToInt(x);
1570017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    SkScalar sx = SkIntToScalar(ix);
158045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    return SkScalarAbs(sx - x) < (SK_Scalar1 / 16);
1590017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com}
1600017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com
1610017708a5bcb6d0fbff0fac565085bef65de7433reed@google.combool SkRasterClip::op(const SkRect& r, SkRegion::Op op, bool doAA) {
162045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
163045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
164420f74fa720272b1164eae55d7b6c10e07d41601reed@google.com    if (fIsBW && doAA) {
1650017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        // check that the rect really needs aa
1660017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        if (is_integral(r.fLeft) && is_integral(r.fTop) &&
1670017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com            is_integral(r.fRight) && is_integral(r.fBottom)) {
1680017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com            doAA = false;
1690017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        }
1700017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    }
1710017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com
1720017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    if (fIsBW && !doAA) {
1730017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        SkIRect ir;
1740017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        r.round(&ir);
175a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fBW.op(ir, op);
1760017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    } else {
1770017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        if (fIsBW) {
1780017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com            this->convertToAA();
1790017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        }
180a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com        (void)fAA.op(r, op, doAA);
1810017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    }
182a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    return this->updateCacheAndReturnNonEmpty();
1830017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com}
1840017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com
18534f7e47a3593911d03307a08e5af625b218ceec3reed@google.comvoid SkRasterClip::translate(int dx, int dy, SkRasterClip* dst) const {
18634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (NULL == dst) {
18734f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        return;
18834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
18934f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
190045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
191045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
19234f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (this->isEmpty()) {
19334f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        dst->setEmpty();
19434f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        return;
19534f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
19634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (0 == (dx | dy)) {
19734f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        *dst = *this;
19834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        return;
19934f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
20034f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
20134f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    dst->fIsBW = fIsBW;
20234f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    if (fIsBW) {
20334f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        fBW.translate(dx, dy, &dst->fBW);
20434f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        dst->fAA.setEmpty();
20534f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    } else {
20634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        fAA.translate(dx, dy, &dst->fAA);
20734f7e47a3593911d03307a08e5af625b218ceec3reed@google.com        dst->fBW.setEmpty();
20834f7e47a3593911d03307a08e5af625b218ceec3reed@google.com    }
209a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    dst->updateCacheAndReturnNonEmpty();
21034f7e47a3593911d03307a08e5af625b218ceec3reed@google.com}
21134f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
212045e62d715f5ee9b03deb5af3c750f8318096179reed@google.combool SkRasterClip::quickContains(const SkIRect& ir) const {
213045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    return fIsBW ? fBW.quickContains(ir) : fAA.quickContains(ir);
214045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
215045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
21634f7e47a3593911d03307a08e5af625b218ceec3reed@google.com///////////////////////////////////////////////////////////////////////////////
21734f7e47a3593911d03307a08e5af625b218ceec3reed@google.com
218ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.comconst SkRegion& SkRasterClip::forceGetBW() {
219045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
220045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
221ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    if (!fIsBW) {
222ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com        fBW.setRect(fAA.getBounds());
223ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    }
224ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com    return fBW;
225ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com}
226ba16da97e82e7ec9b73caa752b00504206ff516dreed@google.com
227d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.comvoid SkRasterClip::convertToAA() {
228045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    AUTO_RASTERCLIP_VALIDATE(*this);
229045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
230d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    SkASSERT(fIsBW);
231d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fAA.setRegion(fBW);
232d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com    fIsBW = false;
233a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    (void)this->updateCacheAndReturnNonEmpty();
234d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com}
235d1e3c5fde3f2ed309273cb08dbba2309b13e527freed@google.com
236045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#ifdef SK_DEBUG
237045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkRasterClip::validate() const {
238045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    // can't ever assert that fBW is empty, since we may have called forceGetBW
239045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    if (fIsBW) {
240045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        SkASSERT(fAA.isEmpty());
241045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    }
242045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
243045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fBW.validate();
244045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fAA.validate();
245a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com
246a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkASSERT(this->computeIsEmpty() == fIsEmpty);
247a1c6ff4922251065c45e3323e17e985a62931fc7reed@google.com    SkASSERT(this->computeIsRect() == fIsRect);
248045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
249045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#endif
250045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
251045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com///////////////////////////////////////////////////////////////////////////////
252045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
253045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkAAClipBlitterWrapper::SkAAClipBlitterWrapper() {
254045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkDEBUGCODE(fClipRgn = NULL;)
255045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkDEBUGCODE(fBlitter = NULL;)
256045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
257045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
258045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkRasterClip& clip,
259045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                                               SkBlitter* blitter) {
260045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    this->init(clip, blitter);
261045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
262045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
263045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkAAClip* aaclip,
264045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com                                               SkBlitter* blitter) {
265045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkASSERT(blitter);
266045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkASSERT(aaclip);
267045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fBWRgn.setRect(aaclip->getBounds());
268045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fAABlitter.init(blitter, aaclip);
269045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    // now our return values
270045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fClipRgn = &fBWRgn;
271045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    fBlitter = &fAABlitter;
272045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
273045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
274045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comvoid SkAAClipBlitterWrapper::init(const SkRasterClip& clip, SkBlitter* blitter) {
275045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    SkASSERT(blitter);
276045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    if (clip.isBW()) {
277045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fClipRgn = &clip.bwRgn();
278045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fBlitter = blitter;
279045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    } else {
280045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        const SkAAClip& aaclip = clip.aaRgn();
281045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fBWRgn.setRect(aaclip.getBounds());
282045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fAABlitter.init(blitter, &aaclip);
283045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        // now our return values
284045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fClipRgn = &fBWRgn;
285045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com        fBlitter = &fAABlitter;
286045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com    }
287045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com}
288045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com
289