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 Dart_Handle raw_image_handle) {
60 sk_sp<DisplayList> display_list,
66#if IMPELLER_SUPPORTS_RENDERING
70 std::move(snapshot_delegate), std::move(raster_task_runner));
75 FML_LOG(FATAL) <<
"Impeller opt-out unavailable.";
78 const SkImageInfo image_info = SkImageInfo::Make(
79 width,
height, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
81 std::move(snapshot_delegate),
82 raster_task_runner, unref_queue);
90 Dart_Handle raw_image_handle) {
95 auto unref_queue = dart_state->GetSkiaUnrefQueue();
96 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
97 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
102 std::move(snapshot_delegate), std::move(raster_task_runner), unref_queue);
103 image->set_image(dl_image);
104 image->AssociateWithDartWrapper(raw_image_handle);
108 display_list_.reset();
114 return display_list_->bytes() +
sizeof(
Picture);
123 Dart_Handle raw_image_callback) {
129 std::unique_ptr<LayerTree> layer_tree,
130 Dart_Handle raw_image_callback) {
132 auto frame_size = layer_tree->frame_size();
134 frame_size.height, raw_image_callback);
138 std::unique_ptr<LayerTree> layer_tree,
141 Dart_Handle raw_image_callback) {
145 if (Dart_IsNull(raw_image_callback) || !Dart_IsClosure(raw_image_callback)) {
150 return tonic::ToDart(
"Image dimensions for scene were invalid.");
154 auto image_callback = std::make_unique<tonic::DartPersistentValue>(
155 dart_state, raw_image_callback);
156 auto unref_queue = dart_state->GetSkiaUnrefQueue();
157 auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
158 auto raster_task_runner = dart_state->GetTaskRunners().GetRasterTaskRunner();
159 auto snapshot_delegate = dart_state->GetSnapshotDelegate();
170 unref_queue](sk_sp<DlImage>
image)
mutable {
171 auto dart_state = image_callback->dart_state().lock();
183 if (!
image->isUIThreadSafe()) {
191 dart_image->set_image(
image);
199 image_callback.reset();
208 layer_tree = std::move(layer_tree)]()
mutable {
210 sk_sp<DisplayList> snapshot_display_list =
display_list;
212 FML_DCHECK(picture_bounds == layer_tree->frame_size());
213 snapshot_display_list =
215 snapshot_delegate->GetTextureRegistry(),
216 snapshot_delegate->GetGrContext());
218 snapshot_delegate->MakeRasterSnapshot(
219 snapshot_display_list, picture_bounds,
220 [ui_task_runner, ui_task](
const sk_sp<DlImage>&
image) {
222 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 CreateAndAssociateWithDartWrapper(Dart_Handle dart_handle, sk_sp< DisplayList > display_list)
Dart_Handle toImage(uint32_t width, uint32_t height, Dart_Handle raw_image_callback)
static Dart_Handle RasterizeLayerTreeToImage(std::unique_ptr< LayerTree > layer_tree, Dart_Handle raw_image_callback)
size_t GetAllocationSize() const
void toImageSync(uint32_t width, uint32_t height, Dart_Handle raw_image_handle)
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 void RasterizeToImageSync(sk_sp< DisplayList > display_list, uint32_t width, uint32_t height, Dart_Handle raw_image_handle)
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)