Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(190)

Side by Side Diff: cc/trees/layer_tree_host_common.cc

Issue 1902893002: cc: Move calculation of content rect to RenderSurfaceImpl class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@targetid
Patch Set: fix error Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/layer_tree_host_common.h" 5 #include "cc/trees/layer_tree_host_common.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 DCHECK_EQ(scrolls.size(), 0u); 188 DCHECK_EQ(scrolls.size(), 0u);
189 for (int i = 0; i < proto.scrolls_size(); ++i) { 189 for (int i = 0; i < proto.scrolls_size(); ++i) {
190 scrolls.push_back(LayerTreeHostCommon::ScrollUpdateInfo()); 190 scrolls.push_back(LayerTreeHostCommon::ScrollUpdateInfo());
191 scrolls[i].FromProtobuf(proto.scrolls(i)); 191 scrolls[i].FromProtobuf(proto.scrolls(i));
192 } 192 }
193 page_scale_delta = proto.page_scale_delta(); 193 page_scale_delta = proto.page_scale_delta();
194 elastic_overscroll_delta = ProtoToVector2dF(proto.elastic_overscroll_delta()); 194 elastic_overscroll_delta = ProtoToVector2dF(proto.elastic_overscroll_delta());
195 top_controls_delta = proto.top_controls_delta(); 195 top_controls_delta = proto.top_controls_delta();
196 } 196 }
197 197
198 inline gfx::Rect CalculateVisibleRectWithCachedLayerRect(
199 const gfx::Rect& target_surface_rect,
200 const gfx::Rect& layer_bound_rect,
201 const gfx::Rect& layer_rect_in_target_space,
202 const gfx::Transform& transform) {
203 if (layer_rect_in_target_space.IsEmpty())
204 return gfx::Rect();
205
206 // Is this layer fully contained within the target surface?
207 if (target_surface_rect.Contains(layer_rect_in_target_space))
208 return layer_bound_rect;
209
210 // If the layer doesn't fill up the entire surface, then find the part of
211 // the surface rect where the layer could be visible. This avoids trying to
212 // project surface rect points that are behind the projection point.
213 gfx::Rect minimal_surface_rect = target_surface_rect;
214 minimal_surface_rect.Intersect(layer_rect_in_target_space);
215
216 if (minimal_surface_rect.IsEmpty())
217 return gfx::Rect();
218
219 // Project the corners of the target surface rect into the layer space.
220 // This bounding rectangle may be larger than it needs to be (being
221 // axis-aligned), but is a reasonable filter on the space to consider.
222 // Non-invertible transforms will create an empty rect here.
223
224 gfx::Transform surface_to_layer(gfx::Transform::kSkipInitialization);
225 if (!transform.GetInverse(&surface_to_layer)) {
226 // Because we cannot use the surface bounds to determine what portion of
227 // the layer is visible, we must conservatively assume the full layer is
228 // visible.
229 return layer_bound_rect;
230 }
231
232 gfx::Rect layer_rect = MathUtil::ProjectEnclosingClippedRect(
233 surface_to_layer, minimal_surface_rect);
234 layer_rect.Intersect(layer_bound_rect);
235 return layer_rect;
236 }
237
238 gfx::Rect LayerTreeHostCommon::CalculateVisibleRect(
239 const gfx::Rect& target_surface_rect,
240 const gfx::Rect& layer_bound_rect,
241 const gfx::Transform& transform) {
242 gfx::Rect layer_in_surface_space =
243 MathUtil::MapEnclosingClippedRect(transform, layer_bound_rect);
244 return CalculateVisibleRectWithCachedLayerRect(
245 target_surface_rect, layer_bound_rect, layer_in_surface_space, transform);
246 }
247
248 static inline bool IsRootLayer(const Layer* layer) { 198 static inline bool IsRootLayer(const Layer* layer) {
249 return !layer->parent(); 199 return !layer->parent();
250 } 200 }
251 201
252 template <typename LayerType> 202 template <typename LayerType>
253 static bool HasInvertibleOrAnimatedTransform(LayerType* layer) { 203 static bool HasInvertibleOrAnimatedTransform(LayerType* layer) {
254 return layer->transform_is_invertible() || 204 return layer->transform_is_invertible() ||
255 layer->HasPotentiallyRunningTransformAnimation(); 205 layer->HasPotentiallyRunningTransformAnimation();
256 } 206 }
257 207
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 560
611 static void ComputeSurfaceContentRects(LayerTreeImpl* layer_tree_impl, 561 static void ComputeSurfaceContentRects(LayerTreeImpl* layer_tree_impl,
612 PropertyTrees* property_trees, 562 PropertyTrees* property_trees,
613 LayerImplList* render_surface_layer_list, 563 LayerImplList* render_surface_layer_list,
614 int max_texture_size) { 564 int max_texture_size) {
615 // Walk the list backwards, accumulating each surface's content rect into its 565 // Walk the list backwards, accumulating each surface's content rect into its
616 // target's content rect. 566 // target's content rect.
617 for (LayerImpl* layer : base::Reversed(*render_surface_layer_list)) { 567 for (LayerImpl* layer : base::Reversed(*render_surface_layer_list)) {
618 if (layer_tree_impl->IsRootLayer(layer)) { 568 if (layer_tree_impl->IsRootLayer(layer)) {
619 // The root layer's surface content rect is always the entire viewport. 569 // The root layer's surface content rect is always the entire viewport.
620 gfx::Rect viewport = 570 layer->render_surface()->SetContentRectToViewport();
621 gfx::ToEnclosingRect(property_trees->clip_tree.ViewportClip());
622 layer->render_surface()->SetContentRect(viewport);
623 continue; 571 continue;
624 } 572 }
625
626 RenderSurfaceImpl* surface = layer->render_surface(); 573 RenderSurfaceImpl* surface = layer->render_surface();
627 gfx::Rect surface_content_rect = surface->accumulated_content_rect(); 574 // Now all contributing drawable content rect has been accumulated to this
628 575 // render surface, calculate the content rect.
629 if (!layer->replica_layer() && !layer->HasCopyRequest() && 576 surface->CalculateContentRectFromAccumulatedContentRect(max_texture_size);
630 surface->is_clipped()) {
631 // Here, we clip the render surface's content rect with its clip rect.
632 // As the clip rect of render surface is in the surface's target
633 // space, we first map the content rect into the target space,
634 // intersect it with clip rect and project back the result to the
635 // surface space.
636 if (!surface_content_rect.IsEmpty()) {
637 gfx::Rect surface_clip_rect = LayerTreeHostCommon::CalculateVisibleRect(
638 surface->clip_rect(), surface_content_rect,
639 surface->draw_transform());
640 surface_content_rect.Intersect(surface_clip_rect);
641 }
642 }
643 // The RenderSurfaceImpl backing texture cannot exceed the maximum
644 // supported texture size.
645 surface_content_rect.set_width(
646 std::min(surface_content_rect.width(), max_texture_size));
647 surface_content_rect.set_height(
648 std::min(surface_content_rect.height(), max_texture_size));
649 surface->SetContentRect(surface_content_rect);
650 577
651 // Now the render surface's content rect is calculated correctly, it could 578 // Now the render surface's content rect is calculated correctly, it could
652 // contribute to its render target. 579 // contribute to its render target.
653 surface->render_target() 580 surface->render_target()
654 ->AccumulateContentRectFromContributingRenderSurface(surface); 581 ->AccumulateContentRectFromContributingRenderSurface(surface);
655 } 582 }
656 } 583 }
657 584
658 static void ComputeListOfNonEmptySurfaces( 585 static void ComputeListOfNonEmptySurfaces(
659 LayerTreeImpl* layer_tree_impl, 586 LayerTreeImpl* layer_tree_impl,
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 863
937 PropertyTrees* GetPropertyTrees(Layer* layer) { 864 PropertyTrees* GetPropertyTrees(Layer* layer) {
938 return layer->layer_tree_host()->property_trees(); 865 return layer->layer_tree_host()->property_trees();
939 } 866 }
940 867
941 PropertyTrees* GetPropertyTrees(LayerImpl* layer) { 868 PropertyTrees* GetPropertyTrees(LayerImpl* layer) {
942 return layer->layer_tree_impl()->property_trees(); 869 return layer->layer_tree_impl()->property_trees();
943 } 870 }
944 871
945 } // namespace cc 872 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common.h ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698