Index: cc/surfaces/surface_manager.cc |
diff --git a/cc/surfaces/surface_manager.cc b/cc/surfaces/surface_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..117d82ab659394458f678ac13da90eaa15b9d00b |
--- /dev/null |
+++ b/cc/surfaces/surface_manager.cc |
@@ -0,0 +1,89 @@ |
+// Copyright 2014 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 "cc/surfaces/surface_manager.h" |
+ |
+#include "base/logging.h" |
+#include "cc/surfaces/surface.h" |
+#include "cc/surfaces/surface_id_allocator.h" |
+ |
+namespace cc { |
+ |
+SurfaceManager::SurfaceManager() { |
+ thread_checker_.DetachFromThread(); |
+} |
+ |
+SurfaceManager::~SurfaceManager() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ for (SurfaceDestroyList::iterator it = surfaces_to_destroy_.begin(); |
+ it != surfaces_to_destroy_.end(); |
+ ++it) { |
+ DeregisterSurface((*it)->surface_id()); |
+ delete *it; |
+ } |
+} |
+ |
+void SurfaceManager::RegisterSurface(Surface* surface) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(surface); |
+ DCHECK(!surface_map_.count(surface->surface_id())); |
+ surface_map_[surface->surface_id()] = surface; |
+} |
+ |
+void SurfaceManager::DeregisterSurface(SurfaceId surface_id) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ SurfaceMap::iterator it = surface_map_.find(surface_id); |
+ DCHECK(it != surface_map_.end()); |
+ surface_map_.erase(it); |
+} |
+ |
+void SurfaceManager::Destroy(scoped_ptr<Surface> surface) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ surfaces_to_destroy_.push_back(surface.release()); |
+ SearchForSatisfaction(); |
+} |
+ |
+void SurfaceManager::DidSatisfySequences(uint32_t id_namespace, |
+ std::vector<uint32_t>* sequence) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ for (std::vector<uint32_t>::iterator it = sequence->begin(); |
+ it != sequence->end(); |
+ ++it) { |
+ satisfied_sequences_.insert(SurfaceSequence(id_namespace, *it)); |
+ } |
+ sequence->clear(); |
+ SearchForSatisfaction(); |
+} |
+ |
+void SurfaceManager::SearchForSatisfaction() { |
+ for (SurfaceDestroyList::iterator dest_it = surfaces_to_destroy_.begin(); |
+ dest_it != surfaces_to_destroy_.end();) { |
+ (*dest_it)->SatisfyDestructionDependencies(&satisfied_sequences_); |
+ if (!(*dest_it)->GetDestructionDependencyCount()) { |
+ scoped_ptr<Surface> surf(*dest_it); |
+ DeregisterSurface(surf->surface_id()); |
+ dest_it = surfaces_to_destroy_.erase(dest_it); |
+ } else { |
+ ++dest_it; |
+ } |
+ } |
+} |
+ |
+Surface* SurfaceManager::GetSurfaceForId(SurfaceId surface_id) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ SurfaceMap::iterator it = surface_map_.find(surface_id); |
+ if (it == surface_map_.end()) |
+ return NULL; |
+ return it->second; |
+} |
+ |
+bool SurfaceManager::SurfaceModified(SurfaceId surface_id) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ bool changed = false; |
+ FOR_EACH_OBSERVER(SurfaceDamageObserver, observer_list_, |
+ OnSurfaceDamaged(surface_id, &changed)); |
+ return changed; |
+} |
+ |
+} // namespace cc |