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