Index: services/gfx/compositor/graph/scene_content.h |
diff --git a/services/gfx/compositor/graph/scene_content.h b/services/gfx/compositor/graph/scene_content.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f3ccb5abafb5b6cf836ad3d2edf1801929dbdaa0 |
--- /dev/null |
+++ b/services/gfx/compositor/graph/scene_content.h |
@@ -0,0 +1,117 @@ |
+// 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 SERVICES_GFX_COMPOSITOR_GRAPH_SCENE_CONTENT_H_ |
+#define SERVICES_GFX_COMPOSITOR_GRAPH_SCENE_CONTENT_H_ |
+ |
+#include <iosfwd> |
+#include <unordered_map> |
+ |
+#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/weak_ptr.h" |
+#include "mojo/services/gfx/composition/interfaces/scenes.mojom.h" |
+#include "services/gfx/compositor/graph/node_def.h" |
+#include "services/gfx/compositor/graph/resource_def.h" |
+#include "services/gfx/compositor/graph/scene_label.h" |
+ |
+namespace compositor { |
+ |
+class SceneContentBuilder; |
+class SceneDef; |
+ |
+// Represents the content of a particular published version of a scene. |
+// |
+// Holds a resource and node table which describes the content of a |
+// scene as it was when a particular version was published. Only the |
+// internal state of the scene is described; links to other scenes are |
+// not resolved at this level. |
+// |
+// Once fully constructed, instances of this class are immutable and |
+// reference counted so they may be bound to scene references in other scenes. |
+// |
+// TODO(jeffbrown): To improve efficiency, we could replace the hash tables |
+// with a vector of internally linked graph edges. This is relatively easy |
+// since the traversal order is well-known and we could even build some kind |
+// of hierarchical iterator to walk the graph starting from the root. |
+class SceneContent : public base::RefCounted<SceneContent> { |
+ public: |
+ // Gets the scene label. |
+ const SceneLabel& label() const { return label_; } |
+ std::string FormattedLabel() const { |
+ return label_.FormattedLabelForVersion(version_); |
+ } |
+ std::string FormattedLabelForNode(uint32_t node_id) const { |
+ return label_.FormattedLabelForNode(version_, node_id); |
+ } |
+ |
+ // Gets the version of the scene represented by this object. |
+ uint32_t version() const { return version_; } |
+ |
+ // Gets the requested resource, never null because it must be present. |
+ const ResourceDef* GetResource(uint32_t resource_id, |
+ ResourceDef::Type resource_type) const; |
+ |
+ // Gets the requested node, never null because it must be present. |
+ const NodeDef* GetNode(uint32_t node_id) const; |
+ |
+ // Gets the root node if it exists, otherwise returns nullptr. |
+ const NodeDef* GetRootNodeIfExists() const; |
+ |
+ private: |
+ friend class base::RefCounted<SceneContent>; |
+ friend class SceneContentBuilder; |
+ SceneContent(const SceneLabel& label, |
+ uint32_t version, |
+ size_t max_resources, |
+ size_t max_nodes); |
+ ~SceneContent(); |
+ |
+ const SceneLabel label_; |
+ const uint32_t version_; |
+ std::unordered_map<uint32_t, scoped_refptr<const ResourceDef>> resources_; |
+ std::unordered_map<uint32_t, scoped_refptr<const NodeDef>> nodes_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SceneContent); |
+}; |
+ |
+// Builds a table of all of the nodes and resources that make up the |
+// content of a particular version of a scene. |
+class SceneContentBuilder { |
+ public: |
+ SceneContentBuilder(const SceneDef* scene, |
+ uint32_t version, |
+ std::ostream& err, |
+ size_t max_resources, |
+ size_t max_nodes); |
+ ~SceneContentBuilder(); |
+ |
+ // Stream for reporting validation error messages. |
+ std::ostream& err() { return err_; } |
+ |
+ // Ensures the requested resource is part of the retained scene graph and |
+ // returns a reference to it, or nullptr if an error occurred. |
+ const ResourceDef* RequireResource(uint32_t resource_id, |
+ ResourceDef::Type resource_type, |
+ uint32_t referrer_node_id); |
+ |
+ // Ensures the requested node is part of the retained scene graph and |
+ // returns a reference to it, or nullptr if an error occurred. |
+ const NodeDef* RequireNode(uint32_t node_id, uint32_t referrer_node_id); |
+ |
+ // Builds the content graph. |
+ // Returns nullptr if an error occurred. |
+ scoped_refptr<const SceneContent> Build(); |
+ |
+ private: |
+ bool AddNode(const NodeDef* node); |
+ |
+ scoped_refptr<SceneContent> content_; |
+ const SceneDef* scene_; |
+ std::ostream& err_; |
+}; |
+ |
+} // namespace compositor |
+ |
+#endif // SERVICES_GFX_COMPOSITOR_GRAPH_SCENE_CONTENT_H_ |