1313#include " flutter/fml/make_copyable.h"
1414#include " flutter/fml/trace_event.h"
1515#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"
1620#include " third_party/skia/include/core/SkEncodedImageFormat.h"
1721#include " third_party/tonic/dart_persistent_value.h"
1822#include " third_party/tonic/logging/dart_invoke.h"
@@ -22,6 +26,9 @@ using tonic::DartInvoke;
2226using tonic::DartPersistentValue;
2327using tonic::ToDart;
2428
29+ namespace impeller {
30+ class Context ;
31+ } // namespace impeller
2532namespace flutter {
2633namespace {
2734
@@ -60,84 +67,6 @@ void InvokeDataCallback(std::unique_ptr<DartPersistentValue> callback,
6067 DartInvoke (callback->value (), {dart_data});
6168}
6269
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-
14170sk_sp<SkData> CopyImageByteData (const sk_sp<SkImage>& raster_image,
14271 SkColorType color_type,
14372 SkAlphaType alpha_type) {
@@ -221,7 +150,9 @@ void EncodeImageAndInvokeDataCallback(
221150 const fml::RefPtr<fml::TaskRunner>& io_task_runner,
222151 const fml::WeakPtr<GrDirectContext>& resource_context,
223152 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) {
225156 auto callback_task = fml::MakeCopyable (
226157 [callback = std::move (callback)](sk_sp<SkData> encoded) mutable {
227158 InvokeDataCallback (std::move (callback), std::move (encoded));
@@ -239,9 +170,17 @@ void EncodeImageAndInvokeDataCallback(
239170 };
240171
241172 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);
245184}
246185
247186} // namespace
@@ -272,13 +211,15 @@ Dart_Handle EncodeImage(CanvasImage* canvas_image,
272211 raster_task_runner = task_runners.GetRasterTaskRunner (),
273212 io_task_runner = task_runners.GetIOTaskRunner (),
274213 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 {
277217 EncodeImageAndInvokeDataCallback (
278218 image, std::move (callback), image_format, ui_task_runner,
279219 raster_task_runner, io_task_runner,
280220 io_manager->GetResourceContext (), snapshot_delegate,
281- io_manager->GetIsGpuDisabledSyncSwitch ());
221+ io_manager->GetIsGpuDisabledSyncSwitch (),
222+ io_manager->GetImpellerContext (), is_impeller_enabled);
282223 }));
283224
284225 return Dart_Null ();
0 commit comments