| 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 using |
| 1963 // screen space transforms. |
| 1964 target_space_transform.ConcatTransform( |
| 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 if (transform_node->id > dest_node->id) { |
| 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); |
| 1957 } else { | 1979 } else { |
| 1958 // Compute transform from transform_id to effect_node->transform. | 1980 const TransformNode* current = dest_node; |
| 1959 DCHECK_GT(transform_id, effect_node->transform_id); | 1981 std::vector<int> source_to_destination; |
| 1960 const TransformNode* dest_node = | 1982 source_to_destination.push_back(current->id); |
| 1961 transform_tree.Node(effect_node->transform_id); | 1983 current = transform_tree.parent(current); |
| 1962 if (!dest_node || (dest_node->ancestors_are_invertible && | 1984 for (; current && current->id > transform_node->id; |
| 1963 dest_node->node_and_ancestors_are_flat)) { | 1985 current = transform_tree.parent(current)) { |
| 1964 target_space_transform.ConcatTransform( | 1986 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 } | 1987 } |
| 1988 DCHECK_EQ(current, transform_node); |
| 1989 gfx::Transform combined_transform; |
| 1990 size_t source_to_destination_size = source_to_destination.size(); |
| 1991 for (size_t i = 0; i < source_to_destination_size; ++i) { |
| 1992 size_t index = source_to_destination_size - 1 - i; |
| 1993 const TransformNode* node = |
| 1994 transform_tree.Node(source_to_destination[index]); |
| 1995 if (node->flattens_inherited_transform) |
| 1996 combined_transform.FlattenTo2d(); |
| 1997 combined_transform.PreconcatTransform(node->to_parent); |
| 1998 } |
| 1999 if (effect_node->surface_contents_scale.x() != 0.f && |
| 2000 effect_node->surface_contents_scale.y() != 0.f) |
| 2001 combined_transform.Scale( |
| 2002 1.0f / effect_node->surface_contents_scale.x(), |
| 2003 1.0f / effect_node->surface_contents_scale.y()); |
| 2004 cached_data_.draw_transforms[effect_id][transform_id] |
| 2005 .transforms.invertible = |
| 2006 combined_transform.GetInverse(&target_space_transform); |
| 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 26 matching lines...) Expand all Loading... |
| 2020 screen_space_transform.Scale(1.0 / effect_node->surface_contents_scale.x(), | 2051 screen_space_transform.Scale(1.0 / effect_node->surface_contents_scale.x(), |
| 2021 1.0 / effect_node->surface_contents_scale.y()); | 2052 1.0 / effect_node->surface_contents_scale.y()); |
| 2022 return screen_space_transform; | 2053 return screen_space_transform; |
| 2023 } | 2054 } |
| 2024 | 2055 |
| 2025 bool PropertyTrees::ComputeTransformToTarget(int transform_id, | 2056 bool PropertyTrees::ComputeTransformToTarget(int transform_id, |
| 2026 int effect_id, | 2057 int effect_id, |
| 2027 gfx::Transform* transform) const { | 2058 gfx::Transform* transform) const { |
| 2028 transform->MakeIdentity(); | 2059 transform->MakeIdentity(); |
| 2029 | 2060 |
| 2061 if (transform_id == TransformTree::kInvalidNodeId) |
| 2062 return true; |
| 2063 |
| 2030 int target_transform_id; | 2064 int target_transform_id; |
| 2031 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2065 const EffectNode* effect_node = effect_tree.Node(effect_id); |
| 2032 if (effect_id == EffectTree::kInvalidNodeId) { | 2066 if (effect_id == EffectTree::kInvalidNodeId) { |
| 2033 // This can happen when PaintArtifactCompositor builds property trees as | 2067 // This can happen when PaintArtifactCompositor builds property trees as |
| 2034 // it doesn't set effect ids on clip nodes. We want to compute transform | 2068 // it doesn't set effect ids on clip nodes. We want to compute transform |
| 2035 // to the root in this case. | 2069 // to the root in this case. |
| 2036 target_transform_id = TransformTree::kRootNodeId; | 2070 target_transform_id = TransformTree::kRootNodeId; |
| 2037 } else { | 2071 } else { |
| 2038 DCHECK(effect_node->has_render_surface || | 2072 DCHECK(effect_node->has_render_surface || |
| 2039 effect_node->id == EffectTree::kRootNodeId); | 2073 effect_node->id == EffectTree::kRootNodeId); |
| 2040 target_transform_id = effect_node->transform_id; | 2074 target_transform_id = effect_node->transform_id; |
| 2041 } | 2075 } |
| 2042 | 2076 |
| 2043 bool success = transform_tree.ComputeTransform( | 2077 bool success = transform_tree.ComputeTransform( |
| 2044 transform_id, target_transform_id, transform); | 2078 transform_id, target_transform_id, transform); |
| 2045 if (verify_transform_tree_calculations && | 2079 if (verify_transform_tree_calculations) { |
| 2046 transform_id > target_transform_id) { | |
| 2047 gfx::Transform to_target; | 2080 gfx::Transform to_target; |
| 2048 to_target.ConcatTransform( | 2081 to_target.ConcatTransform( |
| 2049 GetDrawTransforms(transform_id, effect_id).to_target); | 2082 GetDrawTransforms(transform_id, effect_id).to_target); |
| 2050 if (effect_node->surface_contents_scale.x() != 0.f && | 2083 if (effect_node->surface_contents_scale.x() != 0.f && |
| 2051 effect_node->surface_contents_scale.y() != 0.f) | 2084 effect_node->surface_contents_scale.y() != 0.f) |
| 2052 to_target.matrix().postScale( | 2085 to_target.matrix().postScale( |
| 2053 1.0f / effect_node->surface_contents_scale.x(), | 2086 1.0f / effect_node->surface_contents_scale.x(), |
| 2054 1.0f / effect_node->surface_contents_scale.y(), 1.0f); | 2087 1.0f / effect_node->surface_contents_scale.y(), 1.0f); |
| 2055 DCHECK(to_target.ApproximatelyEqual(*transform)); | 2088 DCHECK(to_target.ApproximatelyEqual(*transform)); |
| 2056 } | 2089 } |
| 2057 return success; | 2090 return success; |
| 2058 } | 2091 } |
| 2059 | 2092 |
| 2060 bool PropertyTrees::ComputeTransformFromTarget( | 2093 bool PropertyTrees::ComputeTransformFromTarget( |
| 2061 int transform_id, | 2094 int transform_id, |
| 2062 int effect_id, | 2095 int effect_id, |
| 2063 gfx::Transform* transform) const { | 2096 gfx::Transform* transform) const { |
| 2064 transform->MakeIdentity(); | 2097 transform->MakeIdentity(); |
| 2065 | 2098 |
| 2099 if (transform_id == TransformTree::kInvalidNodeId) |
| 2100 return true; |
| 2101 |
| 2066 int target_transform_id; | 2102 int target_transform_id; |
| 2067 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2103 const EffectNode* effect_node = effect_tree.Node(effect_id); |
| 2068 if (effect_id == EffectTree::kInvalidNodeId) { | 2104 if (effect_id == EffectTree::kInvalidNodeId) { |
| 2069 // This can happen when PaintArtifactCompositor builds property trees as | 2105 // This can happen when PaintArtifactCompositor builds property trees as |
| 2070 // it doesn't set effect ids on clip nodes. We want to compute transform | 2106 // it doesn't set effect ids on clip nodes. We want to compute transform |
| 2071 // to the root in this case. | 2107 // to the root in this case. |
| 2072 target_transform_id = TransformTree::kRootNodeId; | 2108 target_transform_id = TransformTree::kRootNodeId; |
| 2073 } else { | 2109 } else { |
| 2074 DCHECK(effect_node->has_render_surface || | 2110 DCHECK(effect_node->has_render_surface || |
| 2075 effect_node->id == EffectTree::kRootNodeId); | 2111 effect_node->id == EffectTree::kRootNodeId); |
| 2076 target_transform_id = effect_node->transform_id; | 2112 target_transform_id = effect_node->transform_id; |
| 2077 } | 2113 } |
| 2078 | 2114 |
| 2079 bool success = transform_tree.ComputeTransform(target_transform_id, | 2115 bool success = transform_tree.ComputeTransform(target_transform_id, |
| 2080 transform_id, transform); | 2116 transform_id, transform); |
| 2081 if (verify_transform_tree_calculations && | 2117 if (verify_transform_tree_calculations) { |
| 2082 transform_id < target_transform_id) { | |
| 2083 auto draw_transforms = GetDrawTransforms(transform_id, effect_id); | 2118 auto draw_transforms = GetDrawTransforms(transform_id, effect_id); |
| 2084 gfx::Transform from_target; | 2119 gfx::Transform from_target; |
| 2085 from_target.ConcatTransform(draw_transforms.from_target); | 2120 from_target.ConcatTransform(draw_transforms.from_target); |
| 2086 from_target.Scale(effect_node->surface_contents_scale.x(), | 2121 from_target.Scale(effect_node->surface_contents_scale.x(), |
| 2087 effect_node->surface_contents_scale.y()); | 2122 effect_node->surface_contents_scale.y()); |
| 2088 DCHECK(from_target.ApproximatelyEqual(*transform) || | 2123 DCHECK(from_target.ApproximatelyEqual(*transform) || |
| 2089 !draw_transforms.invertible); | 2124 !draw_transforms.invertible); |
| 2090 } | 2125 } |
| 2091 return success; | 2126 return success; |
| 2092 } | 2127 } |
| 2093 | 2128 |
| 2094 } // namespace cc | 2129 } // namespace cc |
| OLD | NEW |