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