1 /* 2 * Copyright 2019 Google LLC 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 GrSurfaceProxyView_DEFINED 9 #define GrSurfaceProxyView_DEFINED 10 11 #include "include/core/SkRefCnt.h" 12 #include "include/gpu/GrTypes.h" 13 #include "src/gpu/GrRenderTargetProxy.h" 14 #include "src/gpu/GrSurfaceProxy.h" 15 #include "src/gpu/GrSwizzle.h" 16 #include "src/gpu/GrTextureProxy.h" 17 18 class GrSurfaceProxyView { 19 public: 20 GrSurfaceProxyView() = default; 21 GrSurfaceProxyView(sk_sp<GrSurfaceProxy> proxy,GrSurfaceOrigin origin,GrSwizzle swizzle)22 GrSurfaceProxyView(sk_sp<GrSurfaceProxy> proxy, GrSurfaceOrigin origin, GrSwizzle swizzle) 23 : fProxy(proxy), fOrigin(origin), fSwizzle(swizzle) {} 24 25 // This entry point is used when we don't care about the origin or the swizzle. GrSurfaceProxyView(sk_sp<GrSurfaceProxy> proxy)26 explicit GrSurfaceProxyView(sk_sp<GrSurfaceProxy> proxy) 27 : fProxy(proxy), fOrigin(kTopLeft_GrSurfaceOrigin) {} 28 29 GrSurfaceProxyView(GrSurfaceProxyView&& view) = default; 30 GrSurfaceProxyView(const GrSurfaceProxyView&) = default; 31 32 operator bool() const { return SkToBool(fProxy.get()); } 33 34 GrSurfaceProxyView& operator=(const GrSurfaceProxyView&) = default; 35 GrSurfaceProxyView& operator=(GrSurfaceProxyView&& view) = default; 36 37 bool operator==(const GrSurfaceProxyView& view) const { 38 return fProxy->uniqueID() == view.fProxy->uniqueID() && 39 fOrigin == view.fOrigin && 40 fSwizzle == view.fSwizzle; 41 } 42 bool operator!=(const GrSurfaceProxyView& other) const { return !(*this == other); } 43 width()44 int width() const { return this->proxy()->width(); } height()45 int height() const { return this->proxy()->height(); } dimensions()46 SkISize dimensions() const { return this->proxy()->dimensions(); } 47 proxy()48 GrSurfaceProxy* proxy() const { return fProxy.get(); } refProxy()49 sk_sp<GrSurfaceProxy> refProxy() const { return fProxy; } 50 asTextureProxy()51 GrTextureProxy* asTextureProxy() const { 52 if (!fProxy) { 53 return nullptr; 54 } 55 return fProxy->asTextureProxy(); 56 } asTextureProxyRef()57 sk_sp<GrTextureProxy> asTextureProxyRef() const { 58 return sk_ref_sp<GrTextureProxy>(this->asTextureProxy()); 59 } 60 asRenderTargetProxy()61 GrRenderTargetProxy* asRenderTargetProxy() const { 62 if (!fProxy) { 63 return nullptr; 64 } 65 return fProxy->asRenderTargetProxy(); 66 } 67 asRenderTargetProxyRef()68 sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() const { 69 return sk_ref_sp<GrRenderTargetProxy>(this->asRenderTargetProxy()); 70 } 71 origin()72 GrSurfaceOrigin origin() const { return fOrigin; } swizzle()73 GrSwizzle swizzle() const { return fSwizzle; } 74 reset()75 void reset() { 76 *this = {}; 77 } 78 79 // This does not reset the origin or swizzle, so the View can still be used to access those 80 // properties associated with the detached proxy. detachProxy()81 sk_sp<GrSurfaceProxy> detachProxy() { 82 return std::move(fProxy); 83 } 84 85 private: 86 sk_sp<GrSurfaceProxy> fProxy; 87 GrSurfaceOrigin fOrigin = kTopLeft_GrSurfaceOrigin; 88 GrSwizzle fSwizzle; 89 }; 90 91 #endif 92 93