11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc. 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef SkRasterClip_DEFINED 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SkRasterClip_DEFINED 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRegion.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkAAClip.h" 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkRasterClip { 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRasterClip(); 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRasterClip(const SkIRect&); 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRasterClip(const SkRasterClip&); 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ~SkRasterClip(); 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool isBW() const { return fIsBW; } 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool isAA() const { return !fIsBW; } 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRegion& bwRgn() const { SkASSERT(fIsBW); return fBW; } 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkAAClip& aaRgn() const { SkASSERT(!fIsBW); return fAA; } 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool isEmpty() const; 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool isRect() const; 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool isComplex() const; 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkIRect& getBounds() const; 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool setEmpty(); 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool setRect(const SkIRect&); 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool setPath(const SkPath& path, const SkRegion& clip, bool doAA); 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool setPath(const SkPath& path, const SkIRect& clip, bool doAA); 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool setPath(const SkPath& path, const SkRasterClip&, bool doAA); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool op(const SkIRect&, SkRegion::Op); 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool op(const SkRegion&, SkRegion::Op); 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool op(const SkRasterClip&, SkRegion::Op); 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool op(const SkRect&, SkRegion::Op, bool doAA); 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void translate(int dx, int dy, SkRasterClip* dst) const; 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void translate(int dx, int dy) { 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->translate(dx, dy, this); 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool quickContains(const SkIRect& rect) const; 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool quickContains(int left, int top, int right, int bottom) const { 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return quickContains(SkIRect::MakeLTRB(left, top, right, bottom)); 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Return true if this region is empty, or if the specified rectangle does 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * not intersect the region. Returning false is not a guarantee that they 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * intersect, but returning true is a guarantee that they do not. 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool quickReject(const SkIRect& rect) const { 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return this->isEmpty() || rect.isEmpty() || 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger !SkIRect::Intersects(this->getBounds(), rect); 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // hack for SkCanvas::getTotalClip 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRegion& forceGetBW(); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_DEBUG 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void validate() const; 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void validate() const {} 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRegion fBW; 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAAClip fAA; 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fIsBW; 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void convertToAA(); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkAutoRasterClipValidate : SkNoncopyable { 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAutoRasterClipValidate(const SkRasterClip& rc) : fRC(rc) { 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fRC.validate(); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ~SkAutoRasterClipValidate() { 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fRC.validate(); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRasterClip& fRC; 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_DEBUG 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger #define AUTO_RASTERCLIP_VALIDATE(rc) SkAutoRasterClipValidate arcv(rc) 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger #define AUTO_RASTERCLIP_VALIDATE(rc) 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Encapsulates the logic of deciding if we need to change/wrap the blitter 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * for aaclipping. If so, getRgn and getBlitter return modified values. If 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * not, they return the raw blitter and (bw) clip region. 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * We need to keep the constructor/destructor cost as small as possible, so we 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * can freely put this guy on the stack, and not pay too much for the case when 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * we're really BW anyways. 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkAAClipBlitterWrapper { 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAAClipBlitterWrapper(); 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAAClipBlitterWrapper(const SkRasterClip&, SkBlitter*); 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAAClipBlitterWrapper(const SkAAClip*, SkBlitter*); 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void init(const SkRasterClip&, SkBlitter*); 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkIRect& getBounds() const { 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkASSERT(fClipRgn); 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return fClipRgn->getBounds(); 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRegion& getRgn() const { 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkASSERT(fClipRgn); 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return *fClipRgn; 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlitter* getBlitter() { 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkASSERT(fBlitter); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return fBlitter; 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkAAClip* fAAClip; 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRegion fBWRgn; 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAAClipBlitter fAABlitter; 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // what we return 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRegion* fClipRgn; 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlitter* fBlitter; 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 140