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

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

Issue 1973343003: Initial implementation of GeometryMapper (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
new file mode 100644
index 0000000000000000000000000000000000000000..d02be98b0870ab027f400e6e239c02f9aa43f7da
--- /dev/null
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
@@ -0,0 +1,104 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GeometryMapper_h
+#define GeometryMapper_h
+
+#include "platform/geometry/FloatRect.h"
+#include "platform/graphics/paint/PropertyTreeState.h"
+#include "platform/transforms/TransformationMatrix.h"
+#include "wtf/HashMap.h"
+
+namespace blink {
+
+struct PrecomputedDataForAncestor {
+ // Maps from a transform node that is a descendant of the ancestor to the combined
+ // transform between the descendant's and the ancestor's coordinate space.
+ HashMap<const TransformPaintPropertyNode*, TransformationMatrix> toAncestorTransforms;
+
+ // Maps from a descendant clip node to its equivalent "clip visual rect" in the space of the ancestor.
+ // The clip visual rect is defined as the intersection of all clips between the descendant
+ // and the ancestor (*not* including the ancestor) in the clip tree, individually transformed from their
+ // localTransformSpace into the ancestor's localTransformSpace.
+ HashMap<const ClipPaintPropertyNode*, FloatRect> toAncestorClipRects;
+
+ static std::unique_ptr<PrecomputedDataForAncestor> create()
+ {
+ return wrapUnique(new PrecomputedDataForAncestor());
+ }
+};
+
+// GeometryMapper is a helper class for fast computations of transformed and visual rects in different
+// PropertyTreeStates. The design document has a number of details on use cases, algorithmic definitions,
+// and running times.
+//
+// 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.
+
+ // 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.
+ // See above for the definition of "clip visual rect".
+ //
+ // 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&,
+ const PropertyTreeState& localTransformState,
+ const PropertyTreeState& ancestorState);
+
+ // 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&,
+ const PropertyTreeState& localTransformState,
+ const PropertyTreeState& ancestorState);
+
+ // 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.
+ //
+ // 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&,
+ const PropertyTreeState& localTransformState,
+ const PropertyTreeState& ancestorState, bool* success);
+
+private:
+ // Returns the matrix used in |LocalToAncestorRect|.
+ const TransformationMatrix& LocalToAncestorMatrix(
+ const TransformPaintPropertyNode* localTransformState,
+ const PropertyTreeState& ancestorState);
+
+ // Returns the "clip visual rect" between |localTransformState| and |ancestorState|. See above for the definition
+ // of "clip visual rect".
+ 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&);
+
+ friend class GeometryMapperTest;
+
+ HashMap<const TransformPaintPropertyNode*, std::unique_ptr<PrecomputedDataForAncestor>> m_data;
+
+ DISALLOW_COPY_AND_ASSIGN(GeometryMapper);
+};
+
+} // namespace blink
+
+#endif // GeometryMapper_h

Powered by Google App Engine
This is Rietveld 408576698