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

Side by Side Diff: services/gfx/compositor/graph/node_def.h

Issue 1774373002: Mozart: Implement hit testing. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-4
Patch Set: Created 4 years, 9 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 unified diff | Download patch
OLDNEW
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 |global_point| is the original hit tested point.
79 // The |parent_transform| is the accumulated transform from the parent's
80 // coordinate space to the global coordinate space.
81 // Adds hit information for the node to the array.
82 void HitTest(const SceneContent* content,
83 const Snapshot* snapshot,
84 const SkPoint& global_point,
85 const SkMatrix& parent_transform,
abarth 2016/03/09 04:02:48 Don't you want an SkMatrix44 here?
jeffbrown 2016/03/09 20:32:11 I didn't know that existed! ha! I'll make a note
86 bool* opaque,
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 void HitTestInner(
107 const SceneContent* content,
108 const Snapshot* snapshot,
109 const SkPoint& global_point,
110 const SkMatrix& node_transform,
111 bool* opaque,
112 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const;
113
88 private: 114 private:
89 uint32_t const node_id_; 115 uint32_t const node_id_;
90 mojo::TransformPtr const content_transform_; 116 mojo::TransformPtr const content_transform_;
91 mojo::RectPtr const content_clip_; 117 mojo::RectPtr const content_clip_;
118 mojo::gfx::composition::HitTestBehaviorPtr const hit_test_behavior_;
92 Combinator const combinator_; 119 Combinator const combinator_;
93 std::vector<uint32_t> const child_node_ids_; 120 std::vector<uint32_t> const child_node_ids_;
94 121
95 DISALLOW_COPY_AND_ASSIGN(NodeDef); 122 DISALLOW_COPY_AND_ASSIGN(NodeDef);
96 }; 123 };
97 124
98 // Represents a rectangle node. 125 // Represents a rectangle node.
99 // 126 //
100 // Draws a solid color filled rectangle node underneath its children. 127 // Draws a solid color filled rectangle node underneath its children.
101 class RectNodeDef : public NodeDef { 128 class RectNodeDef : public NodeDef {
102 public: 129 public:
103 RectNodeDef(uint32_t node_id, 130 RectNodeDef(uint32_t node_id,
104 mojo::TransformPtr content_transform, 131 mojo::TransformPtr content_transform,
105 mojo::RectPtr content_clip, 132 mojo::RectPtr content_clip,
133 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior,
106 Combinator combinator, 134 Combinator combinator,
107 const std::vector<uint32_t>& child_node_ids, 135 const std::vector<uint32_t>& child_node_ids,
108 const mojo::Rect& content_rect, 136 const mojo::Rect& content_rect,
109 const mojo::gfx::composition::Color& color); 137 const mojo::gfx::composition::Color& color);
110 138
111 const mojo::Rect& content_rect() const { return content_rect_; } 139 const mojo::Rect& content_rect() const { return content_rect_; }
112 const mojo::gfx::composition::Color& color() const { return color_; } 140 const mojo::gfx::composition::Color& color() const { return color_; }
113 141
114 protected: 142 protected:
115 ~RectNodeDef() override; 143 ~RectNodeDef() override;
(...skipping 10 matching lines...) Expand all
126 }; 154 };
127 155
128 // Represents an image node. 156 // Represents an image node.
129 // 157 //
130 // Draws an image filled rectangle underneath its children. 158 // Draws an image filled rectangle underneath its children.
131 class ImageNodeDef : public NodeDef { 159 class ImageNodeDef : public NodeDef {
132 public: 160 public:
133 ImageNodeDef(uint32_t node_id, 161 ImageNodeDef(uint32_t node_id,
134 mojo::TransformPtr content_transform, 162 mojo::TransformPtr content_transform,
135 mojo::RectPtr content_clip, 163 mojo::RectPtr content_clip,
164 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior,
136 Combinator combinator, 165 Combinator combinator,
137 const std::vector<uint32_t>& child_node_ids, 166 const std::vector<uint32_t>& child_node_ids,
138 const mojo::Rect& content_rect, 167 const mojo::Rect& content_rect,
139 mojo::RectPtr image_rect, 168 mojo::RectPtr image_rect,
140 uint32 image_resource_id, 169 uint32 image_resource_id,
141 mojo::gfx::composition::BlendPtr blend); 170 mojo::gfx::composition::BlendPtr blend);
142 171
143 const mojo::Rect& content_rect() const { return content_rect_; } 172 const mojo::Rect& content_rect() const { return content_rect_; }
144 const mojo::Rect* image_rect() const { return image_rect_.get(); } 173 const mojo::Rect* image_rect() const { return image_rect_.get(); }
145 uint32_t image_resource_id() const { return image_resource_id_; } 174 uint32_t image_resource_id() const { return image_resource_id_; }
(...skipping 18 matching lines...) Expand all
164 }; 193 };
165 194
166 // Represents a scene node. 195 // Represents a scene node.
167 // 196 //
168 // Draws an embedded scene underneath its children. 197 // Draws an embedded scene underneath its children.
169 class SceneNodeDef : public NodeDef { 198 class SceneNodeDef : public NodeDef {
170 public: 199 public:
171 SceneNodeDef(uint32_t node_id, 200 SceneNodeDef(uint32_t node_id,
172 mojo::TransformPtr content_transform, 201 mojo::TransformPtr content_transform,
173 mojo::RectPtr content_clip, 202 mojo::RectPtr content_clip,
203 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior,
174 Combinator combinator, 204 Combinator combinator,
175 const std::vector<uint32_t>& child_node_ids, 205 const std::vector<uint32_t>& child_node_ids,
176 uint32_t scene_resource_id, 206 uint32_t scene_resource_id,
177 uint32_t scene_version); 207 uint32_t scene_version);
178 208
179 uint32_t scene_resource_id() const { return scene_resource_id_; } 209 uint32_t scene_resource_id() const { return scene_resource_id_; }
180 uint32_t scene_version() const { return scene_version_; } 210 uint32_t scene_version() const { return scene_version_; }
181 211
182 bool RecordContent(SceneContentBuilder* builder) const override; 212 bool RecordContent(SceneContentBuilder* builder) const override;
183 213
184 Snapshot::Disposition RecordSnapshot(const SceneContent* content, 214 Snapshot::Disposition RecordSnapshot(const SceneContent* content,
185 SnapshotBuilder* builder) const override; 215 SnapshotBuilder* builder) const override;
186 216
187 protected: 217 protected:
188 ~SceneNodeDef() override; 218 ~SceneNodeDef() override;
189 219
190 void RecordPictureInner(const SceneContent* content, 220 void RecordPictureInner(const SceneContent* content,
191 const Snapshot* snapshot, 221 const Snapshot* snapshot,
192 SkCanvas* canvas) const override; 222 SkCanvas* canvas) const override;
193 223
224 void HitTestInner(
225 const SceneContent* content,
226 const Snapshot* snapshot,
227 const SkPoint& global_point,
228 const SkMatrix& node_transform,
229 bool* opaque,
230 mojo::Array<mojo::gfx::composition::HitPtr>* hits) const override;
231
194 private: 232 private:
195 uint32_t const scene_resource_id_; 233 uint32_t const scene_resource_id_;
196 uint32_t const scene_version_; 234 uint32_t const scene_version_;
197 235
198 DISALLOW_COPY_AND_ASSIGN(SceneNodeDef); 236 DISALLOW_COPY_AND_ASSIGN(SceneNodeDef);
199 }; 237 };
200 238
201 // Represents a layer node. 239 // Represents a layer node.
202 // 240 //
203 // Composites its children to a layer and applies a blending operation. 241 // Composites its children to a layer and applies a blending operation.
204 class LayerNodeDef : public NodeDef { 242 class LayerNodeDef : public NodeDef {
205 public: 243 public:
206 LayerNodeDef(uint32_t node_id, 244 LayerNodeDef(uint32_t node_id,
207 mojo::TransformPtr content_transform, 245 mojo::TransformPtr content_transform,
208 mojo::RectPtr content_clip, 246 mojo::RectPtr content_clip,
247 mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior,
209 Combinator combinator, 248 Combinator combinator,
210 const std::vector<uint32_t>& child_node_ids, 249 const std::vector<uint32_t>& child_node_ids,
211 const mojo::Size& size, 250 const mojo::Size& size,
212 mojo::gfx::composition::BlendPtr blend); 251 mojo::gfx::composition::BlendPtr blend);
213 252
214 const mojo::Size& size() const { return size_; } 253 const mojo::Size& size() const { return size_; }
215 const mojo::gfx::composition::Blend* blend() const { return blend_.get(); } 254 const mojo::gfx::composition::Blend* blend() const { return blend_.get(); }
216 255
217 protected: 256 protected:
218 ~LayerNodeDef() override; 257 ~LayerNodeDef() override;
219 258
220 void RecordPictureInner(const SceneContent* content, 259 void RecordPictureInner(const SceneContent* content,
221 const Snapshot* snapshot, 260 const Snapshot* snapshot,
222 SkCanvas* canvas) const override; 261 SkCanvas* canvas) const override;
223 262
224 private: 263 private:
225 mojo::Size const size_; 264 mojo::Size const size_;
226 mojo::gfx::composition::BlendPtr const blend_; 265 mojo::gfx::composition::BlendPtr const blend_;
227 266
228 DISALLOW_COPY_AND_ASSIGN(LayerNodeDef); 267 DISALLOW_COPY_AND_ASSIGN(LayerNodeDef);
229 }; 268 };
230 269
231 } // namespace compositor 270 } // namespace compositor
232 271
233 #endif // SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_ 272 #endif // SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698