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();