@@ -22,6 +22,19 @@ sk_sp<DlDeferredImageGPU> DlDeferredImageGPU::Make(
2222 raster_task_runner));
2323}
2424
25+ sk_sp<DlDeferredImageGPU> DlDeferredImageGPU::MakeFromLayerTree (
26+ const SkImageInfo& image_info,
27+ std::shared_ptr<LayerTree> layer_tree,
28+ fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
29+ fml::RefPtr<fml::TaskRunner> raster_task_runner,
30+ fml::RefPtr<SkiaUnrefQueue> unref_queue) {
31+ return sk_sp<DlDeferredImageGPU>(new DlDeferredImageGPU (
32+ ImageWrapper::MakeFromLayerTree (
33+ image_info, std::move (layer_tree), std::move (snapshot_delegate),
34+ raster_task_runner, std::move (unref_queue)),
35+ raster_task_runner));
36+ }
37+
2538DlDeferredImageGPU::DlDeferredImageGPU (
2639 std::shared_ptr<ImageWrapper> image_wrapper,
2740 fml::RefPtr<fml::TaskRunner> raster_task_runner)
@@ -92,6 +105,20 @@ DlDeferredImageGPU::ImageWrapper::Make(
92105 return wrapper;
93106}
94107
108+ std::shared_ptr<DlDeferredImageGPU::ImageWrapper>
109+ DlDeferredImageGPU::ImageWrapper::MakeFromLayerTree (
110+ const SkImageInfo& image_info,
111+ std::shared_ptr<LayerTree> layer_tree,
112+ fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
113+ fml::RefPtr<fml::TaskRunner> raster_task_runner,
114+ fml::RefPtr<SkiaUnrefQueue> unref_queue) {
115+ auto wrapper = std::shared_ptr<ImageWrapper>(
116+ new ImageWrapper (image_info, nullptr , std::move (snapshot_delegate),
117+ std::move (raster_task_runner), std::move (unref_queue)));
118+ wrapper->SnapshotDisplayList (std::move (layer_tree));
119+ return wrapper;
120+ }
121+
95122DlDeferredImageGPU::ImageWrapper::ImageWrapper (
96123 const SkImageInfo& image_info,
97124 sk_sp<DisplayList> display_list,
@@ -131,9 +158,11 @@ bool DlDeferredImageGPU::ImageWrapper::isTextureBacked() const {
131158 return texture_.isValid ();
132159}
133160
134- void DlDeferredImageGPU::ImageWrapper::SnapshotDisplayList () {
161+ void DlDeferredImageGPU::ImageWrapper::SnapshotDisplayList (
162+ std::shared_ptr<LayerTree> layer_tree) {
135163 fml::TaskRunner::RunNowOrPostTask (
136- raster_task_runner_, [weak_this = weak_from_this ()]() {
164+ raster_task_runner_,
165+ [weak_this = weak_from_this (), layer_tree = std::move (layer_tree)]() {
137166 auto wrapper = weak_this.lock ();
138167 if (!wrapper) {
139168 return ;
@@ -142,6 +171,14 @@ void DlDeferredImageGPU::ImageWrapper::SnapshotDisplayList() {
142171 if (!snapshot_delegate) {
143172 return ;
144173 }
174+ if (layer_tree) {
175+ auto display_list =
176+ layer_tree->Flatten (SkRect::MakeWH (wrapper->image_info_ .width (),
177+ wrapper->image_info_ .height ()),
178+ snapshot_delegate->GetTextureRegistry (),
179+ snapshot_delegate->GetGrContext ());
180+ wrapper->display_list_ = std::move (display_list);
181+ }
145182 auto result = snapshot_delegate->MakeGpuImage (wrapper->display_list_ ,
146183 wrapper->image_info_ );
147184 if (result->texture .isValid ()) {
0 commit comments