src/gui/text/qtextengine.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
--- a/src/gui/text/qtextengine.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/text/qtextengine.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -1042,7 +1042,7 @@
     QScriptItem &si = layoutData->items[item];
     si.glyph_data_offset = layoutData->used;
 
-    QFontEngine *fe = fontEngine(si, &si.ascent, &si.descent);
+    QFontEngine *fe = fontEngine(si, &si.ascent, &si.descent, &si.leading);
 
     QTextEngine::ShaperFlags flags;
     if (si.analysis.bidiLevel % 2)
@@ -1119,7 +1119,7 @@
 
     si.glyph_data_offset = layoutData->used;
 
-    QFontEngine *font = fontEngine(si, &si.ascent, &si.descent);
+    QFontEngine *font = fontEngine(si, &si.ascent, &si.descent, &si.leading);
 
     bool kerningEnabled = this->font(si).d->kerning;
 
@@ -1350,8 +1350,11 @@
                                             layoutData->items[item].position + block.position(), format);
         }
     } else if (layoutData->items[item].analysis.flags == QScriptAnalysis::Tab) {
-        // set up at least the ascent/descent of the script item for the tab
-        fontEngine(layoutData->items[item], &layoutData->items[item].ascent, &layoutData->items[item].descent);
+        // set up at least the ascent/descent/leading of the script item for the tab
+        fontEngine(layoutData->items[item],
+                   &layoutData->items[item].ascent,
+                   &layoutData->items[item].descent,
+                   &layoutData->items[item].leading);
     } else {
         shapeText(item);
     }
@@ -1737,7 +1740,7 @@
     return font;
 }
 
-QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFixed *descent) const
+QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFixed *descent, QFixed *leading) const
 {
     QFontEngine *engine = 0;
     QFontEngine *scaledEngine = 0;
@@ -1777,6 +1780,7 @@
     if (ascent) {
         *ascent = engine->ascent();
         *descent = engine->descent();
+        *leading = engine->leading();
     }
 
     if (scaledEngine)
@@ -2009,8 +2013,12 @@
         e = eng->fnt.d->engineForScript(QUnicodeTables::Common);
     }
 
-    ascent = qMax(ascent, e->ascent());
-    descent = qMax(descent, e->descent());
+    QFixed other_ascent = e->ascent();
+    QFixed other_descent = e->descent();
+    QFixed other_leading = e->leading();
+    leading = qMax(leading + ascent, other_leading + other_ascent) - qMax(ascent, other_ascent);
+    ascent = qMax(ascent, other_ascent);
+    descent = qMax(descent, other_descent);
 }
 
 QTextEngine::LayoutData::LayoutData()