// 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 "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) : 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_
