src/gui/text/qfontdatabase_s60.cpp
changeset 29 b72c6db6890b
parent 25 e24348a560a6
child 30 5dc02b23752f
--- a/src/gui/text/qfontdatabase_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
+++ b/src/gui/text/qfontdatabase_s60.cpp	Wed Jun 23 19:07:03 2010 +0300
@@ -45,16 +45,16 @@
 #include "qfontengine_s60_p.h"
 #include "qabstractfileengine.h"
 #include "qdesktopservices.h"
-#include "qpixmap_s60_p.h"
-#include "qt_s60_p.h"
+#include <private/qpixmap_s60_p.h>
+#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 @@
     return result;
 }
 
-#if defined(QT_NO_FREETYPE)
+#ifdef QT_NO_FREETYPE
 class QSymbianFontDatabaseExtrasImplementation : public QSymbianFontDatabaseExtras
 {
 public:
@@ -100,19 +100,45 @@
 
     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"));
+    filters.append(QLatin1String("*.ltt"));
     const QFileInfoList fontFiles = alternativeFilePaths(QLatin1String("resource\\Fonts"), filters);
 
     const TInt heapMinLength = 0x1000;
@@ -130,10 +156,14 @@
         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());
@@ -142,6 +172,7 @@
 
     delete m_store;
     m_heap->Close();
+#endif // Q_SYMBIAN_HAS_FONTTABLE_API
 }
 
 #ifndef FNTSTORE_H_INLINES_SUPPORT_FMM
@@ -166,26 +197,37 @@
 {
     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);
@@ -193,10 +235,11 @@
             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:
@@ -208,7 +251,7 @@
 {
     default_hint_style = HintFull;
 }
-#endif // defined(QT_NO_FREETYPE)
+#endif // QT_NO_FREETYPE
 
 /*
  QFontEngineS60::pixelsToPoints, QFontEngineS60::pointsToPixels, QFontEngineMultiS60::QFontEngineMultiS60
@@ -260,12 +303,12 @@
     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);
@@ -277,6 +320,7 @@
         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);
@@ -317,14 +361,13 @@
 
             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")
@@ -333,7 +376,7 @@
         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)
@@ -415,13 +458,13 @@
         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;
@@ -432,7 +475,7 @@
             fe = fte;
         else
             delete fte;
-#endif
+#endif // QT_NO_FREETYPE
 
         Q_ASSERT(fe);
         if (script == QUnicodeTables::Common