Mikołaj Zalewski : user32: Fix TabbedTextOut.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 3 08:57:09 CDT 2007


Module: wine
Branch: master
Commit: 521cba2bc7b9382580a41ac6b238196086205d73
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=521cba2bc7b9382580a41ac6b238196086205d73

Author: Mikołaj Zalewski <mikolaj at zalewski.pl>
Date:   Wed May  2 20:30:43 2007 +0200

user32: Fix TabbedTextOut.

The TEXT_TabbedTextOut didn't set correctly the text starting point
(x0) for left-aligned tabs and was ignoring the last tab. I've also
changed GetTextMetricsA to W as this should be slightly faster.

---

 dlls/user32/text.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/dlls/user32/text.c b/dlls/user32/text.c
index cd1cc75..ab099fc 100644
--- a/dlls/user32/text.c
+++ b/dlls/user32/text.c
@@ -1248,8 +1248,8 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
     }
     else
     {
-        TEXTMETRICA tm;
-        GetTextMetricsA( hdc, &tm );
+        TEXTMETRICW tm;
+        GetTextMetricsW( hdc, &tm );
         defWidth = 8 * tm.tmAveCharWidth;
     }
 
@@ -1270,12 +1270,13 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
         /* and if there is a <tab>, calculate its position */
         if( i) {
             /* get x coordinate for the drawing of this string */
-            for (; cTabStops > i; lpTabPos++, cTabStops--)
+            for (; cTabStops >= i; lpTabPos++, cTabStops--)
             {
                 if( nTabOrg + abs( *lpTabPos) > x) {
                     if( lpTabPos[ i - 1] >= 0) {
                         /* a left aligned tab */
-                        x = nTabOrg + lpTabPos[ i-1] + extent.cx;
+                        x0 = nTabOrg + lpTabPos[i-1];
+                        x = x0 + extent.cx;
                         break;
                     }
                     else
@@ -1294,10 +1295,10 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
             }
             /* if we have run out of tab stops and we have a valid default tab
              * stop width then round x up to that width */
-            if ((cTabStops <= i) && (defWidth > 0)) {
+            if ((cTabStops < i) && (defWidth > 0)) {
                 x0 = nTabOrg + ((x - nTabOrg) / defWidth + i) * defWidth;
                 x = x0 + extent.cx;
-            } else if ((cTabStops <= i) && (defWidth < 0)) {
+            } else if ((cTabStops < i) && (defWidth < 0)) {
                 x = nTabOrg + ((x - nTabOrg + extent.cx) / -defWidth + i)
                     * -defWidth;
                 x0 = x - extent.cx;




More information about the wine-cvs mailing list