Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Unified Diff: cc/resources/picture_pile_impl.cc

Issue 14230007: cc: Do GatherPixelRefs from skia at record time (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reviews Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/picture_pile_impl.h ('k') | cc/resources/picture_pile_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/picture_pile_impl.cc
diff --git a/cc/resources/picture_pile_impl.cc b/cc/resources/picture_pile_impl.cc
index dd30ede82a80d8a7fe20e416d671725fde8a66c4..eac0cbc5c6d474d1a041f35bfc694c4d296ec6b8 100644
--- a/cc/resources/picture_pile_impl.cc
+++ b/cc/resources/picture_pile_impl.cc
@@ -198,31 +198,6 @@ int64 PicturePileImpl::Raster(
return total_pixels_rasterized;
}
-void PicturePileImpl::GatherPixelRefs(
- gfx::Rect content_rect,
- float contents_scale,
- std::list<skia::LazyPixelRef*>& pixel_refs) {
- std::list<skia::LazyPixelRef*> result;
-
- gfx::Rect layer_rect = gfx::ToEnclosingRect(
- gfx::ScaleRect(content_rect, 1.f / contents_scale));
-
- for (TilingData::Iterator tile_iter(&tiling_, layer_rect);
- tile_iter; ++tile_iter) {
- PictureListMap::iterator map_iter =
- picture_list_map_.find(tile_iter.index());
- if (map_iter == picture_list_map_.end())
- continue;
-
- PictureList& pic_list = map_iter->second;
- for (PictureList::const_iterator i = pic_list.begin();
- i != pic_list.end(); ++i) {
- (*i)->GatherPixelRefs(layer_rect, result);
- pixel_refs.splice(pixel_refs.end(), result);
- }
- }
-}
-
skia::RefPtr<SkPicture> PicturePileImpl::GetFlattenedPicture() {
TRACE_EVENT0("cc", "PicturePileImpl::GetFlattenedPicture");
@@ -277,4 +252,67 @@ PicturePileImpl::Analysis::Analysis()
PicturePileImpl::Analysis::~Analysis() {
}
+PicturePileImpl::PixelRefIterator::PixelRefIterator(
+ gfx::Rect content_rect,
+ float contents_scale,
+ const PicturePileImpl* picture_pile)
+ : picture_pile_(picture_pile),
+ layer_rect_(gfx::ToEnclosingRect(
+ gfx::ScaleRect(content_rect, 1.f / contents_scale))),
+ tile_iterator_(&picture_pile_->tiling_, layer_rect_),
+ picture_list_(NULL) {
+ // Early out if there isn't a single tile.
+ if (!tile_iterator_)
+ return;
+
+ if (AdvanceToTileWithPictures())
+ AdvanceToPictureWithPixelRefs();
+}
+
+PicturePileImpl::PixelRefIterator::~PixelRefIterator() {
+}
+
+PicturePileImpl::PixelRefIterator&
+ PicturePileImpl::PixelRefIterator::operator++() {
+ ++pixel_ref_iterator_;
+ if (pixel_ref_iterator_)
+ return *this;
+
+ ++picture_list_iterator_;
+ AdvanceToPictureWithPixelRefs();
+ return *this;
+}
+
+bool PicturePileImpl::PixelRefIterator::AdvanceToTileWithPictures() {
+ for (; tile_iterator_; ++tile_iterator_) {
+ PictureListMap::const_iterator map_iterator =
+ picture_pile_->picture_list_map_.find(tile_iterator_.index());
+ if (map_iterator != picture_pile_->picture_list_map_.end()) {
+ picture_list_ = &map_iterator->second;
+ picture_list_iterator_ = picture_list_->begin();
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void PicturePileImpl::PixelRefIterator::AdvanceToPictureWithPixelRefs() {
+ if (!tile_iterator_)
reveman 2013/04/24 23:01:27 nit: can this happen? remove or change to DCHECK i
vmpstr 2013/04/24 23:58:19 Only when incrementing an iterator that is invalid
+ return;
+
+ do {
+ for (;
+ picture_list_iterator_ != picture_list_->end();
reveman 2013/04/24 23:01:27 nit: indent looks a bit off here.
vmpstr 2013/04/24 23:58:19 I'm not really sure how to indent this :) I've add
+ ++picture_list_iterator_) {
+ pixel_ref_iterator_ = Picture::PixelRefIterator(
+ layer_rect_,
+ *picture_list_iterator_);
+ if (pixel_ref_iterator_)
+ return;
+ }
+ ++tile_iterator_;
+ } while (AdvanceToTileWithPictures());
+}
+
} // namespace cc
« no previous file with comments | « cc/resources/picture_pile_impl.h ('k') | cc/resources/picture_pile_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698