7#include <QtCore/qfile.h>
8#include <QtCore/private/qstdweb_p.h>
9#include <QtGui/private/qguiapplication_p.h>
11#include <emscripten.h>
12#include <emscripten/val.h>
13#include <emscripten/bind.h>
26bool isLocalFontsAPISupported()
28 return val::global(
"window")[
"queryLocalFonts"].isUndefined() ==
false;
38std::multimap<QString, emscripten::val> makeFontFamilyMap(
const QList<val> &fonts)
40 std::multimap<QString, emscripten::val> fontFamilies;
41 for (
auto font : fonts) {
43 fontFamilies.insert(std::make_pair(family,
font));
54std::array<const char *, 8> webSafeFontFamilies()
56 return {
"Arial",
"Verdana",
"Tahoma",
"Trebuchet",
"Times New Roman",
57 "Georgia",
"Garamond",
"Courier New"};
60void checkFontAccessPermitted(std::function<
void()> callback)
62 const val permissions = val::global(
"navigator")[
"permissions"];
63 if (permissions.isUndefined())
67 .thenFunc = [callback](
val status) {
68 if (status[
"state"].as<std::string>() ==
"granted")
71 }, makeObject(
"name",
"local-fonts"));
74void queryLocalFonts(std::function<
void(
const QList<val> &)> callback)
76 emscripten::val
window = emscripten::val::global(
"window");
78 .thenFunc = [callback](emscripten::val fontArray) {
80 const int count = fontArray[
"length"].as<
int>();
83 fonts.
append(fontArray.call<emscripten::val>(
"at",
i));
90void readBlob(
val blob, std::function<
void(
const QByteArray &)> callback)
93 .thenFunc = [callback](emscripten::val fontArrayBuffer) {
104 .thenFunc = [callback](
val blob) {
117 if (!isLocalFontsAPISupported())
124 checkFontAccessPermitted([](){
126 auto fontFamilies = makeFontFamilyMap(fonts);
130 for (
const QString &family: webSafeFontFamilies()) {
131 auto fontsRange = fontFamilies.equal_range(family);
132 if (fontsRange.first != fontsRange.second)
135 for (
auto it = fontsRange.first;
it != fontsRange.second; ++
it) {
153 const QString fontFileNames[] = {
158 for (
const QString &fontFileName : fontFileNames) {
159 QFile theFont(fontFileName);
183 static const QString wasmFallbackFonts[] = {
"Bitstream Vera Sans",
"DejaVu Sans" };
184 for (
auto wasmFallbackFont : wasmFallbackFonts) {
185 if (family != wasmFallbackFont && !fallbacks.contains(wasmFallbackFont))
186 fallbacks.append(wasmFallbackFont);
199 return QFont(
"Bitstream Vera Sans"_L1);
bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
static QFontCache * instance()
StyleHint
Style hints are used by the \l{QFont}{font matching} algorithm to find an appropriate default family ...
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.
QByteArray readAll()
Reads all remaining data from the device, and returns it as a byte array.
void reserve(qsizetype size)
void append(parameter_type t)
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromStdString(const std::string &s)
void populateFontDatabase() override
This function is called once at startup by Qt's internal font database.
QFont defaultFont() const override
Returns the default system font.
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 notifyFontsChanged()
void releaseHandle(void *handle) override
Releases the specified font handle.
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...
QByteArray copyToQByteArray() const
QSet< QString >::iterator it
Combined button and popup list for selecting options.
void make(emscripten::val target, QString methodName, PromiseCallbacks callbacks, Args... args)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qCWarning(category,...)
GLuint64 GLenum void * handle
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLsizeiptr const void * fontData
#define QStringLiteral(str)
void printError(const char *msg)
[0]