Index: cc/trees/layer_tree_host_common.cc |
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc |
index 6863850c97b01c7e98fac52450e1609742ec8948..7fce94bbac40a56a598e9385791b8be468ec9f7d 100644 |
--- a/cc/trees/layer_tree_host_common.cc |
+++ b/cc/trees/layer_tree_host_common.cc |
@@ -14,7 +14,9 @@ |
#include "cc/layers/layer_iterator.h" |
#include "cc/layers/render_surface.h" |
#include "cc/layers/render_surface_impl.h" |
+#include "cc/trees/draw_property_utils.h" |
#include "cc/trees/layer_sorter.h" |
+#include "cc/trees/layer_tree_host.h" |
#include "cc/trees/layer_tree_impl.h" |
#include "ui/gfx/geometry/rect_conversions.h" |
#include "ui/gfx/transform.h" |
@@ -2400,6 +2402,14 @@ static void ProcessCalcDrawPropsInputs( |
data_for_recursion->subtree_is_visible_from_ancestor = true; |
} |
+static bool ApproximatelyEqual(const gfx::Rect& r1, const gfx::Rect& r2) { |
+ static const int tolerance = 1; |
+ return std::abs(r1.x() - r2.x()) <= tolerance && |
+ std::abs(r1.y() - r2.y()) <= tolerance && |
+ std::abs(r1.width() - r2.width()) <= tolerance && |
+ std::abs(r1.height() - r2.height()) <= tolerance; |
+} |
+ |
void LayerTreeHostCommon::CalculateDrawProperties( |
CalcDrawPropsMainInputs* inputs) { |
LayerList dummy_layer_list; |
@@ -2424,6 +2434,41 @@ void LayerTreeHostCommon::CalculateDrawProperties( |
// A root layer render_surface should always exist after |
// CalculateDrawProperties. |
DCHECK(inputs->root_layer->render_surface()); |
+ |
+ // Now compare with the new approach. |
+ // |
+ // TODO(ajuma): Can we efficiently cache some of this rather than |
+ // starting from scratch every frame? |
+ // |
+ // TODO(vollick): This needs to be cleaned up, moved, and enabled with a |
+ // runtime flag. |
+ TransformTree transform_tree; |
+ ClipTree clip_tree; |
+ ComputeVisibleRectsUsingPropertyTrees(inputs->root_layer, |
+ inputs->page_scale_application_layer, |
+ inputs->page_scale_factor, |
+ inputs->device_scale_factor, |
+ gfx::Rect(inputs->device_viewport_size), |
+ inputs->device_transform, |
+ &transform_tree, |
+ &clip_tree); |
+ |
+ bool failed = false; |
+ LayerIterator<Layer> it, end; |
+ for (it = LayerIterator<Layer>::Begin(inputs->render_surface_layer_list), |
+ end = LayerIterator<Layer>::End(inputs->render_surface_layer_list); |
+ it != end; ++it) { |
+ Layer* current_layer = *it; |
+ if (it.represents_itself()) { |
+ if (!failed && current_layer->DrawsContent() && |
+ !ApproximatelyEqual(current_layer->visible_content_rect(), |
+ current_layer->debug_visible_rect())) { |
+ failed = true; |
+ } |
+ } |
+ } |
+ |
+ CHECK(!failed); |
} |
void LayerTreeHostCommon::CalculateDrawProperties( |