// Copyright 2015 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_BROWSER_RENDER_TREE_COMBINER_H_
#define COBALT_BROWSER_RENDER_TREE_COMBINER_H_

#include "cobalt/renderer/renderer_module.h"
#include "cobalt/renderer/submission.h"

namespace cobalt {
namespace browser {

// Combines the main and debug console render trees. Caches the individual
// trees as they are produced. Re-renders when either tree changes.
// This class is only fully implemented when ENABLE_DEBUG_CONSOLE is defined,
// otherwise (e.g. in release builds) a stub implementation is used.
class RenderTreeCombiner {
 public:
  explicit RenderTreeCombiner(renderer::RendererModule* renderer_module,
                              const math::Size& viewport_size);
  ~RenderTreeCombiner();

  void Reset();

  // Update the main web module render tree.
  void UpdateMainRenderTree(const renderer::Submission& render_tree_submission);

  // Update the debug console render tree.
  void UpdateDebugConsoleRenderTree(
      const base::optional<renderer::Submission>& render_tree_submission);

#if defined(ENABLE_DEBUG_CONSOLE)
  bool render_debug_console() const { return render_debug_console_; }
  void set_render_debug_console(bool render_debug_console) {
    render_debug_console_ = render_debug_console;
  }
#else   // ENABLE_DEBUG_CONSOLE
  bool render_debug_console() const { return false; }
  void set_render_debug_console(bool render_debug_console) {
    UNREFERENCED_PARAMETER(render_debug_console);
  }
#endif  // ENABLE_DEBUG_CONSOLE

 private:
#if defined(ENABLE_DEBUG_CONSOLE)
  // Combines the two cached render trees (main/debug) and renders the result.
  void SubmitToRenderer();

  bool render_debug_console_;

  // Local reference to the render pipeline, so we can submit the combined tree.
  // Reference counted pointer not necessary here.
  renderer::RendererModule* renderer_module_;

  // The size of the output viewport.
  math::Size viewport_size_;

  // Local references to the main and debug console render trees/animation maps
  // so we can combine them.
  base::optional<renderer::Submission> main_render_tree_;

  // This is the time that we received the last main render tree submission.
  // used so that we know what time to forward the submission to the pipeline
  // with.
  base::optional<base::TimeTicks> main_render_tree_receipt_time_;

  // The debug console render tree submission.
  base::optional<renderer::Submission> debug_console_render_tree_;
#else   // ENABLE_DEBUG_CONSOLE
  // Use this local reference even in release builds to submit the main tree.
  renderer::RendererModule* renderer_module_;
#endif  // ENABLE_DEBUG_CONSOLE
};

}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_RENDER_TREE_COMBINER_H_
