| /* | |
| * Copyright 2023 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_Image_YUVA_Graphite_DEFINED | |
| #define skgpu_graphite_Image_YUVA_Graphite_DEFINED | |
| #include "include/core/SkYUVAInfo.h" | |
| #include "src/gpu/graphite/Image_Base_Graphite.h" | |
| #include "src/gpu/graphite/TextureProxyView.h" | |
| #include <functional> | |
| namespace skgpu::graphite { | |
| class Recorder; | |
| class Image_YUVA final : public Image_Base { | |
| public: | |
| ~Image_YUVA() override; | |
| // Create an Image_YUVA by interpreting the multiple 'planes' using 'yuvaInfo'. If the info | |
| // or provided plane proxies do not produce a valid mulitplane image, null is returned. | |
| static sk_sp<Image_YUVA> Make(const Caps* caps, | |
| const SkYUVAInfo& yuvaInfo, | |
| SkSpan<TextureProxyView> planes, | |
| sk_sp<SkColorSpace> imageColorSpace); | |
| // Wraps the Graphite-backed Image planes into a YUV[A] image. The returned image shares | |
| // textures as well as any links to Devices that might modify those textures. | |
| static sk_sp<Image_YUVA> WrapImages(const Caps* caps, | |
| const SkYUVAInfo& yuvaInfo, | |
| SkSpan<const sk_sp<SkImage>> images, | |
| sk_sp<SkColorSpace> imageColorSpace); | |
| SkImage_Base::Type type() const override { return SkImage_Base::Type::kGraphiteYUVA; } | |
| size_t textureSize() const override; | |
| bool onHasMipmaps() const override { return fMipmapped == Mipmapped::kYes; } | |
| bool onIsProtected() const override { return fProtected == Protected::kYes; } | |
| sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const override; | |
| // Returns the proxy view that provides value for the YUVA channel specified by 'channelIndex'. | |
| // The view of the returned proxy applies a swizzle to map the relevant data channel into all | |
| // slots of the sample value. The alpha proxy may be null. | |
| const TextureProxyView& proxyView(int channelIndex) const { | |
| SkASSERT(channelIndex >= 0 && channelIndex < SkYUVAInfo::kYUVAChannelCount); | |
| return fProxies[channelIndex]; | |
| } | |
| std::tuple<int, int> uvSubsampleFactors() const { return fUVSubsampleFactors; } | |
| const SkYUVAInfo& yuvaInfo() const { return fYUVAInfo; } | |
| private: | |
| // The proxy views are ordered Y,U,V,A and if the channels are held in the same plane, the | |
| // respective proxy views will share the underlying TextureProxy but have the appropriate | |
| // swizzle to access the appropriate channel and return it in the R slot. | |
| using YUVAProxies = std::array<TextureProxyView, SkYUVAInfo::kYUVAChannelCount>; | |
| Image_YUVA(const YUVAProxies&, | |
| const SkYUVAInfo&, | |
| sk_sp<SkColorSpace>); | |
| YUVAProxies fProxies; | |
| SkYUVAInfo fYUVAInfo; | |
| std::tuple<int, int> fUVSubsampleFactors; | |
| // Aggregate mipmap/protected status from the proxies | |
| Mipmapped fMipmapped = Mipmapped::kYes; | |
| Protected fProtected = Protected::kNo; | |
| }; | |
| } // namespace skgpu::graphite | |
| #endif // skgpu_graphite_Image_YUVA_Graphite_DEFINED |