/*
 * 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.
 */

#include "cobalt/debug/render_overlay.h"

#include "cobalt/math/matrix3_f.h"
#include "cobalt/render_tree/composition_node.h"

namespace cobalt {
namespace debug {

RenderOverlay::RenderOverlay(
    const OnRenderTreeProducedCallback& render_tree_produced_callback)
    : render_tree_produced_callback_(render_tree_produced_callback),
      input_layout_(NULL, base::TimeDelta()) {}

void RenderOverlay::OnRenderTreeProduced(const LayoutResults& layout_results) {
  input_layout_ = layout_results;
  input_receipt_time_ = base::TimeTicks::HighResNow();
  Process();
}

void RenderOverlay::SetOverlay(
    const scoped_refptr<render_tree::Node>& overlay) {
  overlay_ = overlay;
  Process();
}

void RenderOverlay::ClearInput() {
  input_layout_ = LayoutResults(NULL, base::TimeDelta());
  input_receipt_time_ = base::nullopt;
}

void RenderOverlay::Process() {
  if (input_layout_.render_tree) {
    // Calculate a modified layout time accounting for the offset between now
    // and the time the input layout was received.
    base::TimeDelta layout_time = input_layout_.layout_time;
    DCHECK(input_receipt_time_);
    base::TimeTicks now = base::TimeTicks::HighResNow();
    layout_time += now - input_receipt_time_.value_or(now);

    if (overlay_) {
      render_tree::CompositionNode::Builder builder;
      builder.AddChild(input_layout_.render_tree);
      builder.AddChild(overlay_);
      scoped_refptr<render_tree::Node> combined_tree =
          new render_tree::CompositionNode(builder);

      render_tree_produced_callback_.Run(
          LayoutResults(combined_tree, layout_time));
    } else {
      render_tree_produced_callback_.Run(
          LayoutResults(input_layout_.render_tree, layout_time));
    }
  }
}

}  // namespace debug
}  // namespace cobalt
