Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2019 Google Inc. |
| 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 YUVUtils_DEFINED |
| 9 | #define YUVUtils_DEFINED |
| 10 | |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 11 | #include "include/core/SkImage.h" |
Brian Salomon | be0e42c | 2020-08-27 11:00:04 -0400 | [diff] [blame] | 12 | #include "include/core/SkYUVAPixmaps.h" |
Robert Phillips | f105d38 | 2020-06-19 14:27:14 -0400 | [diff] [blame] | 13 | #include "include/gpu/GrBackendSurface.h" |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 14 | #include "src/core/SkAutoMalloc.h" |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 15 | |
| 16 | class SkData; |
| 17 | |
| 18 | namespace sk_gpu_test { |
| 19 | |
| 20 | // Utility that decodes a JPEG but preserves the YUVA8 planes in the image, and uses |
| 21 | // MakeFromYUVAPixmaps to create a GPU multiplane YUVA image for a context. It extracts the planar |
| 22 | // data once, and lazily creates the actual SkImage when the GrContext is provided (and refreshes |
| 23 | // the image if the context has changed, as in Viewer) |
| 24 | class LazyYUVImage { |
| 25 | public: |
Brian Salomon | 7db7139 | 2020-10-16 10:05:21 -0400 | [diff] [blame] | 26 | // Returns null if the data could not be extracted into YUVA planes |
| 27 | static std::unique_ptr<LazyYUVImage> Make(sk_sp<SkData> data, |
| 28 | GrMipmapped = GrMipmapped::kNo, |
| 29 | sk_sp<SkColorSpace> = nullptr); |
| 30 | static std::unique_ptr<LazyYUVImage> Make(SkYUVAPixmaps, |
| 31 | GrMipmapped = GrMipmapped::kNo, |
| 32 | sk_sp<SkColorSpace> = nullptr); |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 33 | |
Brian Salomon | 8670c98 | 2020-12-08 16:39:32 -0500 | [diff] [blame] | 34 | enum class Type { kFromPixmaps, kFromGenerator, kFromTextures }; |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 35 | |
Brian Salomon | 7db7139 | 2020-10-16 10:05:21 -0400 | [diff] [blame] | 36 | SkISize dimensions() const { return fPixmaps.yuvaInfo().dimensions(); } |
| 37 | |
| 38 | sk_sp<SkImage> refImage(GrRecordingContext* rContext, Type); |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 39 | |
| 40 | private: |
| 41 | // Decoded YUV data |
Brian Salomon | be0e42c | 2020-08-27 11:00:04 -0400 | [diff] [blame] | 42 | SkYUVAPixmaps fPixmaps; |
Brian Salomon | 87d42e5 | 2020-08-24 09:18:16 -0400 | [diff] [blame] | 43 | |
Brian Salomon | 6db78b8 | 2020-07-31 08:57:48 -0400 | [diff] [blame] | 44 | GrMipmapped fMipmapped; |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 45 | |
Brian Salomon | 7db7139 | 2020-10-16 10:05:21 -0400 | [diff] [blame] | 46 | sk_sp<SkColorSpace> fColorSpace; |
| 47 | |
| 48 | // Memoized SkImages formed with planes, one for each Type. |
Brian Salomon | 694ff17 | 2020-11-04 16:54:28 -0500 | [diff] [blame] | 49 | sk_sp<SkImage> fYUVImage[4]; |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 50 | |
Brian Salomon | efb5f07 | 2020-07-28 21:06:43 -0400 | [diff] [blame] | 51 | LazyYUVImage() = default; |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 52 | |
Brian Salomon | 7db7139 | 2020-10-16 10:05:21 -0400 | [diff] [blame] | 53 | bool reset(sk_sp<SkData> data, GrMipmapped, sk_sp<SkColorSpace>); |
| 54 | bool reset(SkYUVAPixmaps pixmaps, GrMipmapped, sk_sp<SkColorSpace>); |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 55 | |
Brian Salomon | 7db7139 | 2020-10-16 10:05:21 -0400 | [diff] [blame] | 56 | bool ensureYUVImage(GrRecordingContext* rContext, Type type); |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 57 | }; |
| 58 | |
Michael Ludwig | d9958f8 | 2019-03-21 13:08:36 -0400 | [diff] [blame] | 59 | } // namespace sk_gpu_test |
| 60 | |
| 61 | #endif // YUVUtils_DEFINED |