blob: 935fa2055b790c2a5b402736cb9be84e08e02344 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/gfx/compositor/graph/snapshot.h"
#include "base/logging.h"
#include "services/gfx/compositor/graph/scene_def.h"
#include "services/gfx/compositor/render/render_frame.h"
#include "services/gfx/compositor/render/render_layer.h"
#include "third_party/skia/include/core/SkRect.h"
namespace compositor {
Snapshot::Snapshot() {}
Snapshot::~Snapshot() {}
bool Snapshot::Invalidate() {
if (valid_) {
valid_ = false;
dependencies_.clear();
frame_.reset();
return true;
}
return false;
}
bool Snapshot::InvalidateScene(SceneDef* scene_def) {
DCHECK(scene_def);
if (valid_ && dependencies_.find(scene_def) != dependencies_.end()) {
return Invalidate();
}
return false;
}
SnapshotBuilder::SnapshotBuilder(std::ostream* block_log)
: block_log_(block_log), snapshot_(new Snapshot()) {}
SnapshotBuilder::~SnapshotBuilder() {}
void SnapshotBuilder::AddSceneDependency(SceneDef* scene) {
DCHECK(snapshot_);
snapshot_->dependencies_.insert(scene);
}
std::unique_ptr<Snapshot> SnapshotBuilder::Build(
SceneDef* root_scene,
const mojo::Rect& viewport,
const mojo::gfx::composition::FrameInfo& frame_info) {
DCHECK(snapshot_);
DCHECK(root_scene);
SkRect sk_viewport =
SkRect::MakeXYWH(viewport.x, viewport.y, viewport.width, viewport.height);
RenderLayerBuilder layer_builder(&sk_viewport);
if (root_scene->Snapshot(this, &layer_builder)) {
snapshot_->frame_ =
RenderFrame::Create(layer_builder.Build(), sk_viewport, frame_info);
} else {
snapshot_->valid_ = false;
}
return std::move(snapshot_);
}
} // namespace compositor