blob: 65f31270b35141e680c4ae25707a19dd6c260d84 [file] [log] [blame]
// 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 <map>
#include "base/memory/scoped_ptr.h"
#include "base/optional.h"
#include "base/time.h"
#include "cobalt/renderer/renderer_module.h"
#include "cobalt/renderer/submission.h"
namespace cobalt {
namespace browser {
// Combines rendering layers (such as the main, splash screen, and
// debug console). Caches the individual trees as they are produced.
// Re-renders when any tree changes.
class RenderTreeCombiner {
public:
// Layer represents the render layer corresponding to the main web
// module, the splash screen, or the debug console and are used to
// create and submit a combined tree to the RendererModule's
// pipeline. Layers are combined in order of the |z_index| specifed
// at the Layers' creation. The RenderTreeCombiner stores pointers
// to Layers. The Layers are owned by the caller of
// RenderTreeCombiner::CreateLayer.
class Layer {
public:
~Layer();
void Reset() {
render_tree_ = base::nullopt;
receipt_time_ = base::nullopt;
}
// Submit render tree to the layer, and specify whether the time
// received should be stored.
void Submit(
const base::optional<renderer::Submission>& render_tree_submission,
bool receive_time = false);
private:
friend class RenderTreeCombiner;
explicit Layer(RenderTreeCombiner* render_tree_combiner = NULL);
RenderTreeCombiner* render_tree_combiner_;
base::optional<renderer::Submission> render_tree_;
base::optional<base::TimeTicks> receipt_time_;
};
explicit RenderTreeCombiner(renderer::RendererModule* renderer_module,
const math::Size& viewport_size);
~RenderTreeCombiner() {}
// Create a Layer with a given |z_index|. If a Layer already exists
// at |z_index|, return NULL, and no Layer is created.
scoped_ptr<Layer> CreateLayer(int z_index);
private:
// The layers keyed on their z_index.
std::map<int, Layer*> layers_;
// Removes a layer from |layers_|. Called by the Layer destructor.
void RemoveLayer(const Layer* layer);
// Combines the cached render trees and renders the result.
void SubmitToRenderer();
// 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_;
};
} // namespace browser
} // namespace cobalt
#endif // COBALT_BROWSER_RENDER_TREE_COMBINER_H_