80 sk_sp<DisplayList> display_list,
87#if IMPELLER_SUPPORTS_RENDERING
91 std::move(snapshot_delegate), std::move(raster_task_runner));
96 FML_LOG(FATAL) <<
"Impeller opt-out unavailable.";
99 const SkImageInfo image_info = SkImageInfo::Make(
100 width,
height, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
102 std::move(snapshot_delegate),
103 raster_task_runner, unref_queue);
112 Dart_Handle raw_image_handle) {
117 auto unref_queue = dart_state->GetSkiaUnrefQueue();
118 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
119 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
124 target_format, std::move(snapshot_delegate),
125 std::move(raster_task_runner), unref_queue);
126 image->set_image(dl_image);
127 image->AssociateWithDartWrapper(raw_image_handle);
163 std::unique_ptr<LayerTree> layer_tree,
164 Dart_Handle raw_image_callback) {
166 auto frame_size = layer_tree->frame_size();
168 frame_size.height, raw_image_callback);
172 std::unique_ptr<LayerTree> layer_tree,
175 Dart_Handle raw_image_callback) {
179 if (Dart_IsNull(raw_image_callback) || !Dart_IsClosure(raw_image_callback)) {
184 return tonic::ToDart(
"Image dimensions for scene were invalid.");
188 auto image_callback = std::make_unique<tonic::DartPersistentValue>(
189 dart_state, raw_image_callback);
190 auto unref_queue = dart_state->GetSkiaUnrefQueue();
191 auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
192 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
193 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
194#if IMPELLER_SUPPORTS_RENDERING
195 auto is_impeller_enabled = dart_state->IsImpellerEnabled();
197 auto is_impeller_enabled =
false;
209 unref_queue](sk_sp<DlImage>
image)
mutable {
210 auto dart_state = image_callback->dart_state().lock();
222 if (!
image->isUIThreadSafe()) {
225 auto skia_image =
image->asSkiaImage();
228 std::move(unref_queue)});
232 dart_image->set_image(
image);
240 image_callback.reset();
248 height, ui_task, is_impeller_enabled,
249 layer_tree = std::move(layer_tree)]()
mutable {
251 sk_sp<DisplayList> snapshot_display_list =
display_list;
253 FML_DCHECK(picture_bounds == layer_tree->frame_size());
254 snapshot_display_list =
256 snapshot_delegate->GetTextureRegistry(),
257 snapshot_delegate->GetGrContext());
259 if (is_impeller_enabled) {
260#if IMPELLER_SUPPORTS_RENDERING
261 snapshot_delegate->MakeImpellerSnapshot(
262 snapshot_display_list, picture_bounds,
264 ui_task](
const std::shared_ptr<impeller::Texture>&
texture) {
266 ui_task_runner, [ui_task,
texture]() {
267 ui_task(MakeImpellerImage(
texture));
273 snapshot_delegate->MakeSkiaSnapshot(
274 snapshot_display_list, picture_bounds,
275 [ui_task_runner, ui_task](
const sk_sp<SkImage>& sk_image) {
277 ui_task_runner, [ui_task, sk_image]() {
278 sk_sp<DlImage>
image;
282 ui_task(std::move(
image));
static sk_sp< DlDeferredImageGPUSkia > Make(const SkImageInfo &image_info, sk_sp< DisplayList > display_list, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, const fml::RefPtr< fml::TaskRunner > &raster_task_runner, fml::RefPtr< SkiaUnrefQueue > unref_queue)
static Dart_Handle DoRasterizeToImage(const sk_sp< DisplayList > &display_list, std::unique_ptr< LayerTree > layer_tree, uint32_t width, uint32_t height, Dart_Handle raw_image_callback)
static sk_sp< DlImage > CreateDeferredImage(bool impeller, std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, fml::RefPtr< fml::TaskRunner > raster_task_runner, const fml::RefPtr< SkiaUnrefQueue > &unref_queue)