| 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 <limits> | 8 #include <limits> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 150 |
| 151 PicturePile::~PicturePile() { | 151 PicturePile::~PicturePile() { |
| 152 } | 152 } |
| 153 | 153 |
| 154 bool PicturePile::UpdateAndExpandInvalidation( | 154 bool PicturePile::UpdateAndExpandInvalidation( |
| 155 ContentLayerClient* painter, | 155 ContentLayerClient* painter, |
| 156 Region* invalidation, | 156 Region* invalidation, |
| 157 SkColor background_color, | 157 SkColor background_color, |
| 158 bool contents_opaque, | 158 bool contents_opaque, |
| 159 bool contents_fill_bounds_completely, | 159 bool contents_fill_bounds_completely, |
| 160 const gfx::Rect& layer_bounds_rect, | 160 const gfx::Size& layer_size, |
| 161 const gfx::Rect& visible_layer_rect, | 161 const gfx::Rect& visible_layer_rect, |
| 162 int frame_number, | 162 int frame_number, |
| 163 Picture::RecordingMode recording_mode, | 163 Picture::RecordingMode recording_mode, |
| 164 RenderingStatsInstrumentation* stats_instrumentation) { | 164 RenderingStatsInstrumentation* stats_instrumentation) { |
| 165 background_color_ = background_color; | 165 background_color_ = background_color; |
| 166 contents_opaque_ = contents_opaque; | 166 contents_opaque_ = contents_opaque; |
| 167 contents_fill_bounds_completely_ = contents_fill_bounds_completely; | 167 contents_fill_bounds_completely_ = contents_fill_bounds_completely; |
| 168 | 168 |
| 169 bool updated = false; | 169 bool updated = false; |
| 170 | 170 |
| 171 Region resize_invalidation; | 171 Region resize_invalidation; |
| 172 gfx::Rect old_tiling_rect = tiling_rect(); | 172 gfx::Size old_tiling_size = tiling_size(); |
| 173 if (old_tiling_rect != layer_bounds_rect) { | 173 if (old_tiling_size != layer_size) { |
| 174 tiling_.SetTilingRect(layer_bounds_rect); | 174 tiling_.SetTilingSize(layer_size); |
| 175 updated = true; | 175 updated = true; |
| 176 } | 176 } |
| 177 | 177 |
| 178 gfx::Rect interest_rect = visible_layer_rect; | 178 gfx::Rect interest_rect = visible_layer_rect; |
| 179 interest_rect.Inset( | 179 interest_rect.Inset( |
| 180 -kPixelDistanceToRecord, | 180 -kPixelDistanceToRecord, |
| 181 -kPixelDistanceToRecord, | 181 -kPixelDistanceToRecord, |
| 182 -kPixelDistanceToRecord, | 182 -kPixelDistanceToRecord, |
| 183 -kPixelDistanceToRecord); | 183 -kPixelDistanceToRecord); |
| 184 recorded_viewport_ = interest_rect; | 184 recorded_viewport_ = interest_rect; |
| 185 recorded_viewport_.Intersect(tiling_rect()); | 185 recorded_viewport_.Intersect(gfx::Rect(tiling_size())); |
| 186 | 186 |
| 187 gfx::Rect interest_rect_over_tiles = | 187 gfx::Rect interest_rect_over_tiles = |
| 188 tiling_.ExpandRectToTileBounds(interest_rect); | 188 tiling_.ExpandRectToTileBounds(interest_rect); |
| 189 | 189 |
| 190 if (old_tiling_rect != layer_bounds_rect) { | 190 if (old_tiling_size != layer_size) { |
| 191 has_any_recordings_ = false; | 191 has_any_recordings_ = false; |
| 192 | 192 |
| 193 if (tiling_rect().origin() != old_tiling_rect.origin()) { | 193 // Drop recordings that are outside the new layer bounds or that changed |
| 194 // If the origin changes we just do something simple. | 194 // size. |
| 195 picture_map_.clear(); | 195 std::vector<PictureMapKey> to_erase; |
| 196 invalidation->Union(old_tiling_rect); | 196 int min_toss_x = tiling_.num_tiles_x(); |
| 197 invalidation->Union(tiling_rect()); | 197 if (tiling_size().width() > old_tiling_size.width()) { |
| 198 } else { | 198 min_toss_x = |
| 199 // Drop recordings that are outside the new layer bounds or that changed | 199 tiling_.FirstBorderTileXIndexFromSrcCoord(old_tiling_size.width()); |
| 200 // size. | 200 } |
| 201 std::vector<PictureMapKey> to_erase; | 201 int min_toss_y = tiling_.num_tiles_y(); |
| 202 int min_toss_x = tiling_.num_tiles_x(); | 202 if (tiling_size().height() > old_tiling_size.height()) { |
| 203 if (tiling_rect().right() > old_tiling_rect.right()) { | 203 min_toss_y = |
| 204 min_toss_x = | 204 tiling_.FirstBorderTileYIndexFromSrcCoord(old_tiling_size.height()); |
| 205 tiling_.FirstBorderTileXIndexFromSrcCoord(old_tiling_rect.right()); | 205 } |
| 206 for (PictureMap::const_iterator it = picture_map_.begin(); |
| 207 it != picture_map_.end(); |
| 208 ++it) { |
| 209 const PictureMapKey& key = it->first; |
| 210 if (key.first < min_toss_x && key.second < min_toss_y) { |
| 211 has_any_recordings_ |= !!it->second.GetPicture(); |
| 212 continue; |
| 206 } | 213 } |
| 207 int min_toss_y = tiling_.num_tiles_y(); | 214 to_erase.push_back(key); |
| 208 if (tiling_rect().bottom() > old_tiling_rect.bottom()) { | 215 } |
| 209 min_toss_y = | |
| 210 tiling_.FirstBorderTileYIndexFromSrcCoord(old_tiling_rect.bottom()); | |
| 211 } | |
| 212 for (PictureMap::const_iterator it = picture_map_.begin(); | |
| 213 it != picture_map_.end(); | |
| 214 ++it) { | |
| 215 const PictureMapKey& key = it->first; | |
| 216 if (key.first < min_toss_x && key.second < min_toss_y) { | |
| 217 has_any_recordings_ |= !!it->second.GetPicture(); | |
| 218 continue; | |
| 219 } | |
| 220 to_erase.push_back(key); | |
| 221 } | |
| 222 | 216 |
| 223 for (size_t i = 0; i < to_erase.size(); ++i) | 217 for (size_t i = 0; i < to_erase.size(); ++i) |
| 224 picture_map_.erase(to_erase[i]); | 218 picture_map_.erase(to_erase[i]); |
| 225 | 219 |
| 226 // If a recording is dropped and not re-recorded below, invalidate that | 220 // If a recording is dropped and not re-recorded below, invalidate that |
| 227 // full recording to cause any raster tiles that would use it to be | 221 // full recording to cause any raster tiles that would use it to be |
| 228 // dropped. | 222 // dropped. |
| 229 // If the recording will be replaced below, just invalidate newly exposed | 223 // If the recording will be replaced below, just invalidate newly exposed |
| 230 // areas to force raster tiles that include the old recording to know | 224 // areas to force raster tiles that include the old recording to know |
| 231 // there is new recording to display. | 225 // there is new recording to display. |
| 232 gfx::Rect old_tiling_rect_over_tiles = | 226 gfx::Rect old_tiling_rect_over_tiles = |
| 233 tiling_.ExpandRectToTileBounds(old_tiling_rect); | 227 tiling_.ExpandRectToTileBounds(gfx::Rect(old_tiling_size)); |
| 234 if (min_toss_x < tiling_.num_tiles_x()) { | 228 if (min_toss_x < tiling_.num_tiles_x()) { |
| 235 int unrecorded_left = std::max(tiling_.TilePositionX(min_toss_x), | 229 int unrecorded_left = std::max(tiling_.TilePositionX(min_toss_x), |
| 236 interest_rect_over_tiles.right()); | 230 interest_rect_over_tiles.right()); |
| 237 int exposed_left = old_tiling_rect.right(); | 231 int exposed_left = old_tiling_size.width(); |
| 238 int left = std::min(unrecorded_left, exposed_left); | 232 int left = std::min(unrecorded_left, exposed_left); |
| 239 int tile_right = | 233 int tile_right = |
| 240 tiling_.TilePositionX(min_toss_x) + tiling_.TileSizeX(min_toss_x); | 234 tiling_.TilePositionX(min_toss_x) + tiling_.TileSizeX(min_toss_x); |
| 241 int exposed_right = tiling_rect().right(); | 235 int exposed_right = tiling_size().width(); |
| 242 int right = std::min(tile_right, exposed_right); | 236 int right = std::min(tile_right, exposed_right); |
| 243 gfx::Rect right_side(left, | 237 gfx::Rect right_side(left, |
| 244 old_tiling_rect_over_tiles.y(), | 238 old_tiling_rect_over_tiles.y(), |
| 245 right - left, | 239 right - left, |
| 246 old_tiling_rect_over_tiles.height()); | 240 old_tiling_rect_over_tiles.height()); |
| 247 resize_invalidation.Union(right_side); | 241 resize_invalidation.Union(right_side); |
| 248 } | 242 } |
| 249 if (min_toss_y < tiling_.num_tiles_y()) { | 243 if (min_toss_y < tiling_.num_tiles_y()) { |
| 250 int unrecorded_top = std::max(tiling_.TilePositionY(min_toss_y), | 244 int unrecorded_top = std::max(tiling_.TilePositionY(min_toss_y), |
| 251 interest_rect_over_tiles.bottom()); | 245 interest_rect_over_tiles.bottom()); |
| 252 int exposed_top = old_tiling_rect.bottom(); | 246 int exposed_top = old_tiling_size.height(); |
| 253 int top = std::min(unrecorded_top, exposed_top); | 247 int top = std::min(unrecorded_top, exposed_top); |
| 254 int tile_bottom = | 248 int tile_bottom = |
| 255 tiling_.TilePositionY(min_toss_y) + tiling_.TileSizeY(min_toss_y); | 249 tiling_.TilePositionY(min_toss_y) + tiling_.TileSizeY(min_toss_y); |
| 256 int exposed_bottom = tiling_rect().bottom(); | 250 int exposed_bottom = tiling_size().height(); |
| 257 int bottom = std::min(tile_bottom, exposed_bottom); | 251 int bottom = std::min(tile_bottom, exposed_bottom); |
| 258 gfx::Rect bottom_side(old_tiling_rect_over_tiles.x(), | 252 gfx::Rect bottom_side(old_tiling_rect_over_tiles.x(), |
| 259 top, | 253 top, |
| 260 old_tiling_rect_over_tiles.width(), | 254 old_tiling_rect_over_tiles.width(), |
| 261 bottom - top); | 255 bottom - top); |
| 262 resize_invalidation.Union(bottom_side); | 256 resize_invalidation.Union(bottom_side); |
| 263 } | |
| 264 } | 257 } |
| 265 } | 258 } |
| 266 | 259 |
| 267 Region invalidation_expanded_to_full_tiles; | 260 Region invalidation_expanded_to_full_tiles; |
| 268 for (Region::Iterator i(*invalidation); i.has_rect(); i.next()) { | 261 for (Region::Iterator i(*invalidation); i.has_rect(); i.next()) { |
| 269 gfx::Rect invalid_rect = i.rect(); | 262 gfx::Rect invalid_rect = i.rect(); |
| 270 | 263 |
| 271 // Expand invalidation that is outside tiles that intersect the interest | 264 // Expand invalidation that is outside tiles that intersect the interest |
| 272 // rect. These tiles are no longer valid and should be considerered fully | 265 // rect. These tiles are no longer valid and should be considerered fully |
| 273 // invalid, so we can know to not keep around raster tiles that intersect | 266 // invalid, so we can know to not keep around raster tiles that intersect |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 } | 395 } |
| 403 DCHECK(found_tile_for_recorded_picture); | 396 DCHECK(found_tile_for_recorded_picture); |
| 404 } | 397 } |
| 405 | 398 |
| 406 has_any_recordings_ = true; | 399 has_any_recordings_ = true; |
| 407 DCHECK(CanRasterSlowTileCheck(recorded_viewport_)); | 400 DCHECK(CanRasterSlowTileCheck(recorded_viewport_)); |
| 408 return true; | 401 return true; |
| 409 } | 402 } |
| 410 | 403 |
| 411 void PicturePile::SetEmptyBounds() { | 404 void PicturePile::SetEmptyBounds() { |
| 412 tiling_.SetTilingRect(gfx::Rect()); | 405 tiling_.SetTilingSize(gfx::Size()); |
| 413 picture_map_.clear(); | 406 picture_map_.clear(); |
| 414 has_any_recordings_ = false; | 407 has_any_recordings_ = false; |
| 415 recorded_viewport_ = gfx::Rect(); | 408 recorded_viewport_ = gfx::Rect(); |
| 416 } | 409 } |
| 417 | 410 |
| 418 } // namespace cc | 411 } // namespace cc |
| OLD | NEW |