| /* | |
| * 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<GrCCAtlas> renderPathInAtlas(GrCCPerFlushResources*, | |
| GrOnFlushResourceProvider*); | |
| const SkIVector& atlasTranslate() const { | |
| SkASSERT(fHasAtlas); | |
| return fDevToAtlasOffset; | |
| } | |
| void assignAtlasTexture(sk_sp<GrTexture> atlasTexture) { | |
| fAtlasLazyProxy->priv().assign(std::move(atlasTexture)); | |
| } | |
| private: | |
| SkPath fDeviceSpacePath; | |
| SkIRect fPathDevIBounds; | |
| SkIRect fAccessRect; | |
| sk_sp<GrTextureProxy> fAtlasLazyProxy; | |
| SkIVector fDevToAtlasOffset; // Translation from device space to location in atlas. | |
| SkDEBUGCODE(bool fHasAtlas = false;) | |
| }; | |
| #endif |