diff options
author | ajuma <ajuma@chromium.org> | 2015-10-21 06:06:32 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-21 13:07:11 +0000 |
commit | ed5bee1d1a8b8a2e2c793d1118367537d05d7a23 (patch) | |
tree | 5347fa504f9561d1775c1b9a573a04ec86224edb /cc | |
parent | 8d6fcf60aef7e6ac90afed729cf6384a9f4719e9 (diff) | |
download | chromium_src-ed5bee1d1a8b8a2e2c793d1118367537d05d7a23.zip chromium_src-ed5bee1d1a8b8a2e2c793d1118367537d05d7a23.tar.gz chromium_src-ed5bee1d1a8b8a2e2c793d1118367537d05d7a23.tar.bz2 |
cc: Make property trees support external viewports
This makes the clip tree get updated for changes to the viewport
rect that happen on the compositor thread via calls to
LTHI::SetExternalDrawConstraints (this is used by Android WebView).
BUG=524106
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1413743005
Cr-Commit-Position: refs/heads/master@{#355278}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/trees/layer_tree_host_common.cc | 3 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 2 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl_unittest.cc | 35 | ||||
-rw-r--r-- | cc/trees/property_tree_builder.cc | 1 |
4 files changed, 39 insertions, 2 deletions
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc index 143c7b1..ccffb0f 100644 --- a/cc/trees/layer_tree_host_common.cc +++ b/cc/trees/layer_tree_host_common.cc @@ -2708,6 +2708,9 @@ void CalculateDrawPropertiesAndVerify( inputs->property_trees, inputs->page_scale_layer, inputs->page_scale_factor, inputs->device_scale_factor, inputs->device_transform); + // Similarly, the device viewport is shared between both trees. + inputs->property_trees->clip_tree.SetViewportClip( + gfx::RectF(gfx::SizeF(inputs->device_viewport_size))); ComputeVisibleRectsUsingPropertyTrees( inputs->root_layer, inputs->property_trees, inputs->can_render_to_separate_surface, &update_layer_list); diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 98118cc..2613af2 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -2302,8 +2302,6 @@ void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { client_->OnCanDrawStateChanged(CanDraw()); SetFullRootLayerDamage(); active_tree_->set_needs_update_draw_properties(); - active_tree_->property_trees()->clip_tree.SetViewportClip( - gfx::RectF(gfx::SizeF(device_viewport_size))); } const gfx::Rect LayerTreeHostImpl::ViewportRectForTilePriority() const { diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 3824186..2eae9ac 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -8245,6 +8245,41 @@ TEST_F(LayerTreeHostImplTest, ExternalTransformSetNeedsRedraw) { } } +TEST_F(LayerTreeHostImplTest, ExternalViewportAffectsVisibleRects) { + const gfx::Size layer_size(100, 100); + SetupScrollAndContentsLayers(layer_size); + LayerImpl* content_layer = + host_impl_->active_tree()->OuterViewportScrollLayer()->children()[0]; + RebuildPropertyTrees(); + + bool update_lcd_text = false; + + host_impl_->SetViewportSize(gfx::Size(90, 90)); + host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); + EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect()); + + gfx::Transform external_transform; + gfx::Rect external_viewport(10, 20); + gfx::Rect external_clip(layer_size); + bool resourceless_software_draw = false; + host_impl_->SetExternalDrawConstraints( + external_transform, external_viewport, external_clip, external_viewport, + external_transform, resourceless_software_draw); + + // Visible rects should now be clipped by the external viewport. + host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); + EXPECT_EQ(gfx::Rect(10, 20), content_layer->visible_layer_rect()); + + // Clear the external viewport. + external_viewport = gfx::Rect(); + host_impl_->SetExternalDrawConstraints( + external_transform, external_viewport, external_clip, external_viewport, + external_transform, resourceless_software_draw); + + host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); + EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect()); +} + TEST_F(LayerTreeHostImplTest, ScrollAnimated) { SetupScrollAndContentsLayers(gfx::Size(100, 200)); diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index 1207b40..262a52c 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc @@ -544,6 +544,7 @@ void BuildPropertyTreesTopLevelInternal( UpdatePageScaleFactorInPropertyTrees(property_trees, page_scale_layer, page_scale_factor, device_scale_factor, device_transform); + property_trees->clip_tree.SetViewportClip(gfx::RectF(viewport)); return; } |