blob: beff45bf189c680f253f8c6260a3ac3827b451ef [file] [log] [blame]
// 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_NODE_DEF_H_
#define SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_
#include <iosfwd>
#include <memory>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/macros.h"
#include "mojo/services/gfx/composition/interfaces/nodes.mojom.h"
#include "services/gfx/compositor/graph/resource_def.h"
namespace compositor {
class RenderImage;
class RenderLayerBuilder;
class SceneDef;
class SnapshotBuilder;
class NodeOp;
// Scene graph node definition.
class NodeDef {
public:
using Combinator = mojo::gfx::composition::Node::Combinator;
NodeDef(uint32_t node_id,
mojo::TransformPtr content_transform,
mojo::RectPtr content_clip,
uint32_t hit_id,
Combinator combinator,
const std::vector<uint32_t>& child_node_ids,
NodeOp* op);
~NodeDef();
uint32_t node_id() { return node_id_; }
const mojo::Transform* content_transform() {
return content_transform_.get();
}
const mojo::Rect* content_clip() { return content_clip_.get(); }
uint32_t hit_id() { return hit_id_; }
Combinator combinator() { return combinator_; }
const std::vector<uint32_t>& child_node_ids() { return child_node_ids_; }
NodeOp* op() { return op_.get(); }
std::string FormattedLabel(SceneDef* scene);
// Updated by |Validate()|.
const std::vector<NodeDef*>& child_nodes() { return child_nodes_; }
// Validates and prepares the object for rendering.
// Returns true if successful, false if errors were reported.
bool Validate(SceneDef* scene, std::ostream& err);
// Generates a snapshot of the node into the specified builder.
// Returns true if successful, false if the node is blocked from rendering.
bool Snapshot(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene);
// Generates a snapshot of the node's children into the specified builder.
// Returns true if successful, false if the children are blocked from
// rendering.
bool SnapshotChildren(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene);
private:
bool SnapshotInner(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene);
uint32_t node_id_;
mojo::TransformPtr const content_transform_;
mojo::RectPtr const content_clip_;
uint32_t const hit_id_;
Combinator const combinator_;
std::vector<uint32_t> const child_node_ids_;
std::unique_ptr<NodeOp> const op_;
std::vector<NodeDef*> child_nodes_;
// Used to detect cycles during a snapshot operation.
// This is safe because the object will only be used by a single thread.
bool visited_ = false;
DISALLOW_COPY_AND_ASSIGN(NodeDef);
};
// Abstract scene graph node operation.
class NodeOp {
public:
NodeOp() = default;
virtual ~NodeOp() = default;
// Validates and prepares the object for rendering.
// Returns true if successful, false if errors were reported.
virtual bool Validate(SceneDef* scene, NodeDef* node, std::ostream& err);
// Generates a snapshot of the node operation into the specified builder.
// This method is responsible for calling |SnapshotChildren| to process
// the children of the node. Returns true if successful, false if the node
// is blocked from rendering.
virtual bool Snapshot(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene,
NodeDef* node) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(NodeOp);
};
// A solid color filled rectangle node definition.
class RectNodeOp : public NodeOp {
public:
RectNodeOp(const mojo::Rect& content_rect,
const mojo::gfx::composition::Color& color);
~RectNodeOp() override;
const mojo::Rect& content_rect() { return content_rect_; }
const mojo::gfx::composition::Color& color() { return color_; }
bool Snapshot(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene,
NodeDef* node) override;
private:
mojo::Rect content_rect_;
mojo::gfx::composition::Color color_;
DISALLOW_COPY_AND_ASSIGN(RectNodeOp);
};
// An image filled rectangle node definition.
class ImageNodeOp : public NodeOp {
public:
ImageNodeOp(const mojo::Rect& content_rect,
mojo::RectPtr image_rect,
uint32 image_resource_id,
mojo::gfx::composition::BlendPtr blend);
~ImageNodeOp() override;
const mojo::Rect& content_rect() { return content_rect_; }
mojo::Rect* image_rect() { return image_rect_.get(); }
uint32_t image_resource_id() { return image_resource_id_; }
mojo::gfx::composition::Blend* blend() { return blend_.get(); }
// Updated by |Validate()|.
ImageResourceDef* image_resource() { return image_resource_; }
bool Validate(SceneDef* scene, NodeDef* node, std::ostream& err) override;
bool Snapshot(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene,
NodeDef* node) override;
private:
mojo::Rect const content_rect_;
mojo::RectPtr const image_rect_;
uint32_t const image_resource_id_;
mojo::gfx::composition::BlendPtr const blend_;
ImageResourceDef* image_resource_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(ImageNodeOp);
};
// An embedded scene node definition.
class SceneNodeOp : public NodeOp {
public:
SceneNodeOp(uint32_t scene_resource_id, uint32_t scene_version);
~SceneNodeOp() override;
uint32_t scene_resource_id() { return scene_resource_id_; }
uint32_t scene_version() { return scene_version_; }
// Updated by |Validate()|.
SceneResourceDef* scene_resource() { return scene_resource_; }
bool Validate(SceneDef* scene, NodeDef* node, std::ostream& err) override;
bool Snapshot(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene,
NodeDef* node) override;
private:
uint32_t const scene_resource_id_;
uint32_t const scene_version_;
SceneResourceDef* scene_resource_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(SceneNodeOp);
};
// A composited layer node definition.
class LayerNodeOp : public NodeOp {
public:
LayerNodeOp(const mojo::Size& size, mojo::gfx::composition::BlendPtr blend);
~LayerNodeOp() override;
const mojo::Size& size() { return size_; }
mojo::gfx::composition::Blend* blend() { return blend_.get(); }
bool Snapshot(SnapshotBuilder* snapshot_builder,
RenderLayerBuilder* layer_builder,
SceneDef* scene,
NodeDef* node) override;
private:
mojo::Size const size_;
mojo::gfx::composition::BlendPtr const blend_;
DISALLOW_COPY_AND_ASSIGN(LayerNodeOp);
};
} // namespace compositor
#endif // SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_