Don't build WinCE specific code on other platforms
Change-Id: I7ade08e57ea0c9c496e316ff0f856b8951eab61e Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Björn Breitmeyer <bjoern.breitmeyer@kdab.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>bb10
parent
4046055caf
commit
e58a721c5d
|
|
@ -52,37 +52,6 @@
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
typedef struct {
|
||||
quint16 majorVersion;
|
||||
quint16 minorVersion;
|
||||
quint16 numTables;
|
||||
quint16 searchRange;
|
||||
quint16 entrySelector;
|
||||
quint16 rangeShift;
|
||||
} OFFSET_TABLE;
|
||||
|
||||
typedef struct {
|
||||
quint32 tag;
|
||||
quint32 checkSum;
|
||||
quint32 offset;
|
||||
quint32 length;
|
||||
} TABLE_DIRECTORY;
|
||||
|
||||
typedef struct {
|
||||
quint16 fontSelector;
|
||||
quint16 nrCount;
|
||||
quint16 storageOffset;
|
||||
} NAME_TABLE_HEADER;
|
||||
|
||||
typedef struct {
|
||||
quint16 platformID;
|
||||
quint16 encodingID;
|
||||
quint16 languageID;
|
||||
quint16 nameID;
|
||||
quint16 stringLength;
|
||||
quint16 stringOffset;
|
||||
} NAME_RECORD;
|
||||
|
||||
void QBasicFontDatabase::populateFontDatabase()
|
||||
{
|
||||
QString fontpath = fontDir();
|
||||
|
|
@ -323,92 +292,4 @@ QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByt
|
|||
return families;
|
||||
}
|
||||
|
||||
QString QBasicFontDatabase::fontNameFromTTFile(const QString &filename)
|
||||
{
|
||||
QFile f(filename);
|
||||
QString retVal;
|
||||
qint64 bytesRead;
|
||||
qint64 bytesToRead;
|
||||
|
||||
if (f.open(QIODevice::ReadOnly)) {
|
||||
OFFSET_TABLE ttOffsetTable;
|
||||
bytesToRead = sizeof(OFFSET_TABLE);
|
||||
bytesRead = f.read((char*)&ttOffsetTable, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
ttOffsetTable.numTables = qFromBigEndian(ttOffsetTable.numTables);
|
||||
ttOffsetTable.majorVersion = qFromBigEndian(ttOffsetTable.majorVersion);
|
||||
ttOffsetTable.minorVersion = qFromBigEndian(ttOffsetTable.minorVersion);
|
||||
|
||||
if (ttOffsetTable.majorVersion != 1 || ttOffsetTable.minorVersion != 0)
|
||||
return retVal;
|
||||
|
||||
TABLE_DIRECTORY tblDir;
|
||||
bool found = false;
|
||||
|
||||
for (int i = 0; i < ttOffsetTable.numTables; i++) {
|
||||
bytesToRead = sizeof(TABLE_DIRECTORY);
|
||||
bytesRead = f.read((char*)&tblDir, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
if (qFromBigEndian(tblDir.tag) == MAKE_TAG('n', 'a', 'm', 'e')) {
|
||||
found = true;
|
||||
tblDir.length = qFromBigEndian(tblDir.length);
|
||||
tblDir.offset = qFromBigEndian(tblDir.offset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
f.seek(tblDir.offset);
|
||||
NAME_TABLE_HEADER ttNTHeader;
|
||||
bytesToRead = sizeof(NAME_TABLE_HEADER);
|
||||
bytesRead = f.read((char*)&ttNTHeader, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
ttNTHeader.nrCount = qFromBigEndian(ttNTHeader.nrCount);
|
||||
ttNTHeader.storageOffset = qFromBigEndian(ttNTHeader.storageOffset);
|
||||
NAME_RECORD ttRecord;
|
||||
found = false;
|
||||
|
||||
for (int i = 0; i < ttNTHeader.nrCount; i++) {
|
||||
bytesToRead = sizeof(NAME_RECORD);
|
||||
bytesRead = f.read((char*)&ttRecord, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
ttRecord.nameID = qFromBigEndian(ttRecord.nameID);
|
||||
if (ttRecord.nameID == 1) {
|
||||
ttRecord.stringLength = qFromBigEndian(ttRecord.stringLength);
|
||||
ttRecord.stringOffset = qFromBigEndian(ttRecord.stringOffset);
|
||||
int nPos = f.pos();
|
||||
f.seek(tblDir.offset + ttRecord.stringOffset + ttNTHeader.storageOffset);
|
||||
|
||||
QByteArray nameByteArray = f.read(ttRecord.stringLength);
|
||||
if (!nameByteArray.isEmpty()) {
|
||||
if (ttRecord.encodingID == 256 || ttRecord.encodingID == 768) {
|
||||
//This is UTF-16 in big endian
|
||||
int stringLength = ttRecord.stringLength / 2;
|
||||
retVal.resize(stringLength);
|
||||
QChar *data = retVal.data();
|
||||
const ushort *srcData = (const ushort *)nameByteArray.data();
|
||||
for (int i = 0; i < stringLength; ++i)
|
||||
data[i] = qFromBigEndian(srcData[i]);
|
||||
return retVal;
|
||||
} else if (ttRecord.encodingID == 0) {
|
||||
//This is Latin1
|
||||
retVal = QString::fromLatin1(nameByteArray);
|
||||
} else {
|
||||
qWarning("Could not retrieve Font name from file: %s", qPrintable(QDir::toNativeSeparators(filename)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
f.seek(nPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
f.close();
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@ public:
|
|||
void releaseHandle(void *handle) Q_DECL_OVERRIDE;
|
||||
|
||||
static QStringList addTTFile(const QByteArray &fontData, const QByteArray &file, QSupportedWritingSystems *supportedWritingSystems = 0);
|
||||
static QString fontNameFromTTFile(const QString &filename);
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
|
||||
#include <wchar.h>
|
||||
#ifdef Q_OS_WINCE
|
||||
#include <QtCore/QFile>
|
||||
#include <QtEndian>
|
||||
#endif
|
||||
|
||||
|
|
@ -100,6 +101,127 @@ static FontFile * createFontFile(const QString &fileName, int index)
|
|||
extern bool localizedName(const QString &name);
|
||||
extern QString getEnglishName(const QString &familyName);
|
||||
|
||||
#ifdef Q_OS_WINCE
|
||||
typedef struct {
|
||||
quint16 majorVersion;
|
||||
quint16 minorVersion;
|
||||
quint16 numTables;
|
||||
quint16 searchRange;
|
||||
quint16 entrySelector;
|
||||
quint16 rangeShift;
|
||||
} OFFSET_TABLE;
|
||||
|
||||
typedef struct {
|
||||
quint32 tag;
|
||||
quint32 checkSum;
|
||||
quint32 offset;
|
||||
quint32 length;
|
||||
} TABLE_DIRECTORY;
|
||||
|
||||
typedef struct {
|
||||
quint16 fontSelector;
|
||||
quint16 nrCount;
|
||||
quint16 storageOffset;
|
||||
} NAME_TABLE_HEADER;
|
||||
|
||||
typedef struct {
|
||||
quint16 platformID;
|
||||
quint16 encodingID;
|
||||
quint16 languageID;
|
||||
quint16 nameID;
|
||||
quint16 stringLength;
|
||||
quint16 stringOffset;
|
||||
} NAME_RECORD;
|
||||
|
||||
static QString fontNameFromTTFile(const QString &filename)
|
||||
{
|
||||
QFile f(filename);
|
||||
QString retVal;
|
||||
qint64 bytesRead;
|
||||
qint64 bytesToRead;
|
||||
|
||||
if (f.open(QIODevice::ReadOnly)) {
|
||||
OFFSET_TABLE ttOffsetTable;
|
||||
bytesToRead = sizeof(OFFSET_TABLE);
|
||||
bytesRead = f.read((char*)&ttOffsetTable, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
ttOffsetTable.numTables = qFromBigEndian(ttOffsetTable.numTables);
|
||||
ttOffsetTable.majorVersion = qFromBigEndian(ttOffsetTable.majorVersion);
|
||||
ttOffsetTable.minorVersion = qFromBigEndian(ttOffsetTable.minorVersion);
|
||||
|
||||
if (ttOffsetTable.majorVersion != 1 || ttOffsetTable.minorVersion != 0)
|
||||
return retVal;
|
||||
|
||||
TABLE_DIRECTORY tblDir;
|
||||
bool found = false;
|
||||
|
||||
for (int i = 0; i < ttOffsetTable.numTables; i++) {
|
||||
bytesToRead = sizeof(TABLE_DIRECTORY);
|
||||
bytesRead = f.read((char*)&tblDir, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
if (qFromBigEndian(tblDir.tag) == MAKE_TAG('n', 'a', 'm', 'e')) {
|
||||
found = true;
|
||||
tblDir.length = qFromBigEndian(tblDir.length);
|
||||
tblDir.offset = qFromBigEndian(tblDir.offset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
f.seek(tblDir.offset);
|
||||
NAME_TABLE_HEADER ttNTHeader;
|
||||
bytesToRead = sizeof(NAME_TABLE_HEADER);
|
||||
bytesRead = f.read((char*)&ttNTHeader, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
ttNTHeader.nrCount = qFromBigEndian(ttNTHeader.nrCount);
|
||||
ttNTHeader.storageOffset = qFromBigEndian(ttNTHeader.storageOffset);
|
||||
NAME_RECORD ttRecord;
|
||||
found = false;
|
||||
|
||||
for (int i = 0; i < ttNTHeader.nrCount; i++) {
|
||||
bytesToRead = sizeof(NAME_RECORD);
|
||||
bytesRead = f.read((char*)&ttRecord, bytesToRead);
|
||||
if (bytesToRead != bytesRead)
|
||||
return retVal;
|
||||
ttRecord.nameID = qFromBigEndian(ttRecord.nameID);
|
||||
if (ttRecord.nameID == 1) {
|
||||
ttRecord.stringLength = qFromBigEndian(ttRecord.stringLength);
|
||||
ttRecord.stringOffset = qFromBigEndian(ttRecord.stringOffset);
|
||||
int nPos = f.pos();
|
||||
f.seek(tblDir.offset + ttRecord.stringOffset + ttNTHeader.storageOffset);
|
||||
|
||||
QByteArray nameByteArray = f.read(ttRecord.stringLength);
|
||||
if (!nameByteArray.isEmpty()) {
|
||||
if (ttRecord.encodingID == 256 || ttRecord.encodingID == 768) {
|
||||
//This is UTF-16 in big endian
|
||||
int stringLength = ttRecord.stringLength / 2;
|
||||
retVal.resize(stringLength);
|
||||
QChar *data = retVal.data();
|
||||
const ushort *srcData = (const ushort *)nameByteArray.data();
|
||||
for (int i = 0; i < stringLength; ++i)
|
||||
data[i] = qFromBigEndian(srcData[i]);
|
||||
return retVal;
|
||||
} else if (ttRecord.encodingID == 0) {
|
||||
//This is Latin1
|
||||
retVal = QString::fromLatin1(nameByteArray);
|
||||
} else {
|
||||
qWarning("Could not retrieve Font name from file: %s", qPrintable(QDir::toNativeSeparators(filename)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
f.seek(nPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
f.close();
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
#endif // Q_OS_WINCE
|
||||
|
||||
static bool addFontToDatabase(const QString &familyName, uchar charSet,
|
||||
const TEXTMETRIC *textmetric,
|
||||
const FONTSIGNATURE *signature,
|
||||
|
|
@ -245,7 +367,7 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet,
|
|||
|
||||
while (it.hasNext()) {
|
||||
const QString fontFile = it.next();
|
||||
const QString fontName = QBasicFontDatabase::fontNameFromTTFile(fontFile);
|
||||
const QString fontName = fontNameFromTTFile(fontFile);
|
||||
if (fontName.isEmpty())
|
||||
continue;
|
||||
fontCache.insert(fontName, fontFile);
|
||||
|
|
|
|||
Loading…
Reference in New Issue