From 37b3cc65499fb9332f9b9ed539bb279217682b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Fri, 25 Aug 2023 10:02:55 +0200 Subject: [PATCH] wasm: Add FontData class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the code easier to follow since it is now implemented in terms of the generic "val" type, and also allows moving string conversions to behind the family() etc accessors. Change-Id: I17364de7f56bc14826e048ce70644c1e14508752 Reviewed-by: Piotr WierciƄski Reviewed-by: Lorn Potter --- .../platforms/wasm/qwasmfontdatabase.cpp | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/plugins/platforms/wasm/qwasmfontdatabase.cpp b/src/plugins/platforms/wasm/qwasmfontdatabase.cpp index c0833a65ca2..83eee06ac0f 100644 --- a/src/plugins/platforms/wasm/qwasmfontdatabase.cpp +++ b/src/plugins/platforms/wasm/qwasmfontdatabase.cpp @@ -23,6 +23,41 @@ using namespace Qt::StringLiterals; namespace { +class FontData +{ +public: + FontData(val fontData) + :m_fontData(fontData) {} + + QString family() const + { + return QString::fromStdString(m_fontData["family"].as()); + } + + QString fullName() const + { + return QString::fromStdString(m_fontData["fullName"].as()); + } + + QString postscriptName() const + { + return QString::fromStdString(m_fontData["postscriptName"].as()); + } + + QString style() const + { + return QString::fromStdString(m_fontData["style"].as()); + } + + val value() const + { + return m_fontData; + } + +private: + val m_fontData; +}; + bool isLocalFontsAPISupported() { return val::global("window")["queryLocalFonts"].isUndefined() == false; @@ -35,13 +70,11 @@ val makeObject(const char *key, const char *value) return obj; } -std::multimap makeFontFamilyMap(const QList &fonts) +std::multimap makeFontFamilyMap(const QList &fonts) { - std::multimap fontFamilies; - for (auto font : fonts) { - QString family = QString::fromStdString(font["family"].as()); - fontFamilies.insert(std::make_pair(family, font)); - } + std::multimap fontFamilies; + for (auto font : fonts) + fontFamilies.insert(std::make_pair(font.family(), font)); return fontFamilies; } @@ -71,16 +104,16 @@ void checkFontAccessPermitted(std::function callback) }, makeObject("name", "local-fonts")); } -void queryLocalFonts(std::function &)> callback) +void queryLocalFonts(std::function &)> callback) { emscripten::val window = emscripten::val::global("window"); qstdweb::Promise::make(window, "queryLocalFonts", { .thenFunc = [callback](emscripten::val fontArray) { - QList fonts; + QList fonts; const int count = fontArray["length"].as(); fonts.reserve(count); for (int i = 0; i < count; ++i) - fonts.append(fontArray.call("at", i)); + fonts.append(FontData(fontArray.call("at", i))); callback(fonts); }, .catchFunc = printError @@ -98,9 +131,9 @@ void readBlob(val blob, std::function callback) }); } -void readFont(val font, std::function callback) +void readFont(FontData font, std::function callback) { - qstdweb::Promise::make(font, "blob", { + qstdweb::Promise::make(font.value(), "blob", { .thenFunc = [callback](val blob) { readBlob(blob, [callback](const QByteArray &data) { callback(data); @@ -122,7 +155,7 @@ void QWasmFontDatabase::populateLocalfonts() // starting up and should not display a permission request dialog at // this point. checkFontAccessPermitted([](){ - queryLocalFonts([](const QList &fonts){ + queryLocalFonts([](const QList &fonts){ auto fontFamilies = makeFontFamilyMap(fonts); // Populate some font families. We can't populate _all_ fonts as in-memory fonts, // since that would require several gigabytes of memory. Instead, populate @@ -133,7 +166,7 @@ void QWasmFontDatabase::populateLocalfonts() QFreeTypeFontDatabase::registerFontFamily(family); for (auto it = fontsRange.first; it != fontsRange.second; ++it) { - const val font = it->second; + const FontData &font = it->second; readFont(font, [](const QByteArray &fontData){ QFreeTypeFontDatabase::addTTFile(fontData, QByteArray()); QWasmFontDatabase::notifyFontsChanged();