Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(870)

Unified Diff: cc/trees/property_tree.h

Issue 2118993002: Detemplatize cc property nodes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_impl_unittest.cc ('k') | cc/trees/property_tree.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/property_tree.h
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
index 68a99767f0a13a888f40648dc67893d93357cbe8..4dbf6c4642db794052fe95cef923ecfe33f08eff 100644
--- a/cc/trees/property_tree.h
+++ b/cc/trees/property_tree.h
@@ -14,7 +14,6 @@
#include "cc/animation/element_id.h"
#include "cc/base/cc_export.h"
#include "cc/base/synced_property.h"
-#include "cc/output/filter_operations.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/scroll_offset.h"
#include "ui/gfx/transform.h"
@@ -28,22 +27,21 @@ class TracedValue;
namespace cc {
namespace proto {
-class ClipNodeData;
-class EffectNodeData;
class PropertyTree;
class PropertyTrees;
class ScrollNodeData;
-class TransformNodeData;
-class TransformCachedNodeData;
-class TransformTreeData;
class TreeNode;
} // namespace proto
class CopyOutputRequest;
class LayerTreeImpl;
-class RenderSurfaceImpl;
class ScrollState;
+struct ClipNode;
+struct EffectNode;
struct ScrollAndScaleSet;
+struct ScrollNode;
+struct TransformNode;
+struct TransformCachedNodeData;
// ------------------------------*IMPORTANT*---------------------------------
// Each class declared here has a corresponding proto defined in
@@ -54,290 +52,6 @@ struct ScrollAndScaleSet;
typedef SyncedProperty<AdditionGroup<gfx::ScrollOffset>> SyncedScrollOffset;
-template <typename T>
-struct CC_EXPORT TreeNode {
- TreeNode() : id(-1), parent_id(-1), owner_id(-1), data() {}
- int id;
- int parent_id;
- int owner_id;
- T data;
-
- bool operator==(const TreeNode<T>& other) const;
-
- void ToProtobuf(proto::TreeNode* proto) const;
- void FromProtobuf(const proto::TreeNode& proto);
-
- void AsValueInto(base::trace_event::TracedValue* value) const;
-};
-
-struct CC_EXPORT TransformNodeData {
- TransformNodeData();
- TransformNodeData(const TransformNodeData& other);
- ~TransformNodeData();
-
- // The local transform information is combined to form to_parent (ignoring
- // snapping) as follows:
- //
- // to_parent = M_post_local * T_scroll * M_local * M_pre_local.
- //
- // The pre/post may seem odd when read LTR, but we multiply our points from
- // the right, so the pre_local matrix affects the result "first". This lines
- // up with the notions of pre/post used in skia and gfx::Transform.
- //
- // TODO(vollick): The values labeled with "will be moved..." take up a lot of
- // space, but are only necessary for animated or scrolled nodes (otherwise
- // we'll just use the baked to_parent). These values will be ultimately stored
- // directly on the transform/scroll display list items when that's possible,
- // or potentially in a scroll tree.
- //
- // TODO(vollick): will be moved when accelerated effects are implemented.
- gfx::Transform pre_local;
- gfx::Transform local;
- gfx::Transform post_local;
-
- gfx::Transform to_parent;
-
- // This is the node with respect to which source_offset is defined. This will
- // not be needed once layerization moves to cc, but is needed in order to
- // efficiently update the transform tree for changes to position in the layer
- // tree.
- int source_node_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;
-
- // TODO(vollick): will be moved when accelerated effects are implemented.
- bool needs_local_transform_update : 1;
-
- bool node_and_ancestors_are_animated_or_invertible : 1;
-
- bool is_invertible : 1;
- bool ancestors_are_invertible : 1;
-
- bool has_potential_animation : 1;
- bool is_currently_animating : 1;
- bool to_screen_is_potentially_animated : 1;
- bool has_only_translation_animations : 1;
-
- // Flattening, when needed, is only applied to a node's inherited transform,
- // never to its local transform.
- 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;
-
- // This is needed to know if a layer can use lcd text.
- bool node_and_ancestors_have_only_integer_translation : 1;
-
- bool scrolls : 1;
-
- bool needs_sublayer_scale : 1;
-
- // These are used to position nodes wrt the right or bottom of the inner or
- // outer viewport.
- bool affected_by_inner_viewport_bounds_delta_x : 1;
- bool affected_by_inner_viewport_bounds_delta_y : 1;
- bool affected_by_outer_viewport_bounds_delta_x : 1;
- bool affected_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;
-
- // TODO(vollick): will be moved when accelerated effects are implemented.
- float post_local_scale_factor;
-
- gfx::Vector2dF sublayer_scale;
-
- // TODO(vollick): will be moved when accelerated effects are implemented.
- gfx::ScrollOffset scroll_offset;
-
- // We scroll snap where possible, but this means fixed-pos elements must be
- // adjusted. This value stores the snapped amount for this purpose.
- gfx::Vector2dF scroll_snap;
-
- // TODO(vollick): will be moved when accelerated effects are implemented.
- gfx::Vector2dF source_offset;
- gfx::Vector2dF source_to_parent;
-
- bool operator==(const TransformNodeData& other) const;
-
- void set_to_parent(const gfx::Transform& transform) {
- to_parent = transform;
- is_invertible = to_parent.IsInvertible();
- }
-
- void update_pre_local_transform(const gfx::Point3F& transform_origin);
-
- void update_post_local_transform(const gfx::PointF& position,
- const gfx::Point3F& transform_origin);
-
- void ToProtobuf(proto::TreeNode* proto) const;
- void FromProtobuf(const proto::TreeNode& proto);
-
- 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_target;
- gfx::Transform to_target;
- gfx::Transform from_screen;
- gfx::Transform to_screen;
- int target_id;
- // This id is used for all content that draws into a render surface associated
- // with this transform node.
- int content_target_id;
-
- bool operator==(const TransformCachedNodeData& other) const;
-
- void ToProtobuf(proto::TransformCachedNodeData* proto) const;
- void FromProtobuf(const proto::TransformCachedNodeData& proto);
-};
-
-typedef TreeNode<TransformNodeData> TransformNode;
-
-struct CC_EXPORT ClipNodeData {
- ClipNodeData();
- ClipNodeData(const ClipNodeData& other);
-
- // The clip rect that this node contributes, expressed in the space of its
- // transform node.
- gfx::RectF clip;
-
- // Clip nodes are uses for two reasons. First, they are used for determining
- // which parts of each layer are visible. Second, they are used for
- // determining whether a clip needs to be applied when drawing a layer, and if
- // so, the rect that needs to be used. These can be different since not all
- // clips need to be applied directly to each layer. For example, a layer is
- // implicitly clipped by the bounds of its target render surface and by clips
- // applied to this surface. |combined_clip_in_target_space| is used for
- // computing visible rects, and |clip_in_target_space| is used for computing
- // clips applied at draw time. Both rects are expressed in the space of the
- // target transform node, and may include clips contributed by ancestors.
- gfx::RectF combined_clip_in_target_space;
- gfx::RectF clip_in_target_space;
-
- // The id of the transform node that defines the clip node's local space.
- int transform_id;
-
- // The id of the transform node that defines the clip node's target space.
- int target_id;
-
- // Whether this node contributes a new clip (that is, whether |clip| needs to
- // be applied), rather than only inheriting ancestor clips.
- bool applies_local_clip : 1;
-
- // When true, |clip_in_target_space| does not include clips from ancestor
- // nodes.
- bool layer_clipping_uses_only_local_clip : 1;
-
- // True if target surface needs to be drawn with a clip applied.
- bool target_is_clipped : 1;
-
- // True if layers with this clip tree node need to be drawn with a clip
- // applied.
- bool layers_are_clipped : 1;
- bool layers_are_clipped_when_surfaces_disabled : 1;
-
- // Nodes that correspond to unclipped surfaces disregard ancestor clips.
- bool resets_clip : 1;
-
- bool operator==(const ClipNodeData& other) const;
-
- void ToProtobuf(proto::TreeNode* proto) const;
- void FromProtobuf(const proto::TreeNode& proto);
- void AsValueInto(base::trace_event::TracedValue* value) const;
-};
-
-typedef TreeNode<ClipNodeData> ClipNode;
-
-struct CC_EXPORT EffectNodeData {
- EffectNodeData();
- EffectNodeData(const EffectNodeData& other);
-
- float opacity;
- float screen_space_opacity;
-
- FilterOperations background_filters;
-
- gfx::Vector2dF sublayer_scale;
-
- bool has_render_surface;
- RenderSurfaceImpl* render_surface;
- bool has_copy_request;
- bool hidden_by_backface_visibility;
- bool double_sided;
- bool is_drawn;
- // TODO(jaydasika) : Delete this after implementation of
- // SetHideLayerAndSubtree is cleaned up. (crbug.com/595843)
- bool subtree_hidden;
- bool has_potential_opacity_animation;
- bool is_currently_animating_opacity;
- // We need to track changes to effects on the compositor to compute damage
- // rect.
- bool effect_changed;
- int num_copy_requests_in_subtree;
- bool has_unclipped_descendants;
- int transform_id;
- int clip_id;
- // Effect node id of which this effect contributes to.
- int target_id;
- int mask_layer_id;
- int replica_layer_id;
- int replica_mask_layer_id;
-
- bool operator==(const EffectNodeData& other) const;
-
- void ToProtobuf(proto::TreeNode* proto) const;
- void FromProtobuf(const proto::TreeNode& proto);
- void AsValueInto(base::trace_event::TracedValue* value) const;
-};
-
-typedef TreeNode<EffectNodeData> EffectNode;
-
-struct CC_EXPORT ScrollNodeData {
- ScrollNodeData();
- ScrollNodeData(const ScrollNodeData& other);
-
- bool scrollable;
- uint32_t main_thread_scrolling_reasons;
- bool contains_non_fast_scrollable_region;
- gfx::Size scroll_clip_layer_bounds;
- gfx::Size bounds;
- bool max_scroll_offset_affected_by_page_scale;
- bool is_inner_viewport_scroll_layer;
- bool is_outer_viewport_scroll_layer;
- gfx::Vector2dF offset_to_transform_parent;
- bool should_flatten;
- bool user_scrollable_horizontal;
- bool user_scrollable_vertical;
- ElementId element_id;
- int transform_id;
- // Number of drawn layers pointing to this node or any of its descendants.
- int num_drawn_descendants;
-
- bool operator==(const ScrollNodeData& other) const;
-
- void ToProtobuf(proto::TreeNode* proto) const;
- void FromProtobuf(const proto::TreeNode& proto);
- void AsValueInto(base::trace_event::TracedValue* value) const;
-};
-
-typedef TreeNode<ScrollNodeData> ScrollNode;
-
class PropertyTrees;
template <typename T>
@@ -345,7 +59,13 @@ class CC_EXPORT PropertyTree {
public:
PropertyTree();
PropertyTree(const PropertyTree& other) = delete;
+
+ // These C++ special member functions cannot be implicit inline because
+ // they are exported by CC_EXPORT. They will be instantiated in every
+ // compilation units that included this header, and compilation can fail
+ // because T may be incomplete.
~PropertyTree();
+ PropertyTree<T>& operator=(const PropertyTree<T>&);
bool operator==(const PropertyTree<T>& other) const;
@@ -402,7 +122,14 @@ class CC_EXPORT PropertyTree {
class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> {
public:
TransformTree();
+
+ // These C++ special member functions cannot be implicit inline because
+ // they are exported by CC_EXPORT. They will be instantiated in every
+ // compilation units that included this header, and compilation can fail
+ // because TransformCachedNodeData may be incomplete.
+ TransformTree(const TransformTree&) = delete;
~TransformTree();
+ TransformTree& operator=(const TransformTree&);
bool operator==(const TransformTree& other) const;
« no previous file with comments | « cc/trees/layer_tree_impl_unittest.cc ('k') | cc/trees/property_tree.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698