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

Side by Side Diff: cc/resources/picture_layer_tiling.cc

Issue 547463002: cc: Don't make tiles for mask layers that are too big for a texture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: hugemasks: rebase-past-mask-analysis Created 6 years, 3 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 unified diff | Download patch
« no previous file with comments | « cc/layers/picture_layer_impl_unittest.cc ('k') | cc/resources/picture_pile_base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "cc/resources/picture_layer_tiling.h" 5 #include "cc/resources/picture_layer_tiling.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #include <set> 10 #include <set>
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 last_impl_frame_time_in_seconds_(0.0), 84 last_impl_frame_time_in_seconds_(0.0),
85 has_visible_rect_tiles_(false), 85 has_visible_rect_tiles_(false),
86 has_skewport_rect_tiles_(false), 86 has_skewport_rect_tiles_(false),
87 has_soon_border_rect_tiles_(false), 87 has_soon_border_rect_tiles_(false),
88 has_eventually_rect_tiles_(false), 88 has_eventually_rect_tiles_(false),
89 eviction_tiles_cache_valid_(false), 89 eviction_tiles_cache_valid_(false),
90 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { 90 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) {
91 gfx::Size content_bounds = 91 gfx::Size content_bounds =
92 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); 92 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale));
93 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); 93 gfx::Size tile_size = client_->CalculateTileSize(content_bounds);
94 if (tile_size.IsEmpty()) {
95 layer_bounds_ = gfx::Size();
96 content_bounds = gfx::Size();
97 }
94 98
95 DCHECK(!gfx::ToFlooredSize( 99 DCHECK(!gfx::ToFlooredSize(
96 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << 100 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) <<
97 "Tiling created with scale too small as contents become empty." << 101 "Tiling created with scale too small as contents become empty." <<
98 " Layer bounds: " << layer_bounds.ToString() << 102 " Layer bounds: " << layer_bounds.ToString() <<
99 " Contents scale: " << contents_scale; 103 " Contents scale: " << contents_scale;
100 104
101 tiling_data_.SetTilingSize(content_bounds); 105 tiling_data_.SetTilingSize(content_bounds);
102 tiling_data_.SetMaxTextureSize(tile_size); 106 tiling_data_.SetMaxTextureSize(tile_size);
103 } 107 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 } 165 }
162 166
163 VerifyLiveTilesRect(); 167 VerifyLiveTilesRect();
164 } 168 }
165 169
166 void PictureLayerTiling::UpdateTilesToCurrentPile( 170 void PictureLayerTiling::UpdateTilesToCurrentPile(
167 const Region& layer_invalidation, 171 const Region& layer_invalidation,
168 const gfx::Size& new_layer_bounds) { 172 const gfx::Size& new_layer_bounds) {
169 DCHECK(!new_layer_bounds.IsEmpty()); 173 DCHECK(!new_layer_bounds.IsEmpty());
170 174
171 gfx::Size old_layer_bounds = layer_bounds_;
172 layer_bounds_ = new_layer_bounds;
173
174 gfx::Size content_bounds =
175 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds_, contents_scale_));
176 gfx::Size tile_size = tiling_data_.max_texture_size(); 175 gfx::Size tile_size = tiling_data_.max_texture_size();
177 176
178 if (layer_bounds_ != old_layer_bounds) { 177 if (new_layer_bounds != layer_bounds_) {
178 gfx::Size content_bounds =
179 gfx::ToCeiledSize(gfx::ScaleSize(new_layer_bounds, contents_scale_));
180
181 tile_size = client_->CalculateTileSize(content_bounds);
182 if (tile_size.IsEmpty()) {
183 layer_bounds_ = gfx::Size();
184 content_bounds = gfx::Size();
185 } else {
186 layer_bounds_ = new_layer_bounds;
187 }
188
179 // The SetLiveTilesRect() method would drop tiles outside the new bounds, 189 // The SetLiveTilesRect() method would drop tiles outside the new bounds,
180 // but may do so incorrectly if resizing the tiling causes the number of 190 // but may do so incorrectly if resizing the tiling causes the number of
181 // tiles in the tiling_data_ to change. 191 // tiles in the tiling_data_ to change.
182 gfx::Rect content_rect(content_bounds); 192 gfx::Rect content_rect(content_bounds);
183 int before_left = tiling_data_.TileXIndexFromSrcCoord(live_tiles_rect_.x()); 193 int before_left = tiling_data_.TileXIndexFromSrcCoord(live_tiles_rect_.x());
184 int before_top = tiling_data_.TileYIndexFromSrcCoord(live_tiles_rect_.y()); 194 int before_top = tiling_data_.TileYIndexFromSrcCoord(live_tiles_rect_.y());
185 int before_right = 195 int before_right =
186 tiling_data_.TileXIndexFromSrcCoord(live_tiles_rect_.right() - 1); 196 tiling_data_.TileXIndexFromSrcCoord(live_tiles_rect_.right() - 1);
187 int before_bottom = 197 int before_bottom =
188 tiling_data_.TileYIndexFromSrcCoord(live_tiles_rect_.bottom() - 1); 198 tiling_data_.TileYIndexFromSrcCoord(live_tiles_rect_.bottom() - 1);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 if (after_right > before_right) { 232 if (after_right > before_right) {
223 DCHECK_EQ(after_right, before_right + 1); 233 DCHECK_EQ(after_right, before_right + 1);
224 for (int j = before_top; j <= after_bottom; ++j) 234 for (int j = before_top; j <= after_bottom; ++j)
225 CreateTile(after_right, j, twin_tiling); 235 CreateTile(after_right, j, twin_tiling);
226 } 236 }
227 if (after_bottom > before_bottom) { 237 if (after_bottom > before_bottom) {
228 DCHECK_EQ(after_bottom, before_bottom + 1); 238 DCHECK_EQ(after_bottom, before_bottom + 1);
229 for (int i = before_left; i <= before_right; ++i) 239 for (int i = before_left; i <= before_right; ++i)
230 CreateTile(i, after_bottom, twin_tiling); 240 CreateTile(i, after_bottom, twin_tiling);
231 } 241 }
232
233 tile_size = client_->CalculateTileSize(content_bounds);
234 } 242 }
235 243
236 if (tile_size != tiling_data_.max_texture_size()) { 244 if (tile_size != tiling_data_.max_texture_size()) {
237 tiling_data_.SetMaxTextureSize(tile_size); 245 tiling_data_.SetMaxTextureSize(tile_size);
238 // When the tile size changes, the TilingData positions no longer work 246 // When the tile size changes, the TilingData positions no longer work
239 // as valid keys to the TileMap, so just drop all tiles. 247 // as valid keys to the TileMap, so just drop all tiles.
240 Reset(); 248 Reset();
241 } else { 249 } else {
242 Invalidate(layer_invalidation); 250 Invalidate(layer_invalidation);
243 } 251 }
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 DCHECK(*this); 1198 DCHECK(*this);
1191 do { 1199 do {
1192 ++current_eviction_tiles_index_; 1200 ++current_eviction_tiles_index_;
1193 } while (current_eviction_tiles_index_ != eviction_tiles_->size() && 1201 } while (current_eviction_tiles_index_ != eviction_tiles_->size() &&
1194 !(*eviction_tiles_)[current_eviction_tiles_index_]->HasResources()); 1202 !(*eviction_tiles_)[current_eviction_tiles_index_]->HasResources());
1195 1203
1196 return *this; 1204 return *this;
1197 } 1205 }
1198 1206
1199 } // namespace cc 1207 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/picture_layer_impl_unittest.cc ('k') | cc/resources/picture_pile_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698