summaryrefslogtreecommitdiffstats
path: root/src/gui/text/qfontdatabase_s60.cpp
diff options
context:
space:
mode:
authorAlessandro Portale <alessandro.portale@nokia.com>2010-05-31 00:51:05 +0200
committerAlessandro Portale <alessandro.portale@nokia.com>2010-06-03 16:52:57 +0200
commit7d71e65658d27c200f97b93781c3c7f7c313ff56 (patch)
tree2c6937d5db1c67bb64d414c1f38108313b483793 /src/gui/text/qfontdatabase_s60.cpp
parentf535efb015314fb07573739fd33aa00ba5502bde (diff)
Using Symbian's future font table getter Api
Qt requires raw access to the font tables of used fonts, for a variety of reasons. Until Symbian^4, it is/was not possible to access the font tables of the fonts which are stored in Symbians Font and Bitmap Server. That's why Qt for Symbian's FontDataBase created an own TFontStore where it loaded in all installed fonts. While accessing the font tables via the own TFontStore it still uses the rasterization and metrics from the FBS, which has public Api for those things. However, loading all fonts in the own TFontStore for each Qt Gui process slows down the program startup. Symbian's future font table setter Api is very welcome and this implemets it's usage. This patch lets Qt use the new font API on Symbain^4. The font tables are retrieved via RFontTable. Task-number: QT-2746 Reviewed-by: Jason Barron
Diffstat (limited to 'src/gui/text/qfontdatabase_s60.cpp')
-rw-r--r--src/gui/text/qfontdatabase_s60.cpp76
1 files changed, 59 insertions, 17 deletions
diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp
index 489b70b30f..943df7f246 100644
--- a/src/gui/text/qfontdatabase_s60.cpp
+++ b/src/gui/text/qfontdatabase_s60.cpp
@@ -49,12 +49,12 @@
#include <private/qt_s60_p.h>
#include "qendian.h"
#include <private/qcore_symbian_p.h>
-#if defined(QT_NO_FREETYPE)
+#ifdef QT_NO_FREETYPE
#include <openfont.h>
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <graphics/openfontrasterizer.h> // COpenFontRasterizer has moved to a new header file
#endif // SYMBIAN_ENABLE_SPLIT_HEADERS
-#endif
+#endif // QT_NO_FREETYPE
QT_BEGIN_NAMESPACE
@@ -91,7 +91,7 @@ QFileInfoList alternativeFilePaths(const QString &path, const QStringList &nameF
return result;
}
-#if defined(QT_NO_FREETYPE)
+#ifdef QT_NO_FREETYPE
class QSymbianFontDatabaseExtrasImplementation : public QSymbianFontDatabaseExtras
{
public:
@@ -100,16 +100,41 @@ public:
const QSymbianTypeFaceExtras *extras(const QString &typeface, bool bold, bool italic) const;
+#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
+ struct CFontFromFontStoreReleaser {
+ static inline void cleanup(CFont *font)
+ {
+ if (!font)
+ return;
+ const QSymbianFontDatabaseExtrasImplementation *dbExtras =
+ static_cast<const QSymbianFontDatabaseExtrasImplementation*>(privateDb()->symbianExtras);
+ dbExtras->m_store->ReleaseFont(font);
+ }
+ };
+#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
+
+ struct CFontFromScreenDeviceReleaser {
+ static inline void cleanup(CFont *font)
+ {
+ if (!font)
+ return;
+ QS60Data::screenDevice()->ReleaseFont(font);
+ }
+ };
+
private:
+#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
RHeap* m_heap;
CFontStore *m_store;
COpenFontRasterizer *m_rasterizer;
mutable QList<const QSymbianTypeFaceExtras *> m_extras;
+#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
};
QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation()
{
+#ifndef Q_SYMBIAN_HAS_FONTTABLE_API
QStringList filters;
filters.append(QLatin1String("*.ttf"));
filters.append(QLatin1String("*.ccc"));
@@ -131,10 +156,14 @@ QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementati
TPtrC fontFilePtr(qt_QString2TPtrC(fontFile));
QT_TRAP_THROWING(m_store->AddFileL(fontFilePtr));
}
+#endif // !Q_SYMBIAN_HAS_FONTTABLE_API
}
QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementation()
{
+#ifdef Q_SYMBIAN_HAS_FONTTABLE_API
+ qDeleteAll(m_extrasHash);
+#else // Q_SYMBIAN_HAS_FONTTABLE_API
typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
for (iterator p = m_extras.begin(); p != m_extras.end(); ++p) {
m_store->ReleaseFont((*p)->fontOwner());
@@ -143,6 +172,7 @@ QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementat
delete m_store;
m_heap->Close();
+#endif // Q_SYMBIAN_HAS_FONTTABLE_API
}
#ifndef FNTSTORE_H_INLINES_SUPPORT_FMM
@@ -167,26 +197,37 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
{
const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic));
if (!m_extrasHash.contains(searchKey)) {
- CFont* font = NULL;
TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1);
if (bold)
searchSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
if (italic)
searchSpec.iFontStyle.SetPosture(EPostureItalic);
+
+ CFont* font = NULL;
+#ifdef Q_SYMBIAN_HAS_FONTTABLE_API
+ const TInt err = QS60Data::screenDevice()->GetNearestFontToDesignHeightInPixels(font, searchSpec);
+ Q_ASSERT(err == KErrNone && font);
+ QScopedPointer<CFont, CFontFromScreenDeviceReleaser> sFont(font);
+ QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font);
+ sFont.take();
+ m_extrasHash.insert(searchKey, extras);
+#else // Q_SYMBIAN_HAS_FONTTABLE_API
const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, searchSpec);
Q_ASSERT(err == KErrNone && font);
const CBitmapFont *bitmapFont = static_cast<CBitmapFont*>(font);
COpenFont *openFont =
#ifdef FNTSTORE_H_INLINES_SUPPORT_FMM
- bitmapFont->openFont();
-#else
+ bitmapFont->OpenFont();
+#else // FNTSTORE_H_INLINES_SUPPORT_FMM
OpenFontFromBitmapFont(bitmapFont);
#endif // FNTSTORE_H_INLINES_SUPPORT_FMM
const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
const QString foundKey =
QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
if (!m_extrasHash.contains(foundKey)) {
+ QScopedPointer<CFont, CFontFromFontStoreReleaser> sFont(font);
QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
+ sFont.take();
m_extras.append(extras);
m_extrasHash.insert(searchKey, extras);
m_extrasHash.insert(foundKey, extras);
@@ -194,10 +235,11 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
m_store->ReleaseFont(font);
m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
}
+#endif // Q_SYMBIAN_HAS_FONTTABLE_API
}
return m_extrasHash.value(searchKey);
}
-#else
+#else // QT_NO_FREETYPE
class QFontEngineFTS60 : public QFontEngineFT
{
public:
@@ -209,7 +251,7 @@ QFontEngineFTS60::QFontEngineFTS60(const QFontDef &fd)
{
default_hint_style = HintFull;
}
-#endif // defined(QT_NO_FREETYPE)
+#endif // QT_NO_FREETYPE
/*
QFontEngineS60::pixelsToPoints, QFontEngineS60::pointsToPixels, QFontEngineMultiS60::QFontEngineMultiS60
@@ -261,12 +303,12 @@ static void initializeDb()
if(!db || db->count)
return;
-#if defined(QT_NO_FREETYPE)
+#ifdef QT_NO_FREETYPE
if (!db->symbianExtras)
db->symbianExtras = new QSymbianFontDatabaseExtrasImplementation;
QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
-
+
const int numTypeFaces = QS60Data::screenDevice()->NumTypefaces();
const QSymbianFontDatabaseExtrasImplementation *dbExtras =
static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
@@ -278,6 +320,7 @@ static void initializeDb()
TFontSpec fontSpec(typefaceSupport.iTypeface.iName, 11);
if (QS60Data::screenDevice()->GetNearestFontInPixels(font, fontSpec) != KErrNone)
continue;
+ QScopedPointer<CFont, QSymbianFontDatabaseExtrasImplementation::CFontFromScreenDeviceReleaser> sFont(font);
if (font->TypeUid() == KCFbsFontUid) {
TOpenFontFaceAttrib faceAttrib;
const CFbsFont *cfbsFont = static_cast<const CFbsFont *>(font);
@@ -318,14 +361,13 @@ static void initializeDb()
fontAdded = true;
}
- QS60Data::screenDevice()->ReleaseFont(font);
}
Q_ASSERT(fontAdded);
- lock.relock();
+ lock.relock();
-#else // defined(QT_NO_FREETYPE)
+#else // QT_NO_FREETYPE
QDir dir(QDesktopServices::storageLocation(QDesktopServices::FontsLocation));
dir.setNameFilters(QStringList() << QLatin1String("*.ttf")
<< QLatin1String("*.ttc") << QLatin1String("*.pfa")
@@ -334,7 +376,7 @@ static void initializeDb()
const QByteArray file = QFile::encodeName(dir.absoluteFilePath(dir[i]));
db->addTTFile(file);
}
-#endif // defined(QT_NO_FREETYPE)
+#endif // QT_NO_FREETYPE
}
static inline void load(const QString &family = QString(), int script = -1)
@@ -416,13 +458,13 @@ QFontEngine *QFontDatabase::findFont(int script, const QFontPrivate *, const QFo
const QString fontFamily = desc.family->name;
QFontDef request = req;
request.family = fontFamily;
-#if defined(QT_NO_FREETYPE)
+#ifdef QT_NO_FREETYPE
const QSymbianFontDatabaseExtrasImplementation *dbExtras =
static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
const QSymbianTypeFaceExtras *typeFaceExtras =
dbExtras->extras(fontFamily, request.weight > QFont::Normal, request.style != QFont::StyleNormal);
fe = new QFontEngineS60(request, typeFaceExtras);
-#else
+#else // QT_NO_FREETYPE
QFontEngine::FaceId faceId;
const QtFontFamily * const reqQtFontFamily = db->family(fontFamily);
faceId.filename = reqQtFontFamily->fontFilename;
@@ -433,7 +475,7 @@ QFontEngine *QFontDatabase::findFont(int script, const QFontPrivate *, const QFo
fe = fte;
else
delete fte;
-#endif
+#endif // QT_NO_FREETYPE
Q_ASSERT(fe);
if (script == QUnicodeTables::Common