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