8
8
9
9
#include " flutter/fml/make_copyable.h"
10
10
#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
11
14
#include " third_party/dart/runtime/include/dart_api.h"
12
15
#include " third_party/skia/include/core/SkPixelRef.h"
13
16
#include " third_party/tonic/logging/dart_invoke.h"
@@ -26,6 +29,7 @@ MultiFrameCodec::State::State(std::shared_ptr<ImageGenerator> generator)
26
29
ImageGenerator::kInfinitePlayCount
27
30
? -1
28
31
: generator_->GetPlayCount() - 1),
32
+ is_impeller_enabled_(UIDartState::Current()->IsImpellerEnabled()),
29
33
nextFrameIndex_(0 ) {}
30
34
31
35
static void InvokeNextFrameCallback (
@@ -77,9 +81,11 @@ static bool CopyToBitmap(SkBitmap* dst,
77
81
return true ;
78
82
}
79
83
80
- sk_sp<SkImage > MultiFrameCodec::State::GetNextFrameImage (
84
+ sk_sp<DlImage > MultiFrameCodec::State::GetNextFrameImage (
81
85
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) {
83
89
SkBitmap bitmap = SkBitmap ();
84
90
SkImageInfo info = generator_->GetInfo ().makeColorType (kN32_SkColorType );
85
91
if (info.alphaType () == kUnpremul_SkAlphaType ) {
@@ -125,30 +131,45 @@ sk_sp<SkImage> MultiFrameCodec::State::GetNextFrameImage(
125
131
lastRequiredFrame_ = std::make_unique<SkBitmap>(bitmap);
126
132
lastRequiredFrameIndex_ = nextFrameIndex_;
127
133
}
128
- sk_sp<SkImage> result;
129
134
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;
130
150
gpu_disable_sync_switch->Execute (
131
151
fml::SyncSwitch::Handlers ()
132
- .SetIfTrue ([&result , &bitmap] {
152
+ .SetIfTrue ([&skImage , &bitmap] {
133
153
// Defer decoding until time of draw later on the raster thread. Can
134
154
// happen when GL operations are currently forbidden such as in the
135
155
// background on iOS.
136
- result = SkImage::MakeFromBitmap (bitmap);
156
+ skImage = SkImage::MakeFromBitmap (bitmap);
137
157
})
138
- .SetIfFalse ([&result , &resourceContext, &bitmap] {
158
+ .SetIfFalse ([&skImage , &resourceContext, &bitmap] {
139
159
if (resourceContext) {
140
160
SkPixmap pixmap (bitmap.info (), bitmap.pixelRef ()->pixels (),
141
161
bitmap.pixelRef ()->rowBytes ());
142
- result = SkImage::MakeCrossContextFromPixmap (
162
+ skImage = SkImage::MakeCrossContextFromPixmap (
143
163
resourceContext.get (), pixmap, true );
144
164
} else {
145
165
// Defer decoding until time of draw later on the raster thread.
146
166
// Can happen when GL operations are currently forbidden such as
147
167
// in the background on iOS.
148
- result = SkImage::MakeFromBitmap (bitmap);
168
+ skImage = SkImage::MakeFromBitmap (bitmap);
149
169
}
150
170
}));
151
- return result;
171
+
172
+ return DlImageGPU::Make ({skImage, std::move (unref_queue)});
152
173
}
153
174
154
175
void MultiFrameCodec::State::GetNextFrameAndInvokeCallback (
@@ -157,14 +178,16 @@ void MultiFrameCodec::State::GetNextFrameAndInvokeCallback(
157
178
fml::WeakPtr<GrDirectContext> resourceContext,
158
179
fml::RefPtr<flutter::SkiaUnrefQueue> unref_queue,
159
180
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) {
161
183
fml::RefPtr<CanvasImage> image = nullptr ;
162
184
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) {
166
189
image = CanvasImage::Create ();
167
- image->set_image (DlImageGPU::Make ({skImage, std::move (unref_queue)}) );
190
+ image->set_image (dlImage );
168
191
ImageGenerator::FrameInfo frameInfo =
169
192
generator_->GetFrameInfo (nextFrameIndex_);
170
193
duration = frameInfo.duration ;
@@ -218,7 +241,8 @@ Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) {
218
241
state->GetNextFrameAndInvokeCallback (
219
242
std::move (callback), ui_task_runner,
220
243
io_manager->GetResourceContext (), io_manager->GetSkiaUnrefQueue (),
221
- io_manager->GetIsGpuDisabledSyncSwitch (), trace_id);
244
+ io_manager->GetIsGpuDisabledSyncSwitch (), trace_id,
245
+ io_manager->GetImpellerContext ());
222
246
}));
223
247
224
248
return Dart_Null ();
0 commit comments