Flutter Engine
 
Loading...
Searching...
No Matches
image_generator_registry.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_LIB_UI_PAINTING_IMAGE_GENERATOR_REGISTRY_H_
6#define FLUTTER_LIB_UI_PAINTING_IMAGE_GENERATOR_REGISTRY_H_
7
8#include <functional>
9#include <set>
10
11#include "flutter/fml/mapping.h"
14
15namespace flutter {
16
17/// @brief `ImageGeneratorFactory` is the top level primitive for specifying an
18/// image decoder in Flutter. When called, it should return an
19/// `ImageGenerator` that typically compatible with the given input
20/// data.
22 std::function<std::shared_ptr<ImageGenerator>(sk_sp<SkData> buffer)>;
23
24/// @brief Keeps a priority-ordered registry of image generator builders to be
25/// used when decoding images. This object must be created, accessed, and
26/// collected on the UI thread (typically the engine or its runtime
27/// controller).
29 public:
31
33
34 /// @brief Install a new factory for image generators
35 /// @param[in] factory Callback that produces `ImageGenerator`s for
36 /// compatible input data.
37 /// @param[in] priority The priority used to determine the order in which
38 /// factories are tried. Higher values mean higher
39 /// priority. The built-in Skia decoders are installed
40 /// at priority 0, and so a priority > 0 takes precedent
41 /// over the builtin decoders. When multiple decoders
42 /// are added with the same priority, those which are
43 /// added earlier take precedent.
44 /// @see `CreateCompatibleGenerator`
45 void AddFactory(ImageGeneratorFactory factory, int32_t priority);
46
47 /// @brief Walks the list of image generator builders in descending
48 /// priority order until a compatible `ImageGenerator` is able to
49 /// be built. This method is safe to perform on the UI thread, as
50 /// checking for `ImageGenerator` compatibility is expected to be
51 /// a lightweight operation. The returned `ImageGenerator` can
52 /// then be used to fully decode the image on e.g. the IO thread.
53 /// @param[in] buffer The raw encoded image data.
54 /// @return An `ImageGenerator` that is compatible with the input buffer.
55 /// If no compatible `ImageGenerator` type was found, then
56 /// `std::shared_ptr<ImageGenerator>(nullptr)` is returned.
57 /// @see `ImageGenerator`
58 std::shared_ptr<ImageGenerator> CreateCompatibleGenerator(
59 const sk_sp<SkData>& buffer);
60
62
63 private:
64 struct PrioritizedFactory {
66
67 int32_t priority = 0;
68 // Used as a fallback priority comparison when equal.
69 size_t ascending_nonce = 0;
70 };
71
72 struct Compare {
73 constexpr bool operator()(const PrioritizedFactory& lhs,
74 const PrioritizedFactory& rhs) const {
75 // When priorities are equal, factories registered earlier take
76 // precedent.
77 if (lhs.priority == rhs.priority) {
78 return lhs.ascending_nonce < rhs.ascending_nonce;
79 }
80 // Order by descending priority.
81 return lhs.priority > rhs.priority;
82 }
83 };
84
85 using FactorySet = std::set<PrioritizedFactory, Compare>;
86 FactorySet image_generator_factories_;
87 size_t nonce_;
89};
90
91} // namespace flutter
92
93#endif // FLUTTER_LIB_UI_PAINTING_IMAGE_GENERATOR_REGISTRY_H_
Keeps a priority-ordered registry of image generator builders to be used when decoding images....
fml::TaskRunnerAffineWeakPtr< ImageGeneratorRegistry > GetWeakPtr() const
std::shared_ptr< ImageGenerator > CreateCompatibleGenerator(const sk_sp< SkData > &buffer)
Walks the list of image generator builders in descending priority order until a compatible ImageGener...
void AddFactory(ImageGeneratorFactory factory, int32_t priority)
Install a new factory for image generators.
FlutterDesktopBinaryReply callback
std::function< std::shared_ptr< ImageGenerator >(sk_sp< SkData > buffer)> ImageGeneratorFactory
ImageGeneratorFactory is the top level primitive for specifying an image decoder in Flutter....