• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 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 GrReducedClip_DEFINED
9 #define GrReducedClip_DEFINED
10 
11 #include "GrWindowRectangles.h"
12 #include "SkClipStack.h"
13 #include "SkTLList.h"
14 
15 class GrContext;
16 class GrRenderTargetContext;
17 
18 /**
19  * This class takes a clip stack and produces a reduced set of elements that are equivalent to
20  * applying that full stack within a specified query rectangle.
21  */
22 class SK_API GrReducedClip {
23 public:
24     GrReducedClip(const SkClipStack&, const SkRect& queryBounds, int maxWindowRectangles = 0);
25 
26     /**
27      * If hasIBounds() is true, this is the bounding box within which the clip elements are valid.
28      * The caller must not modify any pixels outside this box. Undefined if hasIBounds() is false.
29      */
ibounds()30     const SkIRect& ibounds() const { SkASSERT(fHasIBounds); return fIBounds; }
left()31     int left() const { return this->ibounds().left(); }
top()32     int top() const { return this->ibounds().top(); }
width()33     int width() const { return this->ibounds().width(); }
height()34     int height() const { return this->ibounds().height(); }
35 
36     /**
37      * Indicates whether ibounds() are defined. They will always be defined if the elements() are
38      * nonempty.
39      */
hasIBounds()40     bool hasIBounds() const { return fHasIBounds; }
41 
42     /**
43      * If nonempty, this is a set of "exclusive" windows within which the clip elements are NOT
44      * valid. The caller must not modify any pixels inside these windows.
45      */
windowRectangles()46     const GrWindowRectangles& windowRectangles() const { return fWindowRects; }
47 
48     typedef SkTLList<SkClipStack::Element, 16> ElementList;
49 
50     /**
51      * Populated with a minimal list of elements required to fully implement the clip.
52      */
elements()53     const ElementList& elements() const { return fElements; }
54 
55     /**
56      * If elements() are nonempty, uniquely identifies the list of elements within ibounds().
57      * Otherwise undefined.
58      */
elementsGenID()59     uint32_t elementsGenID() const { SkASSERT(!fElements.isEmpty()); return fElementsGenID; }
60 
61     /**
62      * Indicates whether antialiasing is required to process any of the clip elements.
63      */
requiresAA()64     bool requiresAA() const { return fRequiresAA; }
65 
66     enum class InitialState : bool {
67         kAllIn,
68         kAllOut
69     };
70 
initialState()71     InitialState initialState() const { return fInitialState; }
72 
73     bool drawAlphaClipMask(GrRenderTargetContext*) const;
74     bool drawStencilClipMask(GrContext*, GrRenderTargetContext*) const;
75 
76 private:
77     void walkStack(const SkClipStack&, const SkRect& queryBounds, int maxWindowRectangles);
78     void addInteriorWindowRectangles(int maxWindowRectangles);
79     void addWindowRectangle(const SkRect& elementInteriorRect, bool elementIsAA);
80     bool intersectIBounds(const SkIRect&);
81 
82     SkIRect              fIBounds;
83     bool                 fHasIBounds;
84     GrWindowRectangles   fWindowRects;
85     ElementList          fElements;
86     uint32_t             fElementsGenID;
87     bool                 fRequiresAA;
88     InitialState         fInitialState;
89 };
90 
91 #endif
92