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

Unified Diff: cc/layers/render_surface_impl.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: 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 side-by-side diff with in-line comments
Download patch
Index: cc/layers/render_surface_impl.cc
diff --git a/cc/layers/render_surface_impl.cc b/cc/layers/render_surface_impl.cc
index 5ba1aad641674b8c3ca2a16c6c6e642d5344e329..30d11038d175e7fd1d492d421f87214f033d2d90 100644
--- a/cc/layers/render_surface_impl.cc
+++ b/cc/layers/render_surface_impl.cc
@@ -150,6 +150,75 @@ void RenderSurfaceImpl::SetContentRect(const gfx::Rect& content_rect) {
draw_properties_.content_rect = content_rect;
}
+void RenderSurfaceImpl::SetContentRectForTesting(const gfx::Rect& rect) {
+ SetContentRect(rect);
+}
+
+void RenderSurfaceImpl::CalculateContentRectFromAccumulatedContentRect(
+ int max_texture_size) {
+ // Root render surface use viewport, and does not calculate content rect.
+ DCHECK_NE(render_target(), this);
+
+ // Surface's content rect is the clipped accumulated content rect. By default
+ // use accumulated content rect, and then try to clip it.
+ gfx::Rect surface_content_rect = accumulated_content_rect();
+ // Early out if no need to clip.
+ if (!owning_layer_->replica_layer() && !owning_layer_->HasCopyRequest() &&
+ is_clipped()) {
+ if (!accumulated_content_rect().IsEmpty()) {
+ // Calculate projection from the target surface rect to local
+ // space. Non-invertible draw transforms means no able to bring clipped
+ // rect in target space back to local space, early out without clip.
+ gfx::Transform target_to_surface(gfx::Transform::kSkipInitialization);
+ if (draw_transform().GetInverse(&target_to_surface)) {
+ // Clip rect is in target space. Bring accumulated content rect to
+ // target space in preparation for clipping.
+ gfx::Rect accumulated_rect_in_target_space =
+ MathUtil::MapEnclosingClippedRect(draw_transform(),
+ accumulated_content_rect());
+ // If accumulated content rect is contained within clip rect, early out
+ // without clipping.
+ if (!clip_rect().Contains(accumulated_rect_in_target_space)) {
+ gfx::Rect clipped_accumulated_rect_in_target_space = clip_rect();
+ clipped_accumulated_rect_in_target_space.Intersect(
+ accumulated_rect_in_target_space);
+
+ if (!clipped_accumulated_rect_in_target_space.IsEmpty()) {
+ gfx::Rect clipped_accumulated_rect_in_local_space =
+ MathUtil::ProjectEnclosingClippedRect(
+ target_to_surface,
+ clipped_accumulated_rect_in_target_space);
+ // Bringing clipped accumulated rect back to local space may result
+ // in inflationg due to axis-alignment.
ajuma 2016/04/19 19:20:37 typo: inflation
+ surface_content_rect.Intersect(
+ clipped_accumulated_rect_in_local_space);
+ } else {
+ // All accumulated content rect is clipped out.
+ surface_content_rect = gfx::Rect();
+ }
+ }
+ }
+ }
+ }
ajuma 2016/04/19 19:20:37 Suggestion for making this easier to read: put thi
+ // The RenderSurfaceImpl backing texture cannot exceed the maximum
+ // supported texture size.
+ surface_content_rect.set_width(
+ std::min(surface_content_rect.width(), max_texture_size));
+ surface_content_rect.set_height(
+ std::min(surface_content_rect.height(), max_texture_size));
+
+ SetContentRect(surface_content_rect);
+}
+
+void RenderSurfaceImpl::SetContentRectToViewport() {
+ // Only root render surface use viewport as content rect.
+ DCHECK_EQ(render_target(), this);
+ gfx::Rect viewport = gfx::ToEnclosingRect(owning_layer_->layer_tree_impl()
+ ->property_trees()
+ ->clip_tree.ViewportClip());
+ SetContentRect(viewport);
+}
+
void RenderSurfaceImpl::ClearAccumulatedContentRect() {
accumulated_content_rect_ = gfx::Rect();
}

Powered by Google App Engine
This is Rietveld 408576698