Add support for rawFonts loaded from data in FaceId

The problem was that with an empty filename and index of 0, all raw fonts
loaded from data had the same FaceId, and we wouldn't bother to load
another one after doing this once.
This commit introduces a uuid in FaceId to help distinguish them in
that case.

Change-Id: I93655ff07a7d8856af1f854024e207c519f8ed1a
Reviewed-on: http://codereview.qt.nokia.com/1882
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
This commit is contained in:
Pierre Rossi 2011-07-19 18:36:05 +02:00 committed by Qt by Nokia
parent 227cb8c0b9
commit f74296ef7c
3 changed files with 28 additions and 2 deletions

View File

@ -155,6 +155,7 @@ public:
struct FaceId {
FaceId() : index(0), encoding(0) {}
QByteArray filename;
QByteArray uuid;
int index;
int encoding;
};
@ -303,7 +304,7 @@ inline bool operator ==(const QFontEngine::FaceId &f1, const QFontEngine::FaceId
inline uint qHash(const QFontEngine::FaceId &f)
{
return qHash((f.index << 16) + f.encoding) + qHash(f.filename);
return qHash((f.index << 16) + f.encoding) + qHash(f.filename + f.uuid);
}

View File

@ -45,6 +45,7 @@
#include "qrawfont_p.h"
#include "qfontengine_ft_p.h"
#include "quuid.h"
#if defined(Q_WS_X11) && !defined(QT_NO_FONTCONFIG)
# include "qfontengine_x11_p.h"
@ -87,6 +88,7 @@ public:
FaceId faceId;
faceId.filename = "";
faceId.index = 0;
faceId.uuid = QUuid::createUuid().toString().toAscii();
return init(faceId, true, Format_None, fontData);
}

View File

@ -47,7 +47,6 @@
class tst_QRawFont: public QObject
{
Q_OBJECT
#if !defined(QT_NO_RAWFONT)
private slots:
void invalidRawFont();
@ -94,6 +93,11 @@ private slots:
void rawFontSetPixelSize_data();
void rawFontSetPixelSize();
#if defined(Q_WS_X11) || defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
void multipleRawFontsFromData();
#endif
#endif // QT_NO_RAWFONT
};
@ -843,6 +847,25 @@ void tst_QRawFont::rawFontSetPixelSize()
QCOMPARE(rawFont.pixelSize(), 24.0);
}
#if defined(Q_WS_X11) || defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
void tst_QRawFont::multipleRawFontsFromData()
{
QFile file(QString::fromLatin1(SRCDIR "testfont.ttf"));
QRawFont testFont;
if (file.open(QIODevice::ReadOnly)) {
testFont.loadFromData(file.readAll(), 11, QFont::PreferDefaultHinting);
file.close();
}
file.setFileName(QLatin1String(SRCDIR "testfont_bold_italic.ttf"));
QRawFont testFontBoldItalic;
if (file.open(QIODevice::ReadOnly))
testFontBoldItalic.loadFromData(file.readAll(), 11, QFont::PreferDefaultHinting);
QVERIFY(testFont.familyName() != (testFontBoldItalic.familyName())
|| testFont.styleName() != (testFontBoldItalic.styleName()));
}
#endif
#endif // QT_NO_RAWFONT
QTEST_MAIN(tst_QRawFont)