Index: services/gfx/compositor/graph/snapshot.cc |
diff --git a/services/gfx/compositor/graph/snapshot.cc b/services/gfx/compositor/graph/snapshot.cc |
index ab4a4478ed2d2302cc30cce06bdf70ab306621fb..66f44e987422516606efa5d2465250f974517fa9 100644 |
--- a/services/gfx/compositor/graph/snapshot.cc |
+++ b/services/gfx/compositor/graph/snapshot.cc |
@@ -17,33 +17,32 @@ Snapshot::Snapshot() {} |
Snapshot::~Snapshot() {} |
-bool Snapshot::Invalidate() { |
- if (valid_) { |
- valid_ = false; |
- dependencies_.clear(); |
- ClearContent(); |
- return true; |
- } |
- return false; |
+bool Snapshot::HasDependency(const SceneDef* scene) const { |
+ return dependencies_.find(scene->label().token()) != dependencies_.end(); |
} |
-bool Snapshot::InvalidateScene(const SceneDef* scene_def) { |
- DCHECK(scene_def); |
- return valid_ && |
- dependencies_.find(scene_def->label().token()) != |
- dependencies_.end() && |
- Invalidate(); |
-} |
+std::shared_ptr<RenderFrame> Snapshot::CreateFrame( |
+ const mojo::Rect& viewport, |
+ const mojo::gfx::composition::FrameInfo& frame_info) const { |
+ DCHECK(!is_blocked()); |
+ |
+ SkRect sk_viewport = |
+ SkRect::MakeXYWH(viewport.x, viewport.y, viewport.width, viewport.height); |
+ SkPictureRecorder recorder; |
+ recorder.beginRecording(sk_viewport); |
+ |
+ const NodeDef* root_node = root_scene_content_->GetRootNodeIfExists(); |
+ DCHECK(root_node); // otherwise would have failed to snapshot |
+ root_node->RecordPicture(root_scene_content_.get(), this, |
+ recorder.getRecordingCanvas()); |
-void Snapshot::ClearContent() { |
- root_scene_content_ = nullptr; |
- resolved_scene_contents_.clear(); |
- node_dispositions_.clear(); |
- frame_.reset(); |
+ return RenderFrame::Create(skia::AdoptRef(recorder.endRecordingAsPicture()), |
+ sk_viewport, frame_info); |
} |
-bool Snapshot::IsBlocked(const NodeDef* node) const { |
- DCHECK(valid_); |
+bool Snapshot::IsNodeBlocked(const NodeDef* node) const { |
+ DCHECK(!is_blocked()); |
+ |
auto it = node_dispositions_.find(node); |
DCHECK(it != node_dispositions_.end()); |
DCHECK(it->second == Disposition::kSuccess || |
@@ -53,7 +52,8 @@ bool Snapshot::IsBlocked(const NodeDef* node) const { |
const SceneContent* Snapshot::GetResolvedSceneContent( |
const SceneNodeDef* scene_node) const { |
- DCHECK(valid_); |
+ DCHECK(!is_blocked()); |
+ |
auto it = resolved_scene_contents_.find(scene_node); |
DCHECK(it != resolved_scene_contents_.end()); |
return it->second.get(); |
@@ -195,33 +195,18 @@ Snapshot::Disposition SnapshotBuilder::SnapshotRenderer(const SceneDef* scene) { |
return SnapshotRootAndDetectCycles(root, content); |
} |
-std::unique_ptr<Snapshot> SnapshotBuilder::Build( |
- const SceneDef* root_scene, |
- const mojo::Rect& viewport, |
- const mojo::gfx::composition::FrameInfo& frame_info) { |
+scoped_refptr<const Snapshot> SnapshotBuilder::Build( |
+ const SceneDef* root_scene) { |
DCHECK(snapshot_); |
DCHECK(root_scene); |
- Snapshot::Disposition disposition = SnapshotRenderer(root_scene); |
+ snapshot_->disposition_ = SnapshotRenderer(root_scene); |
DCHECK(!cycle_); // must have properly unwound any cycles by now |
- if (disposition == Snapshot::Disposition::kSuccess) { |
- SkRect sk_viewport = SkRect::MakeXYWH(viewport.x, viewport.y, |
- viewport.width, viewport.height); |
- SkPictureRecorder recorder; |
- recorder.beginRecording(sk_viewport); |
- |
- const NodeDef* root_node = |
- snapshot_->root_scene_content_->GetRootNodeIfExists(); |
- DCHECK(root_node); // otherwise would have failed to snapshot |
- root_node->RecordPicture(snapshot_->root_scene_content_.get(), |
- snapshot_.get(), recorder.getRecordingCanvas()); |
- |
- snapshot_->frame_ = |
- RenderFrame::Create(skia::AdoptRef(recorder.endRecordingAsPicture()), |
- sk_viewport, frame_info); |
- } else { |
- snapshot_->ClearContent(); |
+ if (snapshot_->is_blocked()) { |
+ snapshot_->root_scene_content_ = nullptr; |
+ snapshot_->resolved_scene_contents_.clear(); |
+ snapshot_->node_dispositions_.clear(); |
} |
return std::move(snapshot_); |
} |