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.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 14 matching lines...) Expand all Loading... | |
25 client)); | 25 client)); |
26 } | 26 } |
27 | 27 |
28 scoped_ptr<PictureLayerTiling> PictureLayerTiling::Clone( | 28 scoped_ptr<PictureLayerTiling> PictureLayerTiling::Clone( |
29 gfx::Size layer_bounds, | 29 gfx::Size layer_bounds, |
30 PictureLayerTilingClient* client) const { | 30 PictureLayerTilingClient* client) const { |
31 scoped_ptr<PictureLayerTiling> out = | 31 scoped_ptr<PictureLayerTiling> out = |
32 make_scoped_ptr(new PictureLayerTiling(contents_scale_, | 32 make_scoped_ptr(new PictureLayerTiling(contents_scale_, |
33 layer_bounds, | 33 layer_bounds, |
34 client)); | 34 client)); |
35 out->resolution_ = resolution_; | 35 out->resolution_ = resolution_; |
enne (OOO)
2013/05/02 19:59:46
Looking at this code closer, but could this lead t
danakj
2013/05/02 20:02:04
Hmm! It's kinda weird anyway right? You should man
| |
36 out->last_source_frame_number_ = last_source_frame_number_; | |
37 out->last_impl_frame_time_ = last_impl_frame_time_; | |
38 return out.Pass(); | 36 return out.Pass(); |
39 } | 37 } |
40 | 38 |
41 PictureLayerTiling::PictureLayerTiling(float contents_scale, | 39 PictureLayerTiling::PictureLayerTiling(float contents_scale, |
42 gfx::Size layer_bounds, | 40 gfx::Size layer_bounds, |
43 PictureLayerTilingClient* client) | 41 PictureLayerTilingClient* client) |
44 : contents_scale_(contents_scale), | 42 : contents_scale_(contents_scale), |
45 layer_bounds_(layer_bounds), | 43 layer_bounds_(layer_bounds), |
46 resolution_(NON_IDEAL_RESOLUTION), | 44 resolution_(NON_IDEAL_RESOLUTION), |
47 client_(client), | 45 client_(client), |
48 tiling_data_(gfx::Size(), gfx::Size(), true), | 46 tiling_data_(gfx::Size(), gfx::Size(), true), |
49 last_source_frame_number_(0), | 47 last_impl_frame_time_in_seconds_(0.0) { |
50 last_impl_frame_time_(0.0) { | |
51 gfx::Size content_bounds = | 48 gfx::Size content_bounds = |
52 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); | 49 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); |
53 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); | 50 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); |
54 | 51 |
55 tiling_data_.SetTotalSize(content_bounds); | 52 tiling_data_.SetTotalSize(content_bounds); |
56 tiling_data_.SetMaxTextureSize(tile_size); | 53 tiling_data_.SetMaxTextureSize(tile_size); |
57 } | 54 } |
58 | 55 |
59 PictureLayerTiling::~PictureLayerTiling() { | 56 PictureLayerTiling::~PictureLayerTiling() { |
60 } | 57 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
288 WhichTree tree, | 285 WhichTree tree, |
289 gfx::Size device_viewport, | 286 gfx::Size device_viewport, |
290 const gfx::RectF& viewport_in_layer_space, | 287 const gfx::RectF& viewport_in_layer_space, |
291 const gfx::RectF& visible_layer_rect, | 288 const gfx::RectF& visible_layer_rect, |
292 gfx::Size last_layer_bounds, | 289 gfx::Size last_layer_bounds, |
293 gfx::Size current_layer_bounds, | 290 gfx::Size current_layer_bounds, |
294 float last_layer_contents_scale, | 291 float last_layer_contents_scale, |
295 float current_layer_contents_scale, | 292 float current_layer_contents_scale, |
296 const gfx::Transform& last_screen_transform, | 293 const gfx::Transform& last_screen_transform, |
297 const gfx::Transform& current_screen_transform, | 294 const gfx::Transform& current_screen_transform, |
298 int current_source_frame_number, | 295 double current_frame_time_in_seconds, |
299 double current_frame_time, | |
300 bool store_screen_space_quads_on_tiles, | 296 bool store_screen_space_quads_on_tiles, |
301 size_t max_tiles_for_interest_area) { | 297 size_t max_tiles_for_interest_area) { |
302 if (ContentRect().IsEmpty()) | 298 if (ContentRect().IsEmpty()) |
303 return; | 299 return; |
300 if (!NeedsUpdateForFrameAtTime(current_frame_time_in_seconds)) | |
301 return; | |
304 | 302 |
305 gfx::Rect viewport_in_content_space = | 303 gfx::Rect viewport_in_content_space = |
306 gfx::ToEnclosingRect(gfx::ScaleRect(viewport_in_layer_space, | 304 gfx::ToEnclosingRect(gfx::ScaleRect(viewport_in_layer_space, |
307 contents_scale_)); | 305 contents_scale_)); |
308 gfx::Rect visible_content_rect = | 306 gfx::Rect visible_content_rect = |
309 gfx::ToEnclosingRect(gfx::ScaleRect(visible_layer_rect, | 307 gfx::ToEnclosingRect(gfx::ScaleRect(visible_layer_rect, |
310 contents_scale_)); | 308 contents_scale_)); |
311 | 309 |
312 gfx::Size tile_size = tiling_data_.max_texture_size(); | 310 gfx::Size tile_size = tiling_data_.max_texture_size(); |
313 int64 interest_rect_area = | 311 int64 interest_rect_area = |
314 max_tiles_for_interest_area * tile_size.width() * tile_size.height(); | 312 max_tiles_for_interest_area * tile_size.width() * tile_size.height(); |
315 | 313 |
316 gfx::Rect starting_rect = visible_content_rect.IsEmpty() | 314 gfx::Rect starting_rect = visible_content_rect.IsEmpty() |
317 ? viewport_in_content_space | 315 ? viewport_in_content_space |
318 : visible_content_rect; | 316 : visible_content_rect; |
319 gfx::Rect interest_rect = ExpandRectEquallyToAreaBoundedBy( | 317 gfx::Rect interest_rect = ExpandRectEquallyToAreaBoundedBy( |
320 starting_rect, | 318 starting_rect, |
321 interest_rect_area, | 319 interest_rect_area, |
322 ContentRect()); | 320 ContentRect()); |
323 DCHECK(interest_rect.IsEmpty() || | 321 DCHECK(interest_rect.IsEmpty() || |
324 ContentRect().Contains(interest_rect)); | 322 ContentRect().Contains(interest_rect)); |
325 | 323 |
326 SetLiveTilesRect(interest_rect); | 324 SetLiveTilesRect(interest_rect); |
327 | 325 |
328 bool first_update_in_new_source_frame = | 326 double time_delta = 0; |
329 current_source_frame_number != last_source_frame_number_; | 327 if (last_impl_frame_time_in_seconds_ != 0.0 && |
330 | 328 last_layer_bounds == current_layer_bounds) { |
331 bool first_update_in_new_impl_frame = | 329 time_delta = |
332 current_frame_time != last_impl_frame_time_; | 330 current_frame_time_in_seconds - last_impl_frame_time_in_seconds_; |
333 | 331 } |
334 // In pending tree, this is always called. We update priorities: | |
335 // - Immediately after a commit (first_update_in_new_source_frame). | |
336 // - On animation ticks after the first frame in the tree | |
337 // (first_update_in_new_impl_frame). | |
338 // In active tree, this is only called during draw. We update priorities: | |
339 // - On draw if properties were not already computed by the pending tree | |
340 // and activated for the frame (first_update_in_new_impl_frame). | |
341 if (!first_update_in_new_impl_frame && !first_update_in_new_source_frame) | |
342 return; | |
343 | |
344 double time_delta = 0.0; | |
345 if (last_impl_frame_time_ != 0.0 && | |
346 last_layer_bounds == current_layer_bounds) | |
347 time_delta = current_frame_time - last_impl_frame_time_; | |
348 | 332 |
349 gfx::Rect view_rect(device_viewport); | 333 gfx::Rect view_rect(device_viewport); |
350 float current_scale = current_layer_contents_scale / contents_scale_; | 334 float current_scale = current_layer_contents_scale / contents_scale_; |
351 float last_scale = last_layer_contents_scale / contents_scale_; | 335 float last_scale = last_layer_contents_scale / contents_scale_; |
352 | 336 |
353 // Fast path tile priority calculation when both transforms are translations. | 337 // Fast path tile priority calculation when both transforms are translations. |
354 if (last_screen_transform.IsIdentityOrTranslation() && | 338 if (last_screen_transform.IsIdentityOrTranslation() && |
355 current_screen_transform.IsIdentityOrTranslation()) { | 339 current_screen_transform.IsIdentityOrTranslation()) { |
356 gfx::Vector2dF current_offset( | 340 gfx::Vector2dF current_offset( |
357 current_screen_transform.matrix().get(0, 3), | 341 current_screen_transform.matrix().get(0, 3), |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
430 bool clipped; | 414 bool clipped; |
431 priority.set_current_screen_quad( | 415 priority.set_current_screen_quad( |
432 MathUtil::MapQuad(current_screen_transform, | 416 MathUtil::MapQuad(current_screen_transform, |
433 gfx::QuadF(current_layer_content_rect), | 417 gfx::QuadF(current_layer_content_rect), |
434 &clipped)); | 418 &clipped)); |
435 } | 419 } |
436 tile->SetPriority(tree, priority); | 420 tile->SetPriority(tree, priority); |
437 } | 421 } |
438 } | 422 } |
439 | 423 |
440 last_source_frame_number_ = current_source_frame_number; | 424 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; |
441 last_impl_frame_time_ = current_frame_time; | |
442 } | 425 } |
443 | 426 |
444 void PictureLayerTiling::SetLiveTilesRect( | 427 void PictureLayerTiling::SetLiveTilesRect( |
445 gfx::Rect new_live_tiles_rect) { | 428 gfx::Rect new_live_tiles_rect) { |
446 DCHECK(new_live_tiles_rect.IsEmpty() || | 429 DCHECK(new_live_tiles_rect.IsEmpty() || |
447 ContentRect().Contains(new_live_tiles_rect)); | 430 ContentRect().Contains(new_live_tiles_rect)); |
448 if (live_tiles_rect_ == new_live_tiles_rect) | 431 if (live_tiles_rect_ == new_live_tiles_rect) |
449 return; | 432 return; |
450 | 433 |
451 // Iterate to delete all tiles outside of our new live_tiles rect. | 434 // Iterate to delete all tiles outside of our new live_tiles rect. |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
619 | 602 |
620 // If our delta is less then our event distance, we're done. | 603 // If our delta is less then our event distance, we're done. |
621 if (delta < event.distance) | 604 if (delta < event.distance) |
622 break; | 605 break; |
623 } | 606 } |
624 | 607 |
625 return gfx::Rect(origin_x, origin_y, width, height); | 608 return gfx::Rect(origin_x, origin_y, width, height); |
626 } | 609 } |
627 | 610 |
628 } // namespace cc | 611 } // namespace cc |
OLD | NEW |