Index: cc/picture_layer_impl.cc |
diff --git a/cc/picture_layer_impl.cc b/cc/picture_layer_impl.cc |
index 238f01d801df31bdb6ff4004d93d893933cd133a..987f972a0f0a94abd2283921beba09884091231e 100644 |
--- a/cc/picture_layer_impl.cc |
+++ b/cc/picture_layer_impl.cc |
@@ -25,7 +25,6 @@ namespace cc { |
PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* treeImpl, int id) |
: LayerImpl(treeImpl, id), |
- tilings_(this), |
pile_(PicturePileImpl::Create()), |
last_update_time_(0), |
last_content_scale_(0), |
@@ -40,6 +39,36 @@ const char* PictureLayerImpl::layerTypeAsString() const { |
return "PictureLayer"; |
} |
+scoped_ptr<LayerImpl> PictureLayerImpl::createLayerImpl( |
+ LayerTreeImpl* treeImpl) { |
+ return PictureLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>(); |
+} |
+ |
+void PictureLayerImpl::CreateTilingSet() { |
+ DCHECK(layerTreeImpl()->IsPendingTree()); |
+ DCHECK(!tilings_); |
+ tilings_.reset(new PictureLayerTilingSet(this)); |
+ tilings_->SetLayerBounds(bounds()); |
+} |
+ |
+void PictureLayerImpl::TransferTilingSet(scoped_ptr<PictureLayerTilingSet> tilings) { |
+ DCHECK(layerTreeImpl()->IsActiveTree()); |
+ tilings->SetClient(this); |
+ tilings_ = tilings.Pass(); |
+} |
+ |
+void PictureLayerImpl::pushPropertiesTo(LayerImpl* base_layer) { |
+ LayerImpl::pushPropertiesTo(base_layer); |
+ |
+ PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); |
+ |
+ layer_impl->SetIsMask(is_mask_); |
+ layer_impl->TransferTilingSet(tilings_.Pass()); |
+ layer_impl->pile_ = pile_; |
+ pile_ = PicturePileImpl::Create(); |
+} |
+ |
+ |
void PictureLayerImpl::appendQuads(QuadSink& quadSink, |
AppendQuadsData& appendQuadsData) { |
const gfx::Rect& rect = visibleContentRect(); |
@@ -56,7 +85,7 @@ void PictureLayerImpl::appendQuads(QuadSink& quadSink, |
bool useAA = !isAxisAlignedInTarget; |
if (showDebugBorders()) { |
- for (PictureLayerTilingSet::Iterator iter(&tilings_, |
+ for (PictureLayerTilingSet::Iterator iter(tilings_.get(), |
contentsScaleX(), |
rect, |
ideal_contents_scale_); |
@@ -84,7 +113,7 @@ void PictureLayerImpl::appendQuads(QuadSink& quadSink, |
// unused can be considered for removal. |
std::vector<PictureLayerTiling*> seen_tilings; |
- for (PictureLayerTilingSet::Iterator iter(&tilings_, |
+ for (PictureLayerTilingSet::Iterator iter(tilings_.get(), |
contentsScaleX(), |
rect, |
ideal_contents_scale_); |
@@ -162,7 +191,7 @@ void PictureLayerImpl::didUpdateTransforms() { |
time_delta = current_time - last_update_time_; |
} |
WhichTree tree = layerTreeImpl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; |
- tilings_.UpdateTilePriorities( |
+ tilings_->UpdateTilePriorities( |
tree, |
layerTreeImpl()->device_viewport_size(), |
last_content_scale_, |
@@ -179,11 +208,13 @@ void PictureLayerImpl::didUpdateTransforms() { |
} |
void PictureLayerImpl::didBecomeActive() { |
- tilings_.DidBecomeActive(); |
+ LayerImpl::didBecomeActive(); |
+ tilings_->DidBecomeActive(); |
} |
void PictureLayerImpl::didLoseOutputSurface() { |
- tilings_.RemoveAllTilings(); |
+ if (tilings_) |
+ tilings_->RemoveAllTilings(); |
} |
void PictureLayerImpl::calculateContentsScale( |
@@ -192,7 +223,7 @@ void PictureLayerImpl::calculateContentsScale( |
float* contents_scale_y, |
gfx::Size* content_bounds) { |
if (!drawsContent()) { |
- DCHECK(!tilings_.num_tilings()); |
+ DCHECK(!tilings_->num_tilings()); |
return; |
} |
@@ -208,8 +239,8 @@ void PictureLayerImpl::calculateContentsScale( |
// tilings (and then map back to floating point texture coordinates), the |
// contents scale must be at least as large as the largest of the tilings. |
float max_contents_scale = min_contents_scale; |
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) { |
- const PictureLayerTiling* tiling = tilings_.tiling_at(i); |
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
+ const PictureLayerTiling* tiling = tilings_->tiling_at(i); |
max_contents_scale = std::max(max_contents_scale, tiling->contents_scale()); |
} |
@@ -256,26 +287,26 @@ void PictureLayerImpl::SyncFromActiveLayer() { |
} |
void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) { |
- tilings_.CloneAll(other->tilings_, invalidation_); |
- DCHECK(bounds() == tilings_.LayerBounds()); |
+ tilings_->CloneAll(*other->tilings_, invalidation_); |
+ DCHECK(bounds() == tilings_->LayerBounds()); |
} |
void PictureLayerImpl::SyncTiling( |
const PictureLayerTiling* tiling) { |
- tilings_.Clone(tiling, invalidation_); |
+ tilings_->Clone(tiling, invalidation_); |
} |
void PictureLayerImpl::SetIsMask(bool is_mask) { |
if (is_mask_ == is_mask) |
return; |
is_mask_ = is_mask; |
- tilings_.RemoveAllTiles(); |
+ tilings_->RemoveAllTiles(); |
} |
ResourceProvider::ResourceId PictureLayerImpl::contentsResourceId() const { |
gfx::Rect content_rect(gfx::Point(), contentBounds()); |
float scale = contentsScaleX(); |
- for (PictureLayerTilingSet::Iterator iter(&tilings_, |
+ for (PictureLayerTilingSet::Iterator iter(tilings_.get(), |
scale, |
content_rect, |
ideal_contents_scale_); |
@@ -295,8 +326,8 @@ ResourceProvider::ResourceId PictureLayerImpl::contentsResourceId() const { |
bool PictureLayerImpl::areVisibleResourcesReady() const { |
const gfx::Rect& rect = visibleContentRect(); |
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) { |
- const PictureLayerTiling* tiling = tilings_.tiling_at(i); |
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
+ const PictureLayerTiling* tiling = tilings_->tiling_at(i); |
// Ignore non-high resolution tilings. |
if (tiling->resolution() != HIGH_RESOLUTION) |
@@ -320,7 +351,7 @@ PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { |
if (contents_scale < layerTreeImpl()->settings().minimumContentsScale) |
return NULL; |
- PictureLayerTiling* tiling = tilings_.AddTiling( |
+ PictureLayerTiling* tiling = tilings_->AddTiling( |
contents_scale, |
TileSize()); |
@@ -381,8 +412,8 @@ void PictureLayerImpl::ManageTilings(float ideal_contents_scale) { |
if (layerTreeImpl()->IsPendingTree() && |
!layerTreeImpl()->PinchGestureActive()) { |
std::vector<PictureLayerTiling*> remove_list; |
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) { |
- PictureLayerTiling* tiling = tilings_.tiling_at(i); |
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
+ PictureLayerTiling* tiling = tilings_->tiling_at(i); |
if (tiling->contents_scale() == ideal_contents_scale) |
continue; |
if (tiling->contents_scale() == low_res_contents_scale) |
@@ -391,14 +422,14 @@ void PictureLayerImpl::ManageTilings(float ideal_contents_scale) { |
} |
for (size_t i = 0; i < remove_list.size(); ++i) |
- tilings_.Remove(remove_list[i]); |
+ tilings_->Remove(remove_list[i]); |
} |
// Find existing tilings closest to ideal high / low res. |
PictureLayerTiling* high_res = NULL; |
PictureLayerTiling* low_res = NULL; |
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) { |
- PictureLayerTiling* tiling = tilings_.tiling_at(i); |
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
+ PictureLayerTiling* tiling = tilings_->tiling_at(i); |
if (!high_res || IsCloserToThan(tiling, high_res, ideal_contents_scale)) |
high_res = tiling; |
if (!low_res || IsCloserToThan(tiling, low_res, low_res_contents_scale)) |
@@ -442,8 +473,8 @@ void PictureLayerImpl::CleanUpUnusedTilings( |
std::vector<PictureLayerTiling*> used_tilings) { |
std::vector<PictureLayerTiling*> to_remove; |
- for (size_t i = 0; i < tilings_.num_tilings(); ++i) { |
- PictureLayerTiling* tiling = tilings_.tiling_at(i); |
+ for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
+ PictureLayerTiling* tiling = tilings_->tiling_at(i); |
// Don't remove the current high or low res tilinig. |
if (tiling->resolution() != NON_IDEAL_RESOLUTION) |
continue; |
@@ -453,7 +484,7 @@ void PictureLayerImpl::CleanUpUnusedTilings( |
} |
for (size_t i = 0; i < to_remove.size(); ++i) |
- tilings_.Remove(to_remove[i]); |
+ tilings_->Remove(to_remove[i]); |
} |
} // namespace cc |