blob: b2914c7914e9e33f4df94de02c52712f1173ade8 [file] [log] [blame]
// Copyright 2015 The Cobalt Authors. All Rights Reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/optional.h"
#include "cobalt/base/type_id.h"
#include "cobalt/render_tree/blur_filter.h"
#include "cobalt/render_tree/map_to_mesh_filter.h"
#include "cobalt/render_tree/node.h"
#include "cobalt/render_tree/opacity_filter.h"
#include "cobalt/render_tree/shadow.h"
#include "cobalt/render_tree/viewport_filter.h"
namespace cobalt {
namespace render_tree {
// Wrapping a render tree inside of a FilterMode expresses the desire to modify
// the image produced by the source render tree by passing it through a set
// of filters, such as an opacity filter which makes the resulting image
// transparent.
class FilterNode : public Node {
struct Builder {
Builder(const Builder&) = default;
explicit Builder(const scoped_refptr<render_tree::Node>& source);
Builder(const OpacityFilter& opacity_filter,
const scoped_refptr<render_tree::Node>& source);
Builder(const ViewportFilter& viewport_filter,
const scoped_refptr<render_tree::Node>& source);
Builder(const BlurFilter& blur_filter,
const scoped_refptr<render_tree::Node>& source);
Builder(const MapToMeshFilter& map_to_mesh_filter,
const scoped_refptr<render_tree::Node>& source);
math::RectF GetBounds() const;
bool operator==(const Builder& other) const {
return source == other.source && opacity_filter == other.opacity_filter &&
viewport_filter == other.viewport_filter &&
blur_filter == other.blur_filter &&
map_to_mesh_filter == other.map_to_mesh_filter;
// The source tree, which will be used as the input to the filters specified
// in this FilterNode.
scoped_refptr<render_tree::Node> source;
// If set, this filter will make the source subtree appear transparent,
// with the level of transparency dictated by the OpacityFilter's value.
base::Optional<OpacityFilter> opacity_filter;
// If set, this filter will specify the viewport of source content. Only
// the source content within the viewport rectangle will be rendered.
// Rounded corners may be specified on this filter.
base::Optional<ViewportFilter> viewport_filter;
// If set, then a Gaussian blur will be applied to the source with a
// Gaussian kernel of standard deviation |blur_sigma|.
base::Optional<BlurFilter> blur_filter;
// If set, indicates that the rasterized output of the source content should
// be used as a texture which is then mapped onto a 3D mesh specified by the
// filter.
base::Optional<MapToMeshFilter> map_to_mesh_filter;
// Forwarding constructor to the set of Builder constructors.
template <typename... Args>
FilterNode(Args&&... args) : data_(std::forward<Args>(args)...) {
if (DCHECK_IS_ON()) {
void Accept(NodeVisitor* visitor) override;
math::RectF GetBounds() const override { return data_.GetBounds(); }
base::TypeId GetTypeId() const override {
return base::GetTypeId<FilterNode>();
const Builder& data() const { return data_; }
void AssertValid() const;
const Builder data_;
} // namespace render_tree
} // namespace cobalt