From 9a3754c570b71f610c1ee467bcfca83de3a55a4b Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Tue, 17 Feb 2015 11:36:36 +0400 Subject: [QCoreTextFontDatabase] Micro optimization With use of pre-allocated buffer, there is always a good chance to get the requested data with a single call. Change-Id: I8fed718e15970ab345ce96a9405578947b59f311 Reviewed-by: Lars Knoll --- .../fontdatabases/mac/qcoretextfontdatabase.mm | 32 +++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'src/platformsupport') diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm index a022587e11..f48ea1b833 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm @@ -270,23 +270,29 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd) fd->fixedPitch = false; if (QCFType tempFont = CTFontCreateWithFontDescriptor(font, 0.0, 0)) { - uint length = 0; uint tag = MAKE_TAG('O', 'S', '/', '2'); CTFontRef tempFontRef = tempFont; void *userData = reinterpret_cast(&tempFontRef); - if (QCoreTextFontEngine::ct_getSfntTable(userData, tag, 0, &length)) { - QVarLengthArray os2Table(length); - if (length >= 86 && QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length)) { - quint32 unicodeRange[4] = { - qFromBigEndian(os2Table.data() + 42), - qFromBigEndian(os2Table.data() + 46), - qFromBigEndian(os2Table.data() + 50), - qFromBigEndian(os2Table.data() + 54) - }; - quint32 codePageRange[2] = { qFromBigEndian(os2Table.data() + 78), - qFromBigEndian(os2Table.data() + 82) }; - fd->writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); + uint length = 128; + QVarLengthArray os2Table(length); + if (QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length) && length >= 86) { + if (length > os2Table.length()) { + os2Table.resize(length); + if (!QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length)) + Q_UNREACHABLE(); + Q_ASSERT(length >= 86); } + quint32 unicodeRange[4] = { + qFromBigEndian(os2Table.data() + 42), + qFromBigEndian(os2Table.data() + 46), + qFromBigEndian(os2Table.data() + 50), + qFromBigEndian(os2Table.data() + 54) + }; + quint32 codePageRange[2] = { + qFromBigEndian(os2Table.data() + 78), + qFromBigEndian(os2Table.data() + 82) + }; + fd->writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); } } -- cgit v1.2.3