Index: Source/core/rendering/svg/SVGTextLayoutEngine.cpp |
diff --git a/Source/core/rendering/svg/SVGTextLayoutEngine.cpp b/Source/core/rendering/svg/SVGTextLayoutEngine.cpp |
index 0d179d5efd2ba5784acb5e411bc244eb410a8eef..ba2e95f9199df70c94a448a9e01842c20d8e3039 100644 |
--- a/Source/core/rendering/svg/SVGTextLayoutEngine.cpp |
+++ b/Source/core/rendering/svg/SVGTextLayoutEngine.cpp |
@@ -47,6 +47,7 @@ SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layou |
, m_dy(0) |
, m_isVerticalText(false) |
, m_inPathLayout(false) |
+ , m_textPathCalculator(0) |
, m_textPathLength(0) |
, m_textPathCurrentOffset(0) |
, m_textPathSpacing(0) |
@@ -169,11 +170,12 @@ void SVGTextLayoutEngine::beginTextPathLayout(RenderObject* object, SVGTextLayou |
m_inPathLayout = true; |
RenderSVGTextPath* textPath = toRenderSVGTextPath(object); |
- m_textPath = textPath->layoutPath(); |
- if (m_textPath.isEmpty()) |
+ Path path = textPath->layoutPath(); |
+ if (path.isEmpty()) |
return; |
+ m_textPathCalculator = new Path::PositionCalculator(path); |
m_textPathStartOffset = textPath->startOffset(); |
- m_textPathLength = m_textPath.length(); |
+ m_textPathLength = path.length(); |
if (m_textPathStartOffset > 0 && m_textPathStartOffset <= 1) |
m_textPathStartOffset *= m_textPathLength; |
@@ -225,7 +227,8 @@ void SVGTextLayoutEngine::beginTextPathLayout(RenderObject* object, SVGTextLayou |
void SVGTextLayoutEngine::endTextPathLayout() |
{ |
m_inPathLayout = false; |
- m_textPath = Path(); |
+ delete m_textPathCalculator; |
+ m_textPathCalculator = 0; |
m_textPathLength = 0; |
m_textPathStartOffset = 0; |
m_textPathCurrentOffset = 0; |
@@ -424,7 +427,7 @@ void SVGTextLayoutEngine::advanceToNextVisualCharacter(const SVGTextMetrics& vis |
void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, RenderSVGInlineText* text, const RenderStyle* style) |
{ |
- if (m_inPathLayout && m_textPath.isEmpty()) |
+ if (m_inPathLayout && !m_textPathCalculator) |
return; |
SVGElement* lengthContext = toSVGElement(text->parent()->node()); |
@@ -556,7 +559,7 @@ void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Rend |
break; |
FloatPoint point; |
- bool ok = m_textPath.pointAndNormalAtLength(textPathOffset, point, angle); |
+ bool ok = m_textPathCalculator->pointAndNormalAtLength(textPathOffset, point, angle); |
ASSERT_UNUSED(ok, ok); |
x = point.x(); |
y = point.y(); |