Index: third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp |
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp |
index d8b3a66a73aa676ec94efc5d53faed9f17d75b5d..34bcaa7c6b32f2c1a3906b1881bc1d605d89efeb 100644 |
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp |
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp |
@@ -45,8 +45,7 @@ SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layou |
, m_isVerticalText(false) |
, m_inPathLayout(false) |
, m_textLengthSpacingInEffect(false) |
- , m_textPathCalculator(nullptr) |
- , m_textPathLength(0) |
+ , m_textPath(nullptr) |
, m_textPathCurrentOffset(0) |
, m_textPathSpacing(0) |
, m_textPathScaling(1) |
@@ -54,6 +53,8 @@ SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layou |
ASSERT(!m_layoutAttributes.isEmpty()); |
} |
+SVGTextLayoutEngine::~SVGTextLayoutEngine() = default; |
+ |
void SVGTextLayoutEngine::updateCharacterPositionIfNeeded(float& x, float& y) |
{ |
if (m_inPathLayout) |
@@ -174,12 +175,10 @@ void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox) |
m_inPathLayout = true; |
LineLayoutSVGTextPath textPath = LineLayoutSVGTextPath(flowBox->lineLayoutItem()); |
- Path path = textPath.layoutPath(); |
- if (path.isEmpty()) |
+ m_textPath = textPath.layoutPath(); |
+ if (!m_textPath) |
return; |
- m_textPathCalculator = new Path::PositionCalculator(path); |
- m_textPathLength = path.length(); |
- m_textPathStartOffset = textPath.calculateStartOffset(m_textPathLength); |
+ m_textPathStartOffset = textPath.calculateStartOffset(m_textPath->length()); |
SVGTextPathChunkBuilder textPathChunkLayoutBuilder; |
textPathChunkLayoutBuilder.processTextChunks(lineLayout.m_lineLayoutBoxes); |
@@ -213,9 +212,7 @@ void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox) |
void SVGTextLayoutEngine::endTextPathLayout() |
{ |
m_inPathLayout = false; |
- delete m_textPathCalculator; |
- m_textPathCalculator = 0; |
- m_textPathLength = 0; |
+ m_textPath = nullptr; |
m_textPathStartOffset = 0; |
m_textPathCurrentOffset = 0; |
m_textPathSpacing = 0; |
@@ -350,7 +347,7 @@ void SVGTextLayoutEngine::advanceToNextLogicalCharacter(const SVGTextMetrics& lo |
void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, LineLayoutSVGInlineText textLineLayout, const ComputedStyle& style) |
{ |
- if (m_inPathLayout && !m_textPathCalculator) |
+ if (m_inPathLayout && !m_textPath) |
return; |
// Find the start of the current text box in the metrics list. |
@@ -422,7 +419,6 @@ void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line |
// Calculate CSS 'letter-spacing' and 'word-spacing' for next character, if needed. |
float spacing = spacingLayout.calculateCSSSpacing(currentCharacter); |
- float textPathOffset = 0; |
float textPathShiftX = 0; |
float textPathShiftY = 0; |
if (m_inPathLayout) { |
@@ -452,24 +448,25 @@ void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line |
} |
// Calculate current offset along path. |
- textPathOffset = m_textPathCurrentOffset + scaledGlyphAdvance / 2; |
+ float textPathOffset = m_textPathCurrentOffset + scaledGlyphAdvance / 2; |
// Move to next character. |
m_textPathCurrentOffset += scaledGlyphAdvance + m_textPathSpacing + spacing * m_textPathScaling; |
+ FloatPoint point; |
+ PathPositionMapper::PositionType positionType = m_textPath->pointAndNormalAtLength(textPathOffset, point, angle); |
+ |
// Skip character, if we're before the path. |
- if (textPathOffset < 0) { |
+ if (positionType == PathPositionMapper::BeforePath) { |
advanceToNextLogicalCharacter(logicalMetrics); |
m_visualMetricsIterator.next(); |
continue; |
} |
- // Stop processing, if the next character lies behind the path. |
- if (textPathOffset > m_textPathLength) |
+ // Stop processing if the next character lies behind the path. |
+ if (positionType == PathPositionMapper::AfterPath) |
break; |
- FloatPoint point; |
- m_textPathCalculator->pointAndNormalAtLength(textPathOffset, point, angle); |
x = point.x(); |
y = point.y(); |