OLD | NEW |
---|---|
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 "cc/resources/picture_pile.h" | 5 #include "cc/resources/picture_pile.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "cc/base/region.h" | 10 #include "cc/base/region.h" |
(...skipping 28 matching lines...) Expand all Loading... | |
39 RenderingStats* stats) { | 39 RenderingStats* stats) { |
40 background_color_ = background_color; | 40 background_color_ = background_color; |
41 | 41 |
42 gfx::Rect interest_rect = visible_layer_rect; | 42 gfx::Rect interest_rect = visible_layer_rect; |
43 interest_rect.Inset( | 43 interest_rect.Inset( |
44 -kPixelDistanceToRecord, | 44 -kPixelDistanceToRecord, |
45 -kPixelDistanceToRecord, | 45 -kPixelDistanceToRecord, |
46 -kPixelDistanceToRecord, | 46 -kPixelDistanceToRecord, |
47 -kPixelDistanceToRecord); | 47 -kPixelDistanceToRecord); |
48 for (Region::Iterator i(invalidation); i.has_rect(); i.next()) { | 48 for (Region::Iterator i(invalidation); i.has_rect(); i.next()) { |
49 // Inflate all recordings from invalidations with a margin so that when | 49 gfx::Rect invalidation = i.rect(); |
50 // scaled down to at least min_contents_scale, any final pixel touched by an | |
51 // invalidation can be fully rasterized by this picture. | |
52 gfx::Rect inflated_invalidation = i.rect(); | |
53 inflated_invalidation.Inset( | |
54 -buffer_pixels(), | |
55 -buffer_pixels(), | |
56 -buffer_pixels(), | |
57 -buffer_pixels()); | |
58 // Split this inflated invalidation across tile boundaries and apply it | 50 // Split this inflated invalidation across tile boundaries and apply it |
59 // to all tiles that it touches. | 51 // to all tiles that it touches. |
60 for (TilingData::Iterator iter(&tiling_, inflated_invalidation); | 52 for (TilingData::Iterator iter(&tiling_, invalidation); |
61 iter; ++iter) { | 53 iter; ++iter) { |
62 gfx::Rect tile = | 54 gfx::Rect tile = |
63 tiling_.TileBoundsWithBorder(iter.index_x(), iter.index_y()); | 55 tiling_.TileBoundsWithBorder(iter.index_x(), iter.index_y()); |
64 if (!tile.Intersects(interest_rect)) { | 56 if (!tile.Intersects(interest_rect)) { |
65 // This invalidation touches a tile outside the interest rect, so | 57 // This invalidation touches a tile outside the interest rect, so |
66 // just remove the entire picture list. | 58 // just remove the entire picture list. |
67 picture_list_map_.erase(iter.index()); | 59 picture_list_map_.erase(iter.index()); |
68 continue; | 60 continue; |
69 } | 61 } |
70 | 62 |
71 gfx::Rect tile_invalidation = | 63 gfx::Rect tile_invalidation = gfx::IntersectRects(invalidation, tile); |
72 gfx::IntersectRects(inflated_invalidation, tile); | |
73 if (tile_invalidation.IsEmpty()) | 64 if (tile_invalidation.IsEmpty()) |
74 continue; | 65 continue; |
75 PictureListMap::iterator find = picture_list_map_.find(iter.index()); | 66 PictureListMap::iterator find = picture_list_map_.find(iter.index()); |
76 if (find == picture_list_map_.end()) | 67 if (find == picture_list_map_.end()) |
77 continue; | 68 continue; |
78 PictureList& pic_list = find->second; | 69 PictureList& pic_list = find->second; |
79 // Leave empty pic_lists empty in case there are multiple invalidations. | 70 // Leave empty pic_lists empty in case there are multiple invalidations. |
80 if (!pic_list.empty()) | 71 if (!pic_list.empty()) { |
72 // Inflate all recordings from invalidations with a margin so that when | |
73 // scaled down to at least min_contents_scale, any final pixel touched | |
74 // by an invalidation can be fully rasterized by this picture. | |
75 for (int i = 0; i < 2; ++i) { | |
enne (OOO)
2013/05/03 07:00:57
This is not right. It's not just for scaling down
danakj
2013/05/03 17:49:20
Okay so let me see if I'm understanding correctly.
| |
76 int width_inflate = 0; | |
77 int height_inflate = 0; | |
78 if (tile_invalidation.width() < buffer_pixels() * 2 + 1) | |
79 width_inflate = buffer_pixels(); | |
80 if (tile_invalidation.height() < buffer_pixels() * 2 + 1) | |
81 height_inflate = buffer_pixels(); | |
82 if (!width_inflate && !height_inflate) | |
83 break; | |
84 tile_invalidation.Inset(-width_inflate, -height_inflate); | |
85 tile_invalidation.Intersect(tile); | |
86 } | |
87 | |
88 DCHECK_GE(tile_invalidation.width(), buffer_pixels() * 2 + 1); | |
89 DCHECK_GE(tile_invalidation.height(), buffer_pixels() * 2 + 1); | |
90 | |
81 InvalidateRect(pic_list, tile_invalidation); | 91 InvalidateRect(pic_list, tile_invalidation); |
92 } | |
82 } | 93 } |
83 } | 94 } |
84 | 95 |
85 // Walk through all pictures in the rect of interest and record. | 96 // Walk through all pictures in the rect of interest and record. |
86 for (TilingData::Iterator iter(&tiling_, interest_rect); iter; ++iter) { | 97 for (TilingData::Iterator iter(&tiling_, interest_rect); iter; ++iter) { |
87 // Create a picture in this list if it doesn't exist. | 98 // Create a picture in this list if it doesn't exist. |
88 PictureList& pic_list = picture_list_map_[iter.index()]; | 99 PictureList& pic_list = picture_list_map_[iter.index()]; |
89 if (pic_list.empty()) { | 100 if (pic_list.empty()) { |
90 // Inflate the base picture with a margin, similar to invalidations, so | 101 // Inflate the base picture with a margin, similar to invalidations, so |
91 // that when scaled down to at least min_contents_scale, the enclosed | 102 // that when scaled down to at least min_contents_scale, the enclosed |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 | 162 |
152 FullyContainedPredicate pred(picture_rect); | 163 FullyContainedPredicate pred(picture_rect); |
153 picture_list.erase(std::remove_if(picture_list.begin(), | 164 picture_list.erase(std::remove_if(picture_list.begin(), |
154 picture_list.end(), | 165 picture_list.end(), |
155 pred), | 166 pred), |
156 picture_list.end()); | 167 picture_list.end()); |
157 picture_list.push_back(Picture::Create(picture_rect)); | 168 picture_list.push_back(Picture::Create(picture_rect)); |
158 } | 169 } |
159 | 170 |
160 } // namespace cc | 171 } // namespace cc |
OLD | NEW |