summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm
diff options
context:
space:
mode:
authorMorten Sørvig <morten.sorvig@qt.io>2023-08-25 10:02:55 +0200
committerMorten Sørvig <morten.sorvig@qt.io>2023-12-18 23:07:03 +0100
commit37b3cc65499fb9332f9b9ed539bb279217682b1d (patch)
tree31d17095359ab1af0e5c9875cff94c591c87c8a2 /src/plugins/platforms/wasm
parentea0ca7b295500b68a604618268fc3491aba28ab4 (diff)
wasm: Add FontData class
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 <piotr.wiercinski@qt.io> Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
Diffstat (limited to 'src/plugins/platforms/wasm')
-rw-r--r--src/plugins/platforms/wasm/qwasmfontdatabase.cpp59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/plugins/platforms/wasm/qwasmfontdatabase.cpp b/src/plugins/platforms/wasm/qwasmfontdatabase.cpp
index c0833a65ca..83eee06ac0 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<std::string>());
+ }
+
+ QString fullName() const
+ {
+ return QString::fromStdString(m_fontData["fullName"].as<std::string>());
+ }
+
+ QString postscriptName() const
+ {
+ return QString::fromStdString(m_fontData["postscriptName"].as<std::string>());
+ }
+
+ QString style() const
+ {
+ return QString::fromStdString(m_fontData["style"].as<std::string>());
+ }
+
+ 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<QString, emscripten::val> makeFontFamilyMap(const QList<val> &fonts)
+std::multimap<QString, FontData> makeFontFamilyMap(const QList<FontData> &fonts)
{
- std::multimap<QString, emscripten::val> fontFamilies;
- for (auto font : fonts) {
- QString family = QString::fromStdString(font["family"].as<std::string>());
- fontFamilies.insert(std::make_pair(family, font));
- }
+ std::multimap<QString, FontData> fontFamilies;
+ for (auto font : fonts)
+ fontFamilies.insert(std::make_pair(font.family(), font));
return fontFamilies;
}
@@ -71,16 +104,16 @@ void checkFontAccessPermitted(std::function<void()> callback)
}, makeObject("name", "local-fonts"));
}
-void queryLocalFonts(std::function<void(const QList<val> &)> callback)
+void queryLocalFonts(std::function<void(const QList<FontData> &)> callback)
{
emscripten::val window = emscripten::val::global("window");
qstdweb::Promise::make(window, "queryLocalFonts", {
.thenFunc = [callback](emscripten::val fontArray) {
- QList<val> fonts;
+ QList<FontData> fonts;
const int count = fontArray["length"].as<int>();
fonts.reserve(count);
for (int i = 0; i < count; ++i)
- fonts.append(fontArray.call<emscripten::val>("at", i));
+ fonts.append(FontData(fontArray.call<emscripten::val>("at", i)));
callback(fonts);
},
.catchFunc = printError
@@ -98,9 +131,9 @@ void readBlob(val blob, std::function<void(const QByteArray &)> callback)
});
}
-void readFont(val font, std::function<void(const QByteArray &)> callback)
+void readFont(FontData font, std::function<void(const QByteArray &)> 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<val> &fonts){
+ queryLocalFonts([](const QList<FontData> &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();