| 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_layer_tiling_set.h" | 5 #include "cc/resources/picture_layer_tiling_set.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 namespace cc { | 9 namespace cc { |
| 10 | 10 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 PictureLayerTilingSet::~PictureLayerTilingSet() { | 30 PictureLayerTilingSet::~PictureLayerTilingSet() { |
| 31 } | 31 } |
| 32 | 32 |
| 33 void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { | 33 void PictureLayerTilingSet::SetClient(PictureLayerTilingClient* client) { |
| 34 client_ = client; | 34 client_ = client; |
| 35 for (size_t i = 0; i < tilings_.size(); ++i) | 35 for (size_t i = 0; i < tilings_.size(); ++i) |
| 36 tilings_[i]->SetClient(client_); | 36 tilings_[i]->SetClient(client_); |
| 37 } | 37 } |
| 38 | 38 |
| 39 void PictureLayerTilingSet::SyncTilings( | 39 bool PictureLayerTilingSet::SyncTilings(const PictureLayerTilingSet& other, |
| 40 const PictureLayerTilingSet& other, | 40 const gfx::Size& new_layer_bounds, |
| 41 const gfx::Size& new_layer_bounds, | 41 const Region& layer_invalidation, |
| 42 const Region& layer_invalidation, | 42 float minimum_contents_scale) { |
| 43 float minimum_contents_scale) { | |
| 44 if (new_layer_bounds.IsEmpty()) { | 43 if (new_layer_bounds.IsEmpty()) { |
| 45 RemoveAllTilings(); | 44 RemoveAllTilings(); |
| 46 layer_bounds_ = new_layer_bounds; | 45 layer_bounds_ = new_layer_bounds; |
| 47 return; | 46 return false; |
| 48 } | 47 } |
| 49 | 48 |
| 50 tilings_.reserve(other.tilings_.size()); | 49 tilings_.reserve(other.tilings_.size()); |
| 51 | 50 |
| 52 // Remove any tilings that aren't in |other| or don't meet the minimum. | 51 // Remove any tilings that aren't in |other| or don't meet the minimum. |
| 53 for (size_t i = 0; i < tilings_.size(); ++i) { | 52 for (size_t i = 0; i < tilings_.size(); ++i) { |
| 54 float scale = tilings_[i]->contents_scale(); | 53 float scale = tilings_[i]->contents_scale(); |
| 55 if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale)) | 54 if (scale >= minimum_contents_scale && !!other.TilingAtScale(scale)) |
| 56 continue; | 55 continue; |
| 57 // Swap with the last element and remove it. | 56 // Swap with the last element and remove it. |
| 58 tilings_.swap(tilings_.begin() + i, tilings_.end() - 1); | 57 tilings_.swap(tilings_.begin() + i, tilings_.end() - 1); |
| 59 tilings_.pop_back(); | 58 tilings_.pop_back(); |
| 60 --i; | 59 --i; |
| 61 } | 60 } |
| 62 | 61 |
| 62 bool have_high_res_tiling = false; |
| 63 |
| 63 // Add any missing tilings from |other| that meet the minimum. | 64 // Add any missing tilings from |other| that meet the minimum. |
| 64 for (size_t i = 0; i < other.tilings_.size(); ++i) { | 65 for (size_t i = 0; i < other.tilings_.size(); ++i) { |
| 65 float contents_scale = other.tilings_[i]->contents_scale(); | 66 float contents_scale = other.tilings_[i]->contents_scale(); |
| 66 if (contents_scale < minimum_contents_scale) | 67 if (contents_scale < minimum_contents_scale) |
| 67 continue; | 68 continue; |
| 68 if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) { | 69 if (PictureLayerTiling* this_tiling = TilingAtScale(contents_scale)) { |
| 69 this_tiling->set_resolution(other.tilings_[i]->resolution()); | 70 this_tiling->set_resolution(other.tilings_[i]->resolution()); |
| 70 | 71 |
| 71 // These two calls must come before updating the pile, because they may | 72 // These two calls must come before updating the pile, because they may |
| 72 // destroy tiles that the new pile cannot raster. | 73 // destroy tiles that the new pile cannot raster. |
| 73 this_tiling->SetLayerBounds(new_layer_bounds); | 74 this_tiling->SetLayerBounds(new_layer_bounds); |
| 74 this_tiling->Invalidate(layer_invalidation); | 75 this_tiling->Invalidate(layer_invalidation); |
| 75 | 76 |
| 76 this_tiling->UpdateTilesToCurrentPile(); | 77 this_tiling->UpdateTilesToCurrentPile(); |
| 77 this_tiling->CreateMissingTilesInLiveTilesRect(); | 78 this_tiling->CreateMissingTilesInLiveTilesRect(); |
| 79 if (this_tiling->resolution() == HIGH_RESOLUTION) |
| 80 have_high_res_tiling = true; |
| 78 | 81 |
| 79 DCHECK(this_tiling->tile_size() == | 82 DCHECK(this_tiling->tile_size() == |
| 80 client_->CalculateTileSize(this_tiling->TilingRect().size())); | 83 client_->CalculateTileSize(this_tiling->TilingRect().size())); |
| 81 continue; | 84 continue; |
| 82 } | 85 } |
| 83 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( | 86 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( |
| 84 contents_scale, | 87 contents_scale, |
| 85 new_layer_bounds, | 88 new_layer_bounds, |
| 86 client_); | 89 client_); |
| 87 new_tiling->set_resolution(other.tilings_[i]->resolution()); | 90 new_tiling->set_resolution(other.tilings_[i]->resolution()); |
| 91 if (new_tiling->resolution() == HIGH_RESOLUTION) |
| 92 have_high_res_tiling = true; |
| 88 tilings_.push_back(new_tiling.Pass()); | 93 tilings_.push_back(new_tiling.Pass()); |
| 89 } | 94 } |
| 90 tilings_.sort(LargestToSmallestScaleFunctor()); | 95 tilings_.sort(LargestToSmallestScaleFunctor()); |
| 91 | 96 |
| 92 layer_bounds_ = new_layer_bounds; | 97 layer_bounds_ = new_layer_bounds; |
| 98 return have_high_res_tiling; |
| 93 } | 99 } |
| 94 | 100 |
| 95 void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { | 101 void PictureLayerTilingSet::RemoveTilesInRegion(const Region& region) { |
| 96 for (size_t i = 0; i < tilings_.size(); ++i) | 102 for (size_t i = 0; i < tilings_.size(); ++i) |
| 97 tilings_[i]->RemoveTilesInRegion(region); | 103 tilings_[i]->RemoveTilesInRegion(region); |
| 98 } | 104 } |
| 99 | 105 |
| 100 void PictureLayerTilingSet::SetCanUseLCDText(bool can_use_lcd_text) { | 106 void PictureLayerTilingSet::SetCanUseLCDText(bool can_use_lcd_text) { |
| 101 for (size_t i = 0; i < tilings_.size(); ++i) | 107 for (size_t i = 0; i < tilings_.size(); ++i) |
| 102 tilings_[i]->SetCanUseLCDText(can_use_lcd_text); | 108 tilings_[i]->SetCanUseLCDText(can_use_lcd_text); |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 } | 350 } |
| 345 | 351 |
| 346 size_t PictureLayerTilingSet::GPUMemoryUsageInBytes() const { | 352 size_t PictureLayerTilingSet::GPUMemoryUsageInBytes() const { |
| 347 size_t amount = 0; | 353 size_t amount = 0; |
| 348 for (size_t i = 0; i < tilings_.size(); ++i) | 354 for (size_t i = 0; i < tilings_.size(); ++i) |
| 349 amount += tilings_[i]->GPUMemoryUsageInBytes(); | 355 amount += tilings_[i]->GPUMemoryUsageInBytes(); |
| 350 return amount; | 356 return amount; |
| 351 } | 357 } |
| 352 | 358 |
| 353 } // namespace cc | 359 } // namespace cc |
| OLD | NEW |