summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 00:09:27 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 00:09:27 +0000
commit8f95c562479b3be9776e77b597d72b464bb447a5 (patch)
treebb2e57273abf25f5bba3989aceb32c3bf3c6bb6b
parenta2b9b1d31541665ff0961c11c80684b73c597bd3 (diff)
downloadchromium_src-8f95c562479b3be9776e77b597d72b464bb447a5.zip
chromium_src-8f95c562479b3be9776e77b597d72b464bb447a5.tar.gz
chromium_src-8f95c562479b3be9776e77b597d72b464bb447a5.tar.bz2
cc: Invalidate the full tiled layer when contents scale changes.
Previously we invalidated only the area outside of the previous bounds, but this is incorrect when changing the scale. The verifyInvalidationWhenContentsScaleChanges test was not actually testing to make sure invalidation happened, so fixed the test to do its job. Tests: TiledLayerTest.verifyInvalidationWhenContentsScaleChanges BUG=166715 R=enne NOTRY=true Review URL: https://chromiumcodereview.appspot.com/11644035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174042 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--cc/contents_scaling_layer.cc19
-rw-r--r--cc/contents_scaling_layer.h9
-rw-r--r--cc/layer_tree_host_unittest_animation.cc4
-rw-r--r--cc/scrollbar_layer.cc4
-rw-r--r--cc/tiled_layer.cc3
-rw-r--r--cc/tiled_layer_unittest.cc11
6 files changed, 43 insertions, 7 deletions
diff --git a/cc/contents_scaling_layer.cc b/cc/contents_scaling_layer.cc
index 579af34..a9a8bef 100644
--- a/cc/contents_scaling_layer.cc
+++ b/cc/contents_scaling_layer.cc
@@ -11,7 +11,10 @@ gfx::Size ContentsScalingLayer::computeContentBoundsForScale(float scaleX, float
return gfx::ToCeiledSize(gfx::ScaleSize(bounds(), scaleX, scaleY));
}
-ContentsScalingLayer::ContentsScalingLayer() {
+ContentsScalingLayer::ContentsScalingLayer()
+ : last_update_contents_scale_x_(0.f)
+ , last_update_contents_scale_y_(0.f)
+ {
}
ContentsScalingLayer::~ContentsScalingLayer() {
@@ -35,4 +38,18 @@ void ContentsScalingLayer::didUpdateBounds() {
contentsScaleY());
}
+void ContentsScalingLayer::update(
+ ResourceUpdateQueue& queue,
+ const OcclusionTracker* occlusion,
+ RenderingStats& stats) {
+ if (drawProperties().contents_scale_x == last_update_contents_scale_x_ &&
+ drawProperties().contents_scale_y == last_update_contents_scale_y_)
+ return;
+
+ last_update_contents_scale_x_ = drawProperties().contents_scale_x;
+ last_update_contents_scale_y_ = drawProperties().contents_scale_y;
+ // Invalidate the whole layer if scale changed.
+ setNeedsDisplayRect(gfx::Rect(bounds()));
+}
+
} // namespace cc
diff --git a/cc/contents_scaling_layer.h b/cc/contents_scaling_layer.h
index 81b51ff..c535d04 100644
--- a/cc/contents_scaling_layer.h
+++ b/cc/contents_scaling_layer.h
@@ -21,11 +21,20 @@ class CC_EXPORT ContentsScalingLayer : public Layer {
gfx::Size* content_bounds) OVERRIDE;
virtual void didUpdateBounds() OVERRIDE;
+ virtual void update(
+ ResourceUpdateQueue& queue,
+ const OcclusionTracker* occlusion,
+ RenderingStats& stats) OVERRIDE;
+
protected:
ContentsScalingLayer();
virtual ~ContentsScalingLayer();
gfx::Size computeContentBoundsForScale(float scaleX, float scaleY) const;
+
+ private:
+ float last_update_contents_scale_x_;
+ float last_update_contents_scale_y_;
};
} // namespace cc
diff --git a/cc/layer_tree_host_unittest_animation.cc b/cc/layer_tree_host_unittest_animation.cc
index 384fbb3..8900c93 100644
--- a/cc/layer_tree_host_unittest_animation.cc
+++ b/cc/layer_tree_host_unittest_animation.cc
@@ -381,9 +381,9 @@ class LayerTreeHostAnimationTestDoNotSkipLayersWithAnimatedOpacity :
}
virtual void afterTest() OVERRIDE {
- // update() should have been called once, proving that the layer was not
+ // update() should have been called, proving that the layer was not
// skipped.
- EXPECT_EQ(1, update_check_layer_->update_count());
+ EXPECT_NE(0, update_check_layer_->update_count());
// clear update_check_layer_ so LayerTreeHost dies.
update_check_layer_ = NULL;
diff --git a/cc/scrollbar_layer.cc b/cc/scrollbar_layer.cc
index 817ead8..c4e61ac 100644
--- a/cc/scrollbar_layer.cc
+++ b/cc/scrollbar_layer.cc
@@ -300,8 +300,10 @@ void ScrollbarLayer::setTexturePriorities(const PriorityCalculator&)
}
}
-void ScrollbarLayer::update(ResourceUpdateQueue& queue, const OcclusionTracker*, RenderingStats& stats)
+void ScrollbarLayer::update(ResourceUpdateQueue& queue, const OcclusionTracker* occlusion, RenderingStats& stats)
{
+ ContentsScalingLayer::update(queue, occlusion, stats);
+
if (contentBounds().IsEmpty())
return;
diff --git a/cc/tiled_layer.cc b/cc/tiled_layer.cc
index 67e6d8c..f69411f 100644
--- a/cc/tiled_layer.cc
+++ b/cc/tiled_layer.cc
@@ -633,6 +633,9 @@ void TiledLayer::updateScrollPrediction()
void TiledLayer::update(ResourceUpdateQueue& queue, const OcclusionTracker* occlusion, RenderingStats& stats)
{
DCHECK(!m_skipsDraw && !m_failedUpdate); // Did resetUpdateState get skipped?
+
+ ContentsScalingLayer::update(queue, occlusion, stats);
+
updateBounds();
if (m_tiler->hasEmptyBounds() || !drawsContent())
return;
diff --git a/cc/tiled_layer_unittest.cc b/cc/tiled_layer_unittest.cc
index 7fb252f..dd636ef 100644
--- a/cc/tiled_layer_unittest.cc
+++ b/cc/tiled_layer_unittest.cc
@@ -788,11 +788,12 @@ TEST_F(TiledLayerTest, verifyInvalidationWhenContentsScaleChanges)
EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(1, 0));
EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(1, 1));
- // Change the contents scale and verify that the content rectangle requiring painting
- // is not scaled.
+ layer->setNeedsDisplayRect(gfx::Rect());
+ EXPECT_FLOAT_RECT_EQ(gfx::RectF(), layer->lastNeedsDisplayRect());
+
+ // Change the contents scale.
layer->updateContentsScale(2);
layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 200, 200);
- EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100), layer->lastNeedsDisplayRect());
// The impl side should get 2x2 tiles now.
layer->setTexturePriorities(m_priorityCalculator);
@@ -805,6 +806,10 @@ TEST_F(TiledLayerTest, verifyInvalidationWhenContentsScaleChanges)
EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(1, 0));
EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(1, 1));
+ // Verify that changing the contents scale caused invalidation, and
+ // that the layer-space rectangle requiring painting is not scaled.
+ EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100), layer->lastNeedsDisplayRect());
+
// Invalidate the entire layer again, but do not paint. All tiles should be gone now from the
// impl side.
layer->setNeedsDisplay();