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. Pick-to: 6.7 Change-Id: I45de37b512fb666c26490551c831c0db824b5f35 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>bb10
parent
ef5ab6e006
commit
b33b85cc46
|
|
@ -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…
Reference in New Issue