| /* | 
 |  * Copyright 2019 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #ifndef YUVUtils_DEFINED | 
 | #define YUVUtils_DEFINED | 
 |  | 
 | #include "include/core/SkColorSpace.h" | 
 | #include "include/core/SkImage.h" | 
 | #include "include/core/SkYUVAPixmaps.h" | 
 | #include "include/gpu/GrBackendSurface.h" | 
 | #include "src/base/SkAutoMalloc.h" | 
 |  | 
 | #include <tuple> | 
 |  | 
 | class SkData; | 
 | #if defined(SK_GRAPHITE) | 
 | namespace skgpu::graphite { class Recorder; } | 
 | #endif | 
 |  | 
 | namespace sk_gpu_test { | 
 |  | 
 | // Splits an input image into A8 YUV[A] planes using the passed subsampling and YUV color space. If | 
 | // the src image is opaque there will be three planes (Y, U, and V) and if not there will be a | 
 | // fourth A plane. The planes are returned along with a SkYUVAInfo describing the resulting planar | 
 | // image. Images are made as textures if GrRecordingContext is not null, otherwise as cpu images. | 
 | std::tuple<std::array<sk_sp<SkImage>, SkYUVAInfo::kMaxPlanes>, SkYUVAInfo> | 
 | MakeYUVAPlanesAsA8(SkImage*, | 
 |                    SkYUVColorSpace, | 
 |                    SkYUVAInfo::Subsampling, | 
 |                    GrRecordingContext*); | 
 |  | 
 | // Utility that decodes a JPEG but preserves the YUVA8 planes in the image, and uses | 
 | // MakeFromYUVAPixmaps to create a GPU multiplane YUVA image for a context. It extracts the planar | 
 | // data once, and lazily creates the actual SkImage when the GrContext is provided (and refreshes | 
 | // the image if the context has changed, as in Viewer) | 
 | class LazyYUVImage { | 
 | public: | 
 |     // Returns null if the data could not be extracted into YUVA planes | 
 |     static std::unique_ptr<LazyYUVImage> Make(sk_sp<SkData> data, | 
 |                                               skgpu::Mipmapped = skgpu::Mipmapped::kNo, | 
 |                                               sk_sp<SkColorSpace> = nullptr); | 
 |     static std::unique_ptr<LazyYUVImage> Make(SkYUVAPixmaps, | 
 |                                               skgpu::Mipmapped = skgpu::Mipmapped::kNo, | 
 |                                               sk_sp<SkColorSpace> = nullptr); | 
 |  | 
 |     enum class Type { kFromPixmaps, kFromGenerator, kFromTextures, kFromImages }; | 
 |  | 
 |     SkISize dimensions() const { return fPixmaps.yuvaInfo().dimensions(); } | 
 |  | 
 |     sk_sp<SkImage> refImage(GrRecordingContext* rContext, Type); | 
 | #if defined(SK_GRAPHITE) | 
 |     sk_sp<SkImage> refImage(skgpu::graphite::Recorder* recorder, Type); | 
 | #endif | 
 |  | 
 | private: | 
 |     // Decoded YUV data | 
 |     SkYUVAPixmaps fPixmaps; | 
 |  | 
 |     skgpu::Mipmapped fMipmapped; | 
 |  | 
 |     sk_sp<SkColorSpace> fColorSpace; | 
 |  | 
 |     // Memoized SkImages formed with planes, one for each Type. | 
 |     sk_sp<SkImage> fYUVImage[4]; | 
 |  | 
 |     LazyYUVImage() = default; | 
 |  | 
 |     bool reset(sk_sp<SkData> data, skgpu::Mipmapped, sk_sp<SkColorSpace>); | 
 |     bool reset(SkYUVAPixmaps pixmaps, skgpu::Mipmapped, sk_sp<SkColorSpace>); | 
 |  | 
 |     bool ensureYUVImage(GrRecordingContext* rContext, Type type); | 
 | #if defined(SK_GRAPHITE) | 
 |     bool ensureYUVImage(skgpu::graphite::Recorder* recorder, Type type); | 
 | #endif | 
 | }; | 
 |  | 
 | } // namespace sk_gpu_test | 
 |  | 
 | #endif // YUVUtils_DEFINED |