| /* | 
 |  * Copyright 2017 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #ifndef GrSurfaceProxyPriv_DEFINED | 
 | #define GrSurfaceProxyPriv_DEFINED | 
 |  | 
 | #include "GrSurfaceProxy.h" | 
 |  | 
 | #include "GrResourceProvider.h" | 
 |  | 
 | /** Class that adds methods to GrSurfaceProxy that are only intended for use internal to Skia. | 
 |     This class is purely a privileged window into GrSurfaceProxy. It should never have additional | 
 |     data members or virtual methods. */ | 
 | class GrSurfaceProxyPriv { | 
 | public: | 
 |     // Beware! Woe betide anyone whosoever calls this method. | 
 |     // The refs on proxies and their backing GrSurfaces shift around based on whether the proxy | 
 |     // is instantiated or not. Additionally, the lifetime of a proxy (and a GrSurface) also | 
 |     // depends on the read and write refs (So this method can validly return 0). | 
 |     int32_t getProxyRefCnt() const { return fProxy->getProxyRefCnt(); } | 
 |  | 
 |     // Beware! This call is only guaranteed to tell you if the proxy in question has | 
 |     // any pending IO in its current state. It won't tell you about the IO state in the | 
 |     // future when the proxy is actually used/instantiated. | 
 |     bool hasPendingIO() const { return fProxy->hasPendingIO(); } | 
 |  | 
 |     // Beware! This call is only guaranteed to tell you if the proxy in question has | 
 |     // any pending writes in its current state. It won't tell you about the IO state in the | 
 |     // future when the proxy is actually used/instantiated. | 
 |     bool hasPendingWrite() const { return fProxy->hasPendingWrite(); } | 
 |  | 
 |     void computeScratchKey(GrScratchKey* key) const { return fProxy->computeScratchKey(key); } | 
 |  | 
 |     // Create a GrSurface-derived class that meets the requirements (i.e, desc, renderability) | 
 |     // of the GrSurfaceProxy. | 
 |     sk_sp<GrSurface> createSurface(GrResourceProvider* resourceProvider) const { | 
 |         return fProxy->createSurface(resourceProvider); | 
 |     } | 
 |  | 
 |     // Assign this proxy the provided GrSurface as its backing surface | 
 |     void assign(sk_sp<GrSurface> surface) { fProxy->assign(std::move(surface)); } | 
 |  | 
 |     bool requiresNoPendingIO() const { | 
 |         return fProxy->fSurfaceFlags & GrInternalSurfaceFlags::kNoPendingIO; | 
 |     } | 
 |  | 
 |     // Don't abuse this call!!!!!!! | 
 |     bool isExact() const { return SkBackingFit::kExact == fProxy->fFit; } | 
 |  | 
 |     // Don't. Just don't. | 
 |     void exactify(); | 
 |  | 
 |     bool doLazyInstantiation(GrResourceProvider*); | 
 |  | 
 |     GrSurfaceProxy::LazyInstantiationType lazyInstantiationType() const { | 
 |         return fProxy->fLazyInstantiationType; | 
 |     } | 
 |  | 
 |     bool isSafeToUninstantiate() const { | 
 |         return SkToBool(fProxy->fTarget) && | 
 |                SkToBool(fProxy->fLazyInstantiateCallback) && | 
 |                GrSurfaceProxy::LazyInstantiationType::kUninstantiate == lazyInstantiationType(); | 
 |     } | 
 |  | 
 |     static bool SK_WARN_UNUSED_RESULT AttachStencilIfNeeded(GrResourceProvider*, GrSurface*, | 
 |                                                             bool needsStencil); | 
 |  | 
 | private: | 
 |     explicit GrSurfaceProxyPriv(GrSurfaceProxy* proxy) : fProxy(proxy) {} | 
 |     GrSurfaceProxyPriv(const GrSurfaceProxyPriv&) {} // unimpl | 
 |     GrSurfaceProxyPriv& operator=(const GrSurfaceProxyPriv&); // unimpl | 
 |  | 
 |     // No taking addresses of this type. | 
 |     const GrSurfaceProxyPriv* operator&() const; | 
 |     GrSurfaceProxyPriv* operator&(); | 
 |  | 
 |     GrSurfaceProxy* fProxy; | 
 |  | 
 |     friend class GrSurfaceProxy; // to construct/copy this type. | 
 | }; | 
 |  | 
 | inline GrSurfaceProxyPriv GrSurfaceProxy::priv() { return GrSurfaceProxyPriv(this); } | 
 |  | 
 | inline const GrSurfaceProxyPriv GrSurfaceProxy::priv () const { | 
 |     return GrSurfaceProxyPriv(const_cast<GrSurfaceProxy*>(this)); | 
 | } | 
 |  | 
 | #endif |