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