static void paintTextWithShadows(GraphicsContext* context, const Font& 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(); if (!opaque) context->setFillColor(Color::black, fillColorSpace); do { if (isEmptyShadow(shadow)) { shadow = shadow->next(); continue; } IntSize extraOffset; bool didSaveContext = false; if (shadow) extraOffset = roundedIntSize(InlineTextBox::applyShadowToGraphicsContext(context, shadow, boxRect, stroked, opaque, horizontal, didSaveContext)); else if (!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; if (didSaveContext) context->restore(); else context->clearShadow(); shadow = shadow->next(); } while (shadow || stroked || !opaque); }
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); }