88
99#include " flutter/fml/make_copyable.h"
1010#include " flutter/lib/ui/painting/image.h"
11+ #if IMPELLER_SUPPORTS_RENDERING
12+ #include " lib/ui/painting/image_decoder_impeller.h"
13+ #endif // IMPELLER_SUPPORTS_RENDERING
1114#include " third_party/dart/runtime/include/dart_api.h"
1215#include " third_party/skia/include/core/SkPixelRef.h"
1316#include " third_party/tonic/logging/dart_invoke.h"
@@ -26,6 +29,7 @@ MultiFrameCodec::State::State(std::shared_ptr<ImageGenerator> generator)
2629 ImageGenerator::kInfinitePlayCount
2730 ? -1
2831 : generator_->GetPlayCount() - 1),
32+ is_impeller_enabled_(UIDartState::Current()->IsImpellerEnabled()),
2933 nextFrameIndex_(0 ) {}
3034
3135static void InvokeNextFrameCallback (
@@ -77,9 +81,11 @@ static bool CopyToBitmap(SkBitmap* dst,
7781 return true ;
7882}
7983
80- sk_sp<SkImage > MultiFrameCodec::State::GetNextFrameImage (
84+ sk_sp<DlImage > MultiFrameCodec::State::GetNextFrameImage (
8185 fml::WeakPtr<GrDirectContext> resourceContext,
82- const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch) {
86+ const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch,
87+ std::shared_ptr<impeller::Context> impeller_context_,
88+ fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue) {
8389 SkBitmap bitmap = SkBitmap ();
8490 SkImageInfo info = generator_->GetInfo ().makeColorType (kN32_SkColorType );
8591 if (info.alphaType () == kUnpremul_SkAlphaType ) {
@@ -125,30 +131,45 @@ sk_sp<SkImage> MultiFrameCodec::State::GetNextFrameImage(
125131 lastRequiredFrame_ = std::make_unique<SkBitmap>(bitmap);
126132 lastRequiredFrameIndex_ = nextFrameIndex_;
127133 }
128- sk_sp<SkImage> result;
129134
135+ #if IMPELLER_SUPPORTS_RENDERING
136+ if (is_impeller_enabled_) {
137+ sk_sp<DlImage> result;
138+ // impeller, transfer to DlImageImpeller
139+ gpu_disable_sync_switch->Execute (fml::SyncSwitch::Handlers ().SetIfFalse (
140+ [&result, &bitmap, &impeller_context_] {
141+ result = ImageDecoderImpeller::UploadTexture (
142+ impeller_context_, std::make_shared<SkBitmap>(bitmap));
143+ }));
144+
145+ return result;
146+ }
147+ #endif // IMPELLER_SUPPORTS_RENDERING
148+
149+ sk_sp<SkImage> skImage;
130150 gpu_disable_sync_switch->Execute (
131151 fml::SyncSwitch::Handlers ()
132- .SetIfTrue ([&result , &bitmap] {
152+ .SetIfTrue ([&skImage , &bitmap] {
133153 // Defer decoding until time of draw later on the raster thread. Can
134154 // happen when GL operations are currently forbidden such as in the
135155 // background on iOS.
136- result = SkImage::MakeFromBitmap (bitmap);
156+ skImage = SkImage::MakeFromBitmap (bitmap);
137157 })
138- .SetIfFalse ([&result , &resourceContext, &bitmap] {
158+ .SetIfFalse ([&skImage , &resourceContext, &bitmap] {
139159 if (resourceContext) {
140160 SkPixmap pixmap (bitmap.info (), bitmap.pixelRef ()->pixels (),
141161 bitmap.pixelRef ()->rowBytes ());
142- result = SkImage::MakeCrossContextFromPixmap (
162+ skImage = SkImage::MakeCrossContextFromPixmap (
143163 resourceContext.get (), pixmap, true );
144164 } else {
145165 // Defer decoding until time of draw later on the raster thread.
146166 // Can happen when GL operations are currently forbidden such as
147167 // in the background on iOS.
148- result = SkImage::MakeFromBitmap (bitmap);
168+ skImage = SkImage::MakeFromBitmap (bitmap);
149169 }
150170 }));
151- return result;
171+
172+ return DlImageGPU::Make ({skImage, std::move (unref_queue)});
152173}
153174
154175void MultiFrameCodec::State::GetNextFrameAndInvokeCallback (
@@ -157,14 +178,16 @@ void MultiFrameCodec::State::GetNextFrameAndInvokeCallback(
157178 fml::WeakPtr<GrDirectContext> resourceContext,
158179 fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue,
159180 const std::shared_ptr<const fml::SyncSwitch>& gpu_disable_sync_switch,
160- size_t trace_id) {
181+ size_t trace_id,
182+ std::shared_ptr<impeller::Context> impeller_context) {
161183 fml::RefPtr<CanvasImage> image = nullptr ;
162184 int duration = 0 ;
163- sk_sp<SkImage> skImage =
164- GetNextFrameImage (std::move (resourceContext), gpu_disable_sync_switch);
165- if (skImage) {
185+ sk_sp<DlImage> dlImage =
186+ GetNextFrameImage (std::move (resourceContext), gpu_disable_sync_switch,
187+ impeller_context, unref_queue);
188+ if (dlImage) {
166189 image = CanvasImage::Create ();
167- image->set_image (DlImageGPU::Make ({skImage, std::move (unref_queue)}) );
190+ image->set_image (dlImage );
168191 ImageGenerator::FrameInfo frameInfo =
169192 generator_->GetFrameInfo (nextFrameIndex_);
170193 duration = frameInfo.duration ;
@@ -218,7 +241,8 @@ Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) {
218241 state->GetNextFrameAndInvokeCallback (
219242 std::move (callback), ui_task_runner,
220243 io_manager->GetResourceContext (), io_manager->GetSkiaUnrefQueue (),
221- io_manager->GetIsGpuDisabledSyncSwitch (), trace_id);
244+ io_manager->GetIsGpuDisabledSyncSwitch (), trace_id,
245+ io_manager->GetImpellerContext ());
222246 }));
223247
224248 return Dart_Null ();
0 commit comments