Fix a few font problems with rotated text and non MM_TEXT mapping
modes. Do slightly better with the FF_ flags in WineEngGetTextMetrics.
This commit is contained in:
parent
43b62092a0
commit
afd519be0e
@ -676,6 +676,7 @@ static LONG load_VDMX(GdiFont font, LONG height)
|
|||||||
numRecs = GET_BE_WORD(&hdr[2]);
|
numRecs = GET_BE_WORD(&hdr[2]);
|
||||||
numRatios = GET_BE_WORD(&hdr[4]);
|
numRatios = GET_BE_WORD(&hdr[4]);
|
||||||
|
|
||||||
|
TRACE("numRecs = %d numRatios = %d\n", numRecs, numRatios);
|
||||||
for(i = 0; i < numRatios; i++) {
|
for(i = 0; i < numRatios; i++) {
|
||||||
Ratios ratio;
|
Ratios ratio;
|
||||||
|
|
||||||
@ -784,7 +785,7 @@ static LONG load_VDMX(GdiFont font, LONG height)
|
|||||||
* WineEngCreateFontInstance
|
* WineEngCreateFontInstance
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
GdiFont WineEngCreateFontInstance(HFONT hfont)
|
GdiFont WineEngCreateFontInstance(DC *dc, HFONT hfont)
|
||||||
{
|
{
|
||||||
GdiFont ret;
|
GdiFont ret;
|
||||||
Face *face;
|
Face *face;
|
||||||
@ -893,7 +894,14 @@ not_found:
|
|||||||
TRACE("Choosen %s %s\n", debugstr_w(family->FamilyName),
|
TRACE("Choosen %s %s\n", debugstr_w(family->FamilyName),
|
||||||
debugstr_w(face->StyleName));
|
debugstr_w(face->StyleName));
|
||||||
|
|
||||||
ret->ft_face = OpenFontFile(ret, face->file, plf->lfHeight);
|
ret->ft_face = OpenFontFile(ret, face->file,
|
||||||
|
INTERNAL_YWSTODS(dc,plf->lfHeight));
|
||||||
|
if (!ret->ft_face)
|
||||||
|
{
|
||||||
|
GDI_ReleaseObj(hfont);
|
||||||
|
free_font( ret );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if(ret->charset == SYMBOL_CHARSET)
|
if(ret->charset == SYMBOL_CHARSET)
|
||||||
pFT_Select_Charmap(ret->ft_face, ft_encoding_symbol);
|
pFT_Select_Charmap(ret->ft_face, ft_encoding_symbol);
|
||||||
@ -959,7 +967,11 @@ static void GetEnumStructs(Face *face, LPENUMLOGFONTEXW pelf,
|
|||||||
UINT size;
|
UINT size;
|
||||||
GdiFont font = alloc_font();
|
GdiFont font = alloc_font();
|
||||||
|
|
||||||
font->ft_face = OpenFontFile(font, face->file, 100);
|
if (!(font->ft_face = OpenFontFile(font, face->file, 100)))
|
||||||
|
{
|
||||||
|
free_font(font);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&pelf->elfLogFont, 0, sizeof(LOGFONTW));
|
memset(&pelf->elfLogFont, 0, sizeof(LOGFONTW));
|
||||||
|
|
||||||
@ -1476,8 +1488,39 @@ BOOL WineEngGetTextMetrics(GdiFont font, LPTEXTMETRICW ptm)
|
|||||||
ptm->tmUnderlined = 0; /* entry in OS2 table */
|
ptm->tmUnderlined = 0; /* entry in OS2 table */
|
||||||
ptm->tmStruckOut = 0; /* entry in OS2 table */
|
ptm->tmStruckOut = 0; /* entry in OS2 table */
|
||||||
|
|
||||||
/* Yes this is correct; braindead api */
|
/* Yes TPMF_FIXED_PITCH is correct; braindead api */
|
||||||
ptm->tmPitchAndFamily = FT_IS_FIXED_WIDTH(ft_face) ? 0 : TMPF_FIXED_PITCH;
|
if(!FT_IS_FIXED_WIDTH(ft_face))
|
||||||
|
ptm->tmPitchAndFamily = TMPF_FIXED_PITCH;
|
||||||
|
else
|
||||||
|
ptm->tmPitchAndFamily = 0;
|
||||||
|
|
||||||
|
switch(pOS2->panose[PAN_FAMILYTYPE_INDEX]) {
|
||||||
|
case PAN_FAMILY_SCRIPT:
|
||||||
|
ptm->tmPitchAndFamily |= FF_SCRIPT;
|
||||||
|
break;
|
||||||
|
case PAN_FAMILY_DECORATIVE:
|
||||||
|
case PAN_FAMILY_PICTORIAL:
|
||||||
|
ptm->tmPitchAndFamily |= FF_DECORATIVE;
|
||||||
|
break;
|
||||||
|
case PAN_FAMILY_TEXT_DISPLAY:
|
||||||
|
if(ptm->tmPitchAndFamily == 0) /* fixed */
|
||||||
|
ptm->tmPitchAndFamily = FF_MODERN;
|
||||||
|
else {
|
||||||
|
switch(pOS2->panose[PAN_SERIFSTYLE_INDEX]) {
|
||||||
|
case PAN_SERIF_NORMAL_SANS:
|
||||||
|
case PAN_SERIF_OBTUSE_SANS:
|
||||||
|
case PAN_SERIF_PERP_SANS:
|
||||||
|
ptm->tmPitchAndFamily |= FF_SWISS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ptm->tmPitchAndFamily |= FF_ROMAN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ptm->tmPitchAndFamily |= FF_DONTCARE;
|
||||||
|
}
|
||||||
|
|
||||||
if(FT_IS_SCALABLE(ft_face))
|
if(FT_IS_SCALABLE(ft_face))
|
||||||
ptm->tmPitchAndFamily |= TMPF_VECTOR;
|
ptm->tmPitchAndFamily |= TMPF_VECTOR;
|
||||||
if(FT_IS_SFNT(ft_face))
|
if(FT_IS_SFNT(ft_face))
|
||||||
@ -1726,7 +1769,7 @@ BOOL WineEngInit(void)
|
|||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
GdiFont WineEngCreateFontInstance(HFONT hfont)
|
GdiFont WineEngCreateFontInstance(DC *dc, HFONT hfont)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -578,6 +578,8 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
|||||||
|
|
||||||
GetTextMetricsW(hdc, &tm);
|
GetTextMetricsW(hdc, &tm);
|
||||||
|
|
||||||
|
tm.tmAscent = INTERNAL_YWSTODS(dc, tm.tmAscent);
|
||||||
|
tm.tmDescent = INTERNAL_YWSTODS(dc, tm.tmDescent);
|
||||||
switch( dc->textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) ) {
|
switch( dc->textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) ) {
|
||||||
case TA_LEFT:
|
case TA_LEFT:
|
||||||
if (dc->textAlign & TA_UPDATECP) {
|
if (dc->textAlign & TA_UPDATECP) {
|
||||||
@ -775,7 +777,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
|||||||
(unsigned short *)wstr + idx, 1);
|
(unsigned short *)wstr + idx, 1);
|
||||||
offset += INTERNAL_XWSTODS(dc, lpDx[idx]);
|
offset += INTERNAL_XWSTODS(dc, lpDx[idx]);
|
||||||
xoff = offset * cosEsc;
|
xoff = offset * cosEsc;
|
||||||
yoff = offset * sinEsc;
|
yoff = offset * -sinEsc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ extern void FONT_EnumLogFontEx16ToW(const ENUMLOGFONTEX16*, LPENUMLOGFONTEXW);
|
|||||||
|
|
||||||
extern LPWSTR FONT_mbtowc(HDC, LPCSTR, INT, INT*, UINT*);
|
extern LPWSTR FONT_mbtowc(HDC, LPCSTR, INT, INT*, UINT*);
|
||||||
|
|
||||||
extern GdiFont WineEngCreateFontInstance(HFONT);
|
extern GdiFont WineEngCreateFontInstance(DC*, HFONT);
|
||||||
extern BOOL WineEngDestroyFontInstance(HFONT handle);
|
extern BOOL WineEngDestroyFontInstance(HFONT handle);
|
||||||
extern DWORD WineEngEnumFonts(LPLOGFONTW, DEVICEFONTENUMPROC, LPARAM);
|
extern DWORD WineEngEnumFonts(LPLOGFONTW, DEVICEFONTENUMPROC, LPARAM);
|
||||||
extern BOOL WineEngGetCharWidth(GdiFont, UINT, UINT, LPINT);
|
extern BOOL WineEngGetCharWidth(GdiFont, UINT, UINT, LPINT);
|
||||||
|
@ -1153,7 +1153,7 @@ static HGDIOBJ FONT_SelectObject(DC *dc, HGDIOBJ hFont)
|
|||||||
|
|
||||||
if(dc->hFont != hFont || dc->gdiFont == NULL) {
|
if(dc->hFont != hFont || dc->gdiFont == NULL) {
|
||||||
if(GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_VA_ABLE)
|
if(GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_VA_ABLE)
|
||||||
dc->gdiFont = WineEngCreateFontInstance(hFont);
|
dc->gdiFont = WineEngCreateFontInstance(dc, hFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dc->funcs->pSelectFont)
|
if(dc->funcs->pSelectFont)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user