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
18class GrSurfaceProxyView {
19public:
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
99private:
100 sk_sp<GrSurfaceProxy> fProxy;
101 GrSurfaceOrigin fOrigin = kTopLeft_GrSurfaceOrigin;
102 GrSwizzle fSwizzle;
103};
104
105#endif
106
107