/*
 * 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_DEBUG_RENDER_OVERLAY_H_
#define COBALT_DEBUG_RENDER_OVERLAY_H_

#include <string>

#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "cobalt/layout/layout_manager.h"
#include "cobalt/render_tree/node.h"

namespace cobalt {
namespace debug {

// Inserted into the render callback pipeline to add additional nodes to the
// render tree.
class RenderOverlay {
 public:
  typedef layout::LayoutManager::LayoutResults LayoutResults;

  typedef base::Callback<void(const LayoutResults&)>
      OnRenderTreeProducedCallback;

  explicit RenderOverlay(
      const OnRenderTreeProducedCallback& render_tree_produced_callback);

  // Called when the input layout changes.
  void OnRenderTreeProduced(const LayoutResults& layout_results);

  // Updates the overlay that will be added to the input layout.
  void SetOverlay(const scoped_refptr<render_tree::Node>& overlay);

  void ClearInput();

 private:
  // Adds the overlay (if any) to the input layout and passes on to the
  // callback specified in the constructor.
  void Process();

  OnRenderTreeProducedCallback render_tree_produced_callback_;
  scoped_refptr<render_tree::Node> overlay_;
  LayoutResults input_layout_;
  base::optional<base::TimeTicks> input_receipt_time_;
};

}  // namespace debug
}  // namespace cobalt

#endif  // COBALT_DEBUG_RENDER_OVERLAY_H_
