7#include <QtCore/qfile.h>
8#include <QtCore/private/qstdweb_p.h>
9#include <QtCore/private/qeventdispatcher_wasm_p.h>
10#include <QtGui/private/qguiapplication_p.h>
12#include <emscripten.h>
13#include <emscripten/val.h>
14#include <emscripten/bind.h>
76void checkFontAccessPermitted(std::function<
void(
bool)> callback)
78 const val permissions = val::global(
"navigator")[
"permissions"];
79 if (permissions.isUndefined()) {
85 .thenFunc = [callback](
val status) {
86 callback(status[
"state"].as<std::string>() ==
"granted");
88 }, makeObject(
"name",
"local-fonts"));
91void queryLocalFonts(std::function<
void(
const QList<FontData> &)> callback)
93 emscripten::val
window = emscripten::val::global(
"window");
95 .thenFunc = [callback](emscripten::val fontArray) {
96 QList<FontData> fonts;
97 const int count = fontArray[
"length"].as<
int>();
100 fonts.append(FontData(fontArray.call<emscripten::val>(
"at",
i)));
107void readBlob(
val blob, std::function<
void(
const QByteArray &)> callback)
110 .thenFunc = [callback](emscripten::val fontArrayBuffer) {
118void readFont(FontData
font, std::function<
void(
const QByteArray &)> callback)
121 .thenFunc = [callback](val blob) {
122 readBlob(blob, [callback](const QByteArray &data) {
130emscripten::val getLocalFontsConfigProperty(
const char *
name) {
131 emscripten::val qt = val::module_property(
"qt");
132 if (qt.isUndefined())
133 return emscripten::val();
134 emscripten::val localFonts = qt[
"localFonts"];
135 if (localFonts.isUndefined())
136 return emscripten::val();
137 return localFonts[
name];
140bool getLocalFontsBoolConfigPropertyWithDefault(
const char *
name,
bool defaultValue) {
141 emscripten::val prop = getLocalFontsConfigProperty(
name);
142 if (prop.isUndefined())
144 return prop.as<
bool>();
147QString getLocalFontsStringConfigPropertyWithDefault(
const char *
name,
QString defaultValue) {
148 emscripten::val prop = getLocalFontsConfigProperty(
name);
149 if (prop.isUndefined())
155 emscripten::val
array = getLocalFontsConfigProperty(
name);
156 if (
array.isUndefined())
161 for (
int i = 0;
i <
size; ++
i) {
162 emscripten::val element =
array.call<emscripten::val>(
"at",
i);
164 if (!
string.isEmpty())
175 m_localFontsApiSupported = val::global(
"window")[
"queryLocalFonts"].isUndefined() ==
false;
176 if (m_localFontsApiSupported)
192 bool allFamilies =
false;
194 switch (m_localFontFamilyLoadSet) {
199 case DefaultFontFamilies: {
201 {
"Arial",
"Verdana",
"Tahoma",
"Trebuchet",
"Times New Roman",
202 "Georgia",
"Garamond",
"Courier New"};
203 selectedLocalFontFamilies = webSafeFontFamilies;
205 case AllFontFamilies:
210 selectedLocalFontFamilies += m_extraLocalFontFamilies;
212 if (selectedLocalFontFamilies.isEmpty() && !allFamilies) {
225 for (
int i = 0;
i <
size; ++
i) {
226 emscripten::val element =
array.call<emscripten::val>(
"at",
i);
228 if (!
string.isEmpty())
237 if (!m_localFontsApiSupported)
244 queryLocalFonts([fontFamilies, allFamilies](
const QList<FontData> &fonts) {
246 QList<FontData> filteredFonts;
247 std::copy_if(fonts.begin(), fonts.end(), std::back_inserter(filteredFonts),
248 [fontFamilies, allFamilies](FontData
fontData) {
249 return allFamilies || fontFamilies.contains(fontData.family());
252 for (
const FontData &
font: filteredFonts) {
268 const QString fontFileNames[] = {
272 for (
const QString &fontFileName : fontFileNames) {
273 QFile theFont(fontFileName);
281 m_queryLocalFontsPermission = getLocalFontsBoolConfigPropertyWithDefault(
"requestPermission",
false);
282 QString fontFamilyLoadSet = getLocalFontsStringConfigPropertyWithDefault(
"familiesCollection",
"DefaultFontFamilies");
283 m_extraLocalFontFamilies = getLocalFontsStringListConfigPropertyWithDefault(
"extraFamilies",
QStringList());
285 if (fontFamilyLoadSet ==
"NoFontFamilies") {
286 m_localFontFamilyLoadSet = NoFontFamilies;
287 }
else if (fontFamilyLoadSet ==
"DefaultFontFamilies") {
288 m_localFontFamilyLoadSet = DefaultFontFamilies;
289 }
else if (fontFamilyLoadSet ==
"AllFontFamilies") {
290 m_localFontFamilyLoadSet = AllFontFamilies;
292 m_localFontFamilyLoadSet = NoFontFamilies;
293 qWarning() <<
"Unknown fontFamilyLoadSet value" << fontFamilyLoadSet;
296 if (!m_localFontsApiSupported)
302 if (m_queryLocalFontsPermission) {
305 checkFontAccessPermitted([
this](
bool granted) {
322 QChar::Script script)
const
329 static const QString wasmFallbackFonts[] = {
"DejaVu Sans" };
330 for (
auto wasmFallbackFont : wasmFallbackFonts) {
331 if (family != wasmFallbackFont && !fallbacks.contains(wasmFallbackFont))
332 fallbacks.append(wasmFallbackFont);
345 return QFont(
"DejaVu Sans"_L1);
349 int g_pendingFonts = 0;
350 bool g_fontStartupTaskCompleted =
false;
357 g_fontStartupTaskCompleted =
false;
364 if (!g_fontStartupTaskCompleted) {
365 g_fontStartupTaskCompleted =
true;
380 if (--g_pendingFonts <= 0) {
391 bool hadPandingfonts = g_pendingFonts > 0;
392 if (hadPandingfonts) {
static void completeStarupTask()
static void registerStartupTask()
static QFontCache * instance()
StyleHint
Style hints are used by the \l{QFont}{font matching} algorithm to find an appropriate default family ...
QString family() const
Returns the requested font family name.
Style
This enum describes the different styles of glyphs that are used to display text.
QFontEngine * fontEngine(const QFontDef &fontDef, void *handle) override
Returns the font engine that can be used to render the font described by the font definition,...
static QStringList addTTFile(const QByteArray &fontData, const QByteArray &file, QFontDatabasePrivate::ApplicationFont *applicationFont=nullptr)
void releaseHandle(void *handle) override
Releases the specified font handle.
void append(parameter_type t)
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromStdString(const std::string &s)
static void derefFontFileLoading()
static void endAllFontFileLoading()
void populateFontDatabase() override
This function is called once at startup by Qt's internal font database.
static QWasmFontDatabase * get()
QFont defaultFont() const override
Returns the default system font.
static void refFontFileLoading()
QFontEngine * fontEngine(const QFontDef &fontDef, void *handle) override
Returns the font engine that can be used to render the font described by the font definition,...
void populateLocalfonts()
static void beginFontDatabaseStartupTask()
void releaseHandle(void *handle) override
Releases the specified font handle.
static void endFontDatabaseStartupTask()
QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const override
Returns a list of alternative fonts for the specified family and style and script using the styleHint...
void populateLocalFontFamilies(emscripten::val families)
static QWasmIntegration * get()
QByteArray copyToQByteArray() const
Combined button and popup list for selecting options.
void make(emscripten::val target, QString methodName, PromiseCallbacks callbacks, Args... args)
QList< QString > QStringList
Constructs a string list that contains the given string, str.
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qCWarning(category,...)
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLenum GLsizeiptr const void * fontData
#define QStringLiteral(str)
static QStringList toStringList(const QJsonArray &jsonArray)
void printError(const char *msg)
[0]