gdi32: Fix text justification to properly handle logical coordinates.

This commit is contained in:
Alexandre Julliard 2012-12-11 16:52:43 +01:00
parent 91ebca2bf1
commit 351e58318a
3 changed files with 43 additions and 23 deletions

View file

@ -1189,7 +1189,7 @@ BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count,
/* Perform device size to world size transformations. */
if (ret)
{
INT extra = dc->charExtra,
INT extra = abs(INTERNAL_XWSTODS(dc, dc->charExtra)),
breakExtra = dc->breakExtra,
breakRem = dc->breakRem,
i;
@ -1198,7 +1198,6 @@ BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count,
{
for (i = 0; i < count; ++i)
{
dxs[i] = abs(INTERNAL_XDSTOWS(dc, dxs[i]));
dxs[i] += (i+1) * extra;
if (count > 1 && (breakExtra || breakRem) && str[i] == tm.tmBreakChar)
{
@ -1209,15 +1208,12 @@ BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count,
dxs[i]++;
}
}
dxs[i] = abs(INTERNAL_XDSTOWS(dc, dxs[i]));
if (dxs[i] <= maxExt)
++nFit;
}
breakRem = dc->breakRem;
}
size->cx = abs(INTERNAL_XDSTOWS(dc, size->cx));
size->cy = abs(INTERNAL_YDSTOWS(dc, size->cy));
if (!dxs && count > 1 && (breakExtra || breakRem))
else if (count > 1 && (breakExtra || breakRem))
{
for (i = 0; i < count; i++)
{
@ -1232,6 +1228,9 @@ BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count,
}
}
}
size->cx += count * extra;
size->cx = abs(INTERNAL_XDSTOWS(dc, size->cx));
size->cy = abs(INTERNAL_YDSTOWS(dc, size->cy));
}
if (lpnFit)

View file

@ -58,6 +58,7 @@ static void test_dc_values(void)
{
HDC hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
COLORREF color;
int extra;
ok( hdc != NULL, "CreateDC failed\n" );
color = SetBkColor( hdc, 0x12345678 );
@ -86,6 +87,18 @@ static void test_dc_values(void)
color = GetTextColor( hdc );
ok( color == 0, "wrong color %08x\n", color );
extra = GetTextCharacterExtra( hdc );
ok( extra == 0, "initial extra %d\n", extra );
SetTextCharacterExtra( hdc, 123 );
extra = GetTextCharacterExtra( hdc );
ok( extra == 123, "initial extra %d\n", extra );
SetMapMode( hdc, MM_LOMETRIC );
extra = GetTextCharacterExtra( hdc );
ok( extra == 123, "initial extra %d\n", extra );
SetMapMode( hdc, MM_TEXT );
extra = GetTextCharacterExtra( hdc );
ok( extra == 123, "initial extra %d\n", extra );
DeleteDC( hdc );
}

View file

@ -1753,18 +1753,17 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea)
{
INT y,
breakCount,
justifiedWidth = 0, /* to test GetTextExtentExPointW() */
areaWidth = clientArea->right - clientArea->left,
nErrors = 0, e;
BOOL lastExtent = FALSE;
PSTR pFirstChar, pLastChar;
SIZE size;
TEXTMETRICA tm;
struct err
{
char extent[100];
char *start;
int len;
int GetTextExtentExPointWWidth;
} error[10];
} error[20];
GetTextMetricsA(hdc, &tm);
y = clientArea->top;
@ -1803,18 +1802,16 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea)
{
SetTextJustification(hdc, areaWidth - size.cx, breakCount);
GetTextExtentPoint32(hdc, pFirstChar, pLastChar - pFirstChar, &size);
justifiedWidth = size.cx;
if (size.cx != areaWidth && nErrors < sizeof(error)/sizeof(error[0]) - 1)
{
error[nErrors].start = pFirstChar;
error[nErrors].len = pLastChar - pFirstChar;
error[nErrors].GetTextExtentExPointWWidth = size.cx;
nErrors++;
}
}
else lastExtent = TRUE;
/* catch errors and report them */
if (!lastExtent && (justifiedWidth != areaWidth))
{
memset(error[nErrors].extent, 0, 100);
memcpy(error[nErrors].extent, pFirstChar, pLastChar - pFirstChar);
error[nErrors].GetTextExtentExPointWWidth = justifiedWidth;
nErrors++;
}
trace( "%u %.*s\n", size.cx, (int)(pLastChar - pFirstChar), pFirstChar);
y += size.cy;
str = pLastChar;
@ -1825,8 +1822,8 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea)
/* The width returned by GetTextExtentPoint32() is exactly the same
returned by GetTextExtentExPointW() - see dlls/gdi32/font.c */
ok(error[e].GetTextExtentExPointWWidth == areaWidth,
"GetTextExtentPointW() for \"%s\" should have returned a width of %d, not %d.\n",
error[e].extent, areaWidth, error[e].GetTextExtentExPointWWidth);
"GetTextExtentPointW() for \"%.*s\" should have returned a width of %d, not %d.\n",
error[e].len, error[e].start, areaWidth, error[e].GetTextExtentExPointWWidth);
}
}
@ -1862,6 +1859,17 @@ static void test_SetTextJustification(void)
testJustification(hdc, testText, &clientArea);
SetMapMode( hdc, MM_ANISOTROPIC );
SetWindowExtEx( hdc, 2, 2, NULL );
GetClientRect( hwnd, &clientArea );
DPtoLP( hdc, (POINT *)&clientArea, 2 );
testJustification(hdc, testText, &clientArea);
SetViewportExtEx( hdc, 3, 3, NULL );
GetClientRect( hwnd, &clientArea );
DPtoLP( hdc, (POINT *)&clientArea, 2 );
testJustification(hdc, testText, &clientArea);
DeleteObject(hfont);
ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd);