This source file includes following definitions.
- m_glyph
- m_glyph
- constructTextRun
- measureCharacterRange
#include "config.h"
#include "core/rendering/svg/SVGTextMetrics.h"
#include "core/rendering/svg/RenderSVGInlineText.h"
#include "core/rendering/svg/SVGTextRunRenderingContext.h"
namespace WebCore {
SVGTextMetrics::SVGTextMetrics()
: m_width(0)
, m_height(0)
, m_length(0)
, m_glyph(0)
{
}
SVGTextMetrics::SVGTextMetrics(SVGTextMetrics::MetricsType)
: m_width(0)
, m_height(0)
, m_length(1)
, m_glyph(0)
{
}
SVGTextMetrics::SVGTextMetrics(RenderSVGInlineText* textRenderer, const TextRun& run)
{
ASSERT(textRenderer);
float scalingFactor = textRenderer->scalingFactor();
ASSERT(scalingFactor);
const Font& scaledFont = textRenderer->scaledFont();
int length = 0;
m_width = scaledFont.width(run, length, m_glyph) / scalingFactor;
m_height = scaledFont.fontMetrics().floatHeight() / scalingFactor;
ASSERT(length >= 0);
m_length = static_cast<unsigned>(length);
}
TextRun SVGTextMetrics::constructTextRun(RenderSVGInlineText* text, unsigned position, unsigned length)
{
RenderStyle* style = text->style();
ASSERT(style);
TextRun run(static_cast<const LChar*>(0)
, 0
, 0
, 0
, TextRun::AllowTrailingExpansion
, style->direction()
, isOverride(style->unicodeBidi()) );
if (length) {
if (text->is8Bit())
run.setText(text->characters8() + position, length);
else
run.setText(text->characters16() + position, length);
}
if (textRunNeedsRenderingContext(style->font()))
run.setRenderingContext(SVGTextRunRenderingContext::create(text));
run.disableRoundingHacks();
run.disableSpacing();
run.setCharactersLength(text->textLength() - position);
ASSERT(run.charactersLength() >= run.length());
return run;
}
SVGTextMetrics SVGTextMetrics::measureCharacterRange(RenderSVGInlineText* text, unsigned position, unsigned length)
{
ASSERT(text);
return SVGTextMetrics(text, constructTextRun(text, position, length));
}
SVGTextMetrics::SVGTextMetrics(RenderSVGInlineText* text, unsigned position, unsigned length, float width, Glyph glyphNameGlyphId)
{
ASSERT(text);
bool needsContext = textRunNeedsRenderingContext(text->style()->font());
float scalingFactor = text->scalingFactor();
ASSERT(scalingFactor);
m_width = width / scalingFactor;
m_height = text->scaledFont().fontMetrics().floatHeight() / scalingFactor;
m_glyph = needsContext ? glyphNameGlyphId : 0;
m_length = length;
}
}