| Index: third_party/WebKit/Source/core/layout/svg/SVGTextMetricsBuilder.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextMetricsBuilder.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextMetricsBuilder.cpp
|
| index 7c212e95dd422e1f3bce052875135ac90799410f..d28023ce38f1c422647ed2659b3d9058e92217a9 100644
|
| --- a/third_party/WebKit/Source/core/layout/svg/SVGTextMetricsBuilder.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextMetricsBuilder.cpp
|
| @@ -34,6 +34,8 @@
|
|
|
| namespace blink {
|
|
|
| +namespace {
|
| +
|
| class SVGTextMetricsCalculator {
|
| public:
|
| SVGTextMetricsCalculator(LayoutSVGInlineText*);
|
| @@ -62,6 +64,8 @@ public:
|
| private:
|
| void setupBidiRuns();
|
|
|
| + static TextRun constructTextRun(LineLayoutSVGInlineText, unsigned position, unsigned length, TextDirection);
|
| +
|
| // Ensure |m_subrunRanges| is updated for the current bidi run, or the
|
| // complete m_run if no bidi runs are present. Returns the current position
|
| // in the subrun which can be used to index into |m_subrunRanges|.
|
| @@ -80,10 +84,38 @@ private:
|
| Vector<CharacterRange> m_subrunRanges;
|
| };
|
|
|
| +TextRun SVGTextMetricsCalculator::constructTextRun(LineLayoutSVGInlineText textLayoutItem, unsigned position, unsigned length, TextDirection textDirection)
|
| +{
|
| + const ComputedStyle& style = textLayoutItem.styleRef();
|
| +
|
| + TextRun run(static_cast<const LChar*>(nullptr) // characters, will be set below if non-zero.
|
| + , 0 // length, will be set below if non-zero.
|
| + , 0 // xPos, only relevant with allowTabs=true
|
| + , 0 // padding, only relevant for justified text, not relevant for SVG
|
| + , TextRun::AllowTrailingExpansion
|
| + , textDirection
|
| + , isOverride(style.unicodeBidi()) /* directionalOverride */);
|
| +
|
| + if (length) {
|
| + if (textLayoutItem.is8Bit())
|
| + run.setText(textLayoutItem.characters8() + position, length);
|
| + else
|
| + run.setText(textLayoutItem.characters16() + position, length);
|
| + }
|
| +
|
| + // We handle letter & word spacing ourselves.
|
| + run.disableSpacing();
|
| +
|
| + // Propagate the maximum length of the characters buffer to the TextRun, even when we're only processing a substring.
|
| + run.setCharactersLength(textLayoutItem.textLength() - position);
|
| + ASSERT(run.charactersLength() >= run.length());
|
| + return run;
|
| +}
|
| +
|
| SVGTextMetricsCalculator::SVGTextMetricsCalculator(LayoutSVGInlineText* text)
|
| : m_currentPosition(0)
|
| , m_text(LineLayoutSVGInlineText(text))
|
| - , m_run(SVGTextMetrics::constructTextRun(m_text, 0, m_text.textLength(), m_text.styleRef().direction()))
|
| + , m_run(constructTextRun(m_text, 0, m_text.textLength(), m_text.styleRef().direction()))
|
| , m_bidiRun(nullptr)
|
| {
|
| setupBidiRuns();
|
| @@ -133,7 +165,7 @@ unsigned SVGTextMetricsCalculator::updateSubrunRangesForCurrentPosition()
|
| unsigned subrunStart = m_bidiRun ? m_bidiRun->start() : 0;
|
| unsigned subrunEnd = m_bidiRun ? m_bidiRun->stop() : m_run.charactersLength();
|
| TextDirection subrunDirection = m_bidiRun ? m_bidiRun->direction() : m_text.styleRef().direction();
|
| - TextRun subRun = SVGTextMetrics::constructTextRun(m_text, subrunStart, subrunEnd - subrunStart, subrunDirection);
|
| + TextRun subRun = constructTextRun(m_text, subrunStart, subrunEnd - subrunStart, subrunDirection);
|
| m_subrunRanges = m_text.scaledFont().individualCharacterRanges(subRun);
|
|
|
| // TODO(pdr): We only have per-glyph data so we need to synthesize per-
|
| @@ -222,7 +254,7 @@ struct UpdateAttributes {
|
| const SVGCharacterDataMap* allCharactersMap;
|
| };
|
|
|
| -static void walkInlineText(LayoutSVGInlineText* text, TreeWalkTextState& textState, UpdateAttributes* attributesToUpdate = nullptr)
|
| +void walkInlineText(LayoutSVGInlineText* text, TreeWalkTextState& textState, UpdateAttributes* attributesToUpdate = nullptr)
|
| {
|
| if (attributesToUpdate)
|
| attributesToUpdate->clearExistingAttributes();
|
| @@ -260,7 +292,7 @@ static void walkInlineText(LayoutSVGInlineText* text, TreeWalkTextState& textSta
|
| textState.valueListPosition += calculator.currentPosition() - skippedWhitespace;
|
| }
|
|
|
| -static void walkTree(LayoutSVGText* start, LayoutSVGInlineText* stopAtText, SVGCharacterDataMap* allCharactersMap = nullptr)
|
| +void walkTree(LayoutSVGText* start, LayoutSVGInlineText* stopAtText, SVGCharacterDataMap* allCharactersMap = nullptr)
|
| {
|
| TreeWalkTextState textState;
|
| LayoutObject* child = start->firstChild();
|
| @@ -284,6 +316,8 @@ static void walkTree(LayoutSVGText* start, LayoutSVGInlineText* stopAtText, SVGC
|
| }
|
| }
|
|
|
| +} // namespace
|
| +
|
| void SVGTextMetricsBuilder::measureTextLayoutObject(LayoutSVGInlineText* text)
|
| {
|
| ASSERT(text);
|
|
|