qfreetype: Fix caching of memory fonts
Make QFreetypeFace::getFace() not return the same font face for all memory fonts. QtFreetypeData has a cache which maps QFontEngine::FaceId to QFreetypeFace instances. Each FaceId should then have a unique hash value, which is accomplished by by hashing the font file name and a stored uuid. However, we were not setting the uuid in all cases, which means that in-memory fonts (which do not have a file name) would hash identically. Fix this by setting the uuid to a value based on the address of the FontFile, which should be unique. Change-Id: I45de37b512fb666c26490551c831c0db824b5f35 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io> (cherry picked from commit b33b85cc46998133cddb18683402b6f0aaac754e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
54a32bdacf
commit
ab02d2053f
@ -11,6 +11,7 @@
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QtEndian>
|
||||
#include <QtCore/QLoggingCategory>
|
||||
#include <QtCore/QUuid>
|
||||
|
||||
#undef QT_NO_FREETYPE
|
||||
#include "qfontengine_ft_p.h"
|
||||
@ -64,6 +65,14 @@ QFontEngine *QFreeTypeFontDatabase::fontEngine(const QFontDef &fontDef, void *us
|
||||
faceId.instanceIndex = fontfile->instanceIndex;
|
||||
faceId.variableAxes = fontDef.variableAxisValues;
|
||||
|
||||
// Make sure the FaceId compares uniquely in cases where a
|
||||
// file name is not provided.
|
||||
if (faceId.filename.isEmpty()) {
|
||||
QUuid::Id128Bytes id{};
|
||||
memcpy(&id, &usrPtr, sizeof(usrPtr));
|
||||
faceId.uuid = QUuid(id).toByteArray();
|
||||
}
|
||||
|
||||
return QFontEngineFT::create(fontDef, faceId, fontfile->data);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user