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

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

Issue 2729243002: Improve performance of GeometryMapper cache. (Closed)
Patch Set: none Created 3 years, 9 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 05514071738a79c7bf089d3533fdddf7725f2f62..dfa25c6db71ee7a697e5d86a15064531be6e2bbc 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.h
@@ -156,7 +156,7 @@ class PLATFORM_EXPORT GeometryMapper {
const TransformPaintPropertyNode* ancestorTransformNode,
bool& success);
- FloatClipRect localToAncestorClipRectInternal(
+ const FloatClipRect& localToAncestorClipRectInternal(
const ClipPaintPropertyNode* descendant,
const ClipPaintPropertyNode* ancestorClip,
const TransformPaintPropertyNode* ancestorTransform,
@@ -173,45 +173,72 @@ class PLATFORM_EXPORT GeometryMapper {
const PropertyTreeState& ancestorState,
bool& success);
- // Maps from a transform node that is a descendant of the implied ancestor
- // transform node to the combined transform between the descendant's and the
- // ancestor's coordinate space.
- // The "implied ancestor" is the key of the m_transformCache object for which
- // this TransformCache is a value.
- using TransformCache =
- HashMap<const TransformPaintPropertyNode*, TransformationMatrix>;
-
- // Returns the transform cache for the given ancestor transform node.
- TransformCache& getTransformCache(const TransformPaintPropertyNode* ancestor);
-
- // Maps from a descendant clip node to its equivalent "clip visual rect" in
- // the local transform space of the implied ancestor clip node. 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. If one of the clips that contributes to it
- // has a border radius, the hasRadius() field is set to true.
- // The "implied ancestor" is the key of the TransformToClip cachefor which
- // this ClipCache is a value.
- using ClipCache = HashMap<const ClipPaintPropertyNode*, FloatClipRect>;
-
- using TransformToClip =
- HashMap<const TransformPaintPropertyNode*, std::unique_ptr<ClipCache>>;
-
- // Returns the clip cache for the given transform space relative to the
- // given ancestor clip node.
- ClipCache& getClipCache(const ClipPaintPropertyNode* ancestorClip,
- const TransformPaintPropertyNode* ancestorTransform);
+ struct ClipAndTransform {
+ const ClipPaintPropertyNode* ancestorClip;
+ const TransformPaintPropertyNode* ancestorTransform;
+ bool operator==(const ClipAndTransform& other) const {
+ return ancestorClip == other.ancestorClip &&
+ ancestorTransform == other.ancestorTransform;
+ }
+ ClipAndTransform(const ClipPaintPropertyNode* ancestorClipArg,
+ const TransformPaintPropertyNode* ancestorTransformArg)
+ : ancestorClip(ancestorClipArg),
+ ancestorTransform(ancestorTransformArg) {}
+ };
+
+ struct ClipCacheEntry {
+ const ClipAndTransform clipAndTransform;
+ const FloatClipRect clipRect;
+ ClipCacheEntry(const ClipAndTransform& clipAndTransformArg,
+ const FloatClipRect& clipRectArg)
+ : clipAndTransform(clipAndTransformArg), clipRect(clipRectArg) {}
+ };
+
+ Vector<ClipCacheEntry>* getClipCacheEntries(
+ const ClipPaintPropertyNode* descendantClip);
+
+ const FloatClipRect* getClip(const ClipPaintPropertyNode* descendantClip,
+ const ClipAndTransform& ancestors);
+
+ void setClip(const ClipPaintPropertyNode* descendantClip,
+ const ClipAndTransform&,
+ const FloatClipRect&);
+
+ struct TransformCacheEntry {
+ const TransformPaintPropertyNode* ancestorNode;
+ TransformationMatrix toAncestor;
+ TransformCacheEntry(const TransformPaintPropertyNode* ancestorNodeArg,
+ const TransformationMatrix& toAncestorArg)
+ : ancestorNode(ancestorNodeArg), toAncestor(toAncestorArg) {}
+ };
+
+ Vector<TransformCacheEntry>* getTransformCacheEntries(
+ const TransformPaintPropertyNode* descendantTransform);
+
+ const TransformationMatrix* getTransform(
+ const TransformPaintPropertyNode* descendantTransform,
+ const TransformPaintPropertyNode* ancestorTransform);
+
+ void setTransform(const TransformPaintPropertyNode* descendantTransform,
+ const TransformPaintPropertyNode* ancestorTransform,
+ const TransformationMatrix& toAncestor);
friend class GeometryMapperTest;
friend class PaintLayerClipperTest;
- HashMap<const TransformPaintPropertyNode*, std::unique_ptr<TransformCache>>
+ // Maps from a descendant transform node to a list of all ancestor transform
+ // nodes for which there is a cached transform from the descendant.
+ HashMap<const TransformPaintPropertyNode*,
+ std::unique_ptr<Vector<TransformCacheEntry>>>
m_transformCache;
- HashMap<const ClipPaintPropertyNode*, std::unique_ptr<TransformToClip>>
+
+ // Maps from a descendant clip node to a list of all <transform, clip>
+ // ancestor pairs for which there is a cached clip rect from the descendant.
+ HashMap<const ClipPaintPropertyNode*, std::unique_ptr<Vector<ClipCacheEntry>>>
m_clipCache;
const TransformationMatrix m_identity;
+ const FloatClipRect m_infiniteClip;
DISALLOW_COPY_AND_ASSIGN(GeometryMapper);
};

Powered by Google App Engine
This is Rietveld 408576698