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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h

Issue 2390443002: Unify GeometryPropertyTreeState and PropertyTreeState (Closed)
Patch Set: rebase x2 Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #ifndef GeometryMapper_h 5 #ifndef GeometryMapper_h
6 #define GeometryMapper_h 6 #define GeometryMapper_h
7 7
8 #include "platform/geometry/FloatRect.h" 8 #include "platform/geometry/FloatRect.h"
9 #include "platform/graphics/paint/GeometryPropertyTreeState.h" 9 #include "platform/graphics/paint/PropertyTreeState.h"
10 #include "platform/transforms/TransformationMatrix.h" 10 #include "platform/transforms/TransformationMatrix.h"
11 #include "wtf/HashMap.h" 11 #include "wtf/HashMap.h"
12 12
13 namespace blink { 13 namespace blink {
14 14
15 struct PrecomputedDataForAncestor { 15 struct PrecomputedDataForAncestor {
16 // Maps from a transform node that is a descendant of the ancestor to the comb ined 16 // Maps from a transform node that is a descendant of the ancestor to the comb ined
17 // transform between the descendant's and the ancestor's coordinate space. 17 // transform between the descendant's and the ancestor's coordinate space.
18 HashMap<const TransformPaintPropertyNode*, TransformationMatrix> 18 HashMap<const TransformPaintPropertyNode*, TransformationMatrix>
19 toAncestorTransforms; 19 toAncestorTransforms;
20 20
21 // Maps from a descendant clip node to its equivalent "clip visual rect" in th e space of the ancestor. 21 // Maps from a descendant clip node to its equivalent "clip visual rect" in th e space of the ancestor.
22 // The clip visual rect is defined as the intersection of all clips between th e descendant 22 // The clip visual rect is defined as the intersection of all clips between th e descendant
23 // and the ancestor (*not* including the ancestor) in the clip tree, individua lly transformed from their 23 // and the ancestor (*not* including the ancestor) in the clip tree, individua lly transformed from their
24 // localTransformSpace into the ancestor's localTransformSpace. 24 // localTransformSpace into the ancestor's localTransformSpace.
25 HashMap<const ClipPaintPropertyNode*, FloatRect> toAncestorClipRects; 25 HashMap<const ClipPaintPropertyNode*, FloatRect> toAncestorClipRects;
26 26
27 static std::unique_ptr<PrecomputedDataForAncestor> create() { 27 static std::unique_ptr<PrecomputedDataForAncestor> create() {
28 return wrapUnique(new PrecomputedDataForAncestor()); 28 return wrapUnique(new PrecomputedDataForAncestor());
29 } 29 }
30 }; 30 };
31 31
32 // GeometryMapper is a helper class for fast computations of transformed and vis ual rects in 32 // GeometryMapper is a helper class for fast computations of transformed and vis ual rects in
33 // different GeometryPropertyTreeStates. The design document has a number of det ails on use cases, 33 // different PropertyTreeStates. The design document has a number of details on use cases,
34 // algorithmic definitions, and running times. 34 // algorithmic definitions, and running times.
35 // 35 //
36 // NOTE: A GeometryMapper object is only valid for property trees that do not ch ange. If any 36 // NOTE: A GeometryMapper object is only valid for property trees that do not ch ange. If any
37 // mutation occurs, a new GeometryMapper object must be allocated corresponding to the new state. 37 // mutation occurs, a new GeometryMapper object must be allocated corresponding to the new state.
38 // 38 //
39 // Design document: http://bit.ly/28P4FDA 39 // Design document: http://bit.ly/28P4FDA
40 // 40 //
41 // TODO(chrishtr): take effect tree into account. 41 // TODO(chrishtr): take effect tree into account.
42 class PLATFORM_EXPORT GeometryMapper { 42 class PLATFORM_EXPORT GeometryMapper {
43 public: 43 public:
44 GeometryMapper() {} 44 GeometryMapper() {}
45 // The runtime of m calls among localToVisualRectInAncestorSpace, localToAnces torRect or ancestorToLocalRect 45 // The runtime of m calls among localToVisualRectInAncestorSpace, localToAnces torRect or ancestorToLocalRect
46 // with the same |ancestorState| parameter is guaranteed to be O(n + m), wher e n is the number of transform and clip 46 // with the same |ancestorState| parameter is guaranteed to be O(n + m), wher e n is the number of transform and clip
47 // nodes in their respective property trees. 47 // nodes in their respective property trees.
48 48
49 // If the clips and transforms of |sourceState| are equal to or descendants of those of |destinationState|, returns 49 // If the clips and transforms of |sourceState| are equal to or descendants of those of |destinationState|, returns
50 // the same value as localToVisualRectInAncestorSpace. Otherwise, maps the inp ut rect to the transform state which is 50 // the same value as localToVisualRectInAncestorSpace. Otherwise, maps the inp ut rect to the transform state which is
51 // the least common ancestor of |sourceState.transform| and |destinationState. transform|, then multiplies it by 51 // the least common ancestor of |sourceState.transform| and |destinationState. transform|, then multiplies it by
52 // the the inverse transform mapping from the least common ancestor to |destin ationState.transform|. 52 // the the inverse transform mapping from the least common ancestor to |destin ationState.transform|.
53 // 53 //
54 // If that inverse transform is not invertible, sets |success| to false and re turns the input rect. Otherwise, sets 54 // If that inverse transform is not invertible, sets |success| to false and re turns the input rect. Otherwise, sets
55 // |success| to true. 55 // |success| to true.
56 FloatRect mapToVisualRectInDestinationSpace( 56 FloatRect mapToVisualRectInDestinationSpace(
57 const FloatRect&, 57 const FloatRect&,
58 const GeometryPropertyTreeState& sourceState, 58 const PropertyTreeState& sourceState,
59 const GeometryPropertyTreeState& destinationState, 59 const PropertyTreeState& destinationState,
60 bool& success); 60 bool& success);
61 61
62 // Same as mapToVisualRectInDestinationSpace() except that *no* clip is applie d. 62 // Same as mapToVisualRectInDestinationSpace() except that *no* clip is applie d.
63 FloatRect mapRectToDestinationSpace( 63 FloatRect mapRectToDestinationSpace(const FloatRect&,
64 const FloatRect&, 64 const PropertyTreeState& sourceState,
65 const GeometryPropertyTreeState& sourceState, 65 const PropertyTreeState& destinationState,
66 const GeometryPropertyTreeState& destinationState, 66 bool& success);
67 bool& success);
68 67
69 // Maps from a rect in |localTransformSpace| to its visual rect in |ancestorSt ate|. This is computed 68 // Maps from a rect in |localTransformSpace| to its visual rect in |ancestorSt ate|. This is computed
70 // by multiplying the rect by its combined transform between |localTransformSp ace| and |ancestorSpace|, 69 // by multiplying the rect by its combined transform between |localTransformSp ace| and |ancestorSpace|,
71 // then flattening into 2D space, then intersecting by the "clip visual rect" for |localTransformState|'s clips. 70 // then flattening into 2D space, then intersecting by the "clip visual rect" for |localTransformState|'s clips.
72 // See above for the definition of "clip visual rect". 71 // See above for the definition of "clip visual rect".
73 // 72 //
74 // Note that the clip of |ancestorState| is *not* applied. 73 // Note that the clip of |ancestorState| is *not* applied.
75 // 74 //
76 // If any of the paint property tree nodes in |localTransformState| are not eq ual 75 // If any of the paint property tree nodes in |localTransformState| are not eq ual
77 // to or a descendant of that in |ancestorState|, returns the passed-in rect a nd sets |success| to false. Otherwise, 76 // to or a descendant of that in |ancestorState|, returns the passed-in rect a nd sets |success| to false. Otherwise,
78 // sets |success| to true. 77 // sets |success| to true.
79 FloatRect localToVisualRectInAncestorSpace( 78 FloatRect localToVisualRectInAncestorSpace(
80 const FloatRect&, 79 const FloatRect&,
81 const GeometryPropertyTreeState& localTransformState, 80 const PropertyTreeState& localTransformState,
82 const GeometryPropertyTreeState& ancestorState, 81 const PropertyTreeState& ancestorState,
83 bool& success); 82 bool& success);
84 83
85 // Maps from a rect in |localTransformSpace| to its transformed rect in |ances torSpace|. This is computed 84 // Maps from a rect in |localTransformSpace| to its transformed rect in |ances torSpace|. This is computed
86 // by multiplying the rect by the combined transform between |localTransformSt ate| and |ancestorState|, 85 // by multiplying the rect by the combined transform between |localTransformSt ate| and |ancestorState|,
87 // then flattening into 2D space. 86 // then flattening into 2D space.
88 // 87 //
89 // If any of the paint property tree nodes in |localTransformState| are not eq ual 88 // If any of the paint property tree nodes in |localTransformState| are not eq ual
90 // to or a descendant of that in |ancestorState|, returns the passed-in rec an d sets |success| to false. Otherwise, 89 // to or a descendant of that in |ancestorState|, returns the passed-in rec an d sets |success| to false. Otherwise,
91 // sets |success| to true. 90 // sets |success| to true.
92 // 91 //
93 // If any of the paint property tree nodes in |localTransformState| are not eq ual 92 // If any of the paint property tree nodes in |localTransformState| are not eq ual
94 // to or a descendant of that in |ancestorState|, returns the passed-in rect a nd sets |success| to false. Otherwise, 93 // to or a descendant of that in |ancestorState|, returns the passed-in rect a nd sets |success| to false. Otherwise,
95 // sets |success| to true. 94 // sets |success| to true.
96 FloatRect localToAncestorRect( 95 FloatRect localToAncestorRect(const FloatRect&,
97 const FloatRect&, 96 const PropertyTreeState& localTransformState,
98 const GeometryPropertyTreeState& localTransformState, 97 const PropertyTreeState& ancestorState,
99 const GeometryPropertyTreeState& ancestorState, 98 bool& success);
100 bool& success);
101 99
102 // Maps from a rect in |ancestorSpace| to its transformed rect in |localTransf ormSpace|. This is computed 100 // Maps from a rect in |ancestorSpace| to its transformed rect in |localTransf ormSpace|. This is computed
103 // by multiplying the rect by the inverse combined transform between |localTra nsformState| and |ancestorState|, 101 // by multiplying the rect by the inverse combined transform between |localTra nsformState| and |ancestorState|,
104 // if the transform is invertible. 102 // if the transform is invertible.
105 // 103 //
106 // If any of the paint property tree nodes in |localTransformState| are not eq ual 104 // If any of the paint property tree nodes in |localTransformState| are not eq ual
107 // to or a descendant of that in |ancestorState|, returns the passed-in rect a nd sets |success| to false. Otherwise, 105 // to or a descendant of that in |ancestorState|, returns the passed-in rect a nd sets |success| to false. Otherwise,
108 // sets |success| to true. 106 // sets |success| to true.
109 FloatRect ancestorToLocalRect( 107 FloatRect ancestorToLocalRect(const FloatRect&,
110 const FloatRect&, 108 const PropertyTreeState& localTransformState,
111 const GeometryPropertyTreeState& localTransformState, 109 const PropertyTreeState& ancestorState,
112 const GeometryPropertyTreeState& ancestorState, 110 bool& success);
113 bool& success);
114 111
115 private: 112 private:
116 // Used by mapToVisualRectInDestinationSpace() after fast mapping (assuming de stination is an ancestor of source) failed. 113 // Used by mapToVisualRectInDestinationSpace() after fast mapping (assuming de stination is an ancestor of source) failed.
117 FloatRect slowMapToVisualRectInDestinationSpace( 114 FloatRect slowMapToVisualRectInDestinationSpace(
118 const FloatRect&, 115 const FloatRect&,
119 const GeometryPropertyTreeState& sourceState, 116 const PropertyTreeState& sourceState,
120 const GeometryPropertyTreeState& destinationState, 117 const PropertyTreeState& destinationState,
121 bool& success); 118 bool& success);
122 119
123 // Used by mapRectToDestinationSpace() after fast mapping (assuming destinatio n is an ancestor of source) failed. 120 // Used by mapRectToDestinationSpace() after fast mapping (assuming destinatio n is an ancestor of source) failed.
124 FloatRect slowMapRectToDestinationSpace( 121 FloatRect slowMapRectToDestinationSpace(
125 const FloatRect&, 122 const FloatRect&,
126 const GeometryPropertyTreeState& sourceState, 123 const PropertyTreeState& sourceState,
127 const GeometryPropertyTreeState& destinationState, 124 const PropertyTreeState& destinationState,
128 bool& success); 125 bool& success);
129 126
130 // Returns the matrix used in |LocalToAncestorRect|. Sets |success| to failse iff |localTransformNode| is not 127 // Returns the matrix used in |LocalToAncestorRect|. Sets |success| to failse iff |localTransformNode| is not
131 // equal to or a descendant of |ancestorState.transform|. 128 // equal to or a descendant of |ancestorState.transform|.
132 const TransformationMatrix& localToAncestorMatrix( 129 const TransformationMatrix& localToAncestorMatrix(
133 const TransformPaintPropertyNode* localTransformNode, 130 const TransformPaintPropertyNode* localTransformNode,
134 const GeometryPropertyTreeState& ancestorState, 131 const PropertyTreeState& ancestorState,
135 bool& success); 132 bool& success);
136 133
137 // Returns the "clip visual rect" between |localTransformState| and |ancestorS tate|. See above for the definition 134 // Returns the "clip visual rect" between |localTransformState| and |ancestorS tate|. See above for the definition
138 // of "clip visual rect". 135 // of "clip visual rect".
139 FloatRect localToAncestorClipRect( 136 FloatRect localToAncestorClipRect(
140 const GeometryPropertyTreeState& localTransformState, 137 const PropertyTreeState& localTransformState,
141 const GeometryPropertyTreeState& ancestorState, 138 const PropertyTreeState& ancestorState,
142 bool& success); 139 bool& success);
143 140
144 // Returns the precomputed data if already set, or adds and memoizes a new Pre computedDataForAncestor otherwise. 141 // Returns the precomputed data if already set, or adds and memoizes a new Pre computedDataForAncestor otherwise.
145 PrecomputedDataForAncestor& getPrecomputedDataForAncestor( 142 PrecomputedDataForAncestor& getPrecomputedDataForAncestor(
146 const GeometryPropertyTreeState&); 143 const PropertyTreeState&);
147 144
148 // Returns the least common ancestor in the transform tree. 145 // Returns the least common ancestor in the transform tree.
149 static const TransformPaintPropertyNode* leastCommonAncestor( 146 static const TransformPaintPropertyNode* leastCommonAncestor(
150 const TransformPaintPropertyNode*, 147 const TransformPaintPropertyNode*,
151 const TransformPaintPropertyNode*); 148 const TransformPaintPropertyNode*);
152 149
153 friend class GeometryMapperTest; 150 friend class GeometryMapperTest;
154 151
155 HashMap<const TransformPaintPropertyNode*, 152 HashMap<const TransformPaintPropertyNode*,
156 std::unique_ptr<PrecomputedDataForAncestor>> 153 std::unique_ptr<PrecomputedDataForAncestor>>
157 m_data; 154 m_data;
158 155
159 const TransformationMatrix m_identity; 156 const TransformationMatrix m_identity;
160 157
161 DISALLOW_COPY_AND_ASSIGN(GeometryMapper); 158 DISALLOW_COPY_AND_ASSIGN(GeometryMapper);
162 }; 159 };
163 160
164 } // namespace blink 161 } // namespace blink
165 162
166 #endif // GeometryMapper_h 163 #endif // GeometryMapper_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698