137 {
138
140
143 }
144
146 return tonic::ToDart(
"Image dimensions for scene were invalid.");
147 }
148
150 auto image_callback = std::make_unique<tonic::DartPersistentValue>(
151 dart_state, raw_image_callback);
152 auto unref_queue = dart_state->GetSkiaUnrefQueue();
153 auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
154 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
155 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
156
157
158
159
160
161
162 auto ui_task =
163
164
167 auto dart_state = image_callback->dart_state().lock();
168 if (!dart_state) {
169
170 return;
171 }
173
176 return;
177 }
178
179 if (!
image->isUIThreadSafe()) {
180
184 }
185
187 dart_image->set_image(
image);
189
190
192
193
194
195 image_callback.reset();
196 });
197
198
200 raster_task_runner,
203 layer_tree = std::move(layer_tree)]() mutable {
206 if (layer_tree) {
207 FML_DCHECK(picture_bounds == layer_tree->frame_size());
210 snapshot_delegate->GetTextureRegistry(),
211 snapshot_delegate->GetGrContext());
212
214 picture_bounds);
215 } else {
217 picture_bounds);
218 }
219
221 ui_task_runner, [ui_task,
image]() { ui_task(
image); });
222 }));
223
225}
static fml::RefPtr< CanvasImage > Create()
static sk_sp< DlImageGPU > Make(SkiaGPUObject< SkImage > image)
static UIDartState * Current()
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
DART_EXPORT Dart_Handle Dart_Null(void)
DART_EXPORT bool Dart_IsNull(Dart_Handle object)
DART_EXPORT bool Dart_IsClosure(Dart_Handle object)
internal::CopyableLambda< T > MakeCopyable(T lambda)
Dart_Handle ToDart(const T &object)
Dart_Handle DartInvoke(Dart_Handle closure, std::initializer_list< Dart_Handle > args)
static constexpr SkISize Make(int32_t w, int32_t h)
static constexpr SkRect MakeWH(float w, float h)