Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #ifndef SkClipStack_DEFINED
      9 #define SkClipStack_DEFINED
     10 
     11 #include "SkDeque.h"
     12 #include "SkRegion.h"
     13 
     14 struct SkRect;
     15 class SkPath;
     16 
     17 class SK_API SkClipStack {
     18 public:
     19     SkClipStack();
     20     SkClipStack(const SkClipStack& b);
     21     ~SkClipStack() {}
     22 
     23     SkClipStack& operator=(const SkClipStack& b);
     24     bool operator==(const SkClipStack& b) const;
     25     bool operator!=(const SkClipStack& b) const { return !(*this == b); }
     26 
     27     void reset();
     28 
     29     int getSaveCount() const { return fSaveCount; }
     30     void save();
     31     void restore();
     32 
     33     void clipDevRect(const SkIRect& ir,
     34                      SkRegion::Op op = SkRegion::kIntersect_Op) {
     35         SkRect r;
     36         r.set(ir);
     37         this->clipDevRect(r, op, false);
     38     }
     39     void clipDevRect(const SkRect&, SkRegion::Op, bool doAA);
     40     void clipDevPath(const SkPath&, SkRegion::Op, bool doAA);
     41 
     42     class B2FIter {
     43     public:
     44         /**
     45          * Creates an uninitialized iterator. Must be reset()
     46          */
     47         B2FIter();
     48 
     49         B2FIter(const SkClipStack& stack);
     50 
     51         struct Clip {
     52             Clip() : fRect(NULL), fPath(NULL), fOp(SkRegion::kIntersect_Op) {}
     53             friend bool operator==(const Clip& a, const Clip& b);
     54             friend bool operator!=(const Clip& a, const Clip& b);
     55             const SkRect*   fRect;  // if non-null, this is a rect clip
     56             const SkPath*   fPath;  // if non-null, this is a path clip
     57             SkRegion::Op    fOp;
     58             bool            fDoAA;
     59         };
     60 
     61         /**
     62          *  Return the clip for this element in the iterator. If next() returns
     63          *  NULL, then the iterator is done. The type of clip is determined by
     64          *  the pointers fRect and fPath:
     65          *
     66          *  fRect==NULL  fPath!=NULL    path clip
     67          *  fRect!=NULL  fPath==NULL    rect clip
     68          *  fRect==NULL  fPath==NULL    empty clip
     69          */
     70         const Clip* next();
     71 
     72         /**
     73          * Restarts the iterator on a clip stack.
     74          */
     75         void reset(const SkClipStack& stack);
     76 
     77     private:
     78         Clip             fClip;
     79         SkDeque::F2BIter fIter;
     80     };
     81 
     82 private:
     83     friend class B2FIter;
     84     struct Rec;
     85 
     86     SkDeque fDeque;
     87     int     fSaveCount;
     88 };
     89 
     90 #endif
     91 
     92