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

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

Issue 2105273004: GeometryMapper: Support computing visual rects in spaces that are not direct ancestors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: none Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
index d02be98b0870ab027f400e6e239c02f9aa43f7da..ae2542773fa76d3d8c4ac053df3300a6c2476da1 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
@@ -33,17 +33,31 @@ struct PrecomputedDataForAncestor {
// PropertyTreeStates. The design document has a number of details on use cases, algorithmic definitions,
// and running times.
//
+// NOTE: a GeometryMapper object is only valid for property trees that do not change. If any mutation occurs,
+// a new GeometryMapper object must be allocated corresponding to the new state.
+//
// Design document: http://bit.ly/28P4FDA
//
// TODO(chrishtr): take effect and scroll trees into account.
class PLATFORM_EXPORT GeometryMapper {
public:
GeometryMapper() {}
-
// The runtime of m calls among LocalToVisualRectInAncestorSpace, LocalToAncestorRect or AncestorToLocalRect
// with the same |ancestorState| parameter is guaranteed to be O(n + m), where n is the number of transform and clip
// nodes in their respective property trees.
+ // If the clips and transforms of |sourceState| are equal to or descendants of those of |destinationState|, returns
+ // the same value as localToVisualRectInAncestorSpace. Otherwise, maps the input rect to the transform state which is
+ // the least common ancestor of |sourceState.transform| and |destinationState.transform|, then multiplies it by
+ // the the inverse transform mapping from the least common ancestor to |destinationState.transform|.
+ //
+ // If that inverse transform is not invertible, sets |success| to false and returns the input rect. Otherwise, sets
+ // |success| to true.
+ FloatRect mapToVisualRectInDestinationSpace(const FloatRect&,
+ const PropertyTreeState& sourceState,
+ const PropertyTreeState& destinationState,
+ bool& success);
+
// Maps from a rect in |localTransformSpace| to its visual rect in |ancestorState|. This is computed
// by multiplying the rect by its combined transform between |localTransformSpace| and |ancestorSpace|,
// then flattening into 2D space, then intersecting by the "clip visual rect" for |localTransformState|'s clips.
@@ -51,51 +65,64 @@ public:
//
// Note that the clip of |ancestorState| is *not* applied.
//
- // It is an error to call this method if any of the paint property tree nodes in |localTransformState| are not equal
- // to or a descendant of that in |ancestorState|.
- FloatRect LocalToVisualRectInAncestorSpace(const FloatRect&,
+ // If any of the paint property tree nodes in |localTransformState| are not equal
+ // to or a descendant of that in |ancestorState|, returns the passed-in rect and sets |success| to false. Otherwise,
+ // sets |success| to true.
+ FloatRect localToVisualRectInAncestorSpace(const FloatRect&,
const PropertyTreeState& localTransformState,
- const PropertyTreeState& ancestorState);
+ const PropertyTreeState& ancestorState, bool& success);
// Maps from a rect in |localTransformSpace| to its transformed rect in |ancestorSpace|. This is computed
// by multiplying the rect by the combined transform between |localTransformState| and |ancestorState|,
// then flattening into 2D space.
//
- // It is an error to call this method if any of the paint property tree nodes in |localTransformState| are not equal
- // to or a descendant of that in |ancestorState|.
- FloatRect LocalToAncestorRect(const FloatRect&,
+ // If any of the paint property tree nodes in |localTransformState| are not equal
+ // to or a descendant of that in |ancestorState|, returns the passed-in rec and sets |success| to false. Otherwise,
+ // sets |success| to true.
+ //
+ // If any of the paint property tree nodes in |localTransformState| are not equal
+ // to or a descendant of that in |ancestorState|, returns the passed-in rect and sets |success| to false. Otherwise,
+ // sets |success| to true.
+ FloatRect localToAncestorRect(const FloatRect&,
const PropertyTreeState& localTransformState,
- const PropertyTreeState& ancestorState);
+ const PropertyTreeState& ancestorState, bool& success);
// Maps from a rect in |ancestorSpace| to its transformed rect in |localTransformSpace|. This is computed
// by multiplying the rect by the inverse combined transform between |localTransformState| and |ancestorState|,
- // if the transform is invertible. If is invertible, also sets |*success| to true. Otherwise sets |*success| to false.
+ // if the transform is invertible.
//
- // It is an error to call this method if any of the paint property tree nodes in |localTransformState| are not equal
- // to or a descendant of that in |ancestorState|.
- FloatRect AncestorToLocalRect(const FloatRect&,
+ // If any of the paint property tree nodes in |localTransformState| are not equal
+ // to or a descendant of that in |ancestorState|, returns the passed-in rect and sets |success| to false. Otherwise,
+ // sets |success| to true.
+ FloatRect ancestorToLocalRect(const FloatRect&,
const PropertyTreeState& localTransformState,
- const PropertyTreeState& ancestorState, bool* success);
+ const PropertyTreeState& ancestorState, bool& success);
private:
- // Returns the matrix used in |LocalToAncestorRect|.
- const TransformationMatrix& LocalToAncestorMatrix(
- const TransformPaintPropertyNode* localTransformState,
- const PropertyTreeState& ancestorState);
+ // Returns the matrix used in |LocalToAncestorRect|. Sets |success| to failse iff |localTransformNode| is not
+ // equal to or a descendant of |ancestorState.transform|.
+ const TransformationMatrix& localToAncestorMatrix(
+ const TransformPaintPropertyNode* localTransformNode,
+ const PropertyTreeState& ancestorState, bool& success);
// Returns the "clip visual rect" between |localTransformState| and |ancestorState|. See above for the definition
// of "clip visual rect".
- const FloatRect& LocalToAncestorClipRect(
+ const FloatRect& localToAncestorClipRect(
const PropertyTreeState& localTransformState,
const PropertyTreeState& ancestorState);
// Returns the precomputed data if already set, or adds and memoizes a new PrecomputedDataForAncestor otherwise.
- PrecomputedDataForAncestor& GetPrecomputedDataForAncestor(const PropertyTreeState&);
+ PrecomputedDataForAncestor& getPrecomputedDataForAncestor(const PropertyTreeState&);
+
+ // Returns the least common ancestor in the transform tree.
+ PassRefPtr<TransformPaintPropertyNode> leastCommonAncestor(PassRefPtr<TransformPaintPropertyNode>, PassRefPtr<TransformPaintPropertyNode>);
friend class GeometryMapperTest;
HashMap<const TransformPaintPropertyNode*, std::unique_ptr<PrecomputedDataForAncestor>> m_data;
+ const TransformationMatrix m_identity;
+
DISALLOW_COPY_AND_ASSIGN(GeometryMapper);
};

Powered by Google App Engine
This is Rietveld 408576698