/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_TextureProxyView_DEFINED #define skgpu_graphite_TextureProxyView_DEFINED #include "include/core/SkRect.h" #include "include/core/SkRefCnt.h" #include "include/gpu/graphite/GraphiteTypes.h" #include "src/gpu/Swizzle.h" #include "src/gpu/graphite/TextureProxy.h" enum class SkBackingFit; namespace skgpu::graphite { class Recorder; class TextureProxyView { public: TextureProxyView() = default; TextureProxyView(sk_sp proxy, Swizzle swizzle) : fProxy(std::move(proxy)), fSwizzle(swizzle) {} TextureProxyView(sk_sp proxy, Swizzle swizzle, Origin origin) : fProxy(std::move(proxy)), fSwizzle(swizzle), fOrigin(origin) {} // This entry point is used when we don't care about the swizzle and assume TopLeft origin. explicit TextureProxyView(sk_sp proxy) : fProxy(std::move(proxy)) {} TextureProxyView(TextureProxyView&& view) = default; TextureProxyView(const TextureProxyView&) = default; explicit operator bool() const { return SkToBool(fProxy.get()); } TextureProxyView& operator=(const TextureProxyView&) = default; TextureProxyView& operator=(TextureProxyView&& view) = default; bool operator==(const TextureProxyView& view) const { return fProxy == view.fProxy && fSwizzle == view.fSwizzle && fOrigin == view.fOrigin; } bool operator!=(const TextureProxyView& other) const { return !(*this == other); } int width() const { return this->proxy()->dimensions().width(); } int height() const { return this->proxy()->dimensions().height(); } SkISize dimensions() const { return this->proxy()->dimensions(); } skgpu::Mipmapped mipmapped() const { if (const TextureProxy* proxy = this->proxy()) { return proxy->mipmapped(); } return skgpu::Mipmapped::kNo; } TextureProxy* proxy() const { return fProxy.get(); } sk_sp refProxy() const { return fProxy; } Swizzle swizzle() const { return fSwizzle; } Origin origin() const { return fOrigin; } void concatSwizzle(Swizzle swizzle) { fSwizzle = skgpu::Swizzle::Concat(fSwizzle, swizzle); } // makeSwizzle returns a new view with 'swizzle' composed on to this view's existing swizzle TextureProxyView makeSwizzle(Swizzle swizzle) const & { return {fProxy, Swizzle::Concat(fSwizzle, swizzle), fOrigin}; } TextureProxyView makeSwizzle(Swizzle swizzle) && { return {std::move(fProxy), Swizzle::Concat(fSwizzle, swizzle), fOrigin}; } // resetSwizzle returns a new view that uses 'swizzle' and disregards this view's prior swizzle. TextureProxyView replaceSwizzle(Swizzle swizzle) const { return {fProxy, swizzle, fOrigin}; } void reset() { *this = {}; } // This does not reset the swizzle, so the View can still be used to access those // properties associated with the detached proxy. sk_sp detachProxy() { return std::move(fProxy); } private: sk_sp fProxy; Swizzle fSwizzle; Origin fOrigin = Origin::kTopLeft; }; } // namespace skgpu::graphite #endif // skgpu_graphite_TextureProxyView_DEFINED