1 /* 2 * Copyright 2023 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 #include "include/codec/SkCodec.h" 9 #include "include/core/SkAlphaType.h" 10 #include "include/core/SkData.h" 11 #include "include/core/SkGraphics.h" 12 #include "include/core/SkImage.h" 13 #include "include/core/SkImageGenerator.h" 14 #include "include/core/SkRefCnt.h" 15 #include "include/core/SkTypes.h" 16 #include "src/codec/SkCodecImageGenerator.h" 17 #include "src/image/SkImageGeneratorPriv.h" 18 19 #include <memory> 20 #include <optional> 21 #include <utility> 22 23 static SkGraphics::ImageGeneratorFromEncodedDataFactory gFactory; 24 25 SkGraphics::ImageGeneratorFromEncodedDataFactory SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)26SkGraphics::SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory) 27 { 28 ImageGeneratorFromEncodedDataFactory prev = gFactory; 29 gFactory = factory; 30 return prev; 31 } 32 33 namespace SkImageGenerators { 34 MakeFromEncoded(sk_sp<SkData> data,std::optional<SkAlphaType> at)35std::unique_ptr<SkImageGenerator> MakeFromEncoded(sk_sp<SkData> data, 36 std::optional<SkAlphaType> at) { 37 if (!data || at == kOpaque_SkAlphaType) { 38 return nullptr; 39 } 40 if (gFactory) { 41 if (std::unique_ptr<SkImageGenerator> generator = gFactory(data)) { 42 return generator; 43 } 44 } 45 return SkCodecImageGenerator::MakeFromEncodedCodec(std::move(data), at); 46 } 47 48 } // namespace SkImageGenerators 49 50 namespace SkImages { 51 DeferredFromEncodedData(sk_sp<SkData> encoded,std::optional<SkAlphaType> alphaType)52sk_sp<SkImage> DeferredFromEncodedData(sk_sp<SkData> encoded, 53 std::optional<SkAlphaType> alphaType) { 54 if (nullptr == encoded || encoded->isEmpty()) { 55 return nullptr; 56 } 57 return DeferredFromGenerator(SkImageGenerators::MakeFromEncoded(std::move(encoded), alphaType)); 58 } 59 60 } // namespace SkImages 61 62 namespace SkCodecs { 63 DeferredImage(std::unique_ptr<SkCodec> codec,std::optional<SkAlphaType> alphaType)64sk_sp<SkImage> DeferredImage(std::unique_ptr<SkCodec> codec, std::optional<SkAlphaType> alphaType) { 65 return SkImages::DeferredFromGenerator( 66 SkCodecImageGenerator::MakeFromCodec(std::move(codec), alphaType)); 67 } 68 69 } // namespace SkCodecs 70