| // Copyright 2015 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_NODES_H_ |
| #define SERVICES_GFX_COMPOSITOR_GRAPH_NODES_H_ |
| |
| #include <iosfwd> |
| #include <memory> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "mojo/services/gfx/composition/interfaces/nodes.mojom.h" |
| #include "services/gfx/compositor/graph/snapshot.h" |
| |
| class SkCanvas; |
| struct SkPoint; |
| class SkMatrix44; |
| |
| namespace compositor { |
| |
| class SceneContent; |
| class SceneContentBuilder; |
| class TransformPair; |
| |
| // Base class for nodes in a scene graph. |
| // |
| // The base class mainly acts as a container for other nodes and does not |
| // draw any content of its own. |
| // |
| // Instances of this class are immutable and reference counted so they may |
| // be shared by multiple versions of the same scene. |
| class Node : public base::RefCounted<Node> { |
| public: |
| using Combinator = mojo::gfx::composition::Node::Combinator; |
| |
| Node(uint32_t node_id, |
| std::unique_ptr<TransformPair> content_transform, |
| mojo::RectFPtr content_clip, |
| mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| Combinator combinator, |
| const std::vector<uint32_t>& child_node_ids); |
| |
| uint32_t node_id() const { return node_id_; } |
| const TransformPair* content_transform() const { |
| return content_transform_.get(); |
| } |
| const mojo::gfx::composition::HitTestBehavior* hit_test_behavior() const { |
| return hit_test_behavior_.get(); |
| } |
| const mojo::RectF* content_clip() const { return content_clip_.get(); } |
| Combinator combinator() const { return combinator_; } |
| const std::vector<uint32_t>& child_node_ids() const { |
| return child_node_ids_; |
| } |
| |
| // Gets a descriptive label. |
| std::string FormattedLabel(const SceneContent* content) const; |
| |
| // Called by the scene content builder to traverse the node's dependencies |
| // recursively and ensure they are included in the scene's local content. |
| // Returns true if successful, false if the node contains linkage errors. |
| virtual bool RecordContent(SceneContentBuilder* builder) const; |
| |
| // Called by the snapshot builder to traverse the node's dependencies |
| // recursively follow links into other scenes, evaluate whether the |
| // node can be rendered, and record which path was taken for the purposes |
| // of satisfying combinators. |
| virtual Snapshot::Disposition RecordSnapshot(const SceneContent* content, |
| SnapshotBuilder* builder) const; |
| |
| // Paints the content of the node to a recording canvas. |
| void Paint(const SceneContent* content, |
| const Snapshot* snapshot, |
| SkCanvas* canvas) const; |
| |
| // Performs a hit test at the specified point. |
| // The |point| is the hit tested point in the parent's coordinate space. |
| // The |global_to_parent_transform| is the accumulated transform from the |
| // global coordinate space to the parent's coordinate space. |
| // Adds hit information for the node to |hits|. |
| // Returns true if the search was terminated by an opaque hit. |
| bool HitTest(const SceneContent* content, |
| const Snapshot* snapshot, |
| const SkPoint& parent_point, |
| const SkMatrix44& global_to_parent_transform, |
| mojo::Array<mojo::gfx::composition::HitPtr>* hits) const; |
| |
| protected: |
| friend class base::RefCounted<Node>; |
| virtual ~Node(); |
| |
| // Applies a unary function to the children selected by the node's |
| // combinator rule during a snapshot. |
| // Stops when |Func| returns false. |
| // |Func| should have the signature |bool func(const Node*)|. |
| template <typename Func> |
| void TraverseSnapshottedChildren(const SceneContent* content, |
| const Snapshot* snapshot, |
| const Func& func) const; |
| |
| virtual void PaintInner(const SceneContent* content, |
| const Snapshot* snapshot, |
| SkCanvas* canvas) const; |
| |
| virtual bool HitTestInner( |
| const SceneContent* content, |
| const Snapshot* snapshot, |
| const SkPoint& local_point, |
| const SkMatrix44& global_to_local_transform, |
| mojo::Array<mojo::gfx::composition::HitPtr>* hits) const; |
| |
| private: |
| bool HitTestSelf(const SceneContent* content, |
| const Snapshot* snapshot, |
| const SkPoint& local_point, |
| const SkMatrix44& global_to_local_transform, |
| mojo::Array<mojo::gfx::composition::HitPtr>* hits) const; |
| |
| uint32_t const node_id_; |
| std::unique_ptr<TransformPair> const content_transform_; |
| mojo::RectFPtr const content_clip_; |
| mojo::gfx::composition::HitTestBehaviorPtr const hit_test_behavior_; |
| Combinator const combinator_; |
| std::vector<uint32_t> const child_node_ids_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Node); |
| }; |
| |
| // Represents a rectangle node. |
| // |
| // Draws a solid color filled rectangle node underneath its children. |
| class RectNode : public Node { |
| public: |
| RectNode(uint32_t node_id, |
| std::unique_ptr<TransformPair> content_transform, |
| mojo::RectFPtr content_clip, |
| mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| Combinator combinator, |
| const std::vector<uint32_t>& child_node_ids, |
| const mojo::RectF& content_rect, |
| const mojo::gfx::composition::Color& color); |
| |
| const mojo::RectF& content_rect() const { return content_rect_; } |
| const mojo::gfx::composition::Color& color() const { return color_; } |
| |
| protected: |
| ~RectNode() override; |
| |
| void PaintInner(const SceneContent* content, |
| const Snapshot* snapshot, |
| SkCanvas* canvas) const override; |
| |
| private: |
| mojo::RectF const content_rect_; |
| mojo::gfx::composition::Color const color_; |
| |
| DISALLOW_COPY_AND_ASSIGN(RectNode); |
| }; |
| |
| // Represents an image node. |
| // |
| // Draws an image filled rectangle underneath its children. |
| class ImageNode : public Node { |
| public: |
| ImageNode(uint32_t node_id, |
| std::unique_ptr<TransformPair> content_transform, |
| mojo::RectFPtr content_clip, |
| mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| Combinator combinator, |
| const std::vector<uint32_t>& child_node_ids, |
| const mojo::RectF& content_rect, |
| mojo::RectFPtr image_rect, |
| uint32 image_resource_id, |
| mojo::gfx::composition::BlendPtr blend); |
| |
| const mojo::RectF& content_rect() const { return content_rect_; } |
| const mojo::RectF* image_rect() const { return image_rect_.get(); } |
| uint32_t image_resource_id() const { return image_resource_id_; } |
| const mojo::gfx::composition::Blend* blend() const { return blend_.get(); } |
| |
| bool RecordContent(SceneContentBuilder* builder) const override; |
| |
| protected: |
| ~ImageNode() override; |
| |
| void PaintInner(const SceneContent* content, |
| const Snapshot* snapshot, |
| SkCanvas* canvas) const override; |
| |
| private: |
| mojo::RectF const content_rect_; |
| mojo::RectFPtr const image_rect_; |
| uint32_t const image_resource_id_; |
| mojo::gfx::composition::BlendPtr const blend_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ImageNode); |
| }; |
| |
| // Represents a scene node. |
| // |
| // Draws an embedded scene underneath its children. |
| class SceneNode : public Node { |
| public: |
| SceneNode(uint32_t node_id, |
| std::unique_ptr<TransformPair> content_transform, |
| mojo::RectFPtr content_clip, |
| mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| Combinator combinator, |
| const std::vector<uint32_t>& child_node_ids, |
| uint32_t scene_resource_id, |
| uint32_t scene_version); |
| |
| uint32_t scene_resource_id() const { return scene_resource_id_; } |
| uint32_t scene_version() const { return scene_version_; } |
| |
| bool RecordContent(SceneContentBuilder* builder) const override; |
| |
| Snapshot::Disposition RecordSnapshot(const SceneContent* content, |
| SnapshotBuilder* builder) const override; |
| |
| protected: |
| ~SceneNode() override; |
| |
| void PaintInner(const SceneContent* content, |
| const Snapshot* snapshot, |
| SkCanvas* canvas) const override; |
| |
| bool HitTestInner( |
| const SceneContent* content, |
| const Snapshot* snapshot, |
| const SkPoint& local_point, |
| const SkMatrix44& global_to_local_transform, |
| mojo::Array<mojo::gfx::composition::HitPtr>* hits) const override; |
| |
| private: |
| uint32_t const scene_resource_id_; |
| uint32_t const scene_version_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SceneNode); |
| }; |
| |
| // Represents a layer node. |
| // |
| // Composites its children to a layer and applies a blending operation. |
| class LayerNode : public Node { |
| public: |
| LayerNode(uint32_t node_id, |
| std::unique_ptr<TransformPair> content_transform, |
| mojo::RectFPtr content_clip, |
| mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
| Combinator combinator, |
| const std::vector<uint32_t>& child_node_ids, |
| const mojo::RectF& layer_rect, |
| mojo::gfx::composition::BlendPtr blend); |
| |
| const mojo::RectF& layer_rect() const { return layer_rect_; } |
| const mojo::gfx::composition::Blend* blend() const { return blend_.get(); } |
| |
| protected: |
| ~LayerNode() override; |
| |
| void PaintInner(const SceneContent* content, |
| const Snapshot* snapshot, |
| SkCanvas* canvas) const override; |
| |
| private: |
| mojo::RectF const layer_rect_; |
| mojo::gfx::composition::BlendPtr const blend_; |
| |
| DISALLOW_COPY_AND_ASSIGN(LayerNode); |
| }; |
| |
| } // namespace compositor |
| |
| #endif // SERVICES_GFX_COMPOSITOR_GRAPH_NODES_H_ |