Line data Source code
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 0 : 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 : */
30 0 : const SkIRect& ibounds() const { SkASSERT(fHasIBounds); return fIBounds; }
31 0 : int left() const { return this->ibounds().left(); }
32 0 : int top() const { return this->ibounds().top(); }
33 0 : int width() const { return this->ibounds().width(); }
34 0 : 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 : */
40 0 : 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 : */
46 0 : 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 : */
53 0 : 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 : */
59 0 : int32_t elementsGenID() const { SkASSERT(!fElements.isEmpty()); return fElementsGenID; }
60 :
61 : /**
62 : * Indicates whether antialiasing is required to process any of the clip elements.
63 : */
64 0 : bool requiresAA() const { return fRequiresAA; }
65 :
66 : enum class InitialState : bool {
67 : kAllIn,
68 : kAllOut
69 : };
70 :
71 0 : 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 : int32_t fElementsGenID;
87 : bool fRequiresAA;
88 : InitialState fInitialState;
89 : };
90 :
91 : #endif
|