From 4e7854e49681cc6000de3496ace3623c69f7d95d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 24 Apr 2012 09:39:11 +0300 Subject: Change Windows font database to use qendian.h Removed the custom BigEndian class and utilized qendian.h functions instead. Change-Id: Ieb10f77411404e1524fcedaceffa5b0e333c7429 Reviewed-by: Friedemann Kleint --- .../platforms/windows/qwindowsfontdatabase.cpp | 196 +++++++++------------ 1 file changed, 85 insertions(+), 111 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index 36074b0fa9..caa1913bb5 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -65,101 +65,78 @@ QT_BEGIN_NAMESPACE // Helper classes for creating font engines directly from font data namespace { - template - struct BigEndian - { - quint8 data[sizeof(T)]; - - operator T() const - { - T littleEndian = 0; - for (int i = 0; i < int(sizeof(T)); ++i) - littleEndian |= data[i] << ((sizeof(T) - i - 1) * 8); - - return littleEndian; - } - - BigEndian &operator=(const T &t) - { - for (int i = 0; i < int(sizeof(T)); ++i) - data[i] = ((t >> (sizeof(T) - i - 1) * 8) & 0xff); - - return *this; - } - }; - # pragma pack(1) // Common structure for all formats of the "name" table struct NameTable { - BigEndian format; - BigEndian count; - BigEndian stringOffset; + quint16 format; + quint16 count; + quint16 stringOffset; }; struct NameRecord { - BigEndian platformID; - BigEndian encodingID; - BigEndian languageID; - BigEndian nameID; - BigEndian length; - BigEndian offset; + quint16 platformID; + quint16 encodingID; + quint16 languageID; + quint16 nameID; + quint16 length; + quint16 offset; }; struct OffsetSubTable { - BigEndian scalerType; - BigEndian numTables; - BigEndian searchRange; - BigEndian entrySelector; - BigEndian rangeShift; + quint32 scalerType; + quint16 numTables; + quint16 searchRange; + quint16 entrySelector; + quint16 rangeShift; }; struct TableDirectory { - BigEndian identifier; - BigEndian checkSum; - BigEndian offset; - BigEndian length; + quint32 identifier; + quint32 checkSum; + quint32 offset; + quint32 length; }; struct OS2Table { - BigEndian version; - BigEndian avgCharWidth; - BigEndian weightClass; - BigEndian widthClass; - BigEndian type; - BigEndian subscriptXSize; - BigEndian subscriptYSize; - BigEndian subscriptXOffset; - BigEndian subscriptYOffset; - BigEndian superscriptXSize; - BigEndian superscriptYSize; - BigEndian superscriptXOffset; - BigEndian superscriptYOffset; - BigEndian strikeOutSize; - BigEndian strikeOutPosition; - BigEndian familyClass; - quint8 panose[10]; - BigEndian unicodeRanges[4]; - quint8 vendorID[4]; - BigEndian selection; - BigEndian firstCharIndex; - BigEndian lastCharIndex; - BigEndian typoAscender; - BigEndian typoDescender; - BigEndian typoLineGap; - BigEndian winAscent; - BigEndian winDescent; - BigEndian codepageRanges[2]; - BigEndian height; - BigEndian capHeight; - BigEndian defaultChar; - BigEndian breakChar; - BigEndian maxContext; + quint16 version; + qint16 avgCharWidth; + quint16 weightClass; + quint16 widthClass; + quint16 type; + qint16 subscriptXSize; + qint16 subscriptYSize; + qint16 subscriptXOffset; + qint16 subscriptYOffset; + qint16 superscriptXSize; + qint16 superscriptYSize; + qint16 superscriptXOffset; + qint16 superscriptYOffset; + qint16 strikeOutSize; + qint16 strikeOutPosition; + qint16 familyClass; + quint8 panose[10]; + quint32 unicodeRanges[4]; + quint8 vendorID[4]; + quint16 selection; + quint16 firstCharIndex; + quint16 lastCharIndex; + qint16 typoAscender; + qint16 typoDescender; + qint16 typoLineGap; + quint16 winAscent; + quint16 winDescent; + quint32 codepageRanges[2]; + qint16 height; + qint16 capHeight; + quint16 defaultChar; + quint16 breakChar; + quint16 maxContext; }; # pragma pack() @@ -181,16 +158,13 @@ namespace { TableDirectory *EmbeddedFont::tableDirectoryEntry(const QByteArray &tagName) { Q_ASSERT(tagName.size() == 4); - - const BigEndian *tagIdPtr = - reinterpret_cast *>(tagName.constData()); - quint32 tagId = *tagIdPtr; + quint32 tagId = *(reinterpret_cast(tagName.constData())); OffsetSubTable *offsetSubTable = reinterpret_cast(m_fontData.data()); TableDirectory *tableDirectory = reinterpret_cast(offsetSubTable + 1); TableDirectory *nameTableDirectoryEntry = 0; - for (int i=0; inumTables; ++i, ++tableDirectory) { + for (int i = 0; i < qFromBigEndian(offsetSubTable->numTables); ++i, ++tableDirectory) { if (tableDirectory->identifier == tagId) { nameTableDirectoryEntry = tableDirectory; break; @@ -208,21 +182,21 @@ namespace { nameTableDirectoryEntry = tableDirectoryEntry("name"); if (nameTableDirectoryEntry != 0) { - NameTable *nameTable = reinterpret_cast(m_fontData.data() - + nameTableDirectoryEntry->offset); + NameTable *nameTable = reinterpret_cast( + m_fontData.data() + qFromBigEndian(nameTableDirectoryEntry->offset)); NameRecord *nameRecord = reinterpret_cast(nameTable + 1); - for (int i = 0; i < nameTable->count; ++i, ++nameRecord) { - if (nameRecord->nameID == 1 - && nameRecord->platformID == 3 // Windows - && nameRecord->languageID == 0x0409) { // US English + for (int i = 0; i < qFromBigEndian(nameTable->count); ++i, ++nameRecord) { + if (qFromBigEndian(nameRecord->nameID) == 1 + && qFromBigEndian(nameRecord->platformID) == 3 // Windows + && qFromBigEndian(nameRecord->languageID) == 0x0409) { // US English const void *ptr = reinterpret_cast(nameTable) - + nameTable->stringOffset - + nameRecord->offset; + + qFromBigEndian(nameTable->stringOffset) + + qFromBigEndian(nameRecord->offset); - const BigEndian *s = reinterpret_cast *>(ptr); - const BigEndian *e = s + nameRecord->length / sizeof(quint16); + const quint16 *s = reinterpret_cast(ptr); + const quint16 *e = s + qFromBigEndian(nameRecord->length) / sizeof(quint16); while (s != e) - name += QChar(*s++); + name += QChar( qFromBigEndian(*s++)); break; } } @@ -256,34 +230,34 @@ namespace { { NameTable *nameTable = reinterpret_cast(newNameTable.data()); - nameTable->count = requiredRecordCount; - nameTable->stringOffset = sizeOfHeader; + nameTable->count = qbswap(requiredRecordCount); + nameTable->stringOffset = qbswap(sizeOfHeader); NameRecord *nameRecord = reinterpret_cast(nameTable + 1); for (int i = 0; i < requiredRecordCount; ++i, nameRecord++) { - nameRecord->nameID = nameIds[i]; - nameRecord->encodingID = 1; - nameRecord->languageID = 0x0409; - nameRecord->platformID = 3; - nameRecord->length = newFamilyNameSize; + nameRecord->nameID = qbswap(nameIds[i]); + nameRecord->encodingID = qbswap(1); + nameRecord->languageID = qbswap(0x0409); + nameRecord->platformID = qbswap(3); + nameRecord->length = qbswap(newFamilyNameSize); // Special case for sub-family if (nameIds[i] == 4) { - nameRecord->offset = newFamilyNameSize; - nameRecord->length = regularStringSize; + nameRecord->offset = qbswap(newFamilyNameSize); + nameRecord->length = qbswap(regularStringSize); } } // nameRecord now points to string data - BigEndian *stringStorage = reinterpret_cast *>(nameRecord); + quint16 *stringStorage = reinterpret_cast(nameRecord); const quint16 *sourceString = newFamilyName.utf16(); - for (int i=0; i(sourceString[i]); stringStorage += newFamilyName.size(); sourceString = regularString.utf16(); for (int i = 0; i < regularString.size(); ++i) - stringStorage[i] = sourceString[i]; + stringStorage[i] = qbswap(sourceString[i]); } quint32 *p = reinterpret_cast(newNameTable.data()); @@ -291,11 +265,11 @@ namespace { quint32 checkSum = 0; while (p < tableEnd) - checkSum += *(p++); + checkSum += qFromBigEndian(*(p++)); - nameTableDirectoryEntry->checkSum = checkSum; - nameTableDirectoryEntry->offset = m_fontData.size(); - nameTableDirectoryEntry->length = fullSize; + nameTableDirectoryEntry->checkSum = qbswap(checkSum); + nameTableDirectoryEntry->offset = qbswap(m_fontData.size()); + nameTableDirectoryEntry->length = qbswap(fullSize); m_fontData.append(newNameTable); @@ -1284,10 +1258,10 @@ QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal if (os2TableEntry != 0) { const OS2Table *os2Table = reinterpret_cast(fontData.constData() - + os2TableEntry->offset); + + qFromBigEndian(os2TableEntry->offset)); - bool italic = os2Table->selection & 1; - bool oblique = os2Table->selection & 128; + bool italic = qFromBigEndian(os2Table->selection) & 1; + bool oblique = qFromBigEndian(os2Table->selection) & 128; if (italic) fontEngine->fontDef.style = QFont::StyleItalic; @@ -1296,7 +1270,7 @@ QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal else fontEngine->fontDef.style = QFont::StyleNormal; - fontEngine->fontDef.weight = weightFromInteger(os2Table->weightClass); + fontEngine->fontDef.weight = weightFromInteger(qFromBigEndian(os2Table->weightClass)); } } -- cgit v1.2.3