From 1af104b2a65d0c27616fe1ff1c88893e632cefd7 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Fri, 3 Feb 2023 15:50:17 -0800 Subject: [PATCH 1/2] [Impeller] Retain embolden/skew font properties when rendering text glyphs (#39378) --- impeller/typographer/backends/skia/text_frame_skia.cc | 2 ++ .../typographer/backends/skia/text_render_context_skia.cc | 5 +++++ impeller/typographer/font.h | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/impeller/typographer/backends/skia/text_frame_skia.cc b/impeller/typographer/backends/skia/text_frame_skia.cc index bd082ffb71c76..e717a8ab77f59 100644 --- a/impeller/typographer/backends/skia/text_frame_skia.cc +++ b/impeller/typographer/backends/skia/text_frame_skia.cc @@ -27,6 +27,8 @@ static Font ToFont(const SkTextBlobRunIterator& run, Scalar scale) { Font::Metrics metrics; metrics.scale = scale; metrics.point_size = font.getSize(); + metrics.embolden = font.isEmbolden(); + metrics.skewX = font.getSkewX(); return Font{std::move(typeface), metrics}; } diff --git a/impeller/typographer/backends/skia/text_render_context_skia.cc b/impeller/typographer/backends/skia/text_render_context_skia.cc index cf999db213333..3a1c9a646cc6e 100644 --- a/impeller/typographer/backends/skia/text_render_context_skia.cc +++ b/impeller/typographer/backends/skia/text_render_context_skia.cc @@ -282,6 +282,11 @@ static std::shared_ptr CreateAtlasBitmap(const GlyphAtlas& atlas, SkFont sk_font( TypefaceSkia::Cast(*font_glyph.font.GetTypeface()).GetSkiaTypeface(), metrics.point_size); + sk_font.setEdging(SkFont::Edging::kAntiAlias); + sk_font.setHinting(SkFontHinting::kSlight); + sk_font.setEmbolden(metrics.embolden); + sk_font.setSkewX(metrics.skewX); + auto glyph_color = SK_ColorWHITE; SkPaint glyph_paint; diff --git a/impeller/typographer/font.h b/impeller/typographer/font.h index 3e56981206f52..c25a278d99161 100644 --- a/impeller/typographer/font.h +++ b/impeller/typographer/font.h @@ -11,6 +11,7 @@ #include "impeller/base/comparable.h" #include "impeller/typographer/glyph.h" #include "impeller/typographer/typeface.h" +#include "include/core/SkFont.h" namespace impeller { @@ -38,9 +39,12 @@ class Font : public Comparable { /// The point size of the font. /// Scalar point_size = 12.0f; + bool embolden = false; + Scalar skewX = 0.0f; constexpr bool operator==(const Metrics& o) const { - return scale == o.scale && point_size == o.point_size; + return scale == o.scale && point_size == o.point_size && + embolden == o.embolden && skewX == o.skewX; } }; From c0145e49ea0bec4e62a4bc08dae56d5df2b88d27 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Fri, 3 Feb 2023 22:34:09 -0800 Subject: [PATCH 2/2] [Impeller] Make text appear less emboldened (#39383) --- impeller/typographer/backends/skia/text_frame_skia.cc | 1 + .../backends/skia/text_render_context_skia.cc | 11 ++++++----- impeller/typographer/font.h | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/impeller/typographer/backends/skia/text_frame_skia.cc b/impeller/typographer/backends/skia/text_frame_skia.cc index e717a8ab77f59..e451695dc8b6d 100644 --- a/impeller/typographer/backends/skia/text_frame_skia.cc +++ b/impeller/typographer/backends/skia/text_frame_skia.cc @@ -29,6 +29,7 @@ static Font ToFont(const SkTextBlobRunIterator& run, Scalar scale) { metrics.point_size = font.getSize(); metrics.embolden = font.isEmbolden(); metrics.skewX = font.getSkewX(); + metrics.scaleX = font.getScaleX(); return Font{std::move(typeface), metrics}; } diff --git a/impeller/typographer/backends/skia/text_render_context_skia.cc b/impeller/typographer/backends/skia/text_render_context_skia.cc index 3a1c9a646cc6e..c09f1fff8e5ee 100644 --- a/impeller/typographer/backends/skia/text_render_context_skia.cc +++ b/impeller/typographer/backends/skia/text_render_context_skia.cc @@ -272,8 +272,10 @@ static std::shared_ptr CreateAtlasBitmap(const GlyphAtlas& atlas, return nullptr; } - atlas.IterateGlyphs([canvas](const FontGlyphPair& font_glyph, - const Rect& location) -> bool { + bool has_color = atlas.GetType() == GlyphAtlas::Type::kColorBitmap; + + atlas.IterateGlyphs([canvas, has_color](const FontGlyphPair& font_glyph, + const Rect& location) -> bool { const auto& metrics = font_glyph.font.GetMetrics(); const auto position = SkPoint::Make(location.origin.x / metrics.scale, location.origin.y / metrics.scale); @@ -281,13 +283,12 @@ static std::shared_ptr CreateAtlasBitmap(const GlyphAtlas& atlas, SkFont sk_font( TypefaceSkia::Cast(*font_glyph.font.GetTypeface()).GetSkiaTypeface(), - metrics.point_size); + metrics.point_size, metrics.scaleX, metrics.skewX); sk_font.setEdging(SkFont::Edging::kAntiAlias); sk_font.setHinting(SkFontHinting::kSlight); sk_font.setEmbolden(metrics.embolden); - sk_font.setSkewX(metrics.skewX); - auto glyph_color = SK_ColorWHITE; + auto glyph_color = has_color ? SK_ColorWHITE : SK_ColorBLACK; SkPaint glyph_paint; glyph_paint.setColor(glyph_color); diff --git a/impeller/typographer/font.h b/impeller/typographer/font.h index c25a278d99161..0867edcbf71c6 100644 --- a/impeller/typographer/font.h +++ b/impeller/typographer/font.h @@ -41,10 +41,11 @@ class Font : public Comparable { Scalar point_size = 12.0f; bool embolden = false; Scalar skewX = 0.0f; + Scalar scaleX = 1.0f; constexpr bool operator==(const Metrics& o) const { return scale == o.scale && point_size == o.point_size && - embolden == o.embolden && skewX == o.skewX; + embolden == o.embolden && skewX == o.skewX && scaleX == o.scaleX; } };