OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ | 5 #ifndef SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ |
6 #define SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ | 6 #define SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ |
7 | 7 |
8 #include <iosfwd> | 8 #include <iosfwd> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/macros.h" | 11 #include "base/macros.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "mojo/services/gfx/composition/interfaces/nodes.mojom.h" | 13 #include "mojo/services/gfx/composition/interfaces/nodes.mojom.h" |
14 #include "services/gfx/compositor/graph/snapshot.h" | 14 #include "services/gfx/compositor/graph/snapshot.h" |
15 | 15 |
16 class SkCanvas; | 16 class SkCanvas; |
| 17 struct SkPoint; |
| 18 class SkMatrix; |
17 | 19 |
18 namespace compositor { | 20 namespace compositor { |
19 | 21 |
20 class SceneContent; | 22 class SceneContent; |
21 class SceneContentBuilder; | 23 class SceneContentBuilder; |
22 class SceneDef; | 24 class SceneDef; |
23 | 25 |
24 // Represents a scene graph node. | 26 // Represents a scene graph node. |
25 // | 27 // |
26 // The base class mainly acts as a container for other nodes and does not | 28 // The base class mainly acts as a container for other nodes and does not |
27 // draw any content of its own. | 29 // draw any content of its own. |
28 // | 30 // |
29 // Instances of this class are immutable and reference counted so they may | 31 // Instances of this class are immutable and reference counted so they may |
30 // be shared by multiple versions of the same scene. | 32 // be shared by multiple versions of the same scene. |
31 class NodeDef : public base::RefCounted<NodeDef> { | 33 class NodeDef : public base::RefCounted<NodeDef> { |
32 public: | 34 public: |
33 using Combinator = mojo::gfx::composition::Node::Combinator; | 35 using Combinator = mojo::gfx::composition::Node::Combinator; |
34 | 36 |
35 NodeDef(uint32_t node_id, | 37 NodeDef(uint32_t node_id, |
36 mojo::TransformPtr content_transform, | 38 mojo::TransformPtr content_transform, |
37 mojo::RectPtr content_clip, | 39 mojo::RectPtr content_clip, |
| 40 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
38 Combinator combinator, | 41 Combinator combinator, |
39 const std::vector<uint32_t>& child_node_ids); | 42 const std::vector<uint32_t>& child_node_ids); |
40 | 43 |
41 uint32_t node_id() const { return node_id_; } | 44 uint32_t node_id() const { return node_id_; } |
42 const mojo::Transform* content_transform() const { | 45 const mojo::Transform* content_transform() const { |
43 return content_transform_.get(); | 46 return content_transform_.get(); |
44 } | 47 } |
| 48 const mojo::gfx::composition::HitTestBehavior* hit_test_behavior() const { |
| 49 return hit_test_behavior_.get(); |
| 50 } |
45 const mojo::Rect* content_clip() const { return content_clip_.get(); } | 51 const mojo::Rect* content_clip() const { return content_clip_.get(); } |
46 Combinator combinator() const { return combinator_; } | 52 Combinator combinator() const { return combinator_; } |
47 const std::vector<uint32_t>& child_node_ids() const { | 53 const std::vector<uint32_t>& child_node_ids() const { |
48 return child_node_ids_; | 54 return child_node_ids_; |
49 } | 55 } |
50 | 56 |
51 // Gets a descriptive label. | 57 // Gets a descriptive label. |
52 std::string FormattedLabel(const SceneContent* content) const; | 58 std::string FormattedLabel(const SceneContent* content) const; |
53 | 59 |
54 // Called by the scene content builder to traverse the node's dependencies | 60 // Called by the scene content builder to traverse the node's dependencies |
55 // recursively and ensure they are included in the scene's local content. | 61 // recursively and ensure they are included in the scene's local content. |
56 // Returns true if successful, false if the node contains linkage errors. | 62 // Returns true if successful, false if the node contains linkage errors. |
57 virtual bool RecordContent(SceneContentBuilder* builder) const; | 63 virtual bool RecordContent(SceneContentBuilder* builder) const; |
58 | 64 |
59 // Called by the snapshot builder to traverse the node's dependencies | 65 // Called by the snapshot builder to traverse the node's dependencies |
60 // recursively follow links into other scenes, evaluate whether the | 66 // recursively follow links into other scenes, evaluate whether the |
61 // node can be rendered, and record which path was taken for the purposes | 67 // node can be rendered, and record which path was taken for the purposes |
62 // of satisfying combinators. | 68 // of satisfying combinators. |
63 virtual Snapshot::Disposition RecordSnapshot(const SceneContent* content, | 69 virtual Snapshot::Disposition RecordSnapshot(const SceneContent* content, |
64 SnapshotBuilder* builder) const; | 70 SnapshotBuilder* builder) const; |
65 | 71 |
66 // Called to record drawing commands from a snapshot. | 72 // Called to record drawing commands from a snapshot. |
67 void RecordPicture(const SceneContent* content, | 73 void RecordPicture(const SceneContent* content, |
68 const Snapshot* snapshot, | 74 const Snapshot* snapshot, |
69 SkCanvas* canvas) const; | 75 SkCanvas* canvas) const; |
70 | 76 |
| 77 // Performs a hit test at the specified point. |
| 78 // The |point| is the hit tested point in the parent's coordinate space. |
| 79 // The |global_to_parent_transform| is the accumulated transform from the |
| 80 // global coordinate space to the parent's coordinate space. |
| 81 // Adds hit information for the node to |hits|. |
| 82 // Returns true if the search was terminated by an opaque hit. |
| 83 bool HitTest(const SceneContent* content, |
| 84 const Snapshot* snapshot, |
| 85 const SkPoint& parent_point, |
| 86 const SkMatrix& global_to_parent_transform, |
| 87 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const; |
| 88 |
71 protected: | 89 protected: |
72 friend class base::RefCounted<NodeDef>; | 90 friend class base::RefCounted<NodeDef>; |
73 virtual ~NodeDef(); | 91 virtual ~NodeDef(); |
74 | 92 |
75 // Applies a unary function to the children selected by the node's | 93 // Applies a unary function to the children selected by the node's |
76 // combinator rule during a snapshot. | 94 // combinator rule during a snapshot. |
77 // Stops when |Func| returns false. | 95 // Stops when |Func| returns false. |
78 // |Func| should have the signature |bool func(const NodeDef*)|. | 96 // |Func| should have the signature |bool func(const NodeDef*)|. |
79 template <typename Func> | 97 template <typename Func> |
80 void TraverseSnapshottedChildren(const SceneContent* content, | 98 void TraverseSnapshottedChildren(const SceneContent* content, |
81 const Snapshot* snapshot, | 99 const Snapshot* snapshot, |
82 const Func& func) const; | 100 const Func& func) const; |
83 | 101 |
84 virtual void RecordPictureInner(const SceneContent* content, | 102 virtual void RecordPictureInner(const SceneContent* content, |
85 const Snapshot* snapshot, | 103 const Snapshot* snapshot, |
86 SkCanvas* canvas) const; | 104 SkCanvas* canvas) const; |
87 | 105 |
| 106 virtual bool HitTestInner( |
| 107 const SceneContent* content, |
| 108 const Snapshot* snapshot, |
| 109 const SkPoint& local_point, |
| 110 const SkMatrix& global_to_local_transform, |
| 111 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const; |
| 112 |
88 private: | 113 private: |
| 114 bool HitTestSelf(const SceneContent* content, |
| 115 const Snapshot* snapshot, |
| 116 const SkPoint& local_point, |
| 117 const SkMatrix& global_to_local_transform, |
| 118 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const; |
| 119 |
89 uint32_t const node_id_; | 120 uint32_t const node_id_; |
90 mojo::TransformPtr const content_transform_; | 121 mojo::TransformPtr const content_transform_; |
91 mojo::RectPtr const content_clip_; | 122 mojo::RectPtr const content_clip_; |
| 123 mojo::gfx::composition::HitTestBehaviorPtr const hit_test_behavior_; |
92 Combinator const combinator_; | 124 Combinator const combinator_; |
93 std::vector<uint32_t> const child_node_ids_; | 125 std::vector<uint32_t> const child_node_ids_; |
94 | 126 |
95 DISALLOW_COPY_AND_ASSIGN(NodeDef); | 127 DISALLOW_COPY_AND_ASSIGN(NodeDef); |
96 }; | 128 }; |
97 | 129 |
98 // Represents a rectangle node. | 130 // Represents a rectangle node. |
99 // | 131 // |
100 // Draws a solid color filled rectangle node underneath its children. | 132 // Draws a solid color filled rectangle node underneath its children. |
101 class RectNodeDef : public NodeDef { | 133 class RectNodeDef : public NodeDef { |
102 public: | 134 public: |
103 RectNodeDef(uint32_t node_id, | 135 RectNodeDef(uint32_t node_id, |
104 mojo::TransformPtr content_transform, | 136 mojo::TransformPtr content_transform, |
105 mojo::RectPtr content_clip, | 137 mojo::RectPtr content_clip, |
| 138 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
106 Combinator combinator, | 139 Combinator combinator, |
107 const std::vector<uint32_t>& child_node_ids, | 140 const std::vector<uint32_t>& child_node_ids, |
108 const mojo::Rect& content_rect, | 141 const mojo::Rect& content_rect, |
109 const mojo::gfx::composition::Color& color); | 142 const mojo::gfx::composition::Color& color); |
110 | 143 |
111 const mojo::Rect& content_rect() const { return content_rect_; } | 144 const mojo::Rect& content_rect() const { return content_rect_; } |
112 const mojo::gfx::composition::Color& color() const { return color_; } | 145 const mojo::gfx::composition::Color& color() const { return color_; } |
113 | 146 |
114 protected: | 147 protected: |
115 ~RectNodeDef() override; | 148 ~RectNodeDef() override; |
(...skipping 10 matching lines...) Expand all Loading... |
126 }; | 159 }; |
127 | 160 |
128 // Represents an image node. | 161 // Represents an image node. |
129 // | 162 // |
130 // Draws an image filled rectangle underneath its children. | 163 // Draws an image filled rectangle underneath its children. |
131 class ImageNodeDef : public NodeDef { | 164 class ImageNodeDef : public NodeDef { |
132 public: | 165 public: |
133 ImageNodeDef(uint32_t node_id, | 166 ImageNodeDef(uint32_t node_id, |
134 mojo::TransformPtr content_transform, | 167 mojo::TransformPtr content_transform, |
135 mojo::RectPtr content_clip, | 168 mojo::RectPtr content_clip, |
| 169 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
136 Combinator combinator, | 170 Combinator combinator, |
137 const std::vector<uint32_t>& child_node_ids, | 171 const std::vector<uint32_t>& child_node_ids, |
138 const mojo::Rect& content_rect, | 172 const mojo::Rect& content_rect, |
139 mojo::RectPtr image_rect, | 173 mojo::RectPtr image_rect, |
140 uint32 image_resource_id, | 174 uint32 image_resource_id, |
141 mojo::gfx::composition::BlendPtr blend); | 175 mojo::gfx::composition::BlendPtr blend); |
142 | 176 |
143 const mojo::Rect& content_rect() const { return content_rect_; } | 177 const mojo::Rect& content_rect() const { return content_rect_; } |
144 const mojo::Rect* image_rect() const { return image_rect_.get(); } | 178 const mojo::Rect* image_rect() const { return image_rect_.get(); } |
145 uint32_t image_resource_id() const { return image_resource_id_; } | 179 uint32_t image_resource_id() const { return image_resource_id_; } |
(...skipping 18 matching lines...) Expand all Loading... |
164 }; | 198 }; |
165 | 199 |
166 // Represents a scene node. | 200 // Represents a scene node. |
167 // | 201 // |
168 // Draws an embedded scene underneath its children. | 202 // Draws an embedded scene underneath its children. |
169 class SceneNodeDef : public NodeDef { | 203 class SceneNodeDef : public NodeDef { |
170 public: | 204 public: |
171 SceneNodeDef(uint32_t node_id, | 205 SceneNodeDef(uint32_t node_id, |
172 mojo::TransformPtr content_transform, | 206 mojo::TransformPtr content_transform, |
173 mojo::RectPtr content_clip, | 207 mojo::RectPtr content_clip, |
| 208 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
174 Combinator combinator, | 209 Combinator combinator, |
175 const std::vector<uint32_t>& child_node_ids, | 210 const std::vector<uint32_t>& child_node_ids, |
176 uint32_t scene_resource_id, | 211 uint32_t scene_resource_id, |
177 uint32_t scene_version); | 212 uint32_t scene_version); |
178 | 213 |
179 uint32_t scene_resource_id() const { return scene_resource_id_; } | 214 uint32_t scene_resource_id() const { return scene_resource_id_; } |
180 uint32_t scene_version() const { return scene_version_; } | 215 uint32_t scene_version() const { return scene_version_; } |
181 | 216 |
182 bool RecordContent(SceneContentBuilder* builder) const override; | 217 bool RecordContent(SceneContentBuilder* builder) const override; |
183 | 218 |
184 Snapshot::Disposition RecordSnapshot(const SceneContent* content, | 219 Snapshot::Disposition RecordSnapshot(const SceneContent* content, |
185 SnapshotBuilder* builder) const override; | 220 SnapshotBuilder* builder) const override; |
186 | 221 |
187 protected: | 222 protected: |
188 ~SceneNodeDef() override; | 223 ~SceneNodeDef() override; |
189 | 224 |
190 void RecordPictureInner(const SceneContent* content, | 225 void RecordPictureInner(const SceneContent* content, |
191 const Snapshot* snapshot, | 226 const Snapshot* snapshot, |
192 SkCanvas* canvas) const override; | 227 SkCanvas* canvas) const override; |
193 | 228 |
| 229 bool HitTestInner( |
| 230 const SceneContent* content, |
| 231 const Snapshot* snapshot, |
| 232 const SkPoint& local_point, |
| 233 const SkMatrix& global_to_local_transform, |
| 234 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const override; |
| 235 |
194 private: | 236 private: |
195 uint32_t const scene_resource_id_; | 237 uint32_t const scene_resource_id_; |
196 uint32_t const scene_version_; | 238 uint32_t const scene_version_; |
197 | 239 |
198 DISALLOW_COPY_AND_ASSIGN(SceneNodeDef); | 240 DISALLOW_COPY_AND_ASSIGN(SceneNodeDef); |
199 }; | 241 }; |
200 | 242 |
201 // Represents a layer node. | 243 // Represents a layer node. |
202 // | 244 // |
203 // Composites its children to a layer and applies a blending operation. | 245 // Composites its children to a layer and applies a blending operation. |
204 class LayerNodeDef : public NodeDef { | 246 class LayerNodeDef : public NodeDef { |
205 public: | 247 public: |
206 LayerNodeDef(uint32_t node_id, | 248 LayerNodeDef(uint32_t node_id, |
207 mojo::TransformPtr content_transform, | 249 mojo::TransformPtr content_transform, |
208 mojo::RectPtr content_clip, | 250 mojo::RectPtr content_clip, |
| 251 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
209 Combinator combinator, | 252 Combinator combinator, |
210 const std::vector<uint32_t>& child_node_ids, | 253 const std::vector<uint32_t>& child_node_ids, |
211 const mojo::Size& size, | 254 const mojo::Size& size, |
212 mojo::gfx::composition::BlendPtr blend); | 255 mojo::gfx::composition::BlendPtr blend); |
213 | 256 |
214 const mojo::Size& size() const { return size_; } | 257 const mojo::Size& size() const { return size_; } |
215 const mojo::gfx::composition::Blend* blend() const { return blend_.get(); } | 258 const mojo::gfx::composition::Blend* blend() const { return blend_.get(); } |
216 | 259 |
217 protected: | 260 protected: |
218 ~LayerNodeDef() override; | 261 ~LayerNodeDef() override; |
219 | 262 |
220 void RecordPictureInner(const SceneContent* content, | 263 void RecordPictureInner(const SceneContent* content, |
221 const Snapshot* snapshot, | 264 const Snapshot* snapshot, |
222 SkCanvas* canvas) const override; | 265 SkCanvas* canvas) const override; |
223 | 266 |
224 private: | 267 private: |
225 mojo::Size const size_; | 268 mojo::Size const size_; |
226 mojo::gfx::composition::BlendPtr const blend_; | 269 mojo::gfx::composition::BlendPtr const blend_; |
227 | 270 |
228 DISALLOW_COPY_AND_ASSIGN(LayerNodeDef); | 271 DISALLOW_COPY_AND_ASSIGN(LayerNodeDef); |
229 }; | 272 }; |
230 | 273 |
231 } // namespace compositor | 274 } // namespace compositor |
232 | 275 |
233 #endif // SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ | 276 #endif // SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ |
OLD | NEW |