Authors: Huw D M Davies <hdavies@codeweavers.com>, Charles Loep <charles@codeweavers.com>

Various fixes for gdi font handling code including:
- Using TTs VDMX table to ensure that we get exactly that same size
  font that Windows uses.
- Fixes to many members of the metrics structures.
- Font cache.
- Rotated text support.
- Support for GGO_GRAY?_BITMAP (ready for anti-aliased text).
- Support for GGO_NATIVE.
This commit is contained in:
Alexandre Julliard 2002-01-29 03:02:50 +00:00
parent ba7ccc4cc6
commit 18d7573c5e
9 changed files with 1043 additions and 289 deletions

287
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -419,6 +419,10 @@ else
freetype/ttnameid.h \
freetype/ftoutln.h \
freetype/internal/sfnt.h)
AC_TRY_CPP([#include <ft2build.h>
#include <freetype/fttrigon.h>],
AC_DEFINE(HAVE_FREETYPE_FTTRIGON_H, 1,
[Define if you have the <freetype/fttrigon.h> header file.]))
CPPFLAGS="$ac_save_CPPFLAGS"
wine_cv_msg_freetype=no
fi

File diff suppressed because it is too large Load Diff

View File

@ -475,6 +475,9 @@
/* Define if FreeType 2 is installed */
#undef HAVE_FREETYPE
/* Define if you have the <freetype/fttrigon.h> header file. */
#undef HAVE_FREETYPE_FTTRIGON_H
/* Define if we can use ppdev.h for parallel port access */
#undef HAVE_PPDEV

View File

@ -73,9 +73,8 @@ extern void FONT_EnumLogFontEx16ToW(const ENUMLOGFONTEX16*, LPENUMLOGFONTEXW);
extern LPWSTR FONT_mbtowc(HDC, LPCSTR, INT, INT*, UINT*);
extern DWORD WineEngAddRefFont(GdiFont);
extern GdiFont WineEngCreateFontInstance(HFONT);
extern DWORD WineEngDecRefFont(GdiFont);
extern BOOL WineEngDestroyFontInstance(HFONT handle);
extern DWORD WineEngEnumFonts(LPLOGFONTW, DEVICEFONTENUMPROC, LPARAM);
extern BOOL WineEngGetCharWidth(GdiFont, UINT, UINT, LPINT);
extern DWORD WineEngGetFontData(GdiFont, DWORD, DWORD, LPVOID, DWORD);

View File

@ -521,4 +521,6 @@ extern void CLIPPING_UpdateGCRegion( DC * dc );
/* objects/enhmetafile.c */
extern HENHMETAFILE EMF_Create_HENHMETAFILE(ENHMETAHEADER *emh, BOOL on_disk );
#define WINE_GGO_GRAY16_BITMAP 0x7f
#endif /* __WINE_GDI_H */

View File

@ -316,7 +316,6 @@ HDC16 WINAPI GetDCState16( HDC16 hdc )
newdc->hClipRgn = 0;
if(dc->gdiFont) {
WineEngAddRefFont(dc->gdiFont);
newdc->gdiFont = dc->gdiFont;
} else
newdc->gdiFont = 0;
@ -775,7 +774,6 @@ BOOL WINAPI DeleteDC( HDC hdc )
if (dc->hClipRgn) DeleteObject( dc->hClipRgn );
if (dc->hVisRgn) DeleteObject( dc->hVisRgn );
if (dc->hGCClipRgn) DeleteObject( dc->hGCClipRgn );
if (dc->gdiFont) WineEngDecRefFont( dc->gdiFont );
PATH_DestroyGdiPath(&dc->path);
GDI_FreeObject( hdc, dc );

View File

@ -1648,7 +1648,33 @@ BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
BOOL WINAPI GetCharABCWidthsA(HDC hdc, UINT firstChar, UINT lastChar,
LPABC abc )
{
return GetCharABCWidthsW( hdc, firstChar, lastChar, abc );
INT i, wlen, count = (INT)(lastChar - firstChar + 1);
LPSTR str;
LPWSTR wstr;
BOOL ret = TRUE;
if(count <= 0) return FALSE;
str = HeapAlloc(GetProcessHeap(), 0, count);
for(i = 0; i < count; i++)
str[i] = (BYTE)(firstChar + i);
wstr = FONT_mbtowc(hdc, str, count, &wlen, NULL);
for(i = 0; i < wlen; i++)
{
if(!GetCharABCWidthsW(hdc, wstr[i], wstr[i], abc))
{
ret = FALSE;
break;
}
abc++;
}
HeapFree(GetProcessHeap(), 0, str);
HeapFree(GetProcessHeap(), 0, wstr);
return ret;
}
@ -1671,20 +1697,22 @@ BOOL WINAPI GetCharABCWidthsA(HDC hdc, UINT firstChar, UINT lastChar,
BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar,
LPABC abc )
{
DC *dc = DC_GetDCPtr(hdc);
int i;
LPINT widths = HeapAlloc(GetProcessHeap(),0,(lastChar-firstChar+1)*sizeof(INT));
GLYPHMETRICS gm;
BOOL ret = FALSE;
FIXME("(%04x,%04x,%04x,%p), returns slightly bogus values.\n", hdc, firstChar, lastChar, abc);
GetCharWidth32A(hdc,firstChar,lastChar,widths);
for (i=firstChar;i<=lastChar;i++) {
abc[i-firstChar].abcA = 0; /* left distance */
abc[i-firstChar].abcB = widths[i-firstChar];/* width */
abc[i-firstChar].abcC = 0; /* right distance */
if(dc->gdiFont) {
for (i=firstChar;i<=lastChar;i++) {
GetGlyphOutlineW(hdc, i, GGO_METRICS, &gm, 0, NULL, NULL);
abc[i-firstChar].abcA = gm.gmptGlyphOrigin.x;
abc[i-firstChar].abcB = gm.gmBlackBoxX;
abc[i-firstChar].abcC = gm.gmCellIncX - gm.gmptGlyphOrigin.x - gm.gmBlackBoxX;
}
ret = TRUE;
}
HeapFree(GetProcessHeap(),0,widths);
return TRUE;
GDI_ReleaseObj(hdc);
return ret;
}
@ -1708,8 +1736,20 @@ DWORD WINAPI GetGlyphOutlineA( HDC hdc, UINT uChar, UINT fuFormat,
LPGLYPHMETRICS lpgm, DWORD cbBuffer,
LPVOID lpBuffer, const MAT2 *lpmat2 )
{
return GetGlyphOutlineW(hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer,
lpmat2);
LPWSTR p = NULL;
DWORD ret;
UINT c;
if(!(fuFormat & GGO_GLYPH_INDEX)) {
p = FONT_mbtowc(hdc, (char*)&uChar, 1, NULL, NULL);
c = p[0];
} else
c = uChar;
ret = GetGlyphOutlineW(hdc, c, fuFormat, lpgm, cbBuffer, lpBuffer,
lpmat2);
if(p)
HeapFree(GetProcessHeap(), 0, p);
return ret;
}
/***********************************************************************

View File

@ -449,6 +449,17 @@ void GDI_CheckNotLock(void)
}
/***********************************************************************
* FONT_DeleteObject
*
*/
static BOOL FONT_DeleteObject(HGDIOBJ hfont, FONTOBJ *fontobj)
{
WineEngDestroyFontInstance( hfont );
return GDI_FreeObject( hfont, fontobj );
}
/***********************************************************************
* DeleteObject (GDI.69)
* SysDeleteObject (GDI.605)
@ -495,7 +506,7 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
{
case PEN_MAGIC: return GDI_FreeObject( obj, header );
case BRUSH_MAGIC: return BRUSH_DeleteObject( obj, (BRUSHOBJ*)header );
case FONT_MAGIC: return GDI_FreeObject( obj, header );
case FONT_MAGIC: return FONT_DeleteObject( obj, (FONTOBJ*)header );
case PALETTE_MAGIC: return PALETTE_DeleteObject(obj,(PALETTEOBJ*)header);
case BITMAP_MAGIC: return BITMAP_DeleteObject( obj, (BITMAPOBJ*)header);
case REGION_MAGIC: return REGION_DeleteObject( obj, (RGNOBJ*)header );
@ -752,19 +763,15 @@ static HGDIOBJ FONT_SelectObject(DC *dc, HGDIOBJ hFont)
{
HGDIOBJ ret = FALSE;
if(dc->gdiFont) {
WineEngDecRefFont(dc->gdiFont);
dc->gdiFont = 0;
if(dc->hFont != hFont || dc->gdiFont == NULL) {
if(GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_VA_ABLE)
dc->gdiFont = WineEngCreateFontInstance(hFont);
}
if(GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_VA_ABLE)
dc->gdiFont = WineEngCreateFontInstance(hFont);
if(dc->funcs->pSelectObject)
ret = dc->funcs->pSelectObject(dc, hFont);
if(ret && dc->gdiFont) {
WineEngDecRefFont(dc->gdiFont);
dc->gdiFont = 0;
}