1 /* 2 * Copyright 2010 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkRasterClip_DEFINED 9 #define SkRasterClip_DEFINED 10 11 #include "SkRegion.h" 12 #include "SkAAClip.h" 13 14 class SkRasterClip { 15 public: 16 SkRasterClip(); 17 SkRasterClip(const SkIRect&); 18 SkRasterClip(const SkRasterClip&); 19 ~SkRasterClip(); 20 isBW()21 bool isBW() const { return fIsBW; } isAA()22 bool isAA() const { return !fIsBW; } bwRgn()23 const SkRegion& bwRgn() const { SkASSERT(fIsBW); return fBW; } aaRgn()24 const SkAAClip& aaRgn() const { SkASSERT(!fIsBW); return fAA; } 25 26 bool isEmpty() const; 27 bool isRect() const; 28 bool isComplex() const; 29 const SkIRect& getBounds() const; 30 31 bool setEmpty(); 32 bool setRect(const SkIRect&); 33 34 bool setPath(const SkPath& path, const SkRegion& clip, bool doAA); 35 bool setPath(const SkPath& path, const SkIRect& clip, bool doAA); 36 bool setPath(const SkPath& path, const SkRasterClip&, bool doAA); 37 38 bool op(const SkIRect&, SkRegion::Op); 39 bool op(const SkRegion&, SkRegion::Op); 40 bool op(const SkRasterClip&, SkRegion::Op); 41 bool op(const SkRect&, SkRegion::Op, bool doAA); 42 43 void translate(int dx, int dy, SkRasterClip* dst) const; translate(int dx,int dy)44 void translate(int dx, int dy) { 45 this->translate(dx, dy, this); 46 } 47 48 bool quickContains(const SkIRect& rect) const; quickContains(int left,int top,int right,int bottom)49 bool quickContains(int left, int top, int right, int bottom) const { 50 return quickContains(SkIRect::MakeLTRB(left, top, right, bottom)); 51 } 52 53 /** 54 * Return true if this region is empty, or if the specified rectangle does 55 * not intersect the region. Returning false is not a guarantee that they 56 * intersect, but returning true is a guarantee that they do not. 57 */ quickReject(const SkIRect & rect)58 bool quickReject(const SkIRect& rect) const { 59 return this->isEmpty() || rect.isEmpty() || 60 !SkIRect::Intersects(this->getBounds(), rect); 61 } 62 63 // hack for SkCanvas::getTotalClip 64 const SkRegion& forceGetBW(); 65 66 #ifdef SK_DEBUG 67 void validate() const; 68 #else validate()69 void validate() const {} 70 #endif 71 72 private: 73 SkRegion fBW; 74 SkAAClip fAA; 75 bool fIsBW; 76 77 void convertToAA(); 78 }; 79 80 class SkAutoRasterClipValidate : SkNoncopyable { 81 public: SkAutoRasterClipValidate(const SkRasterClip & rc)82 SkAutoRasterClipValidate(const SkRasterClip& rc) : fRC(rc) { 83 fRC.validate(); 84 } ~SkAutoRasterClipValidate()85 ~SkAutoRasterClipValidate() { 86 fRC.validate(); 87 } 88 private: 89 const SkRasterClip& fRC; 90 }; 91 92 #ifdef SK_DEBUG 93 #define AUTO_RASTERCLIP_VALIDATE(rc) SkAutoRasterClipValidate arcv(rc) 94 #else 95 #define AUTO_RASTERCLIP_VALIDATE(rc) 96 #endif 97 98 /////////////////////////////////////////////////////////////////////////////// 99 100 /** 101 * Encapsulates the logic of deciding if we need to change/wrap the blitter 102 * for aaclipping. If so, getRgn and getBlitter return modified values. If 103 * not, they return the raw blitter and (bw) clip region. 104 * 105 * We need to keep the constructor/destructor cost as small as possible, so we 106 * can freely put this guy on the stack, and not pay too much for the case when 107 * we're really BW anyways. 108 */ 109 class SkAAClipBlitterWrapper { 110 public: 111 SkAAClipBlitterWrapper(); 112 SkAAClipBlitterWrapper(const SkRasterClip&, SkBlitter*); 113 SkAAClipBlitterWrapper(const SkAAClip*, SkBlitter*); 114 115 void init(const SkRasterClip&, SkBlitter*); 116 getBounds()117 const SkIRect& getBounds() const { 118 SkASSERT(fClipRgn); 119 return fClipRgn->getBounds(); 120 } getRgn()121 const SkRegion& getRgn() const { 122 SkASSERT(fClipRgn); 123 return *fClipRgn; 124 } getBlitter()125 SkBlitter* getBlitter() { 126 SkASSERT(fBlitter); 127 return fBlitter; 128 } 129 130 private: 131 const SkAAClip* fAAClip; 132 SkRegion fBWRgn; 133 SkAAClipBlitter fAABlitter; 134 // what we return 135 const SkRegion* fClipRgn; 136 SkBlitter* fBlitter; 137 }; 138 139 #endif 140