| 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 4da94e423358e0f1c45f7b3b2e4d3c816cad9441..a9bb3088472bea6dcd43341aeccb5931eda51771 100644
|
| --- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp
|
| @@ -33,9 +33,9 @@
|
|
|
| namespace blink {
|
|
|
| -SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layoutAttributes)
|
| - : m_layoutAttributes(layoutAttributes)
|
| - , m_layoutAttributesPosition(0)
|
| +SVGTextLayoutEngine::SVGTextLayoutEngine(const Vector<LayoutSVGInlineText*>& descendantTextNodes)
|
| + : m_descendantTextNodes(descendantTextNodes)
|
| + , m_currentLogicalTextNodeIndex(0)
|
| , m_logicalCharacterOffset(0)
|
| , m_logicalMetricsListOffset(0)
|
| , m_isVerticalText(false)
|
| @@ -47,7 +47,7 @@ SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layou
|
| , m_textPathSpacing(0)
|
| , m_textPathScaling(1)
|
| {
|
| - ASSERT(!m_layoutAttributes.isEmpty());
|
| + ASSERT(!m_descendantTextNodes.isEmpty());
|
| }
|
|
|
| SVGTextLayoutEngine::~SVGTextLayoutEngine() = default;
|
| @@ -156,7 +156,7 @@ void SVGTextLayoutEngine::beginTextPathLayout(SVGInlineFlowBox* flowBox)
|
| {
|
| // Build text chunks for all <textPath> children, using the line layout algorithm.
|
| // This is needeed as text-anchor is just an additional startOffset for text paths.
|
| - SVGTextLayoutEngine lineLayout(m_layoutAttributes);
|
| + SVGTextLayoutEngine lineLayout(m_descendantTextNodes);
|
| lineLayout.m_textLengthSpacingInEffect = m_textLengthSpacingInEffect;
|
| lineLayout.layoutCharactersInTextBoxes(flowBox);
|
|
|
| @@ -276,47 +276,47 @@ void SVGTextLayoutEngine::finishLayout()
|
| m_lineLayoutBoxes.clear();
|
| }
|
|
|
| -const SVGTextLayoutAttributes* SVGTextLayoutEngine::nextLogicalAttributes()
|
| +const LayoutSVGInlineText* SVGTextLayoutEngine::nextLogicalTextNode()
|
| {
|
| - ASSERT(m_layoutAttributesPosition < m_layoutAttributes.size());
|
| - ++m_layoutAttributesPosition;
|
| - if (m_layoutAttributesPosition == m_layoutAttributes.size())
|
| + ASSERT(m_currentLogicalTextNodeIndex < m_descendantTextNodes.size());
|
| + ++m_currentLogicalTextNodeIndex;
|
| + if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size())
|
| return nullptr;
|
|
|
| m_logicalMetricsListOffset = 0;
|
| m_logicalCharacterOffset = 0;
|
| - return m_layoutAttributes[m_layoutAttributesPosition];
|
| + return m_descendantTextNodes[m_currentLogicalTextNodeIndex];
|
| }
|
|
|
| -const SVGTextLayoutAttributes* SVGTextLayoutEngine::currentLogicalCharacterMetrics(SVGTextMetrics& logicalMetrics)
|
| +const LayoutSVGInlineText* SVGTextLayoutEngine::currentLogicalCharacterMetrics(SVGTextMetrics& logicalMetrics)
|
| {
|
| - // If we're consumed all layout attributes, there can be no more metrics.
|
| - if (m_layoutAttributesPosition == m_layoutAttributes.size())
|
| + // If we're consumed all text nodes, there can be no more metrics.
|
| + if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size())
|
| return nullptr;
|
|
|
| - const SVGTextLayoutAttributes* logicalAttributes = m_layoutAttributes[m_layoutAttributesPosition];
|
| + const LayoutSVGInlineText* logicalTextNode = m_descendantTextNodes[m_currentLogicalTextNodeIndex];
|
| // If we reached the end of the text node associated with the current set
|
| // of layout attributes, try to move to the next text node/set of layout
|
| // attributes.
|
| - ASSERT(m_logicalCharacterOffset <= logicalAttributes->context()->textLength());
|
| - if (m_logicalCharacterOffset == logicalAttributes->context()->textLength()) {
|
| - logicalAttributes = nextLogicalAttributes();
|
| - if (!logicalAttributes)
|
| + ASSERT(m_logicalCharacterOffset <= logicalTextNode->textLength());
|
| + if (m_logicalCharacterOffset == logicalTextNode->textLength()) {
|
| + logicalTextNode = nextLogicalTextNode();
|
| + if (!logicalTextNode)
|
| return nullptr;
|
| }
|
|
|
| // We have set of layout attributes. Find the first non-collapsed text
|
| // metrics cell.
|
| - const Vector<SVGTextMetrics>* metricsList = &logicalAttributes->context()->metricsList();
|
| + const Vector<SVGTextMetrics>* metricsList = &logicalTextNode->metricsList();
|
| unsigned metricsListSize = metricsList->size();
|
| while (true) {
|
| // If we run out of metrics, move to the next set of layout attributes.
|
| if (m_logicalMetricsListOffset == metricsListSize) {
|
| - logicalAttributes = nextLogicalAttributes();
|
| - if (!logicalAttributes)
|
| + logicalTextNode = nextLogicalTextNode();
|
| + if (!logicalTextNode)
|
| return nullptr;
|
|
|
| - metricsList = &logicalAttributes->context()->metricsList();
|
| + metricsList = &logicalTextNode->metricsList();
|
| metricsListSize = metricsList->size();
|
| continue;
|
| }
|
| @@ -330,7 +330,7 @@ const SVGTextLayoutAttributes* SVGTextLayoutEngine::currentLogicalCharacterMetri
|
| }
|
|
|
| // Stop if we found the next valid logical text metrics object.
|
| - return logicalAttributes;
|
| + return logicalTextNode;
|
| }
|
|
|
| ASSERT_NOT_REACHED();
|
| @@ -379,15 +379,11 @@ void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line
|
| }
|
|
|
| SVGTextMetrics logicalMetrics(SVGTextMetrics::SkippedSpaceMetrics);
|
| - const SVGTextLayoutAttributes* logicalAttributes = currentLogicalCharacterMetrics(logicalMetrics);
|
| - if (!logicalAttributes)
|
| + const LayoutSVGInlineText* logicalTextNode = currentLogicalCharacterMetrics(logicalMetrics);
|
| + if (!logicalTextNode)
|
| break;
|
|
|
| - const SVGCharacterDataMap& characterDataMap = logicalAttributes->characterDataMap();
|
| - SVGCharacterData data;
|
| - SVGCharacterDataMap::const_iterator it = characterDataMap.find(m_logicalCharacterOffset + 1);
|
| - if (it != characterDataMap.end())
|
| - data = it->value;
|
| + const SVGCharacterData data = logicalTextNode->characterDataMap().get(m_logicalCharacterOffset + 1);
|
|
|
| // TODO(fs): Use the return value to eliminate the additional
|
| // hash-lookup below when determining if this text box should be tagged
|
| @@ -397,7 +393,7 @@ void SVGTextLayoutEngine::layoutTextOnLineOrPath(SVGInlineTextBox* textBox, Line
|
| // When we've advanced to the box start offset, determine using the original x/y values,
|
| // whether this character starts a new text chunk, before doing any further processing.
|
| if (m_visualMetricsIterator.characterOffset() == textBox->start())
|
| - textBox->setStartsNewTextChunk(logicalAttributes->context()->characterStartsNewTextChunk(m_logicalCharacterOffset));
|
| + textBox->setStartsNewTextChunk(logicalTextNode->characterStartsNewTextChunk(m_logicalCharacterOffset));
|
|
|
| bool hasRelativePosition = applyRelativePositionAdjustmentsIfNeeded(data);
|
|
|
|
|