14#if IMPELLER_SUPPORTS_RENDERING
30 Dart_Handle dart_handle,
31 sk_sp<DisplayList> display_list) {
33 auto canvas_picture = fml::MakeRefCounted<Picture>(std::move(
display_list));
34 canvas_picture->AssociateWithDartWrapper(dart_handle);
37Picture::Picture(sk_sp<DisplayList> display_list)
38 : display_list_(
std::move(display_list)) {}
44 Dart_Handle raw_image_callback) {
53 int32_t target_format,
54 Dart_Handle raw_image_handle) {
58 switch (target_format) {
69 FML_DCHECK(
false) <<
"unknown target format: " << target_format;
79 sk_sp<DisplayList> display_list,
86#if IMPELLER_SUPPORTS_RENDERING
90 std::move(snapshot_delegate), std::move(raster_task_runner));
95 FML_LOG(FATAL) <<
"Impeller opt-out unavailable.";
98 const SkImageInfo image_info = SkImageInfo::Make(
99 width,
height, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
101 std::move(snapshot_delegate),
102 raster_task_runner, unref_queue);
111 Dart_Handle raw_image_handle) {
116 auto unref_queue = dart_state->GetSkiaUnrefQueue();
117 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
118 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
123 target_format, std::move(snapshot_delegate),
124 std::move(raster_task_runner), unref_queue);
125 image->set_image(dl_image);
126 image->AssociateWithDartWrapper(raw_image_handle);
130 display_list_.reset();
136 return display_list_->bytes() +
sizeof(
Picture);
145 Dart_Handle raw_image_callback) {
151 std::unique_ptr<LayerTree> layer_tree,
152 Dart_Handle raw_image_callback) {
154 auto frame_size = layer_tree->frame_size();
156 frame_size.height, raw_image_callback);
160 std::unique_ptr<LayerTree> layer_tree,
163 Dart_Handle raw_image_callback) {
167 if (Dart_IsNull(raw_image_callback) || !Dart_IsClosure(raw_image_callback)) {
172 return tonic::ToDart(
"Image dimensions for scene were invalid.");
176 auto image_callback = std::make_unique<tonic::DartPersistentValue>(
177 dart_state, raw_image_callback);
178 auto unref_queue = dart_state->GetSkiaUnrefQueue();
179 auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
180 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
181 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
192 unref_queue](sk_sp<DlImage>
image)
mutable {
193 auto dart_state = image_callback->dart_state().lock();
205 if (!
image->isUIThreadSafe()) {
213 dart_image->set_image(
image);
221 image_callback.reset();
230 layer_tree = std::move(layer_tree)]()
mutable {
232 sk_sp<DisplayList> snapshot_display_list =
display_list;
234 FML_DCHECK(picture_bounds == layer_tree->frame_size());
235 snapshot_display_list =
237 snapshot_delegate->GetTextureRegistry(),
238 snapshot_delegate->GetGrContext());
240 snapshot_delegate->MakeRasterSnapshot(
241 snapshot_display_list, picture_bounds,
242 [ui_task_runner, ui_task](
const sk_sp<DlImage>&
image) {
244 ui_task_runner, [ui_task,
image]() { ui_task(
image); });
static fml::RefPtr< CanvasImage > Create()
static sk_sp< DlDeferredImageGPUImpeller > Make(std::unique_ptr< LayerTree > layer_tree, fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > snapshot_delegate, fml::RefPtr< fml::TaskRunner > raster_task_runner)
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 sk_sp< DlImageGPU > Make(SkiaGPUObject< SkImage > image)
sk_sp< DisplayList > display_list() const
static void RasterizeToImageSync(sk_sp< DisplayList > display_list, uint32_t width, uint32_t height, SnapshotPixelFormat target_format, Dart_Handle raw_image_handle)
static void CreateAndAssociateWithDartWrapper(Dart_Handle dart_handle, sk_sp< DisplayList > display_list)
Dart_Handle toImage(uint32_t width, uint32_t height, Dart_Handle raw_image_callback)
void toImageSync(uint32_t width, uint32_t height, int32_t target_format, Dart_Handle raw_image_handle)
static Dart_Handle RasterizeLayerTreeToImage(std::unique_ptr< LayerTree > layer_tree, Dart_Handle raw_image_callback)
size_t GetAllocationSize() const
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 Dart_Handle RasterizeToImage(const sk_sp< DisplayList > &display_list, uint32_t width, uint32_t height, Dart_Handle raw_image_callback)
static UIDartState * Current()
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
FlutterVulkanImage * image
#define FML_LOG(severity)
#define FML_DCHECK(condition)
impeller::ISize32 DlISize
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)
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 TRect MakeWH(Type width, Type height)