13
13
#include " flutter/fml/make_copyable.h"
14
14
#include " flutter/fml/trace_event.h"
15
15
#include " flutter/lib/ui/painting/image.h"
16
+ #if IMPELLER_SUPPORTS_RENDERING
17
+ #include " flutter/lib/ui/painting/image_encoding_impeller.h"
18
+ #endif // IMPELLER_SUPPORTS_RENDERING
19
+ #include " flutter/lib/ui/painting/image_encoding_skia.h"
16
20
#include " third_party/skia/include/core/SkEncodedImageFormat.h"
17
21
#include " third_party/tonic/dart_persistent_value.h"
18
22
#include " third_party/tonic/logging/dart_invoke.h"
@@ -22,6 +26,9 @@ using tonic::DartInvoke;
22
26
using tonic::DartPersistentValue;
23
27
using tonic::ToDart;
24
28
29
+ namespace impeller {
30
+ class Context ;
31
+ } // namespace impeller
25
32
namespace flutter {
26
33
namespace {
27
34
@@ -60,84 +67,6 @@ void InvokeDataCallback(std::unique_ptr<DartPersistentValue> callback,
60
67
DartInvoke (callback->value (), {dart_data});
61
68
}
62
69
63
- void ConvertImageToRaster (
64
- const sk_sp<DlImage>& dl_image,
65
- std::function<void (sk_sp<SkImage>)> encode_task,
66
- const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
67
- const fml::RefPtr<fml::TaskRunner>& io_task_runner,
68
- const fml::WeakPtr<GrDirectContext>& resource_context,
69
- const fml::TaskRunnerAffineWeakPtr<SnapshotDelegate>& snapshot_delegate,
70
- const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch) {
71
- // If the owning_context is kRaster, we can't access it on this task runner.
72
- if (dl_image->owning_context () != DlImage::OwningContext::kRaster ) {
73
- auto image = dl_image->skia_image ();
74
-
75
- // Check validity of the image.
76
- if (image == nullptr ) {
77
- FML_LOG (ERROR) << " Image was null." ;
78
- encode_task (nullptr );
79
- return ;
80
- }
81
-
82
- auto dimensions = image->dimensions ();
83
-
84
- if (dimensions.isEmpty ()) {
85
- FML_LOG (ERROR) << " Image dimensions were empty." ;
86
- encode_task (nullptr );
87
- return ;
88
- }
89
-
90
- SkPixmap pixmap;
91
- if (image->peekPixels (&pixmap)) {
92
- // This is already a raster image.
93
- encode_task (image);
94
- return ;
95
- }
96
-
97
- if (sk_sp<SkImage> raster_image = image->makeRasterImage ()) {
98
- // The image can be converted to a raster image.
99
- encode_task (raster_image);
100
- return ;
101
- }
102
- }
103
-
104
- // Cross-context images do not support makeRasterImage. Convert these images
105
- // by drawing them into a surface. This must be done on the raster thread
106
- // to prevent concurrent usage of the image on both the IO and raster threads.
107
- raster_task_runner->PostTask ([dl_image, encode_task = std::move (encode_task),
108
- resource_context, snapshot_delegate,
109
- io_task_runner, is_gpu_disabled_sync_switch,
110
- raster_task_runner]() {
111
- auto image = dl_image->skia_image ();
112
- if (!image || !snapshot_delegate) {
113
- io_task_runner->PostTask (
114
- [encode_task = encode_task]() mutable { encode_task (nullptr ); });
115
- return ;
116
- }
117
-
118
- sk_sp<SkImage> raster_image =
119
- snapshot_delegate->ConvertToRasterImage (image);
120
-
121
- io_task_runner->PostTask ([image, encode_task = encode_task,
122
- raster_image = std::move (raster_image),
123
- resource_context, is_gpu_disabled_sync_switch,
124
- owning_context = dl_image->owning_context (),
125
- raster_task_runner]() mutable {
126
- if (!raster_image) {
127
- // The rasterizer was unable to render the cross-context image
128
- // (presumably because it does not have a GrContext). In that case,
129
- // convert the image on the IO thread using the resource context.
130
- raster_image = ConvertToRasterUsingResourceContext (
131
- image, resource_context, is_gpu_disabled_sync_switch);
132
- }
133
- encode_task (raster_image);
134
- if (owning_context == DlImage::OwningContext::kRaster ) {
135
- raster_task_runner->PostTask ([image = std::move (image)]() {});
136
- }
137
- });
138
- });
139
- }
140
-
141
70
sk_sp<SkData> CopyImageByteData (const sk_sp<SkImage>& raster_image,
142
71
SkColorType color_type,
143
72
SkAlphaType alpha_type) {
@@ -221,7 +150,9 @@ void EncodeImageAndInvokeDataCallback(
221
150
const fml::RefPtr<fml::TaskRunner>& io_task_runner,
222
151
const fml::WeakPtr<GrDirectContext>& resource_context,
223
152
const fml::TaskRunnerAffineWeakPtr<SnapshotDelegate>& snapshot_delegate,
224
- const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch) {
153
+ const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch,
154
+ const std::shared_ptr<impeller::Context>& impeller_context,
155
+ bool is_impeller_enabled) {
225
156
auto callback_task = fml::MakeCopyable (
226
157
[callback = std::move (callback)](sk_sp<SkData> encoded) mutable {
227
158
InvokeDataCallback (std::move (callback), std::move (encoded));
@@ -239,9 +170,17 @@ void EncodeImageAndInvokeDataCallback(
239
170
};
240
171
241
172
FML_DCHECK (image);
242
- ConvertImageToRaster (image, encode_task, raster_task_runner, io_task_runner,
243
- resource_context, snapshot_delegate,
244
- is_gpu_disabled_sync_switch);
173
+ #if IMPELLER_SUPPORTS_RENDERING
174
+ if (is_impeller_enabled) {
175
+ ConvertImageToRasterImpeller (image, encode_task, raster_task_runner,
176
+ io_task_runner, is_gpu_disabled_sync_switch,
177
+ impeller_context);
178
+ return ;
179
+ }
180
+ #endif // IMPELLER_SUPPORTS_RENDERING
181
+ ConvertImageToRasterSkia (image, encode_task, raster_task_runner,
182
+ io_task_runner, resource_context, snapshot_delegate,
183
+ is_gpu_disabled_sync_switch);
245
184
}
246
185
247
186
} // namespace
@@ -272,13 +211,15 @@ Dart_Handle EncodeImage(CanvasImage* canvas_image,
272
211
raster_task_runner = task_runners.GetRasterTaskRunner (),
273
212
io_task_runner = task_runners.GetIOTaskRunner (),
274
213
io_manager = UIDartState::Current ()->GetIOManager (),
275
- snapshot_delegate =
276
- UIDartState::Current ()->GetSnapshotDelegate ()]() mutable {
214
+ snapshot_delegate = UIDartState::Current ()->GetSnapshotDelegate (),
215
+ is_impeller_enabled =
216
+ UIDartState::Current ()->IsImpellerEnabled ()]() mutable {
277
217
EncodeImageAndInvokeDataCallback (
278
218
image, std::move (callback), image_format, ui_task_runner,
279
219
raster_task_runner, io_task_runner,
280
220
io_manager->GetResourceContext (), snapshot_delegate,
281
- io_manager->GetIsGpuDisabledSyncSwitch ());
221
+ io_manager->GetIsGpuDisabledSyncSwitch (),
222
+ io_manager->GetImpellerContext (), is_impeller_enabled);
282
223
}));
283
224
284
225
return Dart_Null ();
0 commit comments