void SVGInlineTextBox::paintDecorationWithStyle(GraphicsContext* context, ETextDecoration decoration, const SVGTextFragment& fragment, RenderObject* decorationRenderer) { ASSERT(!m_paintingResource); ASSERT(m_paintingResourceMode != ApplyToDefaultMode); RenderStyle* decorationStyle = decorationRenderer->style(); ASSERT(decorationStyle); const Font& font = decorationStyle->font(); const FontMetrics& fontMetrics = font.fontMetrics(); // The initial y value refers to overline position. float thickness = thicknessForDecoration(decoration, font); if (fragment.width <= 0 && thickness <= 0) return; float y = fragment.y - fontMetrics.ascent() + positionOffsetForDecoration(decoration, fontMetrics, thickness); Path path; path.addRect(FloatRect(fragment.x, y, fragment.width, thickness)); context->save(); if (acquirePaintingResource(context, decorationRenderer, decorationStyle)) releasePaintingResource(context, &path); context->restore(); }
bool SVGInlineTextBox::prepareGraphicsContextForTextPainting(GraphicsContext*& context, TextRun& textRun, RenderStyle* style) { bool acquiredResource = acquirePaintingResource(context, parent()->renderer(), style); #if ENABLE(SVG_FONTS) // SVG Fonts need access to the painting resource used to draw the current text chunk. if (acquiredResource) textRun.setActivePaintingResource(m_paintingResource); #endif return acquiredResource; }
bool SVGInlineTextBox::prepareGraphicsContextForTextPainting(GraphicsContext*& context, float scalingFactor, TextRun& textRun, RenderStyle* style) { bool acquiredResource = acquirePaintingResource(context, scalingFactor, parent()->renderer(), style); if (!acquiredResource) return false; #if ENABLE(SVG_FONTS) // SVG Fonts need access to the painting resource used to draw the current text chunk. TextRun::RenderingContext* renderingContext = textRun.renderingContext(); if (renderingContext) static_cast<SVGTextRunRenderingContext*>(renderingContext)->setActivePaintingResource(m_paintingResource); #endif return true; }
void SVGInlineTextBox::paintDecorationWithStyle(GraphicsContext* context, ETextDecoration decoration, const SVGTextFragment& fragment, RenderObject* decorationRenderer) { ASSERT(!m_paintingResource); ASSERT(m_paintingResourceMode != ApplyToDefaultMode); RenderStyle* decorationStyle = decorationRenderer->style(); ASSERT(decorationStyle); float scalingFactor = 1; Font scaledFont; RenderSVGInlineText::computeNewScaledFontForStyle(decorationRenderer, decorationStyle, scalingFactor, scaledFont); ASSERT(scalingFactor); // The initial y value refers to overline position. float thickness = thicknessForDecoration(decoration, scaledFont); if (fragment.width <= 0 && thickness <= 0) return; FloatPoint decorationOrigin(fragment.x, fragment.y); float width = fragment.width; const FontMetrics& scaledFontMetrics = scaledFont.fontMetrics(); GraphicsContextStateSaver stateSaver(*context); if (scalingFactor != 1) { width *= scalingFactor; decorationOrigin.scale(scalingFactor, scalingFactor); AffineTransform newTransform = context->getCTM(); newTransform.scale(1 / scalingFactor); normalizeTransform(newTransform); context->setCTM(newTransform); } decorationOrigin.move(0, -scaledFontMetrics.floatAscent() + positionOffsetForDecoration(decoration, scaledFontMetrics, thickness)); Path path; path.addRect(FloatRect(decorationOrigin, FloatSize(width, thickness))); if (acquirePaintingResource(context, scalingFactor, decorationRenderer, decorationStyle)) releasePaintingResource(context, &path); }
void SVGInlineTextBox::paintDecorationWithStyle(GraphicsContext* context, TextDecoration decoration, const SVGTextFragment& fragment, RenderObject* decorationRenderer) { ASSERT(!m_paintingResource); ASSERT(m_paintingResourceMode != ApplyToDefaultMode); RenderStyle* decorationStyle = decorationRenderer->style(); ASSERT(decorationStyle); float scalingFactor = 1; Font scaledFont; RenderSVGInlineText::computeNewScaledFontForStyle(decorationRenderer, decorationStyle, scalingFactor, scaledFont); ASSERT(scalingFactor); // The initial y value refers to overline position. float thickness = thicknessForDecoration(decoration, scaledFont); if (fragment.width <= 0 && thickness <= 0) return; FloatPoint decorationOrigin(fragment.x, fragment.y); float width = fragment.width; const FontMetrics& scaledFontMetrics = scaledFont.fontMetrics(); GraphicsContextStateSaver stateSaver(*context, false); if (scalingFactor != 1) { stateSaver.save(); width *= scalingFactor; decorationOrigin.scale(scalingFactor, scalingFactor); context->scale(FloatSize(1 / scalingFactor, 1 / scalingFactor)); } decorationOrigin.move(0, -scaledFontMetrics.floatAscent() + positionOffsetForDecoration(decoration, scaledFontMetrics, thickness)); Path path; path.addRect(FloatRect(decorationOrigin, FloatSize(width, thickness))); // acquirePaintingResource also modifies state if the scalingFactor is non-identity. // Above we have saved the state for this case. if (acquirePaintingResource(context, scalingFactor, decorationRenderer, decorationStyle)) releasePaintingResource(context, &path); }
bool SVGInlineTextBox::prepareGraphicsContextForTextPainting(GraphicsContext*& context, float scalingFactor, RenderStyle* style) { return acquirePaintingResource(context, scalingFactor, parent()->renderer(), style); }