Commit bc710312 authored by Huw Davies's avatar Huw Davies Committed by Alexandre Julliard

Proper handling of SetTextCharacterExtra.

parent 6d886a52
...@@ -85,7 +85,9 @@ INT MFDRV_SetTextJustification( PHYSDEV dev, INT extra, INT breaks ) ...@@ -85,7 +85,9 @@ INT MFDRV_SetTextJustification( PHYSDEV dev, INT extra, INT breaks )
INT MFDRV_SetTextCharacterExtra( PHYSDEV dev, INT extra ) INT MFDRV_SetTextCharacterExtra( PHYSDEV dev, INT extra )
{ {
return MFDRV_MetaParam1( dev, META_SETTEXTCHAREXTRA, extra ); if(!MFDRV_MetaParam1( dev, META_SETTEXTCHAREXTRA, extra ))
return 0x80000000;
return TRUE;
} }
DWORD MFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags ) DWORD MFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
......
...@@ -95,6 +95,8 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR ...@@ -95,6 +95,8 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR
WORD *glyphs = NULL; WORD *glyphs = NULL;
DC *dc = physDev->dc; DC *dc = physDev->dc;
UINT align = GetTextAlign( physDev->hdc ); UINT align = GetTextAlign( physDev->hdc );
INT char_extra;
INT *deltas = NULL;
if (!count) if (!count)
return TRUE; return TRUE;
...@@ -125,7 +127,27 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR ...@@ -125,7 +127,27 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR
else else
GetTextExtentPoint32W(physDev->hdc, str, count, &sz); GetTextExtentPoint32W(physDev->hdc, str, count, &sz);
if(lpDx) { if((char_extra = GetTextCharacterExtra(physDev->hdc)) != 0) {
INT i;
SIZE tmpsz;
deltas = HeapAlloc(GetProcessHeap(), 0, count * sizeof(INT));
for(i = 0; i < count; i++) {
deltas[i] = char_extra;
if(lpDx)
deltas[i] += lpDx[i];
else {
if(physDev->font.fontloc == Download)
GetTextExtentPointI(physDev->hdc, glyphs + i, 1, &tmpsz);
else
GetTextExtentPoint32W(physDev->hdc, str + i, 1, &tmpsz);
deltas[i] += tmpsz.cx;
}
}
} else if(lpDx)
deltas = (INT*)lpDx;
if(deltas) {
SIZE tmpsz; SIZE tmpsz;
INT i; INT i;
/* Get the width of the last char and add on all the offsets */ /* Get the width of the last char and add on all the offsets */
...@@ -134,7 +156,7 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR ...@@ -134,7 +156,7 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR
else else
GetTextExtentPoint32W(physDev->hdc, str + count - 1, 1, &tmpsz); GetTextExtentPoint32W(physDev->hdc, str + count - 1, 1, &tmpsz);
for(i = 0; i < count-1; i++) for(i = 0; i < count-1; i++)
tmpsz.cx += lpDx[i]; tmpsz.cx += deltas[i];
sz.cx = tmpsz.cx; /* sz.cy remains untouched */ sz.cx = tmpsz.cx; /* sz.cy remains untouched */
} }
...@@ -201,7 +223,7 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR ...@@ -201,7 +223,7 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR
PSDRV_WriteMoveTo(physDev, x, y); PSDRV_WriteMoveTo(physDev, x, y);
if(!lpDx) { if(!deltas) {
if(physDev->font.fontloc == Download) if(physDev->font.fontloc == Download)
PSDRV_WriteDownloadGlyphShow(physDev, glyphs, count); PSDRV_WriteDownloadGlyphShow(physDev, glyphs, count);
else else
...@@ -213,13 +235,13 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR ...@@ -213,13 +235,13 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR
float cos_theta = cos(physDev->font.escapement * M_PI / 1800.0); float cos_theta = cos(physDev->font.escapement * M_PI / 1800.0);
float sin_theta = sin(physDev->font.escapement * M_PI / 1800.0); float sin_theta = sin(physDev->font.escapement * M_PI / 1800.0);
for(i = 0; i < count-1; i++) { for(i = 0; i < count-1; i++) {
TRACE("lpDx[%d] = %d\n", i, lpDx[i]); TRACE("lpDx[%d] = %d\n", i, deltas[i]);
if(physDev->font.fontloc == Download) if(physDev->font.fontloc == Download)
PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1); PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1);
else else
PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1); PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1);
dx += lpDx[i] * cos_theta; dx += deltas[i] * cos_theta;
dy -= lpDx[i] * sin_theta; dy -= deltas[i] * sin_theta;
PSDRV_WriteMoveTo(physDev, x + INTERNAL_XWSTODS(dc, dx), PSDRV_WriteMoveTo(physDev, x + INTERNAL_XWSTODS(dc, dx),
y + INTERNAL_YWSTODS(dc, dy)); y + INTERNAL_YWSTODS(dc, dy));
} }
...@@ -227,6 +249,8 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR ...@@ -227,6 +249,8 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR
PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1); PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1);
else else
PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1); PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1);
if(deltas != lpDx)
HeapFree(GetProcessHeap(), 0, deltas);
} }
/* /*
......
...@@ -317,10 +317,12 @@ HFONT WINAPI CreateFontIndirectW( const LOGFONTW *plf ) ...@@ -317,10 +317,12 @@ HFONT WINAPI CreateFontIndirectW( const LOGFONTW *plf )
{ {
memcpy( &fontPtr->logfont, plf, sizeof(LOGFONTW) ); memcpy( &fontPtr->logfont, plf, sizeof(LOGFONTW) );
TRACE("(%ld %ld %ld %ld %x) %s %s %s => %04x\n", TRACE("(%ld %ld %ld %ld %x %d %x %d %d) %s %s %s => %04x\n",
plf->lfHeight, plf->lfWidth, plf->lfHeight, plf->lfWidth,
plf->lfEscapement, plf->lfOrientation, plf->lfEscapement, plf->lfOrientation,
plf->lfPitchAndFamily, plf->lfPitchAndFamily,
plf->lfOutPrecision, plf->lfClipPrecision,
plf->lfQuality, plf->lfCharSet,
debugstr_w(plf->lfFaceName), debugstr_w(plf->lfFaceName),
plf->lfWeight > 400 ? "Bold" : "", plf->lfWeight > 400 ? "Bold" : "",
plf->lfItalic ? "Italic" : "", hFont); plf->lfItalic ? "Italic" : "", hFont);
...@@ -766,9 +768,8 @@ INT WINAPI GetTextCharacterExtra( HDC hdc ) ...@@ -766,9 +768,8 @@ INT WINAPI GetTextCharacterExtra( HDC hdc )
{ {
INT ret; INT ret;
DC *dc = DC_GetDCPtr( hdc ); DC *dc = DC_GetDCPtr( hdc );
if (!dc) return 0; if (!dc) return 0x80000000;
ret = abs( (dc->charExtra * dc->wndExtX + dc->vportExtX / 2) ret = dc->charExtra;
/ dc->vportExtX );
GDI_ReleaseObj( hdc ); GDI_ReleaseObj( hdc );
return ret; return ret;
} }
...@@ -781,14 +782,13 @@ INT WINAPI SetTextCharacterExtra( HDC hdc, INT extra ) ...@@ -781,14 +782,13 @@ INT WINAPI SetTextCharacterExtra( HDC hdc, INT extra )
{ {
INT prev; INT prev;
DC * dc = DC_GetDCPtr( hdc ); DC * dc = DC_GetDCPtr( hdc );
if (!dc) return 0; if (!dc) return 0x80000000;
if (dc->funcs->pSetTextCharacterExtra) if (dc->funcs->pSetTextCharacterExtra)
prev = dc->funcs->pSetTextCharacterExtra( dc->physDev, extra ); prev = dc->funcs->pSetTextCharacterExtra( dc->physDev, extra );
else else
{ {
extra = (extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX; prev = dc->charExtra;
prev = (dc->charExtra * dc->wndExtX + dc->vportExtX / 2) / dc->vportExtX; dc->charExtra = extra;
dc->charExtra = abs(extra);
} }
GDI_ReleaseObj( hdc ); GDI_ReleaseObj( hdc );
return prev; return prev;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment