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.
This commit is contained in:
Mikołaj Zalewski 2007-05-02 20:30:43 +02:00 committed by Alexandre Julliard
parent 7ca4e025e7
commit 521cba2bc7
1 changed files with 7 additions and 6 deletions

View File

@ -1248,8 +1248,8 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
} }
else else
{ {
TEXTMETRICA tm; TEXTMETRICW tm;
GetTextMetricsA( hdc, &tm ); GetTextMetricsW( hdc, &tm );
defWidth = 8 * tm.tmAveCharWidth; 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 */ /* and if there is a <tab>, calculate its position */
if( i) { if( i) {
/* get x coordinate for the drawing of this string */ /* 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( nTabOrg + abs( *lpTabPos) > x) {
if( lpTabPos[ i - 1] >= 0) { if( lpTabPos[ i - 1] >= 0) {
/* a left aligned tab */ /* a left aligned tab */
x = nTabOrg + lpTabPos[ i-1] + extent.cx; x0 = nTabOrg + lpTabPos[i-1];
x = x0 + extent.cx;
break; break;
} }
else 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 /* if we have run out of tab stops and we have a valid default tab
* stop width then round x up to that width */ * 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; x0 = nTabOrg + ((x - nTabOrg) / defWidth + i) * defWidth;
x = x0 + extent.cx; x = x0 + extent.cx;
} else if ((cTabStops <= i) && (defWidth < 0)) { } else if ((cTabStops < i) && (defWidth < 0)) {
x = nTabOrg + ((x - nTabOrg + extent.cx) / -defWidth + i) x = nTabOrg + ((x - nTabOrg + extent.cx) / -defWidth + i)
* -defWidth; * -defWidth;
x0 = x - extent.cx; x0 = x - extent.cx;