void SVGInlineTextBox::paintTextWithShadows(GraphicsContext& context, RenderStyle* style, TextRun& textRun, const SVGTextFragment& fragment, int startPosition, int endPosition) { float scalingFactor = renderer().scalingFactor(); ASSERT(scalingFactor); const FontCascade& scaledFont = renderer().scaledFont(); const ShadowData* shadow = style->textShadow(); FloatPoint textOrigin(fragment.x, fragment.y); FloatSize textSize(fragment.width, fragment.height); if (scalingFactor != 1) { textOrigin.scale(scalingFactor, scalingFactor); textSize.scale(scalingFactor); } FloatRect shadowRect(FloatPoint(textOrigin.x(), textOrigin.y() - scaledFont.fontMetrics().floatAscent()), textSize); GraphicsContext* usedContext = &context; do { if (!prepareGraphicsContextForTextPainting(usedContext, scalingFactor, textRun, style)) break; { ShadowApplier shadowApplier(*usedContext, shadow, shadowRect); if (!shadowApplier.didSaveContext()) usedContext->save(); usedContext->scale(FloatSize(1 / scalingFactor, 1 / scalingFactor)); scaledFont.drawText(*usedContext, textRun, textOrigin + shadowApplier.extraOffset(), startPosition, endPosition); if (!shadowApplier.didSaveContext()) usedContext->restore(); } restoreGraphicsContextAfterTextPainting(usedContext, textRun); if (!shadow) break; shadow = shadow->next(); } while (shadow); }
static void paintTextWithShadows(GraphicsContext& context, const FontCascade& font, const TextRun& textRun, const AtomicString& emphasisMark, int emphasisMarkOffset, int startOffset, int endOffset, int truncationPoint, const FloatPoint& textOrigin, const FloatRect& boxRect, const ShadowData* shadow, bool stroked, bool horizontal) { Color fillColor = context.fillColor(); ColorSpace fillColorSpace = context.fillColorSpace(); bool opaque = !fillColor.hasAlpha(); bool lastShadowIterationShouldDrawText = !stroked && opaque; if (!opaque) context.setFillColor(Color::black, fillColorSpace); do { ShadowApplier shadowApplier(context, shadow, boxRect, lastShadowIterationShouldDrawText, opaque, horizontal ? Horizontal : Vertical); if (shadowApplier.nothingToDraw()) { shadow = shadow->next(); continue; } IntSize extraOffset = roundedIntSize(shadowApplier.extraOffset()); if (!shadow && !opaque) context.setFillColor(fillColor, fillColorSpace); if (startOffset <= endOffset) drawTextOrEmphasisMarks(context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, startOffset, endOffset); else { if (endOffset > 0) drawTextOrEmphasisMarks(context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, 0, endOffset); if (startOffset < truncationPoint) drawTextOrEmphasisMarks(context, font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + extraOffset, startOffset, truncationPoint); } if (!shadow) break; shadow = shadow->next(); } while (shadow || !lastShadowIterationShouldDrawText); }