From ab02d2053f16d1c9c0b005cade638e3c97f75879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Tue, 6 Feb 2024 13:48:48 +0100 Subject: [PATCH] qfreetype: Fix caching of memory fonts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Morten Johan Sørvig (cherry picked from commit b33b85cc46998133cddb18683402b6f0aaac754e) Reviewed-by: Qt Cherry-pick Bot --- src/gui/text/freetype/qfreetypefontdatabase.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gui/text/freetype/qfreetypefontdatabase.cpp b/src/gui/text/freetype/qfreetypefontdatabase.cpp index 772485471f5..018e590ac27 100644 --- a/src/gui/text/freetype/qfreetypefontdatabase.cpp +++ b/src/gui/text/freetype/qfreetypefontdatabase.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #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); }