|  | /* | 
|  | * Copyright 2016 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef GrReducedClip_DEFINED | 
|  | #define GrReducedClip_DEFINED | 
|  |  | 
|  | #include "GrWindowRectangles.h" | 
|  | #include "SkClipStack.h" | 
|  | #include "SkTLList.h" | 
|  |  | 
|  | class GrContext; | 
|  | class GrRenderTargetContext; | 
|  |  | 
|  | /** | 
|  | * This class takes a clip stack and produces a reduced set of elements that are equivalent to | 
|  | * applying that full stack within a specified query rectangle. | 
|  | */ | 
|  | class SK_API GrReducedClip { | 
|  | public: | 
|  | GrReducedClip(const SkClipStack&, const SkRect& queryBounds, int maxWindowRectangles = 0); | 
|  |  | 
|  | /** | 
|  | * If hasIBounds() is true, this is the bounding box within which the clip elements are valid. | 
|  | * The caller must not modify any pixels outside this box. Undefined if hasIBounds() is false. | 
|  | */ | 
|  | const SkIRect& ibounds() const { SkASSERT(fHasIBounds); return fIBounds; } | 
|  | int left() const { return this->ibounds().left(); } | 
|  | int top() const { return this->ibounds().top(); } | 
|  | int width() const { return this->ibounds().width(); } | 
|  | int height() const { return this->ibounds().height(); } | 
|  |  | 
|  | /** | 
|  | * Indicates whether ibounds() are defined. They will always be defined if the elements() are | 
|  | * nonempty. | 
|  | */ | 
|  | bool hasIBounds() const { return fHasIBounds; } | 
|  |  | 
|  | /** | 
|  | * If nonempty, this is a set of "exclusive" windows within which the clip elements are NOT | 
|  | * valid. The caller must not modify any pixels inside these windows. | 
|  | */ | 
|  | const GrWindowRectangles& windowRectangles() const { return fWindowRects; } | 
|  |  | 
|  | typedef SkTLList<SkClipStack::Element, 16> ElementList; | 
|  |  | 
|  | /** | 
|  | * Populated with a minimal list of elements required to fully implement the clip. | 
|  | */ | 
|  | const ElementList& elements() const { return fElements; } | 
|  |  | 
|  | /** | 
|  | * If elements() are nonempty, uniquely identifies the list of elements within ibounds(). | 
|  | * Otherwise undefined. | 
|  | */ | 
|  | int32_t elementsGenID() const { SkASSERT(!fElements.isEmpty()); return fElementsGenID; } | 
|  |  | 
|  | /** | 
|  | * Indicates whether antialiasing is required to process any of the clip elements. | 
|  | */ | 
|  | bool requiresAA() const { return fRequiresAA; } | 
|  |  | 
|  | enum class InitialState : bool { | 
|  | kAllIn, | 
|  | kAllOut | 
|  | }; | 
|  |  | 
|  | InitialState initialState() const { return fInitialState; } | 
|  |  | 
|  | bool drawAlphaClipMask(GrRenderTargetContext*) const; | 
|  | bool drawStencilClipMask(GrContext*, GrRenderTargetContext*) const; | 
|  |  | 
|  | private: | 
|  | void walkStack(const SkClipStack&, const SkRect& queryBounds, int maxWindowRectangles); | 
|  | void addInteriorWindowRectangles(int maxWindowRectangles); | 
|  | void addWindowRectangle(const SkRect& elementInteriorRect, bool elementIsAA); | 
|  | bool intersectIBounds(const SkIRect&); | 
|  |  | 
|  | SkIRect              fIBounds; | 
|  | bool                 fHasIBounds; | 
|  | GrWindowRectangles   fWindowRects; | 
|  | ElementList          fElements; | 
|  | int32_t              fElementsGenID; | 
|  | bool                 fRequiresAA; | 
|  | InitialState         fInitialState; | 
|  | }; | 
|  |  | 
|  | #endif |