/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrCCClipPath_DEFINED #define GrCCClipPath_DEFINED #include "include/core/SkPath.h" #include "src/gpu/GrSurfaceProxyPriv.h" #include "src/gpu/GrTextureProxy.h" #include "src/gpu/ccpr/GrCCAtlas.h" struct GrCCPerFlushResourceSpecs; class GrCCPerFlushResources; class GrOnFlushResourceProvider; class GrProxyProvider; /** * These are keyed by SkPath generation ID, and store which device-space paths are accessed and * where by clip FPs in a given opsTask. A single GrCCClipPath can be referenced by multiple FPs. At * flush time their coverage count masks are packed into atlas(es) alongside normal DrawPathOps. */ class GrCCClipPath : public SkRefCnt { public: GrCCClipPath(const SkPath& deviceSpacePath, const SkIRect&, const GrCaps&); GrCCClipPath(const GrCCClipPath&) = delete; void addAccess(const SkIRect& accessRect) { fAccessRect.join(accessRect); } GrTextureProxy* atlasLazyProxy() const { return fAtlasLazyProxy.get(); } const SkPath& deviceSpacePath() const { return fDeviceSpacePath; } const SkIRect& pathDevIBounds() const { return fPathDevIBounds; } void accountForOwnPath(GrCCAtlas::Specs*) const; // Allocates our clip path in an atlas and records the offset. // // If the return value is non-null, it means the given path did not fit in the then-current // atlas, so it was retired and a new one was added to the stack. The return value is the // newly-retired atlas. (*NOT* the atlas this path will reside in.) The caller must call // assignAtlasTexture on all prior GrCCClipPaths that will use the retired atlas. std::unique_ptr renderPathInAtlas(GrCCPerFlushResources*, GrOnFlushResourceProvider*); const SkIVector& atlasTranslate() const { SkASSERT(fHasAtlas); return fDevToAtlasOffset; } void assignAtlasTexture(sk_sp atlasTexture) { fAtlasLazyProxy->priv().assign(std::move(atlasTexture)); } private: SkPath fDeviceSpacePath; SkIRect fPathDevIBounds; SkIRect fAccessRect; sk_sp fAtlasLazyProxy; SkIVector fDevToAtlasOffset; // Translation from device space to location in atlas. SkDEBUGCODE(bool fHasAtlas = false;) }; #endif