// 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/container_layer.h" namespace flow { ContainerLayer::ContainerLayer() { ctm_.setIdentity(); } ContainerLayer::~ContainerLayer() {} void ContainerLayer::Add(std::unique_ptr layer) { layer->set_parent(this); layers_.push_back(std::move(layer)); } void ContainerLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { TRACE_EVENT0("flutter", "ContainerLayer::Preroll"); PrerollChildren(context, matrix); set_paint_bounds(context->child_paint_bounds); } void ContainerLayer::PrerollChildren(PrerollContext* context, const SkMatrix& matrix) { SkRect child_paint_bounds = SkRect::MakeEmpty(); for (auto& layer : layers_) { PrerollContext child_context = *context; FTL_DCHECK(child_context.child_paint_bounds.isEmpty()); layer->Preroll(&child_context, matrix); if (layer->needs_system_composite()) set_needs_system_composite(true); child_paint_bounds.join(child_context.child_paint_bounds); } context->child_paint_bounds = child_paint_bounds; if (needs_system_composite()) ctm_ = matrix; } void ContainerLayer::PaintChildren(PaintContext& context) const { FTL_DCHECK(!needs_system_composite()); // Intentionally not tracing here as there should be no self-time // and the trace event on this common function has a small overhead. for (auto& layer : layers_) layer->Paint(context); } #if defined(OS_FUCHSIA) void ContainerLayer::UpdateScene(SceneUpdateContext& context, mozart::Node* container) { UpdateSceneChildren(context, container); } void ContainerLayer::UpdateSceneChildrenInsideNode(SceneUpdateContext& context, mozart::Node* container, mozart::NodePtr node) { FTL_DCHECK(needs_system_composite()); UpdateSceneChildren(context, node.get()); context.FinalizeCurrentPaintTaskIfNeeded(node.get(), ctm()); context.AddChildNode(container, std::move(node)); } void ContainerLayer::UpdateSceneChildren(SceneUpdateContext& context, mozart::Node* container) { FTL_DCHECK(needs_system_composite()); for (auto& layer : layers_) { if (layer->needs_system_composite()) { context.FinalizeCurrentPaintTaskIfNeeded(container, ctm()); layer->UpdateScene(context, container); } else { context.AddLayerToCurrentPaintTask(layer.get()); } } } #endif // defined(OS_FUCHSIA) } // namespace flow