SkClipStack.h revision 115d931d2fbd3a109a21b28c8a9c5099e6c49c54
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
85c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com#ifndef SkClipStack_DEFINED
95c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com#define SkClipStack_DEFINED
105c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
115c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com#include "SkDeque.h"
125c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com#include "SkRegion.h"
135c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
1457788b5ada1a5d94ce3fd7606726bcb3c0f6e65absalomon@google.comstruct SkRect;
155c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.comclass SkPath;
165c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
177ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkClipStack {
185c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.compublic:
195c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    SkClipStack();
201e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkClipStack(const SkClipStack& b);
21610f716b00f214e4899a102c1bbc1d6a323e114evandebo@chromium.org    ~SkClipStack();
225c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
231e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkClipStack& operator=(const SkClipStack& b);
241e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    bool operator==(const SkClipStack& b) const;
251e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    bool operator!=(const SkClipStack& b) const { return !(*this == b); }
261e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
275c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    void reset();
285c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
295c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    int getSaveCount() const { return fSaveCount; }
305c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    void save();
315c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    void restore();
325c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
33115d931d2fbd3a109a21b28c8a9c5099e6c49c54reed@google.com    void clipDevRect(const SkIRect& ir, SkRegion::Op op) {
345c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        SkRect r;
355c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        r.set(ir);
360017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com        this->clipDevRect(r, op, false);
375c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    }
380017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    void clipDevRect(const SkRect&, SkRegion::Op, bool doAA);
390017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com    void clipDevPath(const SkPath&, SkRegion::Op, bool doAA);
405c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
415c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    class B2FIter {
425c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    public:
43d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        /**
44d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com         * Creates an uninitialized iterator. Must be reset()
45d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com         */
46d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        B2FIter();
47d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
485c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        B2FIter(const SkClipStack& stack);
495c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
505c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        struct Clip {
51fa1d29112d44d0728cd10e2ff1f8982240303272robertphillips@google.com            Clip() : fRect(NULL), fPath(NULL), fOp(SkRegion::kIntersect_Op),
52fa1d29112d44d0728cd10e2ff1f8982240303272robertphillips@google.com                     fDoAA(false) {}
539fbdf875183f5142b8e0ba46ab430cc46ad701bfvandebo@chromium.org            friend bool operator==(const Clip& a, const Clip& b);
548887ede82465687355c7a1c51e4553e99b2fb15avandebo@chromium.org            friend bool operator!=(const Clip& a, const Clip& b);
555c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com            const SkRect*   fRect;  // if non-null, this is a rect clip
565c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com            const SkPath*   fPath;  // if non-null, this is a path clip
575c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com            SkRegion::Op    fOp;
580017708a5bcb6d0fbff0fac565085bef65de7433reed@google.com            bool            fDoAA;
595c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        };
605c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
615c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        /**
625c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *  Return the clip for this element in the iterator. If next() returns
635c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *  NULL, then the iterator is done. The type of clip is determined by
645c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *  the pointers fRect and fPath:
655c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *
665c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *  fRect==NULL  fPath!=NULL    path clip
675c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *  fRect!=NULL  fPath==NULL    rect clip
685c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         *  fRect==NULL  fPath==NULL    empty clip
695c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com         */
705c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        const Clip* next();
715c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
72d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        /**
73d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com         * Restarts the iterator on a clip stack.
74d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com         */
75d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        void reset(const SkClipStack& stack);
76d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
775c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    private:
785c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        Clip             fClip;
795c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com        SkDeque::F2BIter fIter;
805c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    };
815c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
825c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.comprivate:
835c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    friend class B2FIter;
845c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    struct Rec;
855c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
865c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    SkDeque fDeque;
875c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com    int     fSaveCount;
885c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com};
895c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
905c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com#endif
915c3d1471e4908706cd053a5e2ea9ded3a6c2eaebreed@google.com
92