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

Side by Side Diff: cc/picture_pile.cc

Issue 11299324: Make PicturePile pile. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 6
7 #include "cc/picture_pile.h" 7 #include "cc/picture_pile.h"
8 #include "cc/picture_pile_impl.h" 8 #include "cc/picture_pile_impl.h"
9 9
10 namespace {
11 const float kResetThreshold = 0.7f;
enne (OOO) 2012/12/04 04:11:09 Can you add a comment for what this constant is fo
12 }
13
10 namespace cc { 14 namespace cc {
11 15
12 PicturePile::PicturePile() { 16 PicturePile::PicturePile() {
13 } 17 }
14 18
15 PicturePile::~PicturePile() { 19 PicturePile::~PicturePile() {
16 } 20 }
17 21
18 class OutOfBoundsPredicate { 22 void PicturePile::Resize(gfx::Size size) {
19 public: 23 if (size_ == size)
20 OutOfBoundsPredicate(gfx::Size size) : layer_rect_(gfx::Point(), size) { } 24 return;
21 bool operator()(const scoped_refptr<Picture>& picture) {
22 return !picture->LayerRect().Intersects(layer_rect_);
23 }
24 gfx::Rect layer_rect_;
25 };
26 25
27 void PicturePile::Resize(gfx::Size size) { 26 pile_.clear();
enne (OOO) 2012/12/04 04:11:09 Ah, quite right. I guess if you're resizing and ha
28 // Remove pictures that aren't in bounds anymore.
29 if (size.width() < size_.width() || size.height() < size_.height()) {
30 OutOfBoundsPredicate oob(size);
31 pile_.erase(std::remove_if(pile_.begin(), pile_.end(), oob), pile_.end());
32 }
33
34 size_ = size; 27 size_ = size;
35 } 28 }
36 29
37 void PicturePile::Update( 30 void PicturePile::Update(
38 ContentLayerClient* painter, 31 ContentLayerClient* painter,
39 const Region&, 32 const Region& invalidation,
40 RenderingStats& stats) { 33 RenderingStats& stats) {
41 // TODO(enne): Add things to the pile, consolidate if needed, etc... 34 if (pile_.empty()) {
42 // TODO(enne): Only re-record invalidated areas. 35 ResetPile(painter, stats);
43 // TODO(enne): Also re-record areas that have been newly exposed by resize. 36 return;
37 }
44 38
45 // Always re-record the entire layer into a single picture, just to get 39 for (Region::Iterator i(invalidation); i.has_rect(); i.next())
46 // this class up and running. 40 InvalidateRect(i.rect());
41
42 for (Pile::iterator i = pile_.begin(); i != pile_.end(); ++i) {
43 if (!(*i)->HasRecording())
44 (*i)->Record(painter, stats);
45 }
46 }
47
48 class FullyContainedPredicate {
49 public:
50 FullyContainedPredicate(gfx::Rect rect) : layer_rect_(rect) { }
51 bool operator()(const scoped_refptr<Picture>& picture) {
52 return layer_rect_.Contains(picture->LayerRect());
53 }
54 gfx::Rect layer_rect_;
55 };
56
57 void PicturePile::InvalidateRect(gfx::Rect invalidation) {
58 if (invalidation.IsEmpty())
59 return;
60
61 std::vector<Pile::iterator> overlaps;
62 for (Pile::iterator i = pile_.begin(); i != pile_.end(); ++i) {
63 if ((*i)->LayerRect().Contains(invalidation) && !(*i)->HasRecording())
64 return;
65 if ((*i)->LayerRect().Intersects(invalidation) && i != pile_.begin())
66 overlaps.push_back(i);
67 }
68
69 gfx::Rect picture_rect = invalidation;
70 for (int j = 0; j < overlaps.size(); j++)
71 picture_rect = gfx::UnionRects(picture_rect, (*overlaps[j])->LayerRect());
72 if (picture_rect.size().GetArea() / static_cast<float>(size_.GetArea())
73 > kResetThreshold)
enne (OOO) 2012/12/04 04:11:09 style nit: I'm pretty sure operators go on the pre
74 picture_rect = gfx::Rect(size_);
75
76 FullyContainedPredicate pred(picture_rect);
77 pile_.erase(std::remove_if(pile_.begin(), pile_.end(), pred), pile_.end());
78
79 pile_.push_back(Picture::Create(picture_rect));
80 }
81
82
83 void PicturePile::ResetPile(ContentLayerClient* painter,
84 RenderingStats& stats) {
47 pile_.clear(); 85 pile_.clear();
48 pile_.push_back(Picture::Create()); 86
49 pile_[0]->Record(painter, gfx::Rect(gfx::Point(), size_), stats); 87 scoped_refptr<Picture> base_picture = Picture::Create(gfx::Rect(size_));
88 base_picture->Record(painter, stats);
89 pile_.push_back(base_picture);
50 } 90 }
51 91
52 void PicturePile::PushPropertiesTo(PicturePileImpl* other) { 92 void PicturePile::PushPropertiesTo(PicturePileImpl* other) {
53 other->pile_.resize(pile_.size()); 93 other->pile_ = pile_;
54 for (size_t i = 0; i < pile_.size(); ++i)
55 other->pile_[i] = pile_[i];
56 } 94 }
57 95
58 } // namespace cc 96 } // namespace cc
OLDNEW
« cc/picture_pile.h ('K') | « cc/picture_pile.h ('k') | cc/picture_pile_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698