// 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
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDER_TREE_FILTER_NODE_H_
#define COBALT_RENDER_TREE_FILTER_NODE_H_

#include <utility>

#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 {
 public:
  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)  // NOLINT(runtime/explicit)
      : data_(std::forward<Args>(args)...) {
    if (DCHECK_IS_ON()) {
      AssertValid();
    }
  }

  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_; }

 private:
  void AssertValid() const;

  const Builder data_;
};

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_FILTER_NODE_H_
