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

Side by Side Diff: third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp

Issue 1914293003: SVG <marker> painting TLC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fold markerContentTransformation. Created 4 years, 7 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 /* 1 /*
2 * Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Rob Buis <buis@kde.org>
4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 void LayoutSVGResourceMarker::removeClientFromCache(LayoutObject* client, bool m arkForInvalidation) 58 void LayoutSVGResourceMarker::removeClientFromCache(LayoutObject* client, bool m arkForInvalidation)
59 { 59 {
60 ASSERT(client); 60 ASSERT(client);
61 markClientForInvalidation(client, markForInvalidation ? BoundariesInvalidati on : ParentOnlyInvalidation); 61 markClientForInvalidation(client, markForInvalidation ? BoundariesInvalidati on : ParentOnlyInvalidation);
62 } 62 }
63 63
64 FloatRect LayoutSVGResourceMarker::markerBoundaries(const AffineTransform& marke rTransformation) const 64 FloatRect LayoutSVGResourceMarker::markerBoundaries(const AffineTransform& marke rTransformation) const
65 { 65 {
66 FloatRect coordinates = LayoutSVGContainer::paintInvalidationRectInLocalSVGC oordinates(); 66 FloatRect coordinates = LayoutSVGContainer::paintInvalidationRectInLocalSVGC oordinates();
67 67
68 // Map paint invalidation rect into parent coordinate space, in which the ma rker boundaries have to be evaluated 68 // Map paint invalidation rect into parent coordinate space, in which the
69 // marker boundaries have to be evaluated.
69 coordinates = localToSVGParentTransform().mapRect(coordinates); 70 coordinates = localToSVGParentTransform().mapRect(coordinates);
70 71
71 return markerTransformation.mapRect(coordinates); 72 return markerTransformation.mapRect(coordinates);
72 } 73 }
73 74
74 const AffineTransform& LayoutSVGResourceMarker::localToSVGParentTransform() cons t 75 const AffineTransform& LayoutSVGResourceMarker::localToSVGParentTransform() cons t
75 { 76 {
76 m_localToParentTransform = AffineTransform::translation(m_viewport.x(), m_vi ewport.y()) * viewportTransform(); 77 m_localToParentTransform = AffineTransform::translation(m_viewport.x(), m_vi ewport.y()) * viewportTransform();
77 return m_localToParentTransform; 78 return m_localToParentTransform;
78 // If this class were ever given a localTransform(), then the above would re ad: 79 // If this class were ever given a localTransform(), then the above would re ad:
(...skipping 19 matching lines...) Expand all
98 return toSVGMarkerElement(element())->markerUnits()->currentValue()->enumVal ue(); 99 return toSVGMarkerElement(element())->markerUnits()->currentValue()->enumVal ue();
99 } 100 }
100 101
101 SVGMarkerOrientType LayoutSVGResourceMarker::orientType() const 102 SVGMarkerOrientType LayoutSVGResourceMarker::orientType() const
102 { 103 {
103 return toSVGMarkerElement(element())->orientType()->currentValue()->enumValu e(); 104 return toSVGMarkerElement(element())->orientType()->currentValue()->enumValu e();
104 } 105 }
105 106
106 AffineTransform LayoutSVGResourceMarker::markerTransformation(const FloatPoint& origin, float autoAngle, float strokeWidth) const 107 AffineTransform LayoutSVGResourceMarker::markerTransformation(const FloatPoint& origin, float autoAngle, float strokeWidth) const
107 { 108 {
108 bool useStrokeWidth = markerUnits() == SVGMarkerUnitsStrokeWidth; 109 // Apply scaling according to markerUnits ('strokeWidth' or 'userSpaceOnUse' .)
110 float markerScale = markerUnits() == SVGMarkerUnitsStrokeWidth ? strokeWidth : 1;
109 111
110 AffineTransform transform; 112 AffineTransform transform;
111 transform.translate(origin.x(), origin.y()); 113 transform.translate(origin.x(), origin.y());
112 transform.rotate(orientType() == SVGMarkerOrientAngle ? angle() : autoAngle) ; 114 transform.rotate(orientType() == SVGMarkerOrientAngle ? angle() : autoAngle) ;
113 transform = markerContentTransformation(transform, referencePoint(), useStro keWidth ? strokeWidth : -1); 115 transform.scale(markerScale);
116
117 // The 'origin' coordinate maps to SVGs refX/refY, given in coordinates
118 // relative to the viewport established by the marker.
119 FloatPoint mappedReferencePoint = viewportTransform().mapPoint(referencePoin t());
120 transform.translate(-mappedReferencePoint.x(), -mappedReferencePoint.y());
114 return transform; 121 return transform;
115 } 122 }
116 123
117 AffineTransform LayoutSVGResourceMarker::markerContentTransformation(const Affin eTransform& contentTransformation, const FloatPoint& origin, float strokeWidth) const 124 bool LayoutSVGResourceMarker::shouldPaint() const
118 { 125 {
119 // The 'origin' coordinate maps to SVGs refX/refY, given in coordinates rela tive to the viewport established by the marker 126 // An empty viewBox disables rendering.
120 FloatPoint mappedOrigin = viewportTransform().mapPoint(origin); 127 SVGMarkerElement* marker = toSVGMarkerElement(element());
121 128 ASSERT(marker);
122 AffineTransform transformation = contentTransformation; 129 return !marker->viewBox()->isSpecified()
123 if (strokeWidth != -1) 130 || !marker->viewBox()->currentValue()->isValid()
124 transformation.scaleNonUniform(strokeWidth, strokeWidth); 131 || !marker->viewBox()->currentValue()->value().isEmpty();
125
126 transformation.translate(-mappedOrigin.x(), -mappedOrigin.y());
127 return transformation;
128 } 132 }
129 133
130 AffineTransform LayoutSVGResourceMarker::viewportTransform() const 134 AffineTransform LayoutSVGResourceMarker::viewportTransform() const
131 { 135 {
132 SVGMarkerElement* marker = toSVGMarkerElement(element()); 136 SVGMarkerElement* marker = toSVGMarkerElement(element());
133 ASSERT(marker); 137 ASSERT(marker);
134 138
135 return marker->viewBoxToViewTransform(m_viewport.width(), m_viewport.height( )); 139 return marker->viewBoxToViewTransform(m_viewport.width(), m_viewport.height( ));
136 } 140 }
137 141
(...skipping 13 matching lines...) Expand all
151 155
152 bool LayoutSVGResourceMarker::calculateLocalTransform() 156 bool LayoutSVGResourceMarker::calculateLocalTransform()
153 { 157 {
154 // TODO(fs): Temporarily, needing a layout implies that the local transform 158 // TODO(fs): Temporarily, needing a layout implies that the local transform
155 // has changed. This should be updated to be more precise and factor in the 159 // has changed. This should be updated to be more precise and factor in the
156 // actual (relevant) changes to the computed user-space transform. 160 // actual (relevant) changes to the computed user-space transform.
157 return selfNeedsLayout(); 161 return selfNeedsLayout();
158 } 162 }
159 163
160 } // namespace blink 164 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698