blob: ac0a81d4c6f9256f9d43735477d518e23fb20ddb [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/trees/property_tree_layer_tree_delegate.h"
#include "base/trace_event/trace_event.h"
#include "cc/layers/heads_up_display_layer.h"
#include "cc/trees/layer_tree_host.h"
#include "cc/trees/mutator_host_client.h"
#include "cc/trees/property_tree_builder.h"
namespace cc {
void PropertyTreeLayerTreeDelegate::SetLayerTreeHost(LayerTreeHost* host) {
host_ = host;
}
LayerTreeHost* PropertyTreeLayerTreeDelegate::host() {
return host_;
}
const LayerTreeHost* PropertyTreeLayerTreeDelegate::host() const {
return host_;
}
void PropertyTreeLayerTreeDelegate::UpdatePropertyTreesIfNeeded() {
TRACE_EVENT0("cc",
"PropertyTreeLayerTreeDelegate::UpdatePropertyTreesIfNeeded");
PropertyTreeBuilder::BuildPropertyTrees(host());
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"PropertyTreeLayerTreeDelegate::"
"UpdatePropertyTreesIfNeeded_BuiltPropertyTrees",
TRACE_EVENT_SCOPE_THREAD, "property_trees",
host()->property_trees()->AsTracedValue());
}
void PropertyTreeLayerTreeDelegate::UpdateScrollOffsetFromImpl(
const ElementId& id,
const gfx::Vector2dF& delta,
ScrollSourceType type,
const std::optional<TargetSnapAreaElementIds>& snap_target_ids) {
if (Layer* layer = host()->LayerByElementId(id)) {
layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + delta);
host()->SetNeedsUpdateLayers();
}
}
void PropertyTreeLayerTreeDelegate::OnAnimateLayers() {
// Animation state changes will require rebuilding property trees to
// track them.
host()->property_trees()->set_needs_rebuild(true);
}
void PropertyTreeLayerTreeDelegate::RegisterViewportPropertyIds(
const ViewportPropertyIds& ids) {
// This is a no-op in layer tree mode.
}
void PropertyTreeLayerTreeDelegate::OnUnregisterElement(ElementId element_id) {
host()->mutator_host()->RemoveElementId(element_id);
}
bool PropertyTreeLayerTreeDelegate::IsElementInPropertyTrees(
ElementId element_id,
ElementListType list_type) const {
return list_type == ElementListType::ACTIVE &&
host_->LayerByElementId(element_id);
}
void PropertyTreeLayerTreeDelegate::OnElementFilterMutated(
ElementId element_id,
ElementListType list_type,
const FilterOperations& filters) {
Layer* layer = host()->LayerByElementId(element_id);
DCHECK(layer);
layer->OnFilterAnimated(filters);
}
void PropertyTreeLayerTreeDelegate::OnElementBackdropFilterMutated(
ElementId element_id,
ElementListType list_type,
const FilterOperations& backdrop_filters) {
Layer* layer = host()->LayerByElementId(element_id);
DCHECK(layer);
layer->OnBackdropFilterAnimated(backdrop_filters);
}
void PropertyTreeLayerTreeDelegate::OnElementOpacityMutated(
ElementId element_id,
ElementListType list_type,
float opacity) {
Layer* layer = host()->LayerByElementId(element_id);
DCHECK(layer);
layer->OnOpacityAnimated(opacity);
if (EffectNode* node = host()->property_trees()->effect_tree_mutable().Node(
layer->effect_tree_index())) {
DCHECK_EQ(layer->effect_tree_index(), node->id);
if (node->opacity == opacity) {
return;
}
node->opacity = opacity;
host()->property_trees()->effect_tree_mutable().set_needs_update(true);
}
host()->SetNeedsUpdateLayers();
}
void PropertyTreeLayerTreeDelegate::OnElementTransformMutated(
ElementId element_id,
ElementListType list_type,
const gfx::Transform& transform) {
Layer* layer = host()->LayerByElementId(element_id);
DCHECK(layer);
layer->OnTransformAnimated(transform);
if (layer->has_transform_node()) {
TransformNode* node =
host()->property_trees()->transform_tree_mutable().Node(
layer->transform_tree_index());
if (node->local == transform) {
return;
}
node->local = transform;
node->needs_local_transform_update = true;
node->has_potential_animation = true;
host()->property_trees()->transform_tree_mutable().set_needs_update(true);
}
host()->SetNeedsUpdateLayers();
}
} // namespace cc