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 f21ed3fb153db4bf4c06d3e7a787c719afff1091..70c5037221d1979579ac149f2fe0190b205834a9 100644 |
--- a/cc/trees/layer_tree_host_common.cc |
+++ b/cc/trees/layer_tree_host_common.cc |
@@ -21,6 +21,7 @@ |
#include "ui/gfx/geometry/rect_conversions.h" |
#include "ui/gfx/geometry/vector2d_conversions.h" |
#include "ui/gfx/transform.h" |
+#include "ui/gfx/transform_util.h" |
namespace cc { |
@@ -1202,30 +1203,12 @@ struct PreCalculateMetaInformationRecursiveData { |
} |
}; |
-static bool ValidateRenderSurface(LayerImpl* layer) { |
- // There are a few cases in which it is incorrect to not have a |
- // render_surface. |
- if (layer->render_surface()) |
- return true; |
- |
- return layer->filters().IsEmpty() && layer->background_filters().IsEmpty() && |
- !layer->mask_layer() && !layer->replica_layer() && |
- !IsRootLayer(layer) && !layer->is_root_for_isolated_group() && |
- !layer->HasCopyRequest(); |
-} |
- |
-static bool ValidateRenderSurface(Layer* layer) { |
- return true; |
-} |
- |
// Recursively walks the layer tree to compute any information that is needed |
// before doing the main recursion. |
template <typename LayerType> |
static void PreCalculateMetaInformation( |
LayerType* layer, |
PreCalculateMetaInformationRecursiveData* recursive_data) { |
- DCHECK(ValidateRenderSurface(layer)); |
- |
layer->draw_properties().sorted_for_recursion = false; |
layer->draw_properties().has_child_with_a_scroll_parent = false; |
@@ -1271,11 +1254,6 @@ static void PreCalculateMetaInformation( |
recursive_data->layer_or_descendant_has_input_handler; |
} |
-static void RoundTranslationComponents(gfx::Transform* transform) { |
- transform->matrix().set(0, 3, MathUtil::Round(transform->matrix().get(0, 3))); |
- transform->matrix().set(1, 3, MathUtil::Round(transform->matrix().get(1, 3))); |
-} |
- |
template <typename LayerType> |
struct SubtreeGlobals { |
LayerSorter* layer_sorter; |
@@ -1701,7 +1679,7 @@ static void CalculateDrawPropertiesInternal( |
// blurriness. To avoid side-effects, do this only if the transform is |
// simple. |
gfx::Vector2dF previous_translation = combined_transform.To2dTranslation(); |
- RoundTranslationComponents(&combined_transform); |
+ combined_transform.RoundTranslationComponents(); |
gfx::Vector2dF current_translation = combined_transform.To2dTranslation(); |
// This rounding changes the scroll delta, and so must be included |
@@ -2491,6 +2469,12 @@ static bool ApproximatelyEqual(const gfx::Rect& r1, const gfx::Rect& r2) { |
std::abs(r1.height() - r2.height()) <= tolerance; |
} |
+static bool ApproximatelyEqual(const gfx::Transform& a, |
+ const gfx::Transform& b) { |
+ static const float tolerance = 0.01f; |
+ return gfx::MatrixDistance(a, b) < tolerance; |
+} |
+ |
void LayerTreeHostCommon::CalculateDrawProperties( |
CalcDrawPropsMainInputs* inputs) { |
UpdateRenderSurfaces(inputs->root_layer, |
@@ -2520,8 +2504,8 @@ void LayerTreeHostCommon::CalculateDrawProperties( |
DCHECK(inputs->root_layer->render_surface()); |
if (inputs->verify_property_trees) { |
- // TODO(ajuma): Can we efficiently cache some of this rather than |
- // starting from scratch every frame? |
+ // The translation from layer to property trees is an intermediate state. We |
+ // will eventually get these data passed directly to the compositor. |
TransformTree transform_tree; |
ClipTree clip_tree; |
ComputeVisibleRectsUsingPropertyTrees( |
@@ -2530,23 +2514,24 @@ void LayerTreeHostCommon::CalculateDrawProperties( |
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->visible_rect_from_property_trees())) { |
- failed = true; |
- } |
- } |
+ if (!it.represents_itself() || !current_layer->DrawsContent()) |
+ continue; |
+ |
+ const bool visible_rects_match = |
+ ApproximatelyEqual(current_layer->visible_content_rect(), |
+ current_layer->visible_rect_from_property_trees()); |
+ CHECK(visible_rects_match); |
+ |
+ const bool draw_transforms_match = ApproximatelyEqual( |
+ current_layer->draw_transform(), |
+ current_layer->draw_transform_from_property_trees(transform_tree)); |
+ CHECK(draw_transforms_match); |
} |
- |
- CHECK(!failed); |
} |
} |