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 | |
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. |
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 | |
44 | int width() const { return this->proxy()->width(); } |
45 | int height() const { return this->proxy()->height(); } |
46 | SkISize dimensions() const { return this->proxy()->dimensions(); } |
47 | |
48 | GrSurfaceProxy* proxy() const { return fProxy.get(); } |
49 | sk_sp<GrSurfaceProxy> refProxy() const { return fProxy; } |
50 | |
51 | GrTextureProxy* asTextureProxy() const { |
52 | if (!fProxy) { |
53 | return nullptr; |
54 | } |
55 | return fProxy->asTextureProxy(); |
56 | } |
57 | sk_sp<GrTextureProxy> asTextureProxyRef() const { |
58 | return sk_ref_sp<GrTextureProxy>(this->asTextureProxy()); |
59 | } |
60 | |
61 | GrRenderTargetProxy* asRenderTargetProxy() const { |
62 | if (!fProxy) { |
63 | return nullptr; |
64 | } |
65 | return fProxy->asRenderTargetProxy(); |
66 | } |
67 | |
68 | sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() const { |
69 | return sk_ref_sp<GrRenderTargetProxy>(this->asRenderTargetProxy()); |
70 | } |
71 | |
72 | GrSurfaceOrigin origin() const { return fOrigin; } |
73 | GrSwizzle swizzle() const { return fSwizzle; } |
74 | |
75 | void reset() { |
76 | *this = {}; |
77 | } |
78 | |
79 | // Helper that copies a rect of a src view'' proxy and then creates a view for the copy with |
80 | // the same origin and swizzle as the src view. |
81 | static GrSurfaceProxyView Copy(GrRecordingContext* context, |
82 | GrSurfaceProxyView src, |
83 | GrMipMapped mipMapped, |
84 | SkIRect srcRect, |
85 | SkBackingFit fit, |
86 | SkBudgeted budgeted) { |
87 | auto origin = src.origin(); |
88 | auto* proxy = src.proxy(); |
89 | auto copy = GrSurfaceProxy::Copy(context, proxy, origin, mipMapped, srcRect, fit, budgeted); |
90 | return {std::move(copy), src.origin(), src.swizzle()}; |
91 | } |
92 | |
93 | // This does not reset the origin or swizzle, so the View can still be used to access those |
94 | // properties associated with the detached proxy. |
95 | sk_sp<GrSurfaceProxy> detachProxy() { |
96 | return std::move(fProxy); |
97 | } |
98 | |
99 | private: |
100 | sk_sp<GrSurfaceProxy> fProxy; |
101 | GrSurfaceOrigin fOrigin = kTopLeft_GrSurfaceOrigin; |
102 | GrSwizzle fSwizzle; |
103 | }; |
104 | |
105 | #endif |
106 | |
107 | |