1 /* 2 * Copyright 2018 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 GrCCClipPath_DEFINED 9 #define GrCCClipPath_DEFINED 10 11 #include "include/core/SkPath.h" 12 #include "src/gpu/GrTextureProxy.h" 13 #include "src/gpu/ccpr/GrCCAtlas.h" 14 15 struct GrCCPerFlushResourceSpecs; 16 class GrCCPerFlushResources; 17 class GrOnFlushResourceProvider; 18 class GrProxyProvider; 19 20 /** 21 * These are keyed by SkPath generation ID, and store which device-space paths are accessed and 22 * where by clip FPs in a given opList. A single GrCCClipPath can be referenced by multiple FPs. At 23 * flush time their coverage count masks are packed into atlas(es) alongside normal DrawPathOps. 24 */ 25 class GrCCClipPath { 26 public: 27 GrCCClipPath() = default; 28 GrCCClipPath(const GrCCClipPath&) = delete; 29 ~GrCCClipPath()30 ~GrCCClipPath() { 31 // Ensure no clip FP exists with a dangling pointer back into this class. This works because 32 // a clip FP will have a ref on the proxy if it exists. 33 // 34 // This assert also guarantees there won't be a lazy proxy callback with a dangling pointer 35 // back into this class, since no proxy will exist after we destruct, if the assert passes. 36 SkASSERT(!fAtlasLazyProxy || fAtlasLazyProxy->unique()); 37 } 38 isInitialized()39 bool isInitialized() const { return fAtlasLazyProxy != nullptr; } 40 void init(const SkPath& deviceSpacePath, const SkIRect& accessRect, 41 GrCCAtlas::CoverageType atlasCoverageType, const GrCaps&); 42 addAccess(const SkIRect & accessRect)43 void addAccess(const SkIRect& accessRect) { 44 SkASSERT(this->isInitialized()); 45 fAccessRect.join(accessRect); 46 } atlasLazyProxy()47 GrTextureProxy* atlasLazyProxy() const { 48 SkASSERT(this->isInitialized()); 49 return fAtlasLazyProxy.get(); 50 } deviceSpacePath()51 const SkPath& deviceSpacePath() const { 52 SkASSERT(this->isInitialized()); 53 return fDeviceSpacePath; 54 } pathDevIBounds()55 const SkIRect& pathDevIBounds() const { 56 SkASSERT(this->isInitialized()); 57 return fPathDevIBounds; 58 } 59 60 void accountForOwnPath(GrCCPerFlushResourceSpecs*) const; 61 void renderPathInAtlas(GrCCPerFlushResources*, GrOnFlushResourceProvider*); 62 atlasScale()63 const SkVector& atlasScale() const { SkASSERT(fHasAtlasTransform); return fAtlasScale; } atlasTranslate()64 const SkVector& atlasTranslate() const { SkASSERT(fHasAtlasTransform); return fAtlasTranslate; } 65 66 private: 67 sk_sp<GrTextureProxy> fAtlasLazyProxy; 68 SkPath fDeviceSpacePath; 69 SkIRect fPathDevIBounds; 70 SkIRect fAccessRect; 71 72 const GrCCAtlas* fAtlas = nullptr; 73 SkIVector fDevToAtlasOffset; // Translation from device space to location in atlas. 74 SkDEBUGCODE(bool fHasAtlas = false;) 75 76 SkVector fAtlasScale; 77 SkVector fAtlasTranslate; 78 SkDEBUGCODE(bool fHasAtlasTransform = false;) 79 }; 80 81 #endif 82