Fix bounding box of DirectWrite font engine
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Mon, 9 Jul 2012 12:14:36 +0000 (14:14 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 9 Jul 2012 13:55:49 +0000 (15:55 +0200)
Vertical bearings of the font were ignored, giving the wrong height.
Also, the left bearing is right bound in DirectWrite, so the sign
should be flipped.

Task-number: QTBUG-22649
Change-Id: I82934f5b08e68e46d1b2221b35008bf9d75c5748
Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp

index e90c6b6..3d10d5a 100644 (file)
@@ -434,6 +434,8 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::boundingBox(glyph_t g)
         QFixed rightSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.rightSideBearing);
         QFixed advanceHeight = DESIGN_TO_LOGICAL(glyphMetrics.advanceHeight);
         QFixed verticalOriginY = DESIGN_TO_LOGICAL(glyphMetrics.verticalOriginY);
+        QFixed topSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.topSideBearing);
+        QFixed bottomSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.bottomSideBearing);
 
         if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) {
             advanceWidth = advanceWidth.round();
@@ -441,10 +443,13 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::boundingBox(glyph_t g)
         }
 
         QFixed width = advanceWidth - leftSideBearing - rightSideBearing;
-
-        return glyph_metrics_t(-leftSideBearing, -verticalOriginY,
-                               width, m_ascent + m_descent,
-                               advanceWidth, advanceHeight);
+        QFixed height = advanceHeight - topSideBearing - bottomSideBearing;
+        return glyph_metrics_t(leftSideBearing,
+                               -verticalOriginY + topSideBearing,
+                               width,
+                               height,
+                               advanceWidth,
+                               advanceHeight);
     } else {
         qErrnoWarning("%s: GetDesignGlyphMetrics failed", __FUNCTION__);
     }