From e9acc98eb155a5d5a45ea8fb4e763ff4cede6eb0 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Mon, 29 Apr 2024 03:45:03 -0700 Subject: [PATCH] [Skia] Handle font smoothing when drawing glyphs https://bugs.webkit.org/show_bug.cgi?id=273367 Reviewed by Alejandro G. Castro. * Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp: (WebCore::FontCascade::drawGlyphs): Canonical link: https://commits.webkit.org/278101@main --- .../graphics/skia/FontCascadeSkia.cpp | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp b/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp index 1239f9a25706..fe616ed99056 100644 --- a/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp +++ b/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp @@ -35,16 +35,43 @@ namespace WebCore { -void FontCascade::drawGlyphs(GraphicsContext& graphicsContext, const Font& font, const GlyphBufferGlyph* glyphs, const GlyphBufferAdvance* advances, unsigned glyphCount, const FloatPoint& position, FontSmoothingMode) +void FontCascade::drawGlyphs(GraphicsContext& graphicsContext, const Font& font, const GlyphBufferGlyph* glyphs, const GlyphBufferAdvance* advances, unsigned glyphCount, const FloatPoint& position, FontSmoothingMode smoothingMode) { if (!font.platformData().size()) return; const auto& fontPlatformData = font.platformData(); const auto& skFont = fontPlatformData.skFont(); - SkTextBlobBuilder builder; + + if (!font.allowsAntialiasing()) + smoothingMode = FontSmoothingMode::NoSmoothing; + + SkFont::Edging edging; + switch (smoothingMode) { + case FontSmoothingMode::AutoSmoothing: + edging = skFont.getEdging(); + break; + case FontSmoothingMode::Antialiased: + edging = SkFont::Edging::kAntiAlias; + break; + case FontSmoothingMode::SubpixelAntialiased: + edging = SkFont::Edging::kSubpixelAntiAlias; + break; + case FontSmoothingMode::NoSmoothing: + edging = SkFont::Edging::kAlias; + break; + } + bool isVertical = fontPlatformData.orientation() == FontOrientation::Vertical; - const auto& buffer = isVertical ? builder.allocRunPos(skFont, glyphCount) : builder.allocRunPosH(skFont, glyphCount, 0); + SkTextBlobBuilder builder; + const auto& buffer = [&]() { + if (skFont.getEdging() == edging) + return isVertical ? builder.allocRunPos(skFont, glyphCount) : builder.allocRunPosH(skFont, glyphCount, 0); + + SkFont copiedFont = skFont; + copiedFont.setEdging(edging); + return isVertical ? builder.allocRunPos(copiedFont, glyphCount) : builder.allocRunPosH(copiedFont, glyphCount, 0); + }(); FloatSize glyphPosition; for (unsigned i = 0; i < glyphCount; ++i) { @@ -74,7 +101,7 @@ void FontCascade::drawGlyphs(GraphicsContext& graphicsContext, const Font& font, if (graphicsContext.textDrawingMode().contains(TextDrawingMode::Fill)) { SkPaint paint = skiaGraphicsContext->createFillPaint(); - paint.setAntiAlias(font.allowsAntialiasing()); + paint.setAntiAlias(edging != SkFont::Edging::kAlias); paint.setImageFilter(skiaGraphicsContext->createDropShadowFilterIfNeeded(GraphicsContextSkia::ShadowStyle::Outset)); skiaGraphicsContext->setupFillSource(paint); canvas->drawTextBlob(blob, SkFloatToScalar(position.x()), SkFloatToScalar(position.y()), paint); @@ -82,7 +109,7 @@ void FontCascade::drawGlyphs(GraphicsContext& graphicsContext, const Font& font, if (graphicsContext.textDrawingMode().contains(TextDrawingMode::Stroke)) { SkPaint paint = skiaGraphicsContext->createStrokePaint(); - paint.setAntiAlias(font.allowsAntialiasing()); + paint.setAntiAlias(edging != SkFont::Edging::kAlias); skiaGraphicsContext->setupStrokeSource(paint); canvas->drawTextBlob(blob, SkFloatToScalar(position.x()), SkFloatToScalar(position.y()), paint); }