Index: services/gfx/compositor/render/painting.cc |
diff --git a/services/gfx/compositor/render/painting.cc b/services/gfx/compositor/render/painting.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..de2aefe2a81a616ef421400f9ea1ce52ff0109ae |
--- /dev/null |
+++ b/services/gfx/compositor/render/painting.cc |
@@ -0,0 +1,104 @@ |
+// 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/render/painting.h" |
+ |
+#include "base/logging.h" |
+#include "services/gfx/compositor/render/render_image.h" |
+#include "services/gfx/compositor/render/render_layer.h" |
+#include "third_party/skia/include/core/SkImage.h" |
+#include "third_party/skia/include/core/SkPicture.h" |
+ |
+namespace compositor { |
+ |
+PaintingScope::PaintingScope( |
+ const mojo::skia::GaneshContext::Scope& ganesh_scope, |
+ PaintingCache* painting_cache) |
+ : ganesh_scope_(ganesh_scope), painting_cache_(painting_cache) { |
+ DCHECK(painting_cache_); |
+ painting_cache_->BeginPainting(*this); |
+} |
+ |
+PaintingScope::~PaintingScope() { |
+ painting_cache_->FinishPainting(*this); |
+} |
+ |
+PaintingCache::PaintingCache() {} |
+ |
+PaintingCache::~PaintingCache() { |
+ DCHECK(!painting_); |
+ DCHECK(used_images_.empty()); |
+ DCHECK(cached_images_.empty()); |
+ DCHECK(used_pictures_.empty()); |
+ DCHECK(cached_pictures_.empty()); |
+} |
+ |
+void PaintingCache::BeginPainting(const PaintingScope& painting_scope) { |
+ DCHECK(!painting_); |
+ DCHECK(used_images_.empty()); |
+ DCHECK(used_pictures_.empty()); |
+ |
+ painting_ = true; |
+} |
+ |
+void PaintingCache::FinishPainting(const PaintingScope& painting_scope) { |
+ DCHECK(painting_); |
+ |
+ painting_ = false; |
+ cached_images_.clear(); |
+ cached_images_.swap(used_images_); |
+ cached_pictures_.clear(); |
+ cached_pictures_.swap(used_pictures_); |
+} |
+ |
+void PaintingCache::Clear(const PaintingScope& painting_scope) { |
+ used_images_.clear(); |
+ cached_images_.clear(); |
+ used_pictures_.clear(); |
+ cached_pictures_.clear(); |
+} |
+ |
+skia::RefPtr<SkImage> PaintingCache::GetSkImage( |
+ const PaintingScope& painting_scope, |
+ const std::shared_ptr<RenderImage>& image) { |
+ // Look in our recently used images. |
+ auto used_it = used_images_.find(image); |
+ if (used_it != used_images_.end()) |
+ return used_it->second; |
+ |
+ // Look in our previously cached images. |
+ auto cached_it = cached_images_.find(image); |
+ if (cached_it != cached_images_.end()) { |
+ used_images_.emplace(*cached_it); |
+ return cached_it->second; |
+ } |
+ |
+ // Create the image. |
+ skia::RefPtr<SkImage> result = image->CreateSkImage(painting_scope); |
+ used_images_.emplace(std::make_pair(image, result)); |
+ return result; |
+} |
+ |
+skia::RefPtr<SkPicture> PaintingCache::GetSkPicture( |
+ const PaintingScope& painting_scope, |
+ const std::shared_ptr<RenderLayer>& layer) { |
+ // Look in our recently used pictures. |
+ auto used_it = used_pictures_.find(layer); |
+ if (used_it != used_pictures_.end()) |
+ return used_it->second; |
+ |
+ // Look in our previously cached pictures. |
+ auto cached_it = cached_pictures_.find(layer); |
+ if (cached_it != cached_pictures_.end()) { |
+ used_pictures_.emplace(*cached_it); |
+ return cached_it->second; |
+ } |
+ |
+ // Create the picture. |
+ skia::RefPtr<SkPicture> result = layer->CreateSkPicture(painting_scope); |
+ used_pictures_.emplace(std::make_pair(layer, result)); |
+ return result; |
+} |
+ |
+} // namespace compositor |