Index: cc/resources/picture.cc |
diff --git a/cc/resources/picture.cc b/cc/resources/picture.cc |
index 2b6eca8777fbc0c3d7d280170d3f7008ce85d990..2fc4fee798c27cf83f03bc1c26d5ed323e02cbd1 100644 |
--- a/cc/resources/picture.cc |
+++ b/cc/resources/picture.cc |
@@ -2,10 +2,14 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "cc/resources/picture.h" |
+ |
+#include <algorithm> |
+#include <set> |
+ |
#include "base/debug/trace_event.h" |
#include "cc/debug/rendering_stats.h" |
#include "cc/layers/content_layer_client.h" |
-#include "cc/resources/picture.h" |
#include "skia/ext/analysis_canvas.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
#include "third_party/skia/include/core/SkData.h" |
@@ -44,10 +48,12 @@ Picture::Picture(gfx::Rect layer_rect) |
Picture::Picture(const skia::RefPtr<SkPicture>& picture, |
gfx::Rect layer_rect, |
- gfx::Rect opaque_rect) : |
+ gfx::Rect opaque_rect, |
+ const PositionPixelRefsVector& lazy_pixel_refs) : |
layer_rect_(layer_rect), |
opaque_rect_(opaque_rect), |
- picture_(picture) { |
+ picture_(picture), |
+ lazy_pixel_refs_(lazy_pixel_refs) { |
} |
Picture::~Picture() { |
@@ -73,7 +79,8 @@ void Picture::CloneForDrawing(int num_threads) { |
scoped_refptr<Picture> clone = make_scoped_refptr( |
new Picture(skia::AdoptRef(new SkPicture(clones[i])), |
layer_rect_, |
- opaque_rect_)); |
+ opaque_rect_, |
+ lazy_pixel_refs_)); |
clones_.push_back(clone); |
} |
} |
@@ -125,6 +132,8 @@ void Picture::Record(ContentLayerClient* painter, |
picture_->endRecording(); |
opaque_rect_ = gfx::ToEnclosedRect(opaque_layer_rect); |
+ |
+ GatherAllPixelRefs(); |
} |
void Picture::Raster( |
@@ -152,6 +161,26 @@ void Picture::Raster( |
void Picture::GatherPixelRefs(const gfx::Rect& layer_rect, |
std::list<skia::LazyPixelRef*>& pixel_ref_list) { |
+ std::list<skia::LazyPixelRef*> pixel_refs; |
+ for (PositionPixelRefsVector::iterator iter = lazy_pixel_refs_.begin(); |
+ iter != lazy_pixel_refs_.end(); |
+ ++iter) { |
+ if (iter->rect.Intersects(layer_rect)) { |
+ pixel_refs.insert(pixel_refs.end(), |
+ iter->pixel_refs.begin(), |
+ iter->pixel_refs.end()); |
+ } |
+ } |
+ std::set<skia::LazyPixelRef*> unique_pixel_refs(pixel_refs.begin(), |
+ pixel_refs.end()); |
+ pixel_ref_list.insert(pixel_ref_list.end(), |
+ unique_pixel_refs.begin(), |
+ unique_pixel_refs.end()); |
+} |
+ |
+void Picture::GatherPixelRefsFromSkia( |
+ const gfx::Rect& layer_rect, |
+ std::list<skia::LazyPixelRef*>& pixel_ref_list) { |
DCHECK(picture_); |
SkData* pixel_refs = SkPictureUtils::GatherPixelRefs( |
picture_.get(), SkRect::MakeXYWH(layer_rect.x(), |
@@ -178,4 +207,33 @@ void Picture::GatherPixelRefs(const gfx::Rect& layer_rect, |
pixel_refs->unref(); |
} |
+void Picture::GatherAllPixelRefs() { |
+ const gfx::Size kRegionSize(512, 512); |
+ // Capture pixel refs for this picture in a grid |
+ // with kRegionSize sized cells. |
+ for (int y = layer_rect_.y(); |
+ y < layer_rect_.bottom(); |
+ y += kRegionSize.height()) { |
+ for (int x = layer_rect_.x(); |
+ x < layer_rect_.right(); |
+ x += kRegionSize.width()) { |
+ gfx::Size extent( |
+ std::min(kRegionSize.width(), layer_rect_.right() - x), |
+ std::min(kRegionSize.height(), layer_rect_.bottom() - y)); |
+ gfx::Rect rect(x, y, extent.width(), extent.height()); |
enne (OOO)
2013/04/16 22:03:36
Can we get this information from Skia, rather than
reveman
2013/04/17 00:25:28
this is not related to the image size. it's the gr
|
+ |
+ std::list<skia::LazyPixelRef*> lazy_pixel_refs; |
+ GatherPixelRefsFromSkia(rect, lazy_pixel_refs); |
+ |
+ // Only capture non-empty cells. |
+ if (!lazy_pixel_refs.empty()) { |
+ PositionPixelRefs position_pixel_refs; |
+ position_pixel_refs.rect = rect; |
+ position_pixel_refs.pixel_refs.swap(lazy_pixel_refs); |
+ lazy_pixel_refs_.push_back(position_pixel_refs); |
+ } |
+ } |
+ } |
+} |
+ |
} // namespace cc |