mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Compute the necessary texture resolution using more accurate scaling information provided by Mozart scene node metrics events instead of the device pixel ratio provided by the Mozart view properties (which we might remove in the future). This allows us to allocate smaller textures when a Flutter view is being scaled down.
75 lines
2.5 KiB
C++
75 lines
2.5 KiB
C++
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "flutter/flow/layers/layer_tree.h"
|
|
|
|
#include "flutter/flow/layers/layer.h"
|
|
#include "flutter/glue/trace_event.h"
|
|
|
|
namespace flow {
|
|
|
|
LayerTree::LayerTree()
|
|
: frame_size_{},
|
|
rasterizer_tracing_threshold_(0),
|
|
checkerboard_raster_cache_images_(false),
|
|
checkerboard_offscreen_layers_(false) {}
|
|
|
|
LayerTree::~LayerTree() = default;
|
|
|
|
void LayerTree::Raster(CompositorContext::ScopedFrame& frame,
|
|
bool ignore_raster_cache) {
|
|
Preroll(frame, ignore_raster_cache);
|
|
Paint(frame);
|
|
}
|
|
|
|
void LayerTree::Preroll(CompositorContext::ScopedFrame& frame,
|
|
bool ignore_raster_cache) {
|
|
TRACE_EVENT0("flutter", "LayerTree::Preroll");
|
|
SkColorSpace* color_space =
|
|
frame.canvas() ? frame.canvas()->imageInfo().colorSpace() : nullptr;
|
|
frame.context().raster_cache().SetCheckboardCacheImages(
|
|
checkerboard_raster_cache_images_);
|
|
Layer::PrerollContext context = {
|
|
ignore_raster_cache ? nullptr : &frame.context().raster_cache(),
|
|
frame.gr_context(), color_space, SkRect::MakeEmpty(),
|
|
};
|
|
|
|
root_layer_->Preroll(&context, SkMatrix::I());
|
|
}
|
|
|
|
#if defined(OS_FUCHSIA)
|
|
void LayerTree::UpdateScene(SceneUpdateContext& context,
|
|
mozart::client::ContainerNode& container) {
|
|
TRACE_EVENT0("flutter", "LayerTree::UpdateScene");
|
|
|
|
SceneUpdateContext::Transform transform(context, 1.f / device_pixel_ratio_,
|
|
1.f / device_pixel_ratio_, 1.f);
|
|
SceneUpdateContext::Frame frame(
|
|
context,
|
|
SkRRect::MakeRect(
|
|
SkRect::MakeWH(frame_size_.width(), frame_size_.height())),
|
|
SK_ColorTRANSPARENT, 0.f);
|
|
if (root_layer_->needs_system_composite()) {
|
|
root_layer_->UpdateScene(context);
|
|
}
|
|
if (root_layer_->needs_painting()) {
|
|
frame.AddPaintedLayer(root_layer_.get());
|
|
}
|
|
container.AddChild(transform.entity_node());
|
|
}
|
|
#endif
|
|
|
|
void LayerTree::Paint(CompositorContext::ScopedFrame& frame) {
|
|
Layer::PaintContext context = {*frame.canvas(), frame.context().frame_time(),
|
|
frame.context().engine_time(),
|
|
frame.context().memory_usage(),
|
|
checkerboard_offscreen_layers_};
|
|
TRACE_EVENT0("flutter", "LayerTree::Paint");
|
|
|
|
if (root_layer_->needs_painting())
|
|
root_layer_->Paint(context);
|
|
}
|
|
|
|
} // namespace flow
|