Skip to content

Commit

Permalink
[Skia] Handle font smoothing when drawing glyphs
Browse files Browse the repository at this point in the history
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
  • Loading branch information
carlosgcampos committed Apr 29, 2024
1 parent 89a1916 commit e9acc98
Showing 1 changed file with 32 additions and 5 deletions.
37 changes: 32 additions & 5 deletions Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp
Expand Up @@ -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) {
Expand Down Expand Up @@ -74,15 +101,15 @@ 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);
}

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);
}
Expand Down

0 comments on commit e9acc98

Please sign in to comment.