// Copyright 2016 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_PUNCH_THROUGH_VIDEO_NODE_H_
#define COBALT_RENDER_TREE_PUNCH_THROUGH_VIDEO_NODE_H_

#include <utility>

#include "base/callback.h"
#include "base/compiler_specific.h"
#include "cobalt/base/type_id.h"
#include "cobalt/math/rect.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/render_tree/node.h"

namespace cobalt {
namespace render_tree {

// Results in a rectangle being rasterized onto the screen where each pixel of
// the rectangle has 0 alpha (but it is not blended with the destination color,
// or in other words, it punches through to the background). This is useful when
// another subsystem is rendering a video on another layer behind the graphics.
//
// WARNING: It is very difficult for implementations to support this
//          properly in every scenario (e.g. if the renderer happens to be
//          rendering to an offscreen surface when this ImageNode is
//          encountered, the punch through will apply to the offscreen
//          surface, which itself may be blended with the final image.)
//          Use this setting sparingly.  As of now it is used only to
//          support punch out video rendering.
class PunchThroughVideoNode : public Node {
 public:
  typedef base::Callback<bool(int x, int y, int width, int height)> SetBoundsCB;

  struct Builder {
    Builder(const Builder&) = default;
    Builder(const math::RectF& rect, const SetBoundsCB& set_bounds_cb)
        : rect(rect), set_bounds_cb(set_bounds_cb) {}

    bool operator==(const Builder& other) const {
      return rect == other.rect && set_bounds_cb.Equals(other.set_bounds_cb);
    }

    // The destination rectangle (size includes border).
    math::RectF rect;
    const SetBoundsCB set_bounds_cb;
  };

  // Forwarding constructor to the set of Builder constructors.
  template <typename... Args>
  explicit PunchThroughVideoNode(Args&&... args)
      : data_(std::forward<Args>(args)...) {}

  void Accept(NodeVisitor* visitor) override;
  math::RectF GetBounds() const override;

  base::TypeId GetTypeId() const override {
    return base::GetTypeId<PunchThroughVideoNode>();
  }

  const Builder& data() const { return data_; }

 private:
  const Builder data_;
};

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_PUNCH_THROUGH_VIDEO_NODE_H_
