• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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