diff options
Diffstat (limited to 'Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp')
-rw-r--r-- | Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp | 78 |
1 files changed, 33 insertions, 45 deletions
diff --git a/Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp b/Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp index 86009e6e9..bb2593d38 100644 --- a/Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp +++ b/Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp @@ -18,19 +18,18 @@ */ #include "config.h" - -#if ENABLE(SVG) #include "SVGTextMetricsBuilder.h" +#include "RenderChildIterator.h" +#include "RenderSVGInline.h" #include "RenderSVGInlineText.h" #include "RenderSVGText.h" -#include "SVGTextRunRenderingContext.h" namespace WebCore { SVGTextMetricsBuilder::SVGTextMetricsBuilder() : m_text(0) - , m_run(static_cast<const UChar*>(0), 0) + , m_run(StringView()) , m_textPosition(0) , m_isComplexText(false) , m_totalWidth(0) @@ -39,13 +38,13 @@ SVGTextMetricsBuilder::SVGTextMetricsBuilder() inline bool SVGTextMetricsBuilder::currentCharacterStartsSurrogatePair() const { - return U16_IS_LEAD(m_run[m_textPosition]) && int(m_textPosition + 1) < m_run.charactersLength() && U16_IS_TRAIL(m_run[m_textPosition + 1]); + return U16_IS_LEAD(m_run[m_textPosition]) && (m_textPosition + 1) < m_run.charactersLength() && U16_IS_TRAIL(m_run[m_textPosition + 1]); } bool SVGTextMetricsBuilder::advance() { m_textPosition += m_currentMetrics.length(); - if (int(m_textPosition) >= m_run.charactersLength()) + if (m_textPosition >= m_run.charactersLength()) return false; if (m_isComplexText) @@ -68,18 +67,14 @@ void SVGTextMetricsBuilder::advanceSimpleText() float currentWidth = m_simpleWidthIterator->runWidthSoFar() - m_totalWidth; m_totalWidth = m_simpleWidthIterator->runWidthSoFar(); -#if ENABLE(SVG_FONTS) - m_currentMetrics = SVGTextMetrics(m_text, m_textPosition, metricsLength, currentWidth, m_simpleWidthIterator->lastGlyphName()); -#else - m_currentMetrics = SVGTextMetrics(m_text, m_textPosition, metricsLength, currentWidth, emptyString()); -#endif + m_currentMetrics = SVGTextMetrics(*m_text, metricsLength, currentWidth); } void SVGTextMetricsBuilder::advanceComplexText() { unsigned metricsLength = currentCharacterStartsSurrogatePair() ? 2 : 1; - m_currentMetrics = SVGTextMetrics::measureCharacterRange(m_text, m_textPosition, metricsLength); - m_complexStartToCurrentMetrics = SVGTextMetrics::measureCharacterRange(m_text, 0, m_textPosition + metricsLength); + m_currentMetrics = SVGTextMetrics::measureCharacterRange(*m_text, m_textPosition, metricsLength); + m_complexStartToCurrentMetrics = SVGTextMetrics::measureCharacterRange(*m_text, 0, m_textPosition + metricsLength); ASSERT(m_currentMetrics.length() == metricsLength); // Frequent case for Arabic text: when measuring a single character the arabic isolated form is taken @@ -93,22 +88,22 @@ void SVGTextMetricsBuilder::advanceComplexText() m_totalWidth = m_complexStartToCurrentMetrics.width(); } -void SVGTextMetricsBuilder::initializeMeasurementWithTextRenderer(RenderSVGInlineText* text) +void SVGTextMetricsBuilder::initializeMeasurementWithTextRenderer(RenderSVGInlineText& text) { - m_text = text; + m_text = &text; m_textPosition = 0; m_currentMetrics = SVGTextMetrics(); m_complexStartToCurrentMetrics = SVGTextMetrics(); m_totalWidth = 0; - const Font& scaledFont = text->scaledFont(); - m_run = SVGTextMetrics::constructTextRun(text, text->deprecatedCharacters(), 0, text->textLength()); - m_isComplexText = scaledFont.codePath(m_run) == Font::Complex; + const FontCascade& scaledFont = text.scaledFont(); + m_run = SVGTextMetrics::constructTextRun(text); + m_isComplexText = scaledFont.codePath(m_run) == FontCascade::Complex; if (m_isComplexText) - m_simpleWidthIterator.clear(); + m_simpleWidthIterator = nullptr; else - m_simpleWidthIterator = adoptPtr(new WidthIterator(&scaledFont, m_run)); + m_simpleWidthIterator = std::make_unique<WidthIterator>(&scaledFont, m_run); } struct MeasureTextData { @@ -122,17 +117,15 @@ struct MeasureTextData { } SVGCharacterDataMap* allCharactersMap; - const UChar* lastCharacter; + UChar lastCharacter; bool processRenderer; unsigned valueListPosition; unsigned skippedCharacters; }; -void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText* text, MeasureTextData* data) +void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText& text, MeasureTextData* data) { - ASSERT(text); - - SVGTextLayoutAttributes* attributes = text->layoutAttributes(); + SVGTextLayoutAttributes* attributes = text.layoutAttributes(); Vector<SVGTextMetrics>* textMetricsValues = &attributes->textMetricsValues(); if (data->processRenderer) { if (data->allCharactersMap) @@ -142,12 +135,12 @@ void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText* text, Measu } initializeMeasurementWithTextRenderer(text); - bool preserveWhiteSpace = text->style().whiteSpace() == PRE; + bool preserveWhiteSpace = text.style().whiteSpace() == PRE; int surrogatePairCharacters = 0; while (advance()) { - const UChar* currentCharacter = m_run.data16(m_textPosition); - if (*currentCharacter == ' ' && !preserveWhiteSpace && (!data->lastCharacter || *data->lastCharacter == ' ')) { + UChar currentCharacter = m_run[m_textPosition]; + if (currentCharacter == ' ' && !preserveWhiteSpace && (!data->lastCharacter || data->lastCharacter == ' ')) { if (data->processRenderer) textMetricsValues->append(SVGTextMetrics(SVGTextMetrics::SkippedSpaceMetrics)); if (data->allCharactersMap) @@ -179,10 +172,10 @@ void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText* text, Measu void SVGTextMetricsBuilder::walkTree(RenderElement& start, RenderSVGInlineText* stopAtLeaf, MeasureTextData* data) { - for (auto child = start.firstChild(); child; child = child->nextSibling()) { - if (child->isSVGInlineText()) { - RenderSVGInlineText* text = toRenderSVGInlineText(child); - if (stopAtLeaf && stopAtLeaf != text) { + for (auto& child : childrenOfType<RenderObject>(start)) { + if (is<RenderSVGInlineText>(child)) { + auto& text = downcast<RenderSVGInlineText>(child); + if (stopAtLeaf && stopAtLeaf != &text) { data->processRenderer = false; measureTextRenderer(text, data); continue; @@ -196,32 +189,27 @@ void SVGTextMetricsBuilder::walkTree(RenderElement& start, RenderSVGInlineText* continue; } - if (!child->isSVGInline()) + if (!is<RenderSVGInline>(child)) continue; - walkTree(toRenderElement(*child), stopAtLeaf, data); + walkTree(downcast<RenderSVGInline>(child), stopAtLeaf, data); } } -void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText* text) +void SVGTextMetricsBuilder::measureTextRenderer(RenderSVGInlineText& text) { - ASSERT(text); - - RenderSVGText* textRoot = RenderSVGText::locateRenderSVGTextAncestor(text); + auto* textRoot = RenderSVGText::locateRenderSVGTextAncestor(text); if (!textRoot) return; - MeasureTextData data(0); - walkTree(*textRoot, text, &data); + MeasureTextData data(nullptr); + walkTree(*textRoot, &text, &data); } -void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(RenderSVGText* textRoot, RenderSVGInlineText* stopAtLeaf, SVGCharacterDataMap& allCharactersMap) +void SVGTextMetricsBuilder::buildMetricsAndLayoutAttributes(RenderSVGText& textRoot, RenderSVGInlineText* stopAtLeaf, SVGCharacterDataMap& allCharactersMap) { - ASSERT(textRoot); MeasureTextData data(&allCharactersMap); - walkTree(*textRoot, stopAtLeaf, &data); + walkTree(textRoot, stopAtLeaf, &data); } } - -#endif // ENABLE(SVG) |