blob: 577a79dec15d2ebe44eb93102b79d70b2cc4d04a [file] [log] [blame]
// Copyright 2016 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.
#ifndef CC_TREES_TRANSFORM_NODE_H_
#define CC_TREES_TRANSFORM_NODE_H_
#include "cc/cc_export.h"
#include "cc/paint/element_id.h"
#include "ui/gfx/geometry/point3_f.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/scroll_offset.h"
#include "ui/gfx/transform.h"
namespace base {
namespace trace_event {
class TracedValue;
} // namespace trace_event
} // namespace base
namespace cc {
struct CC_EXPORT TransformNode {
TransformNode();
TransformNode(const TransformNode&);
// The node index of this node in the transform tree node vector.
int id;
// The node index of the parent node in the transform tree node vector.
int parent_id;
// The node index of the nearest parent frame node in the transform tree node
// vector.
int parent_frame_id;
ElementId element_id;
// The local transform information is combined to form to_parent (ignoring
// snapping) as follows:
// to_parent =
// T_post_translation * T_origin * T_scroll * M_local * -T_origin.
gfx::Transform local;
gfx::Point3F origin;
// For layer tree mode only. In layer list mode, when the translation is
// needed, blink creates paint offset translation node above this node.
gfx::Vector2dF post_translation;
gfx::Transform to_parent;
// This is the node which defines the sticky position constraints for this
// transform node. -1 indicates there are no sticky position constraints.
int sticky_position_constraint_id;
// This id determines which 3d rendering context the node is in. 0 is a
// special value and indicates that the node is not in any 3d rendering
// context.
int sorting_context_id;
// True if |TransformTree::UpdateLocalTransform| needs to be called which
// will update |to_parent|.
bool needs_local_transform_update : 1;
// Whether this node or any ancestor has a potentially running
// (i.e., irrespective of exact timeline) transform animation or an
// invertible transform.
bool node_and_ancestors_are_animated_or_invertible : 1;
bool is_invertible : 1;
// Whether the transform from this node to the screen is
// invertible.
bool ancestors_are_invertible : 1;
// Whether this node has a potentially running (i.e., irrespective
// of exact timeline) transform animation.
bool has_potential_animation : 1;
// Whether this node has a currently running transform animation.
bool is_currently_animating : 1;
// Whether this node *or an ancestor* has a potentially running
// (i.e., irrespective of exact timeline) transform
// animation.
bool to_screen_is_potentially_animated : 1;
// Flattening, when needed, is only applied to a node's inherited transform,
// never to its local transform. It's true by default.
bool flattens_inherited_transform : 1;
// This is true if the to_parent transform at every node on the path to the
// root is flat.
bool node_and_ancestors_are_flat : 1;
bool scrolls : 1;
bool should_be_snapped : 1;
// Used by the compositor to determine which layers need to be repositioned by
// the compositor as a result of browser controls expanding/contracting the
// outer viewport size before Blink repositions the fixed layers.
bool moved_by_outer_viewport_bounds_delta_y : 1;
// Layer scale factor is used as a fallback when we either cannot adjust
// raster scale or if the raster scale cannot be extracted from the screen
// space transform. For layers in the subtree of the page scale layer, the
// layer scale factor should include the page scale factor.
bool in_subtree_of_page_scale_layer : 1;
// We need to track changes to to_screen transform to compute the damage rect.
bool transform_changed : 1;
// Whether the parent transform node should be used for checking backface
// visibility, not this transform one.
bool delegates_to_parent_for_backface : 1;
// Set to true, if the compositing reason is will-change:transform.
bool will_change_transform : 1;
// Set to true, if the node or it's parent |will_change_transform| is true.
bool node_or_ancestors_will_change_transform : 1;
gfx::ScrollOffset scroll_offset;
// This value stores the snapped amount whenever we snap. If the snap is due
// to a scroll, we need it to calculate fixed-pos elements adjustment, even
// otherwise we may need it to undo the snapping next frame.
gfx::Vector2dF snap_amount;
// See MutatorHost::GetAnimationScales() for their meanings. Updated by
// PropertyTrees::AnimationScalesChanged().
float maximum_animation_scale;
float starting_animation_scale;
// Set to the element ID of containing document if this transform node is the
// root of a visible frame subtree.
ElementId visible_frame_element_id;
#if DCHECK_IS_ON()
bool operator==(const TransformNode& other) const;
#endif
void set_to_parent(const gfx::Transform& transform) {
to_parent = transform;
is_invertible = to_parent.IsInvertible();
}
void AsValueInto(base::trace_event::TracedValue* value) const;
};
// TODO(sunxd): move this into PropertyTrees::cached_data_.
struct CC_EXPORT TransformCachedNodeData {
TransformCachedNodeData();
TransformCachedNodeData(const TransformCachedNodeData& other);
~TransformCachedNodeData();
gfx::Transform from_screen;
gfx::Transform to_screen;
bool is_showing_backface : 1;
bool operator==(const TransformCachedNodeData& other) const;
};
} // namespace cc
#endif // CC_TREES_TRANSFORM_NODE_H_