summaryrefslogtreecommitdiffstats
path: root/src/gui/text
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/text')
-rw-r--r--src/gui/text/qcssparser_p.h2
-rw-r--r--src/gui/text/qfontdatabase.cpp91
-rw-r--r--src/gui/text/qfontengine_ft.cpp9
-rw-r--r--src/gui/text/qplatformfontdatabase.cpp32
-rw-r--r--src/gui/text/qplatformfontdatabase.h2
-rw-r--r--src/gui/text/qstatictext.cpp3
-rw-r--r--src/gui/text/qtextengine.cpp4
-rw-r--r--src/gui/text/text.pri2
8 files changed, 112 insertions, 33 deletions
diff --git a/src/gui/text/qcssparser_p.h b/src/gui/text/qcssparser_p.h
index b087a2384a..123a53c5cc 100644
--- a/src/gui/text/qcssparser_p.h
+++ b/src/gui/text/qcssparser_p.h
@@ -508,7 +508,7 @@ const quint64 PseudoClass_EditFocus = Q_UINT64_C(0x0000080000000000);
const quint64 PseudoClass_Alternate = Q_UINT64_C(0x0000100000000000);
// The Any specifier is never generated, but can be used as a wildcard in searches.
const quint64 PseudoClass_Any = Q_UINT64_C(0x0000ffffffffffff);
-const int NumPseudos = 46;
+const int NumPseudos = 45;
struct Pseudo
{
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 02b9e6d25c..ae7b6c1c0d 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -317,6 +317,7 @@ struct QtFontFamily
QtFontFamily(const QString &n)
:
+ populated(false),
fixedPitch(false),
name(n), count(0), foundries(0)
, bogusWritingSystems(false)
@@ -330,6 +331,7 @@ struct QtFontFamily
free(foundries);
}
+ bool populated : 1;
bool fixedPitch : 1;
QString name;
@@ -344,6 +346,8 @@ struct QtFontFamily
bool matchesFamilyName(const QString &familyName) const;
QtFontFoundry *foundry(const QString &f, bool = false);
+
+ void ensurePopulated();
};
QtFontFoundry *QtFontFamily::foundry(const QString &f, bool create)
@@ -375,6 +379,14 @@ bool QtFontFamily::matchesFamilyName(const QString &familyName) const
return name.compare(familyName, Qt::CaseInsensitive) == 0 || aliases.contains(familyName, Qt::CaseInsensitive);
}
+void QtFontFamily::ensurePopulated()
+{
+ if (populated)
+ return;
+
+ QGuiApplicationPrivate::platformIntegration()->fontDatabase()->populateFamily(name);
+ Q_ASSERT(populated);
+}
class QFontDatabasePrivate
{
@@ -386,7 +398,14 @@ public:
~QFontDatabasePrivate() {
free();
}
- QtFontFamily *family(const QString &f, bool = false);
+
+ enum FamilyRequestFlags {
+ RequestFamily = 0,
+ EnsureCreated,
+ EnsurePopulated
+ };
+
+ QtFontFamily *family(const QString &f, FamilyRequestFlags flags = EnsurePopulated);
void free() {
while (count--)
delete families[count];
@@ -424,8 +443,10 @@ void QFontDatabasePrivate::invalidate()
emit static_cast<QGuiApplication *>(QCoreApplication::instance())->fontDatabaseChanged();
}
-QtFontFamily *QFontDatabasePrivate::family(const QString &f, bool create)
+QtFontFamily *QFontDatabasePrivate::family(const QString &f, FamilyRequestFlags flags)
{
+ QtFontFamily *fam = 0;
+
int low = 0;
int high = count;
int pos = count / 2;
@@ -439,28 +460,34 @@ QtFontFamily *QFontDatabasePrivate::family(const QString &f, bool create)
pos = (high + low) / 2;
}
if (!res)
- return families[pos];
+ fam = families[pos];
}
- if (!create)
- return 0;
- if (res < 0)
- pos++;
+ if (!fam && (flags & EnsureCreated)) {
+ if (res < 0)
+ pos++;
+
+ // qDebug() << "adding family " << f.toLatin1() << " at " << pos << " total=" << count;
+ if (!(count % 8)) {
+ QtFontFamily **newFamilies = (QtFontFamily **)
+ realloc(families,
+ (((count+8) >> 3) << 3) * sizeof(QtFontFamily *));
+ Q_CHECK_PTR(newFamilies);
+ families = newFamilies;
+ }
+
+ QtFontFamily *family = new QtFontFamily(f);
+ memmove(families + pos + 1, families + pos, (count-pos)*sizeof(QtFontFamily *));
+ families[pos] = family;
+ count++;
- // qDebug() << "adding family " << f.toLatin1() << " at " << pos << " total=" << count;
- if (!(count % 8)) {
- QtFontFamily **newFamilies = (QtFontFamily **)
- realloc(families,
- (((count+8) >> 3) << 3) * sizeof(QtFontFamily *));
- Q_CHECK_PTR(newFamilies);
- families = newFamilies;
+ fam = families[pos];
}
- QtFontFamily *family = new QtFontFamily(f);
- memmove(families + pos + 1, families + pos, (count-pos)*sizeof(QtFontFamily *));
- families[pos] = family;
- count++;
- return families[pos];
+ if (fam && (flags & EnsurePopulated))
+ fam->ensurePopulated();
+
+ return fam;
}
@@ -670,7 +697,7 @@ void qt_registerFont(const QString &familyName, const QString &stylename,
styleKey.style = style;
styleKey.weight = weight;
styleKey.stretch = stretch;
- QtFontFamily *f = d->family(familyName, true);
+ QtFontFamily *f = d->family(familyName, QFontDatabasePrivate::EnsureCreated);
f->fixedPitch = fixedPitch;
for (int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
@@ -689,6 +716,13 @@ void qt_registerFont(const QString &familyName, const QString &stylename,
integration->fontDatabase()->releaseHandle(size->handle);
}
size->handle = handle;
+ f->populated = true;
+}
+
+void qt_registerFontFamily(const QString &familyName)
+{
+ // Create uninitialized/unpopulated family
+ privateDb()->family(familyName, QFontDatabasePrivate::EnsureCreated);
}
void qt_registerAliasToFontFamily(const QString &familyName, const QString &alias)
@@ -697,7 +731,7 @@ void qt_registerAliasToFontFamily(const QString &familyName, const QString &alia
return;
QFontDatabasePrivate *d = privateDb();
- QtFontFamily *f = d->family(familyName, false);
+ QtFontFamily *f = d->family(familyName, QFontDatabasePrivate::RequestFamily);
if (!f)
return;
@@ -1092,6 +1126,8 @@ static int match(int script, const QFontDef &request,
if (!matchFamilyName(family_name, test.family))
continue;
+ test.family->ensurePopulated();
+
if (family_name.isEmpty())
load(test.family->name, script);
@@ -1304,6 +1340,8 @@ QList<QFontDatabase::WritingSystem> QFontDatabase::writingSystems() const
QList<WritingSystem> list;
for (int i = 0; i < d->count; ++i) {
QtFontFamily *family = d->families[i];
+ family->ensurePopulated();
+
if (family->count == 0)
continue;
for (int x = Latin; x < WritingSystemsCount; ++x) {
@@ -1367,11 +1405,14 @@ QStringList QFontDatabase::families(WritingSystem writingSystem) const
QStringList flist;
for (int i = 0; i < d->count; i++) {
QtFontFamily *f = d->families[i];
- if (f->count == 0)
+ if (f->populated && f->count == 0)
continue;
- if (writingSystem != Any && (f->writingSystems[writingSystem] != QtFontFamily::Supported))
- continue;
- if (f->count == 1) {
+ if (writingSystem != Any) {
+ f->ensurePopulated();
+ if (f->writingSystems[writingSystem] != QtFontFamily::Supported)
+ continue;
+ }
+ if (!f->populated || f->count == 1) {
flist.append(f->name);
} else {
for (int j = 0; j < f->count; j++) {
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 11e9ce6c02..fe38755ffd 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -1934,8 +1934,6 @@ QImage QFontEngineFT::alphaMapForGlyph(glyph_t g, QFixed subPixelPosition)
lockFace();
QScopedPointer<Glyph> glyph(loadGlyphFor(g, subPixelPosition, antialias ? Format_A8 : Format_Mono));
- if (cacheEnabled)
- glyph.take();
if (!glyph || !glyph->data) {
unlockFace();
return QFontEngine::alphaMapForGlyph(g);
@@ -1960,6 +1958,8 @@ QImage QFontEngineFT::alphaMapForGlyph(glyph_t g, QFixed subPixelPosition)
for (int y = 0; y < glyph->height; ++y)
memcpy(img.scanLine(y), &glyph->data[y * pitch], pitch);
}
+ if (cacheEnabled)
+ glyph.take();
unlockFace();
return img;
@@ -1973,8 +1973,6 @@ QImage QFontEngineFT::alphaRGBMapForGlyph(glyph_t g, QFixed subPixelPosition, co
lockFace();
QScopedPointer<Glyph> glyph(loadGlyphFor(g, subPixelPosition, Format_A32));
- if (cacheEnabled)
- glyph.take();
if (!glyph || !glyph->data) {
unlockFace();
return QFontEngine::alphaRGBMapForGlyph(g, subPixelPosition, t);
@@ -1982,6 +1980,9 @@ QImage QFontEngineFT::alphaRGBMapForGlyph(glyph_t g, QFixed subPixelPosition, co
QImage img(glyph->width, glyph->height, QImage::Format_RGB32);
memcpy(img.bits(), glyph->data, 4 * glyph->width * glyph->height);
+
+ if (cacheEnabled)
+ glyph.take();
unlockFace();
return img;
diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp
index 5f277c878a..33301005c6 100644
--- a/src/gui/text/qplatformfontdatabase.cpp
+++ b/src/gui/text/qplatformfontdatabase.cpp
@@ -53,6 +53,7 @@ void qt_registerFont(const QString &familyname, const QString &stylename,
bool scalable, int pixelSize, bool fixedPitch,
const QSupportedWritingSystems &writingSystems, void *hanlde);
+void qt_registerFontFamily(const QString &familyName);
void qt_registerAliasToFontFamily(const QString &familyName, const QString &alias);
/*!
@@ -118,7 +119,7 @@ void QPlatformFontDatabase::registerQPF2Font(const QByteArray &dataArray, void *
The writing systems supported by the font are specified by the
\a writingSystems argument.
- \sa registerQPF2Font()
+ \sa registerQPF2Font(), registerFontFamily()
*/
void QPlatformFontDatabase::registerFont(const QString &familyname, const QString &stylename,
const QString &foundryname, QFont::Weight weight,
@@ -134,6 +135,18 @@ void QPlatformFontDatabase::registerFont(const QString &familyname, const QStrin
fixedPitch, writingSystems, usrPtr);
}
+/*!
+ Registers a font family with the font database. The font will be
+ lazily populated by a callback to populateFamily() when the font
+ database determines that the family needs population.
+
+ \sa populateFamily(), registerFont()
+*/
+void QPlatformFontDatabase::registerFontFamily(const QString &familyName)
+{
+ qt_registerFontFamily(familyName);
+}
+
class QWritingSystemsPrivate
{
public:
@@ -249,6 +262,11 @@ QPlatformFontDatabase::~QPlatformFontDatabase()
Reimplement this function in a subclass for a convenient place to initialize
the internal font database.
+ You may lazily populate the database by calling registerFontFamily() instead
+ of registerFont(), in which case you'll get a callback to populateFamily()
+ when the required family needs population. You then call registerFont() to
+ finish population of the family.
+
The default implementation looks in the fontDir() location and registers all
QPF2 fonts.
*/
@@ -276,6 +294,18 @@ void QPlatformFontDatabase::populateFontDatabase()
}
/*!
+ This function is called whenever a lazily populated family, populated
+ through registerFontFamily(), needs full population.
+
+ You are expected to fully populate the family by calling registerFont()
+ for each font that matches the family name.
+*/
+void QPlatformFontDatabase::populateFamily(const QString &familyName)
+{
+ Q_UNUSED(familyName);
+}
+
+/*!
This function is called whenever the font database is invalidated.
Reimplement this function to clear any internal data structures that
diff --git a/src/gui/text/qplatformfontdatabase.h b/src/gui/text/qplatformfontdatabase.h
index 870480809b..b200cf0e58 100644
--- a/src/gui/text/qplatformfontdatabase.h
+++ b/src/gui/text/qplatformfontdatabase.h
@@ -96,6 +96,7 @@ class Q_GUI_EXPORT QPlatformFontDatabase
public:
virtual ~QPlatformFontDatabase();
virtual void populateFontDatabase();
+ virtual void populateFamily(const QString &familyName);
virtual void invalidate();
virtual QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QChar::Script script);
@@ -125,6 +126,7 @@ public:
bool scalable, int pixelSize, bool fixedPitch,
const QSupportedWritingSystems &writingSystems, void *handle);
+ static void registerFontFamily(const QString &familyName);
static void registerAliasToFontFamily(const QString &familyName, const QString &alias);
};
diff --git a/src/gui/text/qstatictext.cpp b/src/gui/text/qstatictext.cpp
index b153219136..0afc6f9259 100644
--- a/src/gui/text/qstatictext.cpp
+++ b/src/gui/text/qstatictext.cpp
@@ -573,6 +573,9 @@ namespace {
case PdmDepth:
val = 24;
break;
+ case PdmDevicePixelRatio:
+ val = 1;
+ break;
default:
val = 0;
qWarning("DrawTextItemDevice::metric: Invalid metric command");
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 0298adde7a..3b079b7ee3 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -2374,6 +2374,7 @@ void QTextEngine::freeMemory()
layoutData->hasBidi = false;
layoutData->layoutState = LayoutEmpty;
layoutData->haveCharAttributes = false;
+ layoutData->items.clear();
}
for (int i = 0; i < lines.size(); ++i) {
lines[i].justified = 0;
@@ -2520,7 +2521,8 @@ void QTextEngine::setAdditionalFormats(const QList<QTextLayout::FormatRange> &fo
specialData->addFormats = formatList;
indexAdditionalFormats();
}
- resetFontEngineCache();
+ invalidate();
+ clearLineData();
}
void QTextEngine::indexAdditionalFormats()
diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri
index 2a0e4eff32..c67769ad48 100644
--- a/src/gui/text/text.pri
+++ b/src/gui/text/text.pri
@@ -88,7 +88,7 @@ HEADERS += \
contains(QT_CONFIG, harfbuzz)|contains(QT_CONFIG, system-harfbuzz) {
DEFINES += QT_ENABLE_HARFBUZZ_NG
- include($$PWD/../../3rdparty/harfbuzz.pri)
+ include($$PWD/../../3rdparty/harfbuzzng.pri)
SOURCES += text/qharfbuzzng.cpp
HEADERS += text/qharfbuzzng_p.h