src/gui/text/qfontengine_s60.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- a/src/gui/text/qfontengine_s60.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/gui/text/qfontengine_s60.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -166,6 +166,11 @@
     return reinterpret_cast<const uchar *>(m_cmapTable.constData());
 }
 
+bool QSymbianTypeFaceExtras::isSymbolCMap() const
+{
+    return m_symbolCMap;
+}
+
 CFont *QSymbianTypeFaceExtras::fontOwner() const
 {
     return m_cFont;
@@ -256,7 +261,7 @@
     for (int i = 0; i < len; ++i) {
         const unsigned int uc = getChar(characters, i, len);
         *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap,
-        		isRtl ? QChar::mirroredChar(uc) : uc);
+                        (isRtl && !m_extras->isSymbolCMap()) ? QChar::mirroredChar(uc) : uc);
     }
 
     glyphs->numGlyphs = g - glyphs->glyphs;
@@ -345,7 +350,7 @@
     for (int i = 0; i < glyphs.numGlyphs; ++i)
         w += glyphs.effectiveAdvance(i);
 
-    return glyph_metrics_t(0, -ascent(), w, ascent()+descent()+1, w, 0);
+    return glyph_metrics_t(0, -ascent(), w - lastRightBearing(glyphs), ascent()+descent()+1, w, 0);
 }
 
 glyph_metrics_t QFontEngineS60::boundingBox_const(glyph_t glyph) const
@@ -374,7 +379,10 @@
 
 QFixed QFontEngineS60::ascent() const
 {
-    return m_originalFont->FontMaxAscent();
+    // Workaround for QTBUG-8013
+    // Stroke based fonts may return an incorrect FontMaxAscent of 0.
+    const QFixed ascent = m_originalFont->FontMaxAscent();
+    return (ascent > 0) ? ascent : QFixed::fromReal(m_originalFontSizeInPixels) - descent();
 }
 
 QFixed QFontEngineS60::descent() const