Make LayerTree::Flatten use DisplayList (flutter/engine#34227)

This commit is contained in:
Dan Field 2022-06-22 12:27:04 -07:00 committed by GitHub
parent 727c66750e
commit a33b1e7c6f
5 changed files with 19 additions and 24 deletions

View File

@ -113,15 +113,10 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame,
}
}
sk_sp<SkPicture> LayerTree::Flatten(const SkRect& bounds) {
sk_sp<DisplayList> LayerTree::Flatten(const SkRect& bounds) {
TRACE_EVENT0("flutter", "LayerTree::Flatten");
SkPictureRecorder recorder;
auto* canvas = recorder.beginRecording(bounds);
if (!canvas) {
return nullptr;
}
DisplayListCanvasRecorder builder(bounds);
MutatorsStack unused_stack;
const FixedRefreshRateStopwatch unused_stopwatch;
@ -147,14 +142,14 @@ sk_sp<SkPicture> LayerTree::Flatten(const SkRect& bounds) {
// clang-format on
};
SkISize canvas_size = canvas->getBaseLayerSize();
SkISize canvas_size = builder.getBaseLayerSize();
SkNWayCanvas internal_nodes_canvas(canvas_size.width(), canvas_size.height());
internal_nodes_canvas.addCanvas(canvas);
internal_nodes_canvas.addCanvas(&builder);
Layer::PaintContext paint_context = {
// clang-format off
.internal_nodes_canvas = &internal_nodes_canvas,
.leaf_nodes_canvas = canvas,
.leaf_nodes_canvas = &builder,
.gr_context = nullptr,
.view_embedder = nullptr,
.raster_time = unused_stopwatch,
@ -178,7 +173,7 @@ sk_sp<SkPicture> LayerTree::Flatten(const SkRect& bounds) {
}
}
return recorder.finishRecordingAsPicture();
return builder.Build();
}
} // namespace flutter

View File

@ -35,7 +35,7 @@ class LayerTree {
void Paint(CompositorContext::ScopedFrame& frame,
bool ignore_raster_cache = false) const;
sk_sp<SkPicture> Flatten(const SkRect& bounds);
sk_sp<DisplayList> Flatten(const SkRect& bounds);
Layer* root_layer() const { return root_layer_.get(); }

View File

@ -58,17 +58,17 @@ Dart_Handle Picture::toImage(uint32_t width,
uint32_t height,
Dart_Handle raw_image_callback) {
if (display_list_.skia_object()) {
return RasterizeToImage(
[display_list = display_list_.skia_object()](SkCanvas* canvas) {
display_list->RenderTo(canvas);
},
width, height, raw_image_callback);
return RasterizeToImage(display_list_.skia_object(), width, height,
raw_image_callback);
} else {
if (!picture_.skia_object()) {
return tonic::ToDart("Picture is null");
}
return RasterizeToImage(picture_.skia_object(), width, height,
raw_image_callback);
return RasterizeToImage(
[picture = picture_.skia_object()](SkCanvas* canvas) {
canvas->drawPicture(picture);
},
width, height, raw_image_callback);
}
}
@ -88,13 +88,13 @@ size_t Picture::GetAllocationSize() const {
}
}
Dart_Handle Picture::RasterizeToImage(sk_sp<SkPicture> picture,
Dart_Handle Picture::RasterizeToImage(sk_sp<DisplayList> display_list,
uint32_t width,
uint32_t height,
Dart_Handle raw_image_callback) {
return RasterizeToImage(
[picture](SkCanvas* canvas) { canvas->drawPicture(picture); }, width,
height, raw_image_callback);
[display_list](SkCanvas* canvas) { display_list->RenderTo(canvas); },
width, height, raw_image_callback);
}
Dart_Handle Picture::RasterizeToImage(

View File

@ -46,7 +46,7 @@ class Picture : public RefCountedDartWrappable<Picture> {
static void RegisterNatives(tonic::DartLibraryNatives* natives);
static Dart_Handle RasterizeToImage(sk_sp<SkPicture> picture,
static Dart_Handle RasterizeToImage(sk_sp<DisplayList> display_list,
uint32_t width,
uint32_t height,
Dart_Handle raw_image_callback);

View File

@ -65,6 +65,6 @@ void main() {
}
}
expect(saveLayerRecordCount, 3);
expect(saveLayerCount, 3);
expect(saveLayerCount, 6);
});
}