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