/*
 * Copyright 2016 Google Inc. 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 "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(const math::Rect&)> SetBoundsCB;

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

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

  explicit PunchThroughVideoNode(const Builder& builder) : data_(builder) {}

  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_
