From 619bdbcc6da4a83edb91c70ef4df8f8d11fd8728 Mon Sep 17 00:00:00 2001 From: Omeid Matten Date: Mon, 4 Dec 2023 22:37:19 +1100 Subject: [PATCH] Implement onMatchFamilyStyle for SkParagraph. CanvasKit uses skparagraph's TypefaceFontProvider which is fine and dandy but it exposes a very limited interface to FontMgr, with matchFamilyStyle as the only option for finding typefaces and fonts. Without implementing this method, it is not possible to use custom fonts on wasm as calling matchFamilyStyle with current onMatchFamilyStyle is a noop and returns null. --- AUTHORS | 1 + modules/skparagraph/include/TypefaceFontProvider.h | 4 +--- modules/skparagraph/src/TypefaceFontProvider.cpp | 10 ++++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index d1190a65be7d..9e632407b4f9 100755 --- a/AUTHORS +++ b/AUTHORS @@ -64,6 +64,7 @@ Nils André-Chang Ning Liu Noah Lavine Oliver Dawes +Omeid Matten Opera Software ASA <*@opera.com> Pavel Krajcevski Petar Kirov diff --git a/modules/skparagraph/include/TypefaceFontProvider.h b/modules/skparagraph/include/TypefaceFontProvider.h index 29634da02907..62af26f777ac 100644 --- a/modules/skparagraph/include/TypefaceFontProvider.h +++ b/modules/skparagraph/include/TypefaceFontProvider.h @@ -47,9 +47,7 @@ class TypefaceFontProvider : public SkFontMgr { sk_sp onMatchFamily(const char familyName[]) const override; sk_sp onCreateStyleSet(int) const override { return nullptr; } - sk_sp onMatchFamilyStyle(const char[], const SkFontStyle&) const override { - return nullptr; - } + sk_sp onMatchFamilyStyle(const char familyName[], const SkFontStyle& pattern) const override; sk_sp onMatchFamilyStyleCharacter(const char[], const SkFontStyle&, const char*[], int, SkUnichar) const override { diff --git a/modules/skparagraph/src/TypefaceFontProvider.cpp b/modules/skparagraph/src/TypefaceFontProvider.cpp index 6737151f6dd3..d0d6c9fc4b4e 100644 --- a/modules/skparagraph/src/TypefaceFontProvider.cpp +++ b/modules/skparagraph/src/TypefaceFontProvider.cpp @@ -24,6 +24,16 @@ sk_sp TypefaceFontProvider::onMatchFamily(const char familyName[ return nullptr; } + +sk_sp TypefaceFontProvider::onMatchFamilyStyle(const char familyName[], const SkFontStyle& pattern) const { + sk_sp sset(this->matchFamily(familyName)); + if (sset) { + return sset->matchStyle(pattern); + } + + return nullptr; +} + size_t TypefaceFontProvider::registerTypeface(sk_sp typeface) { if (typeface == nullptr) { return 0;