180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2010 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRasterClip.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::SkRasterClip() { 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW = true; 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsEmpty = true; 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRect = false; 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE(this->validate();) 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::SkRasterClip(const SkRasterClip& src) { 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(src); 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW = src.fIsBW; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW) { 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBW = src.fBW; 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAA = src.fAA; 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsEmpty = src.isEmpty(); 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRect = src.isRect(); 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE(this->validate();) 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::SkRasterClip(const SkIRect& bounds) : fBW(bounds) { 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW = true; 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsEmpty = this->computeIsEmpty(); // bounds might be empty, so compute 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRect = !fIsEmpty; 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE(this->validate();) 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::~SkRasterClip() { 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE(this->validate();) 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::isComplex() const { 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fIsBW ? fBW.isComplex() : !fAA.isEmpty(); 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkIRect& SkRasterClip::getBounds() const { 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fIsBW ? fBW.getBounds() : fAA.getBounds(); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setEmpty() { 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW = true; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBW.setEmpty(); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAA.setEmpty(); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsEmpty = true; 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRect = false; 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setRect(const SkIRect& rect) { 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW = true; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAA.setEmpty(); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRect = fBW.setRect(rect); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsEmpty = !fIsRect; 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fIsRect; 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setPath(const SkPath& path, const SkRegion& clip, bool doAA) { 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (this->isBW() && !doAA) { 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fBW.setPath(path, clip); 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // TODO: since we are going to over-write fAA completely (aren't we?) 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // we should just clear our BW data (if any) and set fIsAA=true 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (this->isBW()) { 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->convertToAA(); 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fAA.setPath(path, &clip, doAA); 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->updateCacheAndReturnNonEmpty(); 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setPath(const SkPath& path, const SkIRect& clip, bool doAA) { 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRegion tmp; 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru tmp.setRect(clip); 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->setPath(path, tmp, doAA); 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkIRect& rect, SkRegion::Op op) { 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW ? fBW.op(rect, op) : fAA.op(rect, op); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->updateCacheAndReturnNonEmpty(); 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkRegion& rgn, SkRegion::Op op) { 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW) { 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fBW.op(rgn, op); 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAAClip tmp; 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru tmp.setRegion(rgn); 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fAA.op(tmp, op); 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->updateCacheAndReturnNonEmpty(); 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkRasterClip& clip, SkRegion::Op op) { 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru clip.validate(); 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (this->isBW() && clip.isBW()) { 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fBW.op(clip.fBW, op); 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAAClip tmp; 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkAAClip* other; 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (this->isBW()) { 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->convertToAA(); 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (clip.isBW()) { 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru tmp.setRegion(clip.bwRgn()); 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru other = &tmp; 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru other = &clip.aaRgn(); 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fAA.op(*other, op); 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->updateCacheAndReturnNonEmpty(); 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Our antialiasing currently has a granularity of 1/4 of a pixel along each 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * axis. Thus we can treat an axis coordinate as an integer if it differs 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * from its nearest int by < half of that value (1.8 in this case). 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic bool nearly_integral(SkScalar x) { 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static const SkScalar domain = SK_Scalar1 / 4; 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static const SkScalar halfDomain = domain / 2; 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x += halfDomain; 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x - SkScalarFloorToScalar(x) < domain; 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkRect& r, SkRegion::Op op, bool doAA) { 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW && doAA) { 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // check that the rect really needs aa, or is it close enought to 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // integer boundaries that we can just treat it as a BW rect? 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (nearly_integral(r.fLeft) && nearly_integral(r.fTop) && 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru nearly_integral(r.fRight) && nearly_integral(r.fBottom)) { 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru doAA = false; 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW && !doAA) { 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIRect ir; 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru r.round(&ir); 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fBW.op(ir, op); 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW) { 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->convertToAA(); 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)fAA.op(r, op, doAA); 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->updateCacheAndReturnNonEmpty(); 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkRasterClip::translate(int dx, int dy, SkRasterClip* dst) const { 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (NULL == dst) { 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (this->isEmpty()) { 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst->setEmpty(); 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (0 == (dx | dy)) { 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *dst = *this; 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst->fIsBW = fIsBW; 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW) { 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBW.translate(dx, dy, &dst->fBW); 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst->fAA.setEmpty(); 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAA.translate(dx, dy, &dst->fAA); 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst->fBW.setEmpty(); 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst->updateCacheAndReturnNonEmpty(); 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::quickContains(const SkIRect& ir) const { 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fIsBW ? fBW.quickContains(ir) : fAA.quickContains(ir); 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkRegion& SkRasterClip::forceGetBW() { 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!fIsBW) { 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBW.setRect(fAA.getBounds()); 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fBW; 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkRasterClip::convertToAA() { 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AUTO_RASTERCLIP_VALIDATE(*this); 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(fIsBW); 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAA.setRegion(fBW); 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsBW = false; 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (void)this->updateCacheAndReturnNonEmpty(); 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkRasterClip::validate() const { 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // can't ever assert that fBW is empty, since we may have called forceGetBW 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fIsBW) { 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(fAA.isEmpty()); 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBW.validate(); 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAA.validate(); 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(this->computeIsEmpty() == fIsEmpty); 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(this->computeIsRect() == fIsRect); 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAAClipBlitterWrapper::SkAAClipBlitterWrapper() { 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE(fClipRgn = NULL;) 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGCODE(fBlitter = NULL;) 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkRasterClip& clip, 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBlitter* blitter) { 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->init(clip, blitter); 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkAAClip* aaclip, 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBlitter* blitter) { 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(blitter); 25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(aaclip); 25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBWRgn.setRect(aaclip->getBounds()); 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAABlitter.init(blitter, aaclip); 26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // now our return values 26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fClipRgn = &fBWRgn; 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBlitter = &fAABlitter; 26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkAAClipBlitterWrapper::init(const SkRasterClip& clip, SkBlitter* blitter) { 26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(blitter); 26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (clip.isBW()) { 26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fClipRgn = &clip.bwRgn(); 27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBlitter = blitter; 27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkAAClip& aaclip = clip.aaRgn(); 27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBWRgn.setRect(aaclip.getBounds()); 27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAABlitter.init(blitter, &aaclip); 27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // now our return values 27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fClipRgn = &fBWRgn; 27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBlitter = &fAABlitter; 27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 280