summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-15 08:48:18 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-15 08:48:18 +0000
commitb87b0c84b5545817e7338d1a2e220863878343bb (patch)
treec062f23a0c19080e0fed0b6bc6265c4230272ad3
parent059c8d351d5083744525c595110f730081cf5280 (diff)
downloadchromium_src-b87b0c84b5545817e7338d1a2e220863878343bb.zip
chromium_src-b87b0c84b5545817e7338d1a2e220863878343bb.tar.gz
chromium_src-b87b0c84b5545817e7338d1a2e220863878343bb.tar.bz2
cc: Don't add tilings to layers without recordings.
Before calling PictureLayerImpl::AddTiling() the layer checks to make sure it has a recording, as this should be an invariant for adding a tiling. Code paths to sync tilings were not checking this however, and causing DCHECKs to fire as a result. Any time we add a tiling, we must check that we are able to do so by verifying: 1) The contents scale of the tiling is large enough. 2) The layer has a recording (and is non-empty). 3) The layer DrawsContents() The first was already verified, the second was not, and the third was only in some situations. R=enne BUG=240361 Review URL: https://chromiumcodereview.appspot.com/14813034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@200205 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--cc/layers/picture_layer_impl.cc27
-rw-r--r--cc/layers/picture_layer_impl.h3
-rw-r--r--cc/resources/picture_layer_tiling.cc6
3 files changed, 29 insertions, 7 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 8c50b94..00bb878 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -548,13 +548,15 @@ void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
invalidation_.Union(difference_region);
tilings_->RemoveAllTilings();
- tilings_->AddTilingsToMatchScales(*other->tilings_, MinimumContentsScale());
+ if (CanHaveTilings())
+ tilings_->AddTilingsToMatchScales(*other->tilings_, MinimumContentsScale());
+
DCHECK(bounds() == tilings_->layer_bounds());
}
void PictureLayerImpl::SyncTiling(
const PictureLayerTiling* tiling) {
- if (!DrawsContent() || tiling->contents_scale() < MinimumContentsScale())
+ if (!CanHaveTilingWithScale(tiling->contents_scale()))
return;
tilings_->AddTiling(tiling->contents_scale());
@@ -652,7 +654,8 @@ bool PictureLayerImpl::AreVisibleResourcesReady() const {
}
PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) {
- DCHECK(contents_scale >= MinimumContentsScale());
+ DCHECK(CanHaveTilingWithScale(contents_scale)) <<
+ "contents_scale: " << contents_scale;
PictureLayerTiling* tiling = tilings_->AddTiling(contents_scale);
@@ -703,7 +706,7 @@ void PictureLayerImpl::ManageTilings(bool animating_transform_to_screen) {
DCHECK(ideal_device_scale_);
DCHECK(ideal_source_scale_);
- if (pile_->recorded_region().IsEmpty())
+ if (!CanHaveTilings())
return;
bool change_target_tiling =
@@ -943,6 +946,22 @@ void PictureLayerImpl::ResetRasterScale() {
low_res_raster_contents_scale_ = 0.f;
}
+bool PictureLayerImpl::CanHaveTilings() const {
+ if (!DrawsContent())
+ return false;
+ if (pile_->recorded_region().IsEmpty())
+ return false;
+ return true;
+}
+
+bool PictureLayerImpl::CanHaveTilingWithScale(float contents_scale) const {
+ if (!CanHaveTilings())
+ return false;
+ if (contents_scale < MinimumContentsScale())
+ return false;
+ return true;
+}
+
void PictureLayerImpl::GetDebugBorderProperties(
SkColor* color,
float* width) const {
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 736ba60..f982ea8 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -94,6 +94,9 @@ class CC_EXPORT PictureLayerImpl
void UpdateLCDTextStatus();
void ResetRasterScale();
+ bool CanHaveTilings() const;
+ bool CanHaveTilingWithScale(float contents_scale) const;
+
virtual void GetDebugBorderProperties(
SkColor* color, float* width) const OVERRIDE;
virtual void AsValueInto(base::DictionaryValue* dict) const OVERRIDE;
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc
index 678a0fa..1a041f2 100644
--- a/cc/resources/picture_layer_tiling.cc
+++ b/cc/resources/picture_layer_tiling.cc
@@ -44,9 +44,9 @@ PictureLayerTiling::PictureLayerTiling(float contents_scale,
DCHECK(!gfx::ToFlooredSize(
gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) <<
- "Tiling created with scale too small as contents become empty. " <<
- "Layer bounds: " << layer_bounds.ToString() <<
- "Contents scale: " << contents_scale;
+ "Tiling created with scale too small as contents become empty." <<
+ " Layer bounds: " << layer_bounds.ToString() <<
+ " Contents scale: " << contents_scale;
tiling_data_.SetTotalSize(content_bounds);
tiling_data_.SetMaxTextureSize(tile_size);