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:
Morten Sørvig 2024-02-06 13:48:48 +01:00 committed by Qt Cherry-pick Bot
parent 54a32bdacf
commit ab02d2053f

View File

@ -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);
}