diff options
author | Alessandro Portale <alessandro.portale@nokia.com> | 2009-11-10 17:08:21 (GMT) |
---|---|---|
committer | David Boddie <dboddie@trolltech.com> | 2009-11-11 17:34:38 (GMT) |
commit | 9e716e632db24f040fa26c9250d5471307e1f4c1 (patch) | |
tree | 88ca29123023fc8f3007edc301db1c16857765d3 /src | |
parent | 2e582bf83d04f8eedf36c2bd910055b75ff5a827 (diff) | |
download | Qt-9e716e632db24f040fa26c9250d5471307e1f4c1.zip Qt-9e716e632db24f040fa26c9250d5471307e1f4c1.tar.gz Qt-9e716e632db24f040fa26c9250d5471307e1f4c1.tar.bz2 |
Qt covers BC break in Symbian
Workaround: fntstore.h has an inlined function
'COpenFont* CBitmapFont::OpenFont()' that returns a private data member.
The header will change between minor SDK versions, thus break BC. But
Qt has to build on any SDK version and run on other versions of Symbian
OS. Also Qt does not want to deliver that BC to Qt based apps.
This hack performs the needed pointer arithmetic to get the right
COpenFont* pointer, no matter if the 'Flexible Memory Model' is already
supported or not.
The author is not proud of this commit.
Task-number: QT-2250
Reviewed-by: Iain
Reviewed-by: Shane Kearns
modified: src/gui/text/qfontdatabase_s60.cpp
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/text/qfontdatabase_s60.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp index 1a6bb11..ca5be0e 100644 --- a/src/gui/text/qfontdatabase_s60.cpp +++ b/src/gui/text/qfontdatabase_s60.cpp @@ -136,6 +136,23 @@ QFontDatabaseS60StoreImplementation::~QFontDatabaseS60StoreImplementation() m_heap->Close(); } +#ifndef FNTSTORE_H_INLINES_SUPPORT_FMM +/* + Workaround: fntstore.h has an inlined function 'COpenFont* CBitmapFont::OpenFont()' + that returns a private data member. The header will change between SDKs. But Qt has + to build on any SDK version and run on other versions of Symbian OS. + This function performs the needed pointer arithmetic to get the right COpenFont* +*/ +COpenFont* OpenFontFromBitmapFont(const CBitmapFont* aBitmapFont) +{ + const TInt offsetIOpenFont = 92; // '_FOFF(CBitmapFont, iOpenFont)' ..if iOpenFont weren't private + const TUint valueIOpenFont = *(TUint*)PtrAdd(aBitmapFont, offsetIOpenFont); + return (valueIOpenFont & 1) ? + (COpenFont*)PtrAdd(aBitmapFont, valueIOpenFont & ~1) : // New behavior: iOpenFont is offset + (COpenFont*)valueIOpenFont; // Old behavior: iOpenFont is pointer +} +#endif // FNTSTORE_H_INLINES_SUPPORT_FMM + const QFontEngineS60Extensions *QFontDatabaseS60StoreImplementation::extension(const QString &typeface) const { if (!m_extensions.contains(typeface)) { @@ -144,8 +161,14 @@ const QFontEngineS60Extensions *QFontDatabaseS60StoreImplementation::extension(c spec.iHeight = 1; const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, spec); Q_ASSERT(err == KErrNone && font); - CBitmapFont *bitmapFont = static_cast<CBitmapFont*>(font); - m_extensions.insert(typeface, new QFontEngineS60Extensions(font, bitmapFont->OpenFont())); + const CBitmapFont *bitmapFont = static_cast<CBitmapFont*>(font); + COpenFont *openFont = +#ifdef FNTSTORE_H_INLINES_SUPPORT_FMM + bitmapFont->openFont(); +#else + OpenFontFromBitmapFont(bitmapFont); +#endif // FNTSTORE_H_INLINES_SUPPORT_FMM + m_extensions.insert(typeface, new QFontEngineS60Extensions(font, openFont)); } return m_extensions.value(typeface); } |