Changeset 223804 in webkit
- Timestamp:
- Oct 20, 2017 7:33:53 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r223802 r223804 1 2017-10-20 Said Abou-Hallawa <sabouhallawa@apple.com> 2 3 SVGPathElement should cache the built-up Path of its non animating pathByteStream() 4 https://bugs.webkit.org/show_bug.cgi?id=178248 5 6 Reviewed by Simon Fraser. 7 8 Instead of creating a Path object from the non animating pathByteStream() 9 every time we need to updatePathFromPathElement(), the Path object can be 10 cached once it is created and used for later calls. 11 12 * html/canvas/Path2D.h: buildPathFromString() now returns a Path. 13 14 * platform/graphics/Path.h: 15 * platform/graphics/cairo/PathCairo.cpp: 16 (WebCore::Path::Path): 17 (WebCore::Path::operator=): 18 * platform/graphics/cg/PathCG.cpp: 19 (WebCore::Path::Path): 20 (WebCore::Path::operator=): 21 * platform/graphics/win/PathDirect2D.cpp: 22 (WebCore::Path::Path): 23 (WebCore::Path::operator=): 24 Define the move constructor and the move assignment operator for the the 25 Path class so a statement like "Path path = buildPathFromString()" won't 26 go through the copy constructor and the copy assignment operator. 27 28 * rendering/style/BasicShapes.cpp: 29 (WebCore::SVGPathTranslatedByteStream::path const): 30 * rendering/svg/RenderSVGResourceClipper.cpp: 31 (WebCore::RenderSVGResourceClipper::pathOnlyClipping): 32 * rendering/svg/RenderSVGShape.cpp: 33 (WebCore::RenderSVGShape::updateShapeFromElement): 34 * rendering/svg/RenderSVGTextPath.cpp: 35 (WebCore::RenderSVGTextPath::layoutPath const): 36 * rendering/svg/SVGPathData.cpp: 37 (WebCore::pathFromCircleElement): 38 (WebCore::pathFromEllipseElement): 39 (WebCore::pathFromLineElement): 40 (WebCore::pathFromPathElement): 41 (WebCore::pathFromPolygonElement): 42 (WebCore::pathFromPolylineElement): 43 (WebCore::pathFromRectElement): 44 (WebCore::pathFromGraphicsElement): 45 (WebCore::updatePathFromCircleElement): Deleted. 46 (WebCore::updatePathFromEllipseElement): Deleted. 47 (WebCore::updatePathFromLineElement): Deleted. 48 (WebCore::updatePathFromPathElement): Deleted. 49 (WebCore::updatePathFromPolygonElement): Deleted. 50 (WebCore::updatePathFromPolylineElement): Deleted. 51 (WebCore::updatePathFromRectElement): Deleted. 52 (WebCore::updatePathFromGraphicsElement): Deleted. 53 * rendering/svg/SVGPathData.h: 54 * svg/SVGAnimateMotionElement.cpp: 55 (WebCore::SVGAnimateMotionElement::parseAttribute): 56 (WebCore::SVGAnimateMotionElement::updateAnimationPath): 57 * svg/SVGGraphicsElement.cpp: 58 (WebCore::SVGGraphicsElement::toClipPath): 59 * svg/SVGGraphicsElement.h: 60 Rename updatePathFromElement() to pathFromGraphicsElement(). 61 62 * svg/SVGPathElement.cpp: 63 (WebCore::SVGPathElement::parseAttribute): Clear the cache when 64 m_pathByteStream changes. 65 (WebCore::SVGPathElement::pathForByteStream const): Caches the m_cachedPath 66 if it is null. 67 (WebCore::SVGPathElement::pathSegListChanged): Clear the cache when 68 m_pathByteStream changes. 69 70 * svg/SVGPathElement.h: 71 * svg/SVGPathUtilities.cpp: 72 (WebCore::buildPathFromString): 73 (WebCore::buildPathFromByteStream): 74 * svg/SVGPathUtilities.h: 75 Make thes buildPathFromString() and buildPathFromByteStream() return Paths. 76 77 * svg/SVGUseElement.cpp: 78 (WebCore::SVGUseElement::toClipPath): 79 * svg/SVGUseElement.h: 80 Make these toClipPath() return Path. 81 1 82 2017-10-20 Ryosuke Niwa <rniwa@webkit.org> 2 83 -
trunk/Source/WebCore/html/canvas/Path2D.h
r221598 r223804 59 59 static Ref<Path2D> create(const String& pathData) 60 60 { 61 Path path; 62 buildPathFromString(pathData, path); 63 return create(path); 61 return create(buildPathFromString(pathData)); 64 62 } 65 63 -
trunk/Source/WebCore/platform/graphics/Path.h
r222113 r223804 116 116 117 117 WEBCORE_EXPORT Path(const Path&); 118 WEBCORE_EXPORT Path(Path&&); 118 119 WEBCORE_EXPORT Path& operator=(const Path&); 120 WEBCORE_EXPORT Path& operator=(Path&&); 119 121 120 122 static Path polygonPathFromPoints(const Vector<FloatPoint>&); -
trunk/Source/WebCore/platform/graphics/cairo/PathCairo.cpp
r222603 r223804 61 61 cairo_append_path(cr, pathCopy); 62 62 cairo_path_destroy(pathCopy); 63 } 64 65 Path::Path(Path&& other) 66 { 67 m_path = other.m_path; 68 other.m_path = nullptr; 63 69 } 64 70 … … 88 94 } 89 95 96 return *this; 97 } 98 99 Path& Path::operator=(Path&& other) 100 { 101 if (this == &other) 102 return *this; 103 if (m_path) 104 delete m_path; 105 m_path = other.m_path; 106 other.m_path = nullptr; 90 107 return *this; 91 108 } -
trunk/Source/WebCore/platform/graphics/cg/PathCG.cpp
r222898 r223804 114 114 } 115 115 116 Path::Path(Path&& other) 117 { 118 m_path = other.m_path; 119 other.m_path = nullptr; 120 } 121 116 122 Path& Path::operator=(const Path& other) 117 123 { 118 CGMutablePathRef path = other.m_path ? CGPathCreateMutableCopy(other.m_path) : 0; 124 if (this == &other) 125 return *this; 119 126 if (m_path) 120 127 CGPathRelease(m_path); 121 m_path = path; 128 m_path = other.m_path ? CGPathCreateMutableCopy(other.m_path) : nullptr; 129 return *this; 130 } 131 132 Path& Path::operator=(Path&& other) 133 { 134 if (this == &other) 135 return *this; 136 if (m_path) 137 CGPathRelease(m_path); 138 m_path = other.m_path; 139 other.m_path = nullptr; 122 140 return *this; 123 141 } -
trunk/Source/WebCore/platform/graphics/win/PathDirect2D.cpp
r223728 r223804 159 159 } 160 160 } 161 162 Path & Path::operator=(const Path& other)161 162 Path::Path(Path&& other) 163 163 { 164 164 m_path = other.m_path; 165 165 m_activePath = other.m_activePath; 166 166 m_activePathGeometry = other.m_activePathGeometry; 167 167 other.m_path = nullptr; 168 other.m_activePath = nullptr; 169 other.m_activePathGeometry = nullptr; 170 } 171 172 Path& Path::operator=(const Path& other) 173 { 174 m_path = other.m_path; 175 m_activePath = other.m_activePath; 176 m_activePathGeometry = other.m_activePathGeometry; 177 return *this; 178 } 179 180 Path& Path::operator=(Path&& other) 181 { 182 if (this == &other) 183 return *this; 184 m_path = other.m_path; 185 m_activePath = other.m_activePath; 186 m_activePathGeometry = other.m_activePathGeometry; 187 other.m_path = nullptr; 188 other.m_activePath = nullptr; 189 other.m_activePathGeometry = nullptr; 168 190 return *this; 169 191 } -
trunk/Source/WebCore/rendering/style/BasicShapes.cpp
r213603 r223804 74 74 Path path() const 75 75 { 76 Path path; 77 buildPathFromByteStream(m_rawStream, path); 76 Path path = buildPathFromByteStream(m_rawStream); 78 77 path.translate(toFloatSize(m_offset)); 79 78 return path; -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
r223728 r223804 103 103 // Fallback to masking, if there is more than one clipping path. 104 104 if (clipPath.isEmpty()) { 105 styled.toClipPath(clipPath);105 clipPath = styled.toClipPath(); 106 106 clipRule = svgStyle.clipRule(); 107 107 } else -
trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp
r223728 r223804 76 76 void RenderSVGShape::updateShapeFromElement() 77 77 { 78 m_path = std::make_unique<Path>(); 79 ASSERT(RenderSVGShape::isEmpty()); 80 81 updatePathFromGraphicsElement(&graphicsElement(), path()); 78 m_path = std::make_unique<Path>(pathFromGraphicsElement(&graphicsElement())); 82 79 processMarkerPositions(); 83 80 -
trunk/Source/WebCore/rendering/svg/RenderSVGTextPath.cpp
r208863 r223804 50 50 SVGPathElement& pathElement = downcast<SVGPathElement>(*targetElement); 51 51 52 Path pathData; 53 updatePathFromGraphicsElement(&pathElement, pathData); 52 Path path = pathFromGraphicsElement(&pathElement); 54 53 55 54 // Spec: The transform attribute on the referenced 'path' element represents a … … 58 57 // system due to a possible transform attribute on the current 'text' element. 59 58 // http://www.w3.org/TR/SVG/text.html#TextPathElement 60 path Data.transform(pathElement.animatedLocalTransform());61 return path Data;59 path.transform(pathElement.animatedLocalTransform()); 60 return path; 62 61 } 63 62 -
trunk/Source/WebCore/rendering/svg/SVGPathData.cpp
r208863 r223804 40 40 namespace WebCore { 41 41 42 static void updatePathFromCircleElement(SVGElement* element, Path& path)42 static Path pathFromCircleElement(SVGElement& element) 43 43 { 44 44 ASSERT(is<SVGCircleElement>(element)); 45 45 46 SVGLengthContext lengthContext(element); 47 RenderElement* renderer = element->renderer(); 46 RenderElement* renderer = element.renderer(); 48 47 if (!renderer) 49 return; 48 return { }; 49 50 Path path; 50 51 auto& style = renderer->style(); 52 SVGLengthContext lengthContext(&element); 51 53 float r = lengthContext.valueForLength(style.svgStyle().r()); 52 54 if (r > 0) { … … 55 57 path.addEllipse(FloatRect(cx - r, cy - r, r * 2, r * 2)); 56 58 } 59 return path; 57 60 } 58 61 59 static void updatePathFromEllipseElement(SVGElement* element, Path& path)62 static Path pathFromEllipseElement(SVGElement& element) 60 63 { 61 RenderElement* renderer = element ->renderer();64 RenderElement* renderer = element.renderer(); 62 65 if (!renderer) 63 return; 66 return { }; 67 64 68 auto& style = renderer->style(); 65 SVGLengthContext lengthContext( element);69 SVGLengthContext lengthContext(&element); 66 70 float rx = lengthContext.valueForLength(style.svgStyle().rx(), LengthModeWidth); 67 71 if (rx <= 0) 68 return; 72 return { }; 73 69 74 float ry = lengthContext.valueForLength(style.svgStyle().ry(), LengthModeHeight); 70 75 if (ry <= 0) 71 return; 76 return { }; 77 78 Path path; 72 79 float cx = lengthContext.valueForLength(style.svgStyle().cx(), LengthModeWidth); 73 80 float cy = lengthContext.valueForLength(style.svgStyle().cy(), LengthModeHeight); 74 81 path.addEllipse(FloatRect(cx - rx, cy - ry, rx * 2, ry * 2)); 82 return path; 75 83 } 76 84 77 static void updatePathFromLineElement(SVGElement* element, Path& path)85 static Path pathFromLineElement(SVGElement& element) 78 86 { 79 SVGLineElement* line = downcast<SVGLineElement>(element); 87 Path path; 88 const auto& line = downcast<SVGLineElement>(element); 80 89 81 SVGLengthContext lengthContext(element); 82 path.moveTo(FloatPoint(line->x1().value(lengthContext), line->y1().value(lengthContext))); 83 path.addLineTo(FloatPoint(line->x2().value(lengthContext), line->y2().value(lengthContext))); 90 SVGLengthContext lengthContext(&element); 91 path.moveTo(FloatPoint(line.x1().value(lengthContext), line.y1().value(lengthContext))); 92 path.addLineTo(FloatPoint(line.x2().value(lengthContext), line.y2().value(lengthContext))); 93 return path; 84 94 } 85 95 86 static void updatePathFromPathElement(SVGElement* element, Path& path)96 static Path pathFromPathElement(SVGElement& element) 87 97 { 88 buildPathFromByteStream(downcast<SVGPathElement>(element)->pathByteStream(), path);98 return downcast<SVGPathElement>(element).pathForByteStream(); 89 99 } 90 100 91 static void updatePathFromPolygonElement(SVGElement* element, Path& path)101 static Path pathFromPolygonElement(SVGElement& element) 92 102 { 93 auto& points = downcast<SVGPolygonElement>(element) ->animatedPoints()->values();103 auto& points = downcast<SVGPolygonElement>(element).animatedPoints()->values(); 94 104 if (points.isEmpty()) 95 return ;105 return { }; 96 106 107 Path path; 97 108 path.moveTo(points.first()); 98 109 … … 102 113 103 114 path.closeSubpath(); 115 return path; 104 116 } 105 117 106 static void updatePathFromPolylineElement(SVGElement* element, Path& path)118 static Path pathFromPolylineElement(SVGElement& element) 107 119 { 108 auto& points = downcast<SVGPolylineElement>(element) ->animatedPoints()->values();120 auto& points = downcast<SVGPolylineElement>(element).animatedPoints()->values(); 109 121 if (points.isEmpty()) 110 return ;122 return { }; 111 123 124 Path path; 112 125 path.moveTo(points.first()); 113 126 … … 115 128 for (unsigned i = 1; i < size; ++i) 116 129 path.addLineTo(points.at(i)); 130 return path; 117 131 } 118 132 119 static void updatePathFromRectElement(SVGElement* element, Path& path)133 static Path pathFromRectElement(SVGElement& element) 120 134 { 121 RenderElement* renderer = element ->renderer();135 RenderElement* renderer = element.renderer(); 122 136 if (!renderer) 123 return ;137 return { }; 124 138 125 139 auto& style = renderer->style(); 126 SVGLengthContext lengthContext( element);140 SVGLengthContext lengthContext(&element); 127 141 float width = lengthContext.valueForLength(style.width(), LengthModeWidth); 128 142 if (width <= 0) 129 return; 143 return { }; 144 130 145 float height = lengthContext.valueForLength(style.height(), LengthModeHeight); 131 146 if (height <= 0) 132 return; 147 return { }; 148 149 Path path; 133 150 float x = lengthContext.valueForLength(style.svgStyle().x(), LengthModeWidth); 134 151 float y = lengthContext.valueForLength(style.svgStyle().y(), LengthModeHeight); … … 146 163 // See bug https://bugs.webkit.org/show_bug.cgi?id=79932 which tracks this issue. 147 164 path.addRoundedRect(FloatRect(x, y, width, height), FloatSize(rx, ry), Path::PreferBezierRoundedRect); 148 return ;165 return path; 149 166 } 150 167 151 168 path.addRect(FloatRect(x, y, width, height)); 169 return path; 152 170 } 153 171 154 void updatePathFromGraphicsElement(SVGElement* element, Path& path)172 Path pathFromGraphicsElement(SVGElement* element) 155 173 { 156 174 ASSERT(element); 157 ASSERT(path.isEmpty());158 175 159 typedef void (*PathUpdateFunction)(SVGElement*, Path&);160 static HashMap<AtomicStringImpl*, Path UpdateFunction>* map = 0;176 typedef Path (*PathFromFunction)(SVGElement&); 177 static HashMap<AtomicStringImpl*, PathFromFunction>* map = 0; 161 178 if (!map) { 162 map = new HashMap<AtomicStringImpl*, Path UpdateFunction>;163 map->set(SVGNames::circleTag.localName().impl(), updatePathFromCircleElement);164 map->set(SVGNames::ellipseTag.localName().impl(), updatePathFromEllipseElement);165 map->set(SVGNames::lineTag.localName().impl(), updatePathFromLineElement);166 map->set(SVGNames::pathTag.localName().impl(), updatePathFromPathElement);167 map->set(SVGNames::polygonTag.localName().impl(), updatePathFromPolygonElement);168 map->set(SVGNames::polylineTag.localName().impl(), updatePathFromPolylineElement);169 map->set(SVGNames::rectTag.localName().impl(), updatePathFromRectElement);179 map = new HashMap<AtomicStringImpl*, PathFromFunction>; 180 map->set(SVGNames::circleTag.localName().impl(), pathFromCircleElement); 181 map->set(SVGNames::ellipseTag.localName().impl(), pathFromEllipseElement); 182 map->set(SVGNames::lineTag.localName().impl(), pathFromLineElement); 183 map->set(SVGNames::pathTag.localName().impl(), pathFromPathElement); 184 map->set(SVGNames::polygonTag.localName().impl(), pathFromPolygonElement); 185 map->set(SVGNames::polylineTag.localName().impl(), pathFromPolylineElement); 186 map->set(SVGNames::rectTag.localName().impl(), pathFromRectElement); 170 187 } 171 188 172 if (PathUpdateFunction pathUpdateFunction = map->get(element->localName().impl())) 173 (*pathUpdateFunction)(element, path); 189 if (PathFromFunction pathFromFunction = map->get(element->localName().impl())) 190 return (*pathFromFunction)(*element); 191 192 return { }; 174 193 } 175 194 -
trunk/Source/WebCore/rendering/svg/SVGPathData.h
r208668 r223804 25 25 class Path; 26 26 27 void updatePathFromGraphicsElement(SVGElement*, Path&);27 Path pathFromGraphicsElement(SVGElement*); 28 28 29 29 } // namespace WebCore -
trunk/Source/WebCore/svg/SVGAnimateMotionElement.cpp
r222253 r223804 97 97 { 98 98 if (name == SVGNames::pathAttr) { 99 m_path = Path(); 100 buildPathFromString(value, m_path); 99 m_path = buildPathFromString(value); 101 100 updateAnimationPath(); 102 101 return; … … 126 125 SVGPathElement* pathElement = mPath.pathElement(); 127 126 if (pathElement) { 128 updatePathFromGraphicsElement(pathElement, m_animationPath);127 m_animationPath = pathFromGraphicsElement(pathElement); 129 128 foundMPath = true; 130 129 break; -
trunk/Source/WebCore/svg/SVGGraphicsElement.cpp
r223728 r223804 200 200 } 201 201 202 void SVGGraphicsElement::toClipPath(Path& path)203 { 204 updatePathFromGraphicsElement(this, path);202 Path SVGGraphicsElement::toClipPath() 203 { 204 Path path = pathFromGraphicsElement(this); 205 205 // FIXME: How do we know the element has done a layout? 206 206 path.transform(animatedLocalTransform()); 207 return path; 207 208 } 208 209 -
trunk/Source/WebCore/svg/SVGGraphicsElement.h
r208863 r223804 57 57 58 58 // "base class" methods for all the elements which render as paths 59 virtual void toClipPath(Path&);59 virtual Path toClipPath(); 60 60 RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override; 61 61 -
trunk/Source/WebCore/svg/SVGPathElement.cpp
r223802 r223804 226 226 if (!buildSVGPathByteStreamFromString(value, m_pathByteStream, UnalteredParsing)) 227 227 document().accessSVGExtensions().reportError("Problem parsing d=\"" + value + "\""); 228 m_cachedPath = std::nullopt; 228 229 return; 229 230 } … … 304 305 305 306 return *animatedPathByteStream; 307 } 308 309 Path SVGPathElement::pathForByteStream() const 310 { 311 const auto& pathByteStreamToUse = pathByteStream(); 312 313 if (&pathByteStreamToUse == &m_pathByteStream) { 314 if (!m_cachedPath) 315 m_cachedPath = buildPathFromByteStream(m_pathByteStream); 316 return *m_cachedPath; 317 } 318 319 return buildPathFromByteStream(pathByteStreamToUse); 306 320 } 307 321 … … 383 397 } else 384 398 buildSVGPathByteStreamFromSVGPathSegListValues(m_pathSegList.value, m_pathByteStream, UnalteredParsing); 399 m_cachedPath = std::nullopt; 385 400 break; 386 401 case PathSegUndefinedRole: -
trunk/Source/WebCore/svg/SVGPathElement.h
r223802 r223804 21 21 #pragma once 22 22 23 #include "Path.h" 23 24 #include "SVGAnimatedBoolean.h" 24 25 #include "SVGAnimatedNumber.h" … … 53 54 class SVGPoint; 54 55 55 class SVGPathElement final : public SVGGraphicsElement, 56 public SVGExternalResourcesRequired { 56 class SVGPathElement final : public SVGGraphicsElement, public SVGExternalResourcesRequired { 57 57 public: 58 58 static Ref<SVGPathElement> create(const QualifiedName&, Document&); … … 89 89 90 90 const SVGPathByteStream& pathByteStream() const; 91 Path pathForByteStream() const; 91 92 92 93 void pathSegListChanged(SVGPathSegRole, ListModification = ListModificationUnknown); … … 132 133 private: 133 134 SVGPathByteStream m_pathByteStream; 135 mutable std::optional<Path> m_cachedPath; 134 136 mutable SVGSynchronizableAnimatedProperty<SVGPathSegListValues> m_pathSegList; 135 137 WeakPtrFactory<SVGPathElement> m_weakPtrFactory; -
trunk/Source/WebCore/svg/SVGPathUtilities.cpp
r219964 r223804 40 40 namespace WebCore { 41 41 42 bool buildPathFromString(const String& d, Path& result)42 Path buildPathFromString(const String& d) 43 43 { 44 44 if (d.isEmpty()) 45 return true; 46 47 SVGPathBuilder builder(result); 45 return { }; 46 47 Path path; 48 SVGPathBuilder builder(path); 48 49 SVGPathStringSource source(d); 49 return SVGPathParser::parse(source, builder); 50 SVGPathParser::parse(source, builder); 51 return path; 50 52 } 51 53 … … 131 133 } 132 134 133 bool buildPathFromByteStream(const SVGPathByteStream& stream, Path& result) 134 { 135 if (stream.isEmpty()) 136 return true; 137 138 SVGPathBuilder builder(result); 139 SVGPathByteStreamSource source(stream); 140 return SVGPathParser::parse(source, builder); 135 Path buildPathFromByteStream(const SVGPathByteStream& stream) 136 { 137 if (stream.isEmpty()) 138 return { }; 139 140 Path path; 141 SVGPathBuilder builder(path); 142 SVGPathByteStreamSource source(stream); 143 SVGPathParser::parse(source, builder); 144 return path; 141 145 } 142 146 -
trunk/Source/WebCore/svg/SVGPathUtilities.h
r219964 r223804 34 34 35 35 // String/SVGPathByteStream -> Path 36 bool buildPathFromString(const String&, Path&);37 bool buildPathFromByteStream(const SVGPathByteStream&, Path&);36 Path buildPathFromString(const String&); 37 Path buildPathFromByteStream(const SVGPathByteStream&); 38 38 39 39 // Path -> String -
trunk/Source/WebCore/svg/SVGUseElement.cpp
r223802 r223804 286 286 } 287 287 288 void SVGUseElement::toClipPath(Path& path) 289 { 290 ASSERT(path.isEmpty()); 291 288 Path SVGUseElement::toClipPath() 289 { 292 290 auto* targetClone = this->targetClone(); 293 291 if (!is<SVGGraphicsElement>(targetClone)) 294 return ;292 return { }; 295 293 296 294 if (!isDirectReference(*targetClone)) { 297 295 // Spec: Indirect references are an error (14.3.5) 298 296 document().accessSVGExtensions().reportError(ASCIILiteral("Not allowed to use indirect reference in <clip-path>")); 299 return ;300 } 301 302 downcast<SVGGraphicsElement>(*targetClone).toClipPath(path);297 return { }; 298 } 299 300 Path path = downcast<SVGGraphicsElement>(*targetClone).toClipPath(); 303 301 SVGLengthContext lengthContext(this); 304 302 // FIXME: Find a way to do this without manual resolution of x/y here. It's potentially incorrect. 305 303 path.translate(FloatSize(x().value(lengthContext), y().value(lengthContext))); 306 304 path.transform(animatedLocalTransform()); 305 return path; 307 306 } 308 307 -
trunk/Source/WebCore/svg/SVGUseElement.h
r223802 r223804 65 65 void willRecalcStyle(Style::Change) override; 66 66 RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override; 67 void toClipPath(Path&) override;67 Path toClipPath() override; 68 68 bool haveLoadedRequiredResources() override; 69 69 void finishParsingChildren() override;
Note: See TracChangeset
for help on using the changeset viewer.