cc: Fix non root copy request visible rect in HighDPI
Before while transform clip into layer space, incorrectly used wrong
helper function and applied device scale twice. Create correct helper
function and add unittest.
BUG=622083
R=ajuma
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review-Url: https://codereview.chromium.org/2117183002
Cr-Commit-Position: refs/heads/master@{#403782}
diff --git a/cc/test/layer_tree_host_common_test.cc b/cc/test/layer_tree_host_common_test.cc
index 6d40f6c..aabd43c 100644
--- a/cc/test/layer_tree_host_common_test.cc
+++ b/cc/test/layer_tree_host_common_test.cc
@@ -173,6 +173,10 @@
float device_scale_factor,
float page_scale_factor,
LayerImpl* page_scale_layer) {
+ if (device_scale_factor !=
+ root_layer->layer_tree_impl()->device_scale_factor())
+ root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true;
+
root_layer->layer_tree_impl()->SetDeviceScaleFactor(device_scale_factor);
EXPECT_TRUE(page_scale_layer || (page_scale_factor == 1.f));
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index 81c05e00..f2c7022 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -97,7 +97,26 @@
gfx::RectF clip_rect;
};
-static ConditionalClip ComputeRectInTargetSpace(
+static ConditionalClip ComputeTargetRectInLocalSpace(
+ gfx::RectF rect,
+ const TransformTree& transform_tree,
+ int current_transform_id,
+ int target_transform_id) {
+ gfx::Transform current_to_target;
+ if (!transform_tree.ComputeTransformWithSourceSublayerScale(
+ current_transform_id, target_transform_id, ¤t_to_target))
+ // If transform is not invertible, cannot apply clip.
+ return ConditionalClip{false, gfx::RectF()};
+
+ if (current_transform_id > target_transform_id)
+ return ConditionalClip{true, // is_clipped.
+ MathUtil::MapClippedRect(current_to_target, rect)};
+
+ return ConditionalClip{true, // is_clipped.
+ MathUtil::ProjectClippedRect(current_to_target, rect)};
+}
+
+static ConditionalClip ComputeLocalRectInTargetSpace(
gfx::RectF rect,
const TransformTree& transform_tree,
int current_transform_id,
@@ -107,6 +126,7 @@
current_transform_id, target_transform_id, ¤t_to_target))
// If transform is not invertible, cannot apply clip.
return ConditionalClip{false, gfx::RectF()};
+
if (current_transform_id > target_transform_id)
return ConditionalClip{true, // is_clipped.
MathUtil::MapClippedRect(current_to_target, rect)};
@@ -119,9 +139,9 @@
const TransformTree& transform_tree,
int target_transform_id) {
if (clip_node->data.transform_id != target_transform_id)
- return ComputeRectInTargetSpace(clip_node->data.clip, transform_tree,
- clip_node->data.transform_id,
- target_transform_id);
+ return ComputeLocalRectInTargetSpace(clip_node->data.clip, transform_tree,
+ clip_node->data.transform_id,
+ target_transform_id);
gfx::RectF current_clip = clip_node->data.clip;
gfx::Vector2dF sublayer_scale =
@@ -308,10 +328,11 @@
const EffectNode* copy_request_effect_node =
effect_tree.Node(effect_ancestor_with_copy_request);
- ConditionalClip clip_in_layer_space = ComputeRectInTargetSpace(
+ ConditionalClip clip_in_layer_space = ComputeTargetRectInLocalSpace(
accumulated_clip_in_copy_request_space, transform_tree,
copy_request_effect_node->data.transform_id,
layer->transform_tree_index());
+
if (clip_in_layer_space.is_clipped) {
gfx::RectF clip_rect = clip_in_layer_space.clip_rect;
clip_rect.Offset(-layer->offset_to_transform_parent());
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 23d3fd1..4f47e2ea 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -1466,7 +1466,6 @@
const float device_scale_factor = 2.0f;
LayerImpl* root = root_layer_for_testing();
- root->layer_tree_impl()->SetDeviceScaleFactor(device_scale_factor);
LayerImpl* child = AddChild<LayerImpl>(root);
child->SetDrawsContent(true);
@@ -4791,7 +4790,6 @@
root->layer_tree_impl()->SetViewportLayersFromIds(
Layer::INVALID_ID, page_scale->id(), Layer::INVALID_ID,
Layer::INVALID_ID);
- root->layer_tree_impl()->SetDeviceScaleFactor(device_scale_factor);
root->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting();
root->layer_tree_impl()->SetPageScaleOnActiveTree(page_scale_factor);
ExecuteCalculateDrawProperties(root, device_scale_factor, page_scale_factor,
@@ -5871,6 +5869,20 @@
EXPECT_EQ(gfx::Rect(10, 10), copy_child->visible_layer_rect());
EXPECT_EQ(gfx::Rect(10, 10), copy_clipped_child->visible_layer_rect());
EXPECT_EQ(gfx::Rect(5, 5), copy_surface->visible_layer_rect());
+
+ // Case 3: When there is device scale factor.
+ float device_scale_factor = 2.f;
+ copy_layer->test_properties()->copy_requests.push_back(
+ CopyOutputRequest::CreateRequest(base::Bind(&EmptyCopyOutputCallback)));
+
+ DCHECK(!copy_layer->test_properties()->copy_requests.empty());
+ ExecuteCalculateDrawProperties(root, device_scale_factor);
+ DCHECK(copy_layer->test_properties()->copy_requests.empty());
+
+ EXPECT_EQ(gfx::Rect(50, 50), copy_layer->visible_layer_rect());
+ EXPECT_EQ(gfx::Rect(10, 10), copy_child->visible_layer_rect());
+ EXPECT_EQ(gfx::Rect(10, 10), copy_clipped_child->visible_layer_rect());
+ EXPECT_EQ(gfx::Rect(5, 5), copy_surface->visible_layer_rect());
}
TEST_F(LayerTreeHostCommonTest, VisibleContentRectInsideSurface) {