Ignore:
Timestamp:
Aug 2, 2010, 9:27:30 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/text/qfontdatabase_s60.cpp

    r651 r769  
    5151#include <private/qcore_symbian_p.h>
    5252#if defined(QT_NO_FREETYPE)
    53 #include <OPENFONT.H>
     53#include <>
    5454#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
    5555#include <graphics/openfontrasterizer.h> // COpenFontRasterizer has moved to a new header file
     
    9393
    9494#if defined(QT_NO_FREETYPE)
    95 class QFontDatabaseS60StoreImplementation : public QFontDatabaseS60Store
     95class Q
    9696{
    9797public:
    98     QFontDatabaseS60StoreImplementation();
    99     ~QFontDatabaseS60StoreImplementation();
    100 
    101     const QFontEngineS60Extensions *extension(const QString &typeface) const;
     98    QImplementation();
     99    ~QImplementation();
     100
     101    const Q) const;
    102102
    103103private:
     
    105105    CFontStore *m_store;
    106106    COpenFontRasterizer *m_rasterizer;
    107     mutable QHash<QString, const QFontEngineS60Extensions *> m_extensions;
     107    mutable QList<const QSymbianTypeFaceExtras *> m_extras;
     108    mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
    108109};
    109110
    110 QFontDatabaseS60StoreImplementation::QFontDatabaseS60StoreImplementation()
    111 {
    112     m_heap = User::ChunkHeap(NULL, 0x1000, 0x100000);
     111QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation()
     112{
     113    QStringList filters;
     114    filters.append(QLatin1String("*.ttf"));
     115    filters.append(QLatin1String("*.ccc"));
     116    filters.append(QLatin1String("*.ltt"));
     117    const QFileInfoList fontFiles = alternativeFilePaths(QLatin1String("resource\\Fonts"), filters);
     118
     119    const TInt heapMinLength = 0x1000;
     120    const TInt heapMaxLength = qMax(0x20000 * fontFiles.count(), heapMinLength);
     121    m_heap = User::ChunkHeap(NULL, heapMinLength, heapMaxLength);
    113122    QT_TRAP_THROWING(
    114123        m_store = CFontStore::NewL(m_heap);
     
    118127        CleanupStack::Pop(m_rasterizer););
    119128
    120     QStringList filters;
    121     filters.append(QString::fromLatin1("*.ttf"));
    122     filters.append(QString::fromLatin1("*.ccc"));
    123     const QFileInfoList fontFiles = alternativeFilePaths(QString::fromLatin1("resource\\Fonts"), filters);
    124129    foreach (const QFileInfo &fontFileInfo, fontFiles) {
    125130        const QString fontFile = QDir::toNativeSeparators(fontFileInfo.absoluteFilePath());
     
    128133    }
    129134}
    130 QFontDatabaseS60StoreImplementation::~QFontDatabaseS60StoreImplementation()
    131 {
    132     typedef QHash<QString, const QFontEngineS60Extensions *>::iterator iterator;
    133     for (iterator p = m_extensions.begin(); p != m_extensions.end(); ++p) {
     135
     136QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementation()
     137{
     138    typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
     139    for (iterator p = m_extras.begin(); p != m_extras.end(); ++p) {
    134140        m_store->ReleaseFont((*p)->fontOwner());
    135141        delete *p;
     
    157163#endif // FNTSTORE_H_INLINES_SUPPORT_FMM
    158164
    159 const QFontEngineS60Extensions *QFontDatabaseS60StoreImplementation::extension(const QString &typeface) const
    160 {
    161     if (!m_extensions.contains(typeface)) {
     165const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &typeface,
     166                                                                               bool bold, bool italic) const
     167{
     168    const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic));
     169    if (!m_extrasHash.contains(searchKey)) {
    162170        CFont* font = NULL;
    163         TFontSpec spec(qt_QString2TPtrC(typeface), 1);
    164         spec.iHeight = 1;
    165         const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, spec);
     171        TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1);
     172        if (bold)
     173            searchSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
     174        if (italic)
     175            searchSpec.iFontStyle.SetPosture(EPostureItalic);
     176        const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, searchSpec);
    166177        Q_ASSERT(err == KErrNone && font);
    167178        const CBitmapFont *bitmapFont = static_cast<CBitmapFont*>(font);
     
    172183            OpenFontFromBitmapFont(bitmapFont);
    173184#endif // FNTSTORE_H_INLINES_SUPPORT_FMM
    174         m_extensions.insert(typeface, new QFontEngineS60Extensions(font, openFont));
    175     }
    176     return m_extensions.value(typeface);
     185        const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
     186        const QString foundKey =
     187                QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
     188        if (!m_extrasHash.contains(foundKey)) {
     189            QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
     190            m_extras.append(extras);
     191            m_extrasHash.insert(searchKey, extras);
     192            m_extrasHash.insert(foundKey, extras);
     193        } else {
     194            m_store->ReleaseFont(font);
     195            m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
     196        }
     197    }
     198    return m_extrasHash.value(searchKey);
    177199}
    178200#else
     
    241263
    242264#if defined(QT_NO_FREETYPE)
    243     if (!db->s60Store)
    244         db->s60Store = new QFontDatabaseS60StoreImplementation;
     265    if (!db->s)
     266        db->sImplementation;
    245267
    246268    QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
    247269   
    248270    const int numTypeFaces = QS60Data::screenDevice()->NumTypefaces();
    249     const QFontDatabaseS60StoreImplementation *store =
    250             static_cast<const QFontDatabaseS60StoreImplementation*>(db->s60Store);
     271    const Q =
     272            static_cast<const Q);
    251273    bool fontAdded = false;
    252274    for (int i = 0; i < numTypeFaces; i++) {
     
    274296            style->pixelSize(0, true);
    275297
    276             const QFontEngineS60Extensions *extension = store->extension(familyName);
    277             const QByteArray os2Table = extension->getSfntTable(MAKE_TAG('O', 'S', '/', '2'));
     298            const QSymbianTypeFaceExtras *typeFaceExtras =
     299                    dbExtras->extras(familyName, faceAttrib.IsBold(), faceAttrib.IsItalic());
     300            const QByteArray os2Table = typeFaceExtras->getSfntTable(MAKE_TAG('O', 'S', '/', '2'));
    278301            const unsigned char* data = reinterpret_cast<const unsigned char*>(os2Table.constData());
    279302            const unsigned char* ulUnicodeRange = data + 42;
     
    333356}
    334357
     358
     359
     360
     361
     362
    335363bool QFontDatabase::supportsThreadedFontRendering()
    336364{
     
    390418        request.family = fontFamily;
    391419#if defined(QT_NO_FREETYPE)
    392         const QFontDatabaseS60StoreImplementation *store =
    393                 static_cast<const QFontDatabaseS60StoreImplementation*>(db->s60Store);
    394         const QFontEngineS60Extensions *extension = store->extension(fontFamily);
    395         fe = new QFontEngineS60(request, extension);
     420        const QSymbianFontDatabaseExtrasImplementation *dbExtras =
     421                static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
     422        const QSymbianTypeFaceExtras *typeFaceExtras =
     423                dbExtras->extras(fontFamily, request.weight > QFont::Normal, request.style != QFont::StyleNormal);
     424        fe = new QFontEngineS60(request, typeFaceExtras);
    396425#else
    397426        QFontEngine::FaceId faceId;
Note: See TracChangeset for help on using the changeset viewer.