blob: bb520f54ab78cef140a788b579458b09b2885ac4 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include "flutter/lib/ui/painting/image_generator_registry.h"
#include "third_party/skia/include/codec/SkCodec.h"
#include "third_party/skia/include/core/SkImageGenerator.h"
#ifdef FML_OS_MACOSX
#include "third_party/skia/include/ports/SkImageGeneratorCG.h"
#elif FML_OS_WIN
#include "third_party/skia/include/ports/SkImageGeneratorWIC.h"
#endif
namespace flutter {
ImageGeneratorRegistry::ImageGeneratorRegistry() : weak_factory_(this) {
AddFactory(
[](sk_sp<SkData> buffer) {
return BuiltinSkiaCodecImageGenerator::MakeFromData(buffer);
},
0);
// todo(bdero): https://github.com/flutter/flutter/issues/82603
#ifdef FML_OS_MACOSX
AddFactory(
[](sk_sp<SkData> buffer) {
auto generator = SkImageGeneratorCG::MakeFromEncodedCG(buffer);
return BuiltinSkiaImageGenerator::MakeFromGenerator(
std::move(generator));
},
0);
#elif FML_OS_WIN
AddFactory(
[](sk_sp<SkData> buffer) {
auto generator = SkImageGeneratorWIC::MakeFromEncodedWIC(buffer);
return BuiltinSkiaImageGenerator::MakeFromGenerator(
std::move(generator));
},
0);
#endif
}
ImageGeneratorRegistry::~ImageGeneratorRegistry() = default;
void ImageGeneratorRegistry::AddFactory(ImageGeneratorFactory factory,
int32_t priority) {
image_generator_factories_.insert({factory, priority, ++nonce_});
}
std::shared_ptr<ImageGenerator>
ImageGeneratorRegistry::CreateCompatibleGenerator(sk_sp<SkData> buffer) {
if (!image_generator_factories_.size()) {
FML_LOG(WARNING)
<< "There are currently no image decoders installed. If you're writing "
"your own platform embedding, you can register new image decoders "
"via `ImageGeneratorRegistry::AddFactory` on the "
"`ImageGeneratorRegistry` provided by the engine. Otherwise, please "
"file a bug on https://github.com/flutter/flutter/issues.";
}
for (auto& factory : image_generator_factories_) {
std::shared_ptr<ImageGenerator> result = factory.callback(buffer);
if (result) {
return result;
}
}
return nullptr;
}
fml::WeakPtr<ImageGeneratorRegistry> ImageGeneratorRegistry::GetWeakPtr()
const {
return weak_factory_.GetWeakPtr();
}
} // namespace flutter