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

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 12865017: Makes tile-creation lazy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressing last round of feedback Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('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/layers/picture_layer_impl.h" 5 #include "cc/layers/picture_layer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/time.h" 9 #include "base/time.h"
10 #include "cc/base/math_util.h" 10 #include "cc/base/math_util.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 } 54 }
55 55
56 scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl( 56 scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl(
57 LayerTreeImpl* tree_impl) { 57 LayerTreeImpl* tree_impl) {
58 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 58 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
59 } 59 }
60 60
61 void PictureLayerImpl::CreateTilingSet() { 61 void PictureLayerImpl::CreateTilingSet() {
62 DCHECK(layer_tree_impl()->IsPendingTree()); 62 DCHECK(layer_tree_impl()->IsPendingTree());
63 DCHECK(!tilings_); 63 DCHECK(!tilings_);
64 tilings_.reset(new PictureLayerTilingSet(this)); 64 tilings_.reset(new PictureLayerTilingSet(this, bounds()));
65 tilings_->SetLayerBounds(bounds());
66 } 65 }
67 66
68 void PictureLayerImpl::TransferTilingSet( 67 void PictureLayerImpl::TransferTilingSet(
69 scoped_ptr<PictureLayerTilingSet> tilings) { 68 scoped_ptr<PictureLayerTilingSet> tilings) {
70 DCHECK(layer_tree_impl()->IsActiveTree()); 69 DCHECK(layer_tree_impl()->IsActiveTree());
71 tilings->SetClient(this); 70 tilings->SetClient(this);
72 tilings_ = tilings.Pass(); 71 tilings_ = tilings.Pass();
73 } 72 }
74 73
75 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { 74 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
76 LayerImpl::PushPropertiesTo(base_layer); 75 LayerImpl::PushPropertiesTo(base_layer);
77 76
78 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); 77 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
79 78
80 layer_impl->SetIsMask(is_mask_); 79 layer_impl->SetIsMask(is_mask_);
81 layer_impl->TransferTilingSet(tilings_.Pass()); 80 layer_impl->TransferTilingSet(tilings_.Pass());
82 layer_impl->pile_ = pile_; 81 layer_impl->pile_ = pile_;
83 pile_ = PicturePileImpl::Create(is_using_lcd_text_); 82 pile_ = PicturePileImpl::Create(is_using_lcd_text_);
84 83
85 layer_impl->raster_page_scale_ = raster_page_scale_; 84 layer_impl->raster_page_scale_ = raster_page_scale_;
86 layer_impl->raster_device_scale_ = raster_device_scale_; 85 layer_impl->raster_device_scale_ = raster_device_scale_;
87 layer_impl->raster_source_scale_ = raster_source_scale_; 86 layer_impl->raster_source_scale_ = raster_source_scale_;
88 layer_impl->raster_contents_scale_ = raster_contents_scale_; 87 layer_impl->raster_contents_scale_ = raster_contents_scale_;
89 layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_; 88 layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_;
90 layer_impl->is_using_lcd_text_ = is_using_lcd_text_; 89 layer_impl->is_using_lcd_text_ = is_using_lcd_text_;
91 } 90 }
92 91
93
94 void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, 92 void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
95 AppendQuadsData* append_quads_data) { 93 AppendQuadsData* append_quads_data) {
96 const gfx::Rect& rect = visible_content_rect(); 94 const gfx::Rect& rect = visible_content_rect();
97 gfx::Rect content_rect(content_bounds()); 95 gfx::Rect content_rect(content_bounds());
98 96
99 SharedQuadState* shared_quad_state = 97 SharedQuadState* shared_quad_state =
100 quad_sink->UseSharedQuadState(CreateSharedQuadState()); 98 quad_sink->UseSharedQuadState(CreateSharedQuadState());
101 AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data); 99 AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data);
102 100
103 bool clipped = false; 101 bool clipped = false;
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 content_rect, 377 content_rect,
380 contents_opaque() ? content_rect : gfx::Rect(), 378 contents_opaque() ? content_rect : gfx::Rect(),
381 tiling->contents_scale(), 379 tiling->contents_scale(),
382 id())); 380 id()));
383 } 381 }
384 382
385 void PictureLayerImpl::UpdatePile(Tile* tile) { 383 void PictureLayerImpl::UpdatePile(Tile* tile) {
386 tile->set_picture_pile(pile_); 384 tile->set_picture_pile(pile_);
387 } 385 }
388 386
387 const Region* PictureLayerImpl::GetInvalidation() {
388 return &invalidation_;
389 }
390
391 const PictureLayerTiling* PictureLayerImpl::GetTwinTiling(
392 const PictureLayerTiling* tiling) {
393
394 const PictureLayerImpl* other_layer = layer_tree_impl()->IsActiveTree() ?
395 PendingTwin() : ActiveTwin();
396 if (!other_layer)
397 return NULL;
398 for (size_t i = 0; i < other_layer->tilings_->num_tilings(); ++i)
399 if (other_layer->tilings_->tiling_at(i)->contents_scale() ==
400 tiling->contents_scale())
401 return other_layer->tilings_->tiling_at(i);
402 return NULL;
403 }
404
389 gfx::Size PictureLayerImpl::CalculateTileSize( 405 gfx::Size PictureLayerImpl::CalculateTileSize(
390 gfx::Size current_tile_size,
391 gfx::Size content_bounds) { 406 gfx::Size content_bounds) {
392 if (is_mask_) { 407 if (is_mask_) {
393 int max_size = layer_tree_impl()->MaxTextureSize(); 408 int max_size = layer_tree_impl()->MaxTextureSize();
394 return gfx::Size( 409 return gfx::Size(
395 std::min(max_size, content_bounds.width()), 410 std::min(max_size, content_bounds.width()),
396 std::min(max_size, content_bounds.height())); 411 std::min(max_size, content_bounds.height()));
397 } 412 }
398 413
399 gfx::Size default_tile_size = layer_tree_impl()->settings().default_tile_size; 414 gfx::Size default_tile_size = layer_tree_impl()->settings().default_tile_size;
400 gfx::Size max_untiled_content_size = 415 gfx::Size max_untiled_content_size =
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 for (int y = 0; y < pile_->num_tiles_y(); ++y) { 484 for (int y = 0; y < pile_->num_tiles_y(); ++y) {
470 bool previously_had = other->pile_->HasRecordingAt(x, y); 485 bool previously_had = other->pile_->HasRecordingAt(x, y);
471 bool now_has = pile_->HasRecordingAt(x, y); 486 bool now_has = pile_->HasRecordingAt(x, y);
472 if (now_has || !previously_had) 487 if (now_has || !previously_had)
473 continue; 488 continue;
474 gfx::Rect layer_rect = pile_->tile_bounds(x, y); 489 gfx::Rect layer_rect = pile_->tile_bounds(x, y);
475 invalidation_.Union(layer_rect); 490 invalidation_.Union(layer_rect);
476 } 491 }
477 } 492 }
478 493
479 tilings_->CloneAll(*other->tilings_, invalidation_, MinimumContentsScale()); 494 // Union in the other newly exposed regions as invalid.
480 DCHECK(bounds() == tilings_->LayerBounds()); 495 Region difference_region = Region(gfx::Rect(bounds()));
496 difference_region.Subtract(gfx::Rect(other->bounds()));
497 invalidation_.Union(difference_region);
481 498
482 // It's a sad but unfortunate fact that PicturePile tiling edges do not line 499 tilings_->CloneAll(*other->tilings_, MinimumContentsScale());
483 // up with PictureLayerTiling edges. Tiles can only be added if they are 500 DCHECK(bounds() == tilings_->layer_bounds());
484 // entirely covered by recordings (that may come from multiple PicturePile
485 // tiles). This check happens in this class's CreateTile() call.
486 for (int x = 0; x < pile_->num_tiles_x(); ++x) {
487 for (int y = 0; y < pile_->num_tiles_y(); ++y) {
488 bool previously_had = other->pile_->HasRecordingAt(x, y);
489 bool now_has = pile_->HasRecordingAt(x, y);
490 if (!now_has || previously_had)
491 continue;
492 gfx::Rect layer_rect = pile_->tile_bounds(x, y);
493 tilings_->CreateTilesFromLayerRect(layer_rect);
494 }
495 }
496 } 501 }
497 502
498 void PictureLayerImpl::SyncTiling( 503 void PictureLayerImpl::SyncTiling(
499 const PictureLayerTiling* tiling, 504 const PictureLayerTiling* tiling) {
500 const Region& pending_layer_invalidation) {
501 if (!DrawsContent() || tiling->contents_scale() < MinimumContentsScale()) 505 if (!DrawsContent() || tiling->contents_scale() < MinimumContentsScale())
502 return; 506 return;
503 tilings_->Clone(tiling, pending_layer_invalidation); 507 tilings_->Clone(tiling);
504 } 508 }
505 509
506 void PictureLayerImpl::SetIsMask(bool is_mask) { 510 void PictureLayerImpl::SetIsMask(bool is_mask) {
507 if (is_mask_ == is_mask) 511 if (is_mask_ == is_mask)
508 return; 512 return;
509 is_mask_ = is_mask; 513 is_mask_ = is_mask;
510 if (tilings_) 514 if (tilings_)
511 tilings_->RemoveAllTiles(); 515 tilings_->RemoveAllTiles();
512 } 516 }
513 517
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 } 597 }
594 598
595 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { 599 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) {
596 DCHECK(contents_scale >= MinimumContentsScale()); 600 DCHECK(contents_scale >= MinimumContentsScale());
597 601
598 PictureLayerTiling* tiling = tilings_->AddTiling(contents_scale); 602 PictureLayerTiling* tiling = tilings_->AddTiling(contents_scale);
599 603
600 const Region& recorded = pile_->recorded_region(); 604 const Region& recorded = pile_->recorded_region();
601 DCHECK(!recorded.IsEmpty()); 605 DCHECK(!recorded.IsEmpty());
602 606
603 for (Region::Iterator iter(recorded); iter.has_rect(); iter.next())
604 tiling->CreateTilesFromLayerRect(iter.rect());
605
606 PictureLayerImpl* twin = 607 PictureLayerImpl* twin =
607 layer_tree_impl()->IsPendingTree() ? ActiveTwin() : PendingTwin(); 608 layer_tree_impl()->IsPendingTree() ? ActiveTwin() : PendingTwin();
608 if (!twin) 609 if (twin)
609 return tiling; 610 twin->SyncTiling(tiling);
610
611 if (layer_tree_impl()->IsPendingTree())
612 twin->SyncTiling(tiling, invalidation_);
613 else
614 twin->SyncTiling(tiling, twin->invalidation_);
615 611
616 return tiling; 612 return tiling;
617 } 613 }
618 614
619 void PictureLayerImpl::RemoveTiling(float contents_scale) { 615 void PictureLayerImpl::RemoveTiling(float contents_scale) {
620 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { 616 for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
621 PictureLayerTiling* tiling = tilings_->tiling_at(i); 617 PictureLayerTiling* tiling = tilings_->tiling_at(i);
622 if (tiling->contents_scale() == contents_scale) { 618 if (tiling->contents_scale() == contents_scale) {
623 tilings_->Remove(tiling); 619 tilings_->Remove(tiling);
624 break; 620 break;
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 scoped_ptr<base::Value> PictureLayerImpl::AsValue() const { 898 scoped_ptr<base::Value> PictureLayerImpl::AsValue() const {
903 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 899 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
904 LayerImpl::AsValueInto(state.get()); 900 LayerImpl::AsValueInto(state.get());
905 901
906 state->SetDouble("ideal_contents_scale", ideal_contents_scale_); 902 state->SetDouble("ideal_contents_scale", ideal_contents_scale_);
907 state->Set("tilings", tilings_->AsValue().release()); 903 state->Set("tilings", tilings_->AsValue().release());
908 return state.PassAs<base::Value>(); 904 return state.PassAs<base::Value>();
909 } 905 }
910 906
911 } // namespace cc 907 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698