Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1942 } | 1942 } |
| 1943 | 1943 |
| 1944 const DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, | 1944 const DrawTransforms& PropertyTrees::GetDrawTransforms(int transform_id, |
| 1945 int effect_id) const { | 1945 int effect_id) const { |
| 1946 if (cached_data_.draw_transforms[effect_id][transform_id].update_number != | 1946 if (cached_data_.draw_transforms[effect_id][transform_id].update_number != |
| 1947 cached_data_.property_tree_update_number) { | 1947 cached_data_.property_tree_update_number) { |
| 1948 gfx::Transform target_space_transform; | 1948 gfx::Transform target_space_transform; |
| 1949 gfx::Transform from_target; | 1949 gfx::Transform from_target; |
| 1950 const TransformNode* transform_node = transform_tree.Node(transform_id); | 1950 const TransformNode* transform_node = transform_tree.Node(transform_id); |
| 1951 const EffectNode* effect_node = effect_tree.Node(effect_id); | 1951 const EffectNode* effect_node = effect_tree.Node(effect_id); |
| 1952 const TransformNode* dest_node = | |
| 1953 transform_tree.Node(effect_node->transform_id); | |
| 1952 DCHECK(effect_id == effect_tree.kRootNodeId || | 1954 DCHECK(effect_id == effect_tree.kRootNodeId || |
| 1953 effect_node->has_render_surface); | 1955 effect_node->has_render_surface); |
| 1956 bool already_computed_inverse = false; | |
| 1954 if (transform_id == effect_node->transform_id) { | 1957 if (transform_id == effect_node->transform_id) { |
| 1955 target_space_transform.Scale(effect_node->surface_contents_scale.x(), | 1958 target_space_transform.Scale(effect_node->surface_contents_scale.x(), |
| 1956 effect_node->surface_contents_scale.y()); | 1959 effect_node->surface_contents_scale.y()); |
| 1960 } else if (!dest_node || (dest_node->ancestors_are_invertible && | |
| 1961 dest_node->node_and_ancestors_are_flat)) { | |
| 1962 // Compute transform from transform_id to effect_node->transform. | |
| 1963 target_space_transform.ConcatTransform( | |
| 1964 transform_tree.ToScreen(transform_id)); | |
| 1965 if (dest_node) | |
| 1966 target_space_transform.ConcatTransform( | |
| 1967 transform_tree.FromScreen(dest_node->id)); | |
| 1968 if (dest_node->needs_surface_contents_scale) | |
| 1969 target_space_transform.matrix().postScale( | |
| 1970 dest_node->surface_contents_scale.x(), | |
| 1971 dest_node->surface_contents_scale.y(), 1.f); | |
| 1972 } else if (transform_node->id > dest_node->id) { | |
| 1973 target_space_transform = | |
| 1974 GetDrawTransforms(transform_node->parent_id, effect_id).to_target; | |
| 1975 if (transform_node->flattens_inherited_transform) | |
| 1976 target_space_transform.FlattenTo2d(); | |
| 1977 target_space_transform.PreconcatTransform(transform_node->to_parent); | |
| 1957 } else { | 1978 } else { |
| 1958 // Compute transform from transform_id to effect_node->transform. | 1979 const TransformNode* current = dest_node; |
| 1959 DCHECK_GT(transform_id, effect_node->transform_id); | 1980 std::vector<int> source_to_destination; |
| 1960 const TransformNode* dest_node = | 1981 source_to_destination.push_back(current->id); |
| 1961 transform_tree.Node(effect_node->transform_id); | 1982 current = transform_tree.parent(current); |
| 1962 if (!dest_node || (dest_node->ancestors_are_invertible && | 1983 for (; current && current->id > transform_node->id; |
| 1963 dest_node->node_and_ancestors_are_flat)) { | 1984 current = transform_tree.parent(current)) { |
| 1964 target_space_transform.ConcatTransform( | 1985 source_to_destination.push_back(current->id); |
| 1965 transform_tree.ToScreen(transform_id)); | |
| 1966 if (dest_node) | |
| 1967 target_space_transform.ConcatTransform( | |
| 1968 transform_tree.FromScreen(dest_node->id)); | |
| 1969 if (dest_node->needs_surface_contents_scale) | |
| 1970 target_space_transform.matrix().postScale( | |
| 1971 dest_node->surface_contents_scale.x(), | |
| 1972 dest_node->surface_contents_scale.y(), 1.f); | |
| 1973 } else { | |
| 1974 target_space_transform = | |
| 1975 GetDrawTransforms(transform_node->parent_id, effect_id).to_target; | |
| 1976 if (transform_node->flattens_inherited_transform) | |
| 1977 target_space_transform.FlattenTo2d(); | |
| 1978 target_space_transform.PreconcatTransform(transform_node->to_parent); | |
| 1979 } | 1986 } |
| 1987 DCHECK_EQ(current, transform_node); | |
| 1988 gfx::Transform combined_transform; | |
| 1989 size_t source_to_destination_size = source_to_destination.size(); | |
| 1990 for (size_t i = 0; i < source_to_destination_size; ++i) { | |
| 1991 size_t index = source_to_destination_size - 1 - i; | |
| 1992 const TransformNode* node = | |
| 1993 transform_tree.Node(source_to_destination[index]); | |
| 1994 if (node->flattens_inherited_transform) | |
| 1995 combined_transform.FlattenTo2d(); | |
| 1996 combined_transform.PreconcatTransform(node->to_parent); | |
| 1997 } | |
| 1998 if (effect_node->surface_contents_scale.x() != 0.f && | |
| 1999 effect_node->surface_contents_scale.y() != 0.f) | |
| 2000 combined_transform.Scale( | |
| 2001 1.0f / effect_node->surface_contents_scale.x(), | |
| 2002 1.0f / effect_node->surface_contents_scale.y()); | |
| 2003 cached_data_.draw_transforms[effect_id][transform_id] | |
| 2004 .transforms.invertible = | |
| 2005 combined_transform.GetInverse(&target_space_transform); | |
| 2006 target_space_transform.PreconcatTransform(combined_transform); | |
|
ajuma
2016/08/11 23:17:56
I'm probably missing something, but doesn't this l
jaydasika
2016/08/12 00:37:21
Oops, my bad. I din't catch it as there are no uni
| |
| 2007 from_target = combined_transform; | |
| 2008 already_computed_inverse = true; | |
| 1980 } | 2009 } |
| 1981 cached_data_.draw_transforms[effect_id][transform_id] | 2010 if (!already_computed_inverse) { |
| 1982 .transforms.invertible = | 2011 cached_data_.draw_transforms[effect_id][transform_id] |
| 1983 target_space_transform.GetInverse(&from_target); | 2012 .transforms.invertible = |
| 2013 target_space_transform.GetInverse(&from_target); | |
| 2014 } | |
| 1984 cached_data_.draw_transforms[effect_id][transform_id].update_number = | 2015 cached_data_.draw_transforms[effect_id][transform_id].update_number = |
| 1985 cached_data_.property_tree_update_number; | 2016 cached_data_.property_tree_update_number; |
| 1986 cached_data_.draw_transforms[effect_id][transform_id] | 2017 cached_data_.draw_transforms[effect_id][transform_id] |
| 1987 .transforms.from_target = from_target; | 2018 .transforms.from_target = from_target; |
| 1988 cached_data_.draw_transforms[effect_id][transform_id].transforms.to_target = | 2019 cached_data_.draw_transforms[effect_id][transform_id].transforms.to_target = |
| 1989 target_space_transform; | 2020 target_space_transform; |
| 1990 } | 2021 } |
| 1991 return cached_data_.draw_transforms[effect_id][transform_id].transforms; | 2022 return cached_data_.draw_transforms[effect_id][transform_id].transforms; |
| 1992 } | 2023 } |
| 1993 | 2024 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2033 // This can happen when PaintArtifactCompositor builds property trees as | 2064 // This can happen when PaintArtifactCompositor builds property trees as |
| 2034 // it doesn't set effect ids on clip nodes. We want to compute transform | 2065 // it doesn't set effect ids on clip nodes. We want to compute transform |
| 2035 // to the root in this case. | 2066 // to the root in this case. |
| 2036 target_transform_id = TransformTree::kRootNodeId; | 2067 target_transform_id = TransformTree::kRootNodeId; |
| 2037 } else { | 2068 } else { |
| 2038 DCHECK(effect_node->has_render_surface || | 2069 DCHECK(effect_node->has_render_surface || |
| 2039 effect_node->id == EffectTree::kRootNodeId); | 2070 effect_node->id == EffectTree::kRootNodeId); |
| 2040 target_transform_id = effect_node->transform_id; | 2071 target_transform_id = effect_node->transform_id; |
| 2041 } | 2072 } |
| 2042 | 2073 |
| 2074 if (transform_id == TransformTree::kInvalidNodeId) | |
| 2075 return true; | |
| 2043 bool success = transform_tree.ComputeTransform( | 2076 bool success = transform_tree.ComputeTransform( |
| 2044 transform_id, target_transform_id, transform); | 2077 transform_id, target_transform_id, transform); |
| 2045 if (verify_transform_tree_calculations && | 2078 if (verify_transform_tree_calculations) { |
| 2046 transform_id > target_transform_id) { | |
| 2047 gfx::Transform to_target; | 2079 gfx::Transform to_target; |
| 2048 to_target.ConcatTransform( | 2080 to_target.ConcatTransform( |
| 2049 GetDrawTransforms(transform_id, effect_id).to_target); | 2081 GetDrawTransforms(transform_id, effect_id).to_target); |
| 2050 if (effect_node->surface_contents_scale.x() != 0.f && | 2082 if (effect_node->surface_contents_scale.x() != 0.f && |
| 2051 effect_node->surface_contents_scale.y() != 0.f) | 2083 effect_node->surface_contents_scale.y() != 0.f) |
| 2052 to_target.matrix().postScale( | 2084 to_target.matrix().postScale( |
| 2053 1.0f / effect_node->surface_contents_scale.x(), | 2085 1.0f / effect_node->surface_contents_scale.x(), |
| 2054 1.0f / effect_node->surface_contents_scale.y(), 1.0f); | 2086 1.0f / effect_node->surface_contents_scale.y(), 1.0f); |
| 2055 DCHECK(to_target.ApproximatelyEqual(*transform)); | 2087 DCHECK(to_target.ApproximatelyEqual(*transform)); |
| 2056 } | 2088 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 2071 // to the root in this case. | 2103 // to the root in this case. |
| 2072 target_transform_id = TransformTree::kRootNodeId; | 2104 target_transform_id = TransformTree::kRootNodeId; |
| 2073 } else { | 2105 } else { |
| 2074 DCHECK(effect_node->has_render_surface || | 2106 DCHECK(effect_node->has_render_surface || |
| 2075 effect_node->id == EffectTree::kRootNodeId); | 2107 effect_node->id == EffectTree::kRootNodeId); |
| 2076 target_transform_id = effect_node->transform_id; | 2108 target_transform_id = effect_node->transform_id; |
| 2077 } | 2109 } |
| 2078 | 2110 |
| 2079 bool success = transform_tree.ComputeTransform(target_transform_id, | 2111 bool success = transform_tree.ComputeTransform(target_transform_id, |
| 2080 transform_id, transform); | 2112 transform_id, transform); |
| 2081 if (verify_transform_tree_calculations && | 2113 if (verify_transform_tree_calculations) { |
| 2082 transform_id < target_transform_id) { | |
| 2083 auto draw_transforms = GetDrawTransforms(transform_id, effect_id); | 2114 auto draw_transforms = GetDrawTransforms(transform_id, effect_id); |
| 2084 gfx::Transform from_target; | 2115 gfx::Transform from_target; |
| 2085 from_target.ConcatTransform(draw_transforms.from_target); | 2116 from_target.ConcatTransform(draw_transforms.from_target); |
| 2086 from_target.Scale(effect_node->surface_contents_scale.x(), | 2117 from_target.Scale(effect_node->surface_contents_scale.x(), |
| 2087 effect_node->surface_contents_scale.y()); | 2118 effect_node->surface_contents_scale.y()); |
| 2088 DCHECK(from_target.ApproximatelyEqual(*transform) || | 2119 DCHECK(from_target.ApproximatelyEqual(*transform) || |
| 2089 !draw_transforms.invertible); | 2120 !draw_transforms.invertible); |
| 2090 } | 2121 } |
| 2091 return success; | 2122 return success; |
| 2092 } | 2123 } |
| 2093 | 2124 |
| 2094 } // namespace cc | 2125 } // namespace cc |
| OLD | NEW |