Change FONTOBJ to use LOGFONTW

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Feb 14 05:49:08 CST 2001


I hope there aren't any 16bit programs that rely on the layout of
FONTOBJ; if there are, I declare them broken.

While this updates gdi itself, the drivers (in particular x11drv)
still live in a LOGFONT16 world for now.

	Huw D M Davies <hdavies at codeweavers.com>
	Change FONTOBJ to use LOGFONTW rather than LOGFONT16.
	Updated parameters of DEVICEFONTENUMPROC.
-- 
   Dr. Huw D M Davies              | Clarendon Laboratory
   h.davies1 at physics.ox.ac.uk      | Parks Road
   Tel: +44 1865 272390            | Oxford OX1 3PU
   Fax: +44 1865 272400            | UK
-------------- next part --------------
Index: dlls/wineps/font.c
===================================================================
RCS file: /home/wine/wine/dlls/wineps/font.c,v
retrieving revision 1.6
diff -u -r1.6 font.c
--- dlls/wineps/font.c	2001/02/12 03:37:52	1.6
+++ dlls/wineps/font.c	2001/02/14 10:45:48
@@ -18,11 +18,11 @@
  *           PSDRV_FONT_SelectObject
  */
 HFONT16 PSDRV_FONT_SelectObject( DC * dc, HFONT16 hfont,
-                                        FONTOBJ *font )
+				 FONTOBJ *font )
 {
     HFONT16 prevfont = dc->hFont;
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
-    LOGFONT16 *lf = &(font->logfont);
+    LOGFONTW *lf = &(font->logfont);
     BOOL bd = FALSE, it = FALSE;
     AFMLISTENTRY *afmle;
     AFM *afm;
@@ -30,8 +30,9 @@
     char FaceName[LF_FACESIZE];
 
 
-    TRACE("FaceName = '%s' Height = %d Italic = %d Weight = %d\n",
-	  lf->lfFaceName, lf->lfHeight, lf->lfItalic, lf->lfWeight);
+    TRACE("FaceName = '%s' Height = %ld Italic = %d Weight = %ld\n",
+	  debugstr_w(lf->lfFaceName), lf->lfHeight, lf->lfItalic,
+	  lf->lfWeight);
 
     dc->hFont = hfont;
 
@@ -39,7 +40,8 @@
         it = TRUE;
     if(lf->lfWeight > 550)
         bd = TRUE;
-    strcpy(FaceName, lf->lfFaceName);
+    WideCharToMultiByte(CP_ACP, 0, lf->lfFaceName, -1,
+			FaceName, sizeof(FaceName), NULL, NULL);
     
     if(FaceName[0] == '\0') {
         switch(lf->lfPitchAndFamily & 0xf0) {
@@ -270,8 +272,8 @@
 /***********************************************************************
  *           PSDRV_GetFontMetric
  */
-static UINT PSDRV_GetFontMetric(HDC hdc, AFM *pafm, NEWTEXTMETRIC16 *pTM, 
-              ENUMLOGFONTEX16 *pLF, INT16 size)
+static UINT PSDRV_GetFontMetric(HDC hdc, AFM *pafm, NEWTEXTMETRICEXW *pTM, 
+				ENUMLOGFONTEXW *pLF, INT16 size)
 
 {
     DC *dc = DC_GetDCPtr( hdc );
@@ -282,52 +284,55 @@
     memset( pLF, 0, sizeof(*pLF) );
     memset( pTM, 0, sizeof(*pTM) );
 
-#define plf ((LPLOGFONT16)pLF)
-    plf->lfHeight    = pTM->tmHeight       = size;
-    plf->lfWidth     = pTM->tmAveCharWidth = pafm->CharWidths[120] * scale;
-    plf->lfWeight    = pTM->tmWeight       = pafm->Weight;
-    plf->lfItalic    = pTM->tmItalic       = pafm->ItalicAngle != 0.0;
-    plf->lfUnderline = pTM->tmUnderlined   = 0;
-    plf->lfStrikeOut = pTM->tmStruckOut    = 0;
-    plf->lfCharSet   = pTM->tmCharSet      = ANSI_CHARSET;
+#define plf ((LPLOGFONTW)pLF)
+#define ptm ((LPNEWTEXTMETRICW)pTM)
+    plf->lfHeight    = ptm->tmHeight       = size;
+    plf->lfWidth     = ptm->tmAveCharWidth = pafm->CharWidths[120] * scale;
+    plf->lfWeight    = ptm->tmWeight       = pafm->Weight;
+    plf->lfItalic    = ptm->tmItalic       = pafm->ItalicAngle != 0.0;
+    plf->lfUnderline = ptm->tmUnderlined   = 0;
+    plf->lfStrikeOut = ptm->tmStruckOut    = 0;
+    plf->lfCharSet   = ptm->tmCharSet      = ANSI_CHARSET;
 
     /* convert pitch values */
 
-    pTM->tmPitchAndFamily = pafm->IsFixedPitch ? 0 : TMPF_FIXED_PITCH;
-    pTM->tmPitchAndFamily |= TMPF_DEVICE;
+    ptm->tmPitchAndFamily = pafm->IsFixedPitch ? 0 : TMPF_FIXED_PITCH;
+    ptm->tmPitchAndFamily |= TMPF_DEVICE;
     plf->lfPitchAndFamily = 0;
 
-    lstrcpynA( plf->lfFaceName, pafm->FamilyName, LF_FACESIZE );
+    MultiByteToWideChar(CP_ACP, 0, pafm->FamilyName, -1,
+			plf->lfFaceName, LF_FACESIZE);
 #undef plf
 
-    pTM->tmAscent = pafm->FullAscender * scale;
-    pTM->tmDescent = -pafm->Descender * scale;
-    pTM->tmInternalLeading = (pafm->FullAscender - pafm->Ascender) * scale;
-    pTM->tmMaxCharWidth = pafm->CharWidths[77] * scale;
-    pTM->tmDigitizedAspectX = dc->devCaps->logPixelsY;
-    pTM->tmDigitizedAspectY = dc->devCaps->logPixelsX;
+    ptm->tmAscent = pafm->FullAscender * scale;
+    ptm->tmDescent = -pafm->Descender * scale;
+    ptm->tmInternalLeading = (pafm->FullAscender - pafm->Ascender) * scale;
+    ptm->tmMaxCharWidth = pafm->CharWidths[77] * scale;
+    ptm->tmDigitizedAspectX = dc->devCaps->logPixelsY;
+    ptm->tmDigitizedAspectY = dc->devCaps->logPixelsX;
 
-    *(INT*)&pTM->tmFirstChar = 32;
+    *(INT*)&ptm->tmFirstChar = 32;
 
     GDI_ReleaseObj( hdc );
     /* return font type */
-    return DEVICE_FONTTYPE;
 
+    return DEVICE_FONTTYPE;
+#undef ptm
 }
 
 /***********************************************************************
  *           PSDRV_EnumDeviceFonts
  */
-BOOL PSDRV_EnumDeviceFonts( HDC hdc, LPLOGFONT16 plf, 
-				        DEVICEFONTENUMPROC proc, LPARAM lp )
+BOOL PSDRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf, 
+			    DEVICEFONTENUMPROC proc, LPARAM lp )
 {
-    ENUMLOGFONTEX16	lf;
-    NEWTEXTMETRIC16	tm;
+    ENUMLOGFONTEXW	lf;
+    NEWTEXTMETRICEXW	tm;
     BOOL	  	b, bRet = 0;
     AFMLISTENTRY	*afmle;
     FONTFAMILY		*family;
     PSDRV_PDEVICE	*physDev;
-
+    char                FaceName[LF_FACESIZE];
     DC *dc = DC_GetDCPtr( hdc );
     if (!dc) return FALSE;
 
@@ -336,9 +341,11 @@
     GDI_ReleaseObj( hdc );
 
     if( plf->lfFaceName[0] ) {
-        TRACE("lfFaceName = '%s'\n", plf->lfFaceName);
+        WideCharToMultiByte(CP_ACP, 0, plf->lfFaceName, -1,
+			  FaceName, sizeof(FaceName), NULL, NULL);
+        TRACE("lfFaceName = '%s'\n", FaceName);
         for(family = physDev->pi->Fonts; family; family = family->next) {
-            if(!strncmp(plf->lfFaceName, family->FamilyName, 
+            if(!strncmp(FaceName, family->FamilyName, 
 			strlen(family->FamilyName)))
 	        break;
 	}
Index: dlls/wineps/psdrv.h
===================================================================
RCS file: /home/wine/wine/dlls/wineps/psdrv.h,v
retrieving revision 1.5
diff -u -r1.5 psdrv.h
--- dlls/wineps/psdrv.h	2001/01/28 23:13:45	1.5
+++ dlls/wineps/psdrv.h	2001/02/14 10:45:48
@@ -36,7 +36,7 @@
     char		*FullName;
     char		*FamilyName;
     char		*EncodingScheme;
-    int			Weight;			/* FW_NORMAL etc. */
+    LONG		Weight;			/* FW_NORMAL etc. */
     float		ItalicAngle;
     BOOL		IsFixedPitch;
     float		UnderlinePosition;
@@ -271,7 +271,6 @@
 		     COLORREF wincolor );
 extern char PSDRV_UnicodeToANSI(int u);
 
-
 extern INT PSDRV_WriteHeader( DC *dc, LPCSTR title );
 extern INT PSDRV_WriteFooter( DC *dc );
 extern INT PSDRV_WriteNewPage( DC *dc );
@@ -329,8 +328,8 @@
 			     INT bottom );
 extern INT PSDRV_EndDoc( DC *dc );
 extern INT PSDRV_EndPage( DC *dc );
-extern BOOL PSDRV_EnumDeviceFonts( HDC hdc, LPLOGFONT16 plf, 
-				     DEVICEFONTENUMPROC proc, LPARAM lp );
+extern BOOL PSDRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf, 
+				   DEVICEFONTENUMPROC proc, LPARAM lp );
 extern INT PSDRV_Escape( DC *dc, INT nEscape, INT cbInput, 
 			   SEGPTR lpInData, SEGPTR lpOutData );
 extern BOOL PSDRV_ExtTextOut( DC *dc, INT x, INT y, UINT flags,
Index: graphics/enhmetafiledrv/objects.c
===================================================================
RCS file: /home/wine/wine/graphics/enhmetafiledrv/objects.c,v
retrieving revision 1.10
diff -u -r1.10 objects.c
--- graphics/enhmetafiledrv/objects.c	2000/12/24 20:33:01	1.10
+++ graphics/enhmetafiledrv/objects.c	2001/02/14 10:45:48
@@ -147,7 +147,7 @@
     emr.emr.iType = EMR_EXTCREATEFONTINDIRECTW;
     emr.emr.nSize = (sizeof(emr) + 3) / 4 * 4;
     emr.ihFont = index = EMFDRV_AddHandleDC( dc );
-    FONT_LogFont16To32W( &(fontObj->logfont), &(emr.elfw.elfLogFont) );
+    memcpy( &(emr.elfw.elfLogFont), &(fontObj->logfont), sizeof(LOGFONTW) );
     emr.elfw.elfFullName[0] = '\0';
     emr.elfw.elfStyle[0]    = '\0';
     emr.elfw.elfVersion     = 0;
Index: graphics/metafiledrv/objects.c
===================================================================
RCS file: /home/wine/wine/graphics/metafiledrv/objects.c,v
retrieving revision 1.15
diff -u -r1.15 objects.c
--- graphics/metafiledrv/objects.c	2000/11/27 23:54:30	1.15
+++ graphics/metafiledrv/objects.c	2001/02/14 10:45:48
@@ -185,7 +185,9 @@
                                         FONTOBJ * font )
 {
     HFONT16 prevHandle = dc->hFont;
-    if (MFDRV_CreateFontIndirect(dc, hfont, &(font->logfont)))
+    LOGFONT16 lf16;
+    FONT_LogFontWTo16(&(font->logfont), &lf16);
+    if (MFDRV_CreateFontIndirect(dc, hfont, &lf16))
         return prevHandle;
     return 0;
 }
Index: graphics/win16drv/font.c
===================================================================
RCS file: /home/wine/wine/graphics/win16drv/font.c,v
retrieving revision 1.17
diff -u -r1.17 font.c
--- graphics/win16drv/font.c	2000/12/01 21:32:57	1.17
+++ graphics/win16drv/font.c	2001/02/14 10:45:48
@@ -56,7 +56,7 @@
 
     TRACE("%04x \n", dc->hSelf);
 
-    FONT_TextMetric16to32A( &physDev->tm, metrics );
+    FONT_TextMetric16ToA( &physDev->tm, metrics );
 
     TRACE(
 	  "H %ld, A %ld, D %ld, Int %ld, Ext %ld, AW %ld, MW %ld, W %ld\n",
@@ -80,8 +80,8 @@
 
     dc->hFont = hfont;
 
-    TRACE("WIN16DRV_FONT_SelectObject '%s' h=%d\n",
-		     font->logfont.lfFaceName, font->logfont.lfHeight);
+    TRACE("WIN16DRV_FONT_SelectObject '%s' h=%ld\n",
+	  debugstr_w(font->logfont.lfFaceName), font->logfont.lfHeight);
 
 
     if( physDev->FontInfo )
@@ -92,7 +92,7 @@
 				      physDev->FontInfo, 0);
     }
 
-    memcpy(&physDev->lf, &font->logfont, sizeof(LOGFONT16));
+    FONT_LogFontWTo16(&font->logfont, &physDev->lf);
     nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, DRVOBJ_FONT,
                                   &physDev->lf, 0, 0); 
 
@@ -181,14 +181,15 @@
  *           WIN16DRV_EnumDeviceFonts
  */
 
-BOOL	WIN16DRV_EnumDeviceFonts( HDC hdc, LPLOGFONT16 plf, 
-				        DEVICEFONTENUMPROC proc, LPARAM lp )
+BOOL	WIN16DRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf, 
+				  DEVICEFONTENUMPROC proc, LPARAM lp )
 {
     WIN16DRV_PDEVICE *physDev;
     WORD wRet;
     WEPFC wepfc;
     DC *dc;
-    /* EnumDFontCallback is GDI.158 */
+    char *FaceNameA = NULL;
+   /* EnumDFontCallback is GDI.158 */
     FARPROC16 pfnCallback = GetProcAddress16( GetModuleHandle16("GDI"), (LPCSTR)158 );
 
     if (!(dc = DC_GetDCPtr( hdc ))) return 0;
@@ -196,11 +197,20 @@
     /* FIXME!! */
     GDI_ReleaseObj( hdc );
 
-    wepfc.proc = (int (*)(LPENUMLOGFONT16,LPNEWTEXTMETRIC16,UINT16,LPARAM))proc;
+    wepfc.proc = proc;
     wepfc.lp = lp;
 
-    wRet = PRTDRV_EnumDFonts(physDev->segptrPDEVICE, plf->lfFaceName[0] ?
-			     plf->lfFaceName : NULL , pfnCallback , &wepfc );
+    if(plf->lfFaceName[0]) {
+        INT len;
+        len = WideCharToMultiByte(CP_ACP, 0, plf->lfFaceName, -1, NULL, 0,
+				  NULL, NULL);
+	FaceNameA = HeapAlloc(GetProcessHeap(), 0, len);
+	WideCharToMultiByte(CP_ACP, 0, plf->lfFaceName, -1, FaceNameA, len,
+			    NULL, NULL);
+    }
+    wRet = PRTDRV_EnumDFonts(physDev->segptrPDEVICE, FaceNameA, pfnCallback,
+			     &wepfc );
+    if(FaceNameA) HeapFree(GetProcessHeap(), 0, FaceNameA);
     return wRet;
 }
 
@@ -218,8 +228,27 @@
                            LPNEWTEXTMETRIC16 lpTextMetrics,
                            WORD wFontType, LONG lpClientData) 
 {
+    ENUMLOGFONTEXW lfW;
+    ENUMLOGFONTEX16 lf16;
+
+    NEWTEXTMETRICEXW tmW;
+    NEWTEXTMETRICEX16 tm16;
+
     TRACE("In EnumCallback16 plf=%p\n", lpLogFont);
-    return (*(((WEPFC *)lpClientData)->proc))( lpLogFont, lpTextMetrics, 
-				     wFontType, ((WEPFC *)lpClientData)->lp );
+
+    /* we have a ENUMLOGFONT16 which is a subset of ENUMLOGFONTEX16,
+       so we copy it into one of these and then convert to ENUMLOGFONTEXW */
+
+    memset(&lf16, 0, sizeof(lf16));
+    memcpy(&lf16, lpLogFont, sizeof(*lpLogFont));
+    FONT_EnumLogFontEx16ToW(&lf16, &lfW);
+
+    /* and a similar idea for NEWTEXTMETRIC16 */
+    memset(&tm16, 0, sizeof(tm16));
+    memcpy(&tm16, lpTextMetrics, sizeof(*lpTextMetrics));
+    FONT_NewTextMetricEx16ToW(&tm16, &tmW);
+
+    return (*(((WEPFC *)lpClientData)->proc))( &lfW, &tmW, wFontType,
+					       ((WEPFC *)lpClientData)->lp );
 }
 
Index: graphics/x11drv/xfont.c
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/xfont.c,v
retrieving revision 1.66
diff -u -r1.66 xfont.c
--- graphics/x11drv/xfont.c	2001/01/24 19:38:11	1.66
+++ graphics/x11drv/xfont.c	2001/02/14 10:45:48
@@ -1156,50 +1156,61 @@
  *
  * Retrieve font metric info (enumeration).
  */
-static UINT XFONT_GetFontMetric( const fontInfo* pfi, const LPENUMLOGFONTEX16 pLF,
-                                                  const LPNEWTEXTMETRIC16 pTM )
+static UINT XFONT_GetFontMetric( const fontInfo* pfi,
+				 const LPENUMLOGFONTEXW pLF,
+				 const LPNEWTEXTMETRICEXW pTM )
 {
     memset( pLF, 0, sizeof(*pLF) );
     memset( pTM, 0, sizeof(*pTM) );
 
-#define plf ((LPLOGFONT16)pLF)
-    plf->lfHeight    = pTM->tmHeight       = pfi->df.dfPixHeight;
-    plf->lfWidth     = pTM->tmAveCharWidth = pfi->df.dfAvgWidth;
-    plf->lfWeight    = pTM->tmWeight       = pfi->df.dfWeight;
-    plf->lfItalic    = pTM->tmItalic       = pfi->df.dfItalic;
-    plf->lfUnderline = pTM->tmUnderlined   = pfi->df.dfUnderline;
-    plf->lfStrikeOut = pTM->tmStruckOut    = pfi->df.dfStrikeOut;
-    plf->lfCharSet   = pTM->tmCharSet      = pfi->df.dfCharSet;
+#define plf ((LPLOGFONTW)pLF)
+#define ptm ((LPNEWTEXTMETRICW)pTM)
+    plf->lfHeight    = ptm->tmHeight       = pfi->df.dfPixHeight;
+    plf->lfWidth     = ptm->tmAveCharWidth = pfi->df.dfAvgWidth;
+    plf->lfWeight    = ptm->tmWeight       = pfi->df.dfWeight;
+    plf->lfItalic    = ptm->tmItalic       = pfi->df.dfItalic;
+    plf->lfUnderline = ptm->tmUnderlined   = pfi->df.dfUnderline;
+    plf->lfStrikeOut = ptm->tmStruckOut    = pfi->df.dfStrikeOut;
+    plf->lfCharSet   = ptm->tmCharSet      = pfi->df.dfCharSet;
 
     /* convert pitch values */
 
-    pTM->tmPitchAndFamily = pfi->df.dfPitchAndFamily;
+    ptm->tmPitchAndFamily = pfi->df.dfPitchAndFamily;
     plf->lfPitchAndFamily = (pfi->df.dfPitchAndFamily & 0xF1) + 1;
 
-    lstrcpynA( plf->lfFaceName, pfi->df.dfFace, LF_FACESIZE );
+    MultiByteToWideChar(CP_ACP, 0, pfi->df.dfFace, -1,
+			plf->lfFaceName, LF_FACESIZE);
+
+    /* FIXME: fill in rest of plF values */
+    strcpyW(pLF->elfFullName, plf->lfFaceName);
+    MultiByteToWideChar(CP_ACP, 0, "Regular", -1,
+			pLF->elfStyle, LF_FACESIZE);
+    MultiByteToWideChar(CP_ACP, 0, plf->lfCharSet == SYMBOL_CHARSET ?
+			"Symbol" : "Roman", -1,
+			pLF->elfScript, LF_FACESIZE);
+
 #undef plf
 
-    /* FIXME: fill in rest of plF values
-    lstrcpynA(plF->elfFullName, , LF_FULLFACESIZE);
-    lstrcpynA(plF->elfStyle, , LF_FACESIZE);
-    lstrcpynA(plF->elfScript, , LF_FACESIZE);
-    */
-
-    pTM->tmAscent = pfi->df.dfAscent;
-    pTM->tmDescent = pTM->tmHeight - pTM->tmAscent;
-    pTM->tmInternalLeading = pfi->df.dfInternalLeading;
-    pTM->tmMaxCharWidth = pfi->df.dfMaxWidth;
-    pTM->tmDigitizedAspectX = pfi->df.dfHorizRes;
-    pTM->tmDigitizedAspectY = pfi->df.dfVertRes;
-
-    pTM->tmFirstChar = pfi->df.dfFirstChar;
-    pTM->tmLastChar = pfi->df.dfLastChar;
-    pTM->tmDefaultChar = pfi->df.dfDefaultChar;
-    pTM->tmBreakChar = pfi->df.dfBreakChar;
+    ptm->tmAscent = pfi->df.dfAscent;
+    ptm->tmDescent = ptm->tmHeight - ptm->tmAscent;
+    ptm->tmInternalLeading = pfi->df.dfInternalLeading;
+    ptm->tmMaxCharWidth = pfi->df.dfMaxWidth;
+    ptm->tmDigitizedAspectX = pfi->df.dfHorizRes;
+    ptm->tmDigitizedAspectY = pfi->df.dfVertRes;
+
+    ptm->tmFirstChar = pfi->df.dfFirstChar;
+    ptm->tmLastChar = pfi->df.dfLastChar;
+    ptm->tmDefaultChar = pfi->df.dfDefaultChar;
+    ptm->tmBreakChar = pfi->df.dfBreakChar;
+ 
+    TRACE("Calling Enum proc with FaceName '%s' FullName '%s'\n",
+	  debugstr_w(pLF->elfLogFont.lfFaceName),
+	  debugstr_w(pLF->elfFullName));
 
+   TRACE("CharSet = %d type = %d\n", ptm->tmCharSet, pfi->df.dfType);
     /* return font type */
-
     return pfi->df.dfType;
+#undef ptm
 }
 
 
@@ -3049,7 +3060,7 @@
     if( CHECK_PFONT(physDev->font) ) 
         XFONT_ReleaseCacheEntry( __PFONT(physDev->font) );
 
-    lf = font->logfont;
+    FONT_LogFontWTo16(&font->logfont, &lf);
 
     /* Make sure we don't change the sign when converting to device coords */
     /* FIXME - check that the other drivers do this correctly */
@@ -3085,9 +3096,11 @@
 	 * so that GetTextFace can get the correct face name
 	 */
 	if (alias && !strcmp(faceMatched, lf.lfFaceName))
-	    strcpy( font->logfont.lfFaceName, alias );
+	    MultiByteToWideChar(CP_ACP, 0, alias, -1,
+				font->logfont.lfFaceName, LF_FACESIZE);
 	else
-	    strcpy( font->logfont.lfFaceName, faceMatched );
+	    MultiByteToWideChar(CP_ACP, 0, faceMatched, -1,
+			      font->logfont.lfFaceName, LF_FACESIZE);
 
 	/*
 	 * In X, some encodings may have the same lfFaceName.
@@ -3112,18 +3125,22 @@
  *
  *           X11DRV_EnumDeviceFonts
  */
-BOOL X11DRV_EnumDeviceFonts( HDC hdc, LPLOGFONT16 plf, 
-				        DEVICEFONTENUMPROC proc, LPARAM lp )
+BOOL X11DRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf, 
+			     DEVICEFONTENUMPROC proc, LPARAM lp )
 {
-    ENUMLOGFONTEX16	lf;
-    NEWTEXTMETRIC16	tm;
+    ENUMLOGFONTEXW	lf;
+    NEWTEXTMETRICEXW	tm;
     fontResource*	pfr = fontList;
     BOOL	  	b, bRet = 0;
+    LOGFONT16           lf16;
 
-    if( plf->lfFaceName[0] )
+
+    FONT_LogFontWTo16(plf, &lf16);
+
+    if( lf16.lfFaceName[0] )
     {
 	/* enum all entries in this resource */
-	pfr = XFONT_FindFIList( pfr, plf->lfFaceName );
+	pfr = XFONT_FindFIList( pfr, lf16.lfFaceName );
 	if( pfr )
 	{
 	    fontInfo*	pfi;
@@ -3133,10 +3150,13 @@
 		   release the crit section, font list will
 		   have to be retraversed on return */
 
-		if( (b = (*proc)( &lf, &tm, 
-			XFONT_GetFontMetric( pfi, &lf, &tm ), lp )) )
-		     bRet = b;
-		else break;
+	        if(lf16.lfCharSet == DEFAULT_CHARSET ||
+		   lf16.lfCharSet == pfi->df.dfCharSet) {
+		    if( (b = (*proc)( &lf, &tm, 
+			       XFONT_GetFontMetric( pfi, &lf, &tm ), lp )) )
+		        bRet = b;
+		    else break;
+		}
 	    }
 	}
     }
@@ -3145,9 +3165,9 @@
 	{
             if(pfr->fi)
             {
-		if( (b = (*proc)( &lf, &tm, 
-			XFONT_GetFontMetric( pfr->fi, &lf, &tm ), lp )) )
-		     bRet = b;
+	        if( (b = (*proc)( &lf, &tm, 
+			   XFONT_GetFontMetric( pfr->fi, &lf, &tm ), lp )) )
+		    bRet = b;
 		else break;
             }
 	}
Index: include/font.h
===================================================================
RCS file: /home/wine/wine/include/font.h,v
retrieving revision 1.4
diff -u -r1.4 font.h
--- include/font.h	1999/04/25 12:36:53	1.4
+++ include/font.h	2001/02/14 10:45:48
@@ -15,7 +15,7 @@
 typedef struct
 {
     GDIOBJHDR   header;
-    LOGFONT16   logfont WINE_PACKED;
+    LOGFONTW    logfont;
 } FONTOBJ;
 
 typedef struct {
@@ -59,16 +59,18 @@
 extern INT16  FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer );
 extern INT  FONT_GetObjectA( FONTOBJ * font, INT count, LPSTR buffer );
 extern INT  FONT_GetObjectW( FONTOBJ * font, INT count, LPSTR buffer );
-extern void FONT_LogFont32ATo16( const LOGFONTA* font32, LPLOGFONT16 font16 );
-extern void FONT_LogFont32WTo16( const LOGFONTW* font32, LPLOGFONT16 font16 );
-extern void FONT_LogFont16To32A( const LPLOGFONT16 font16, LPLOGFONTA font32 );
-extern void FONT_LogFont16To32W( const LPLOGFONT16 font16, LPLOGFONTW font32 );
-extern void FONT_TextMetric32Ato16(const LPTEXTMETRICA ptm32, LPTEXTMETRIC16 ptm16 );
-extern void FONT_TextMetric32Wto16(const LPTEXTMETRICW ptm32, LPTEXTMETRIC16 ptm16 );
-extern void FONT_TextMetric16to32A(const LPTEXTMETRIC16 ptm16, LPTEXTMETRICA ptm32 );
-extern void FONT_TextMetric16to32W(const LPTEXTMETRIC16 ptm16, LPTEXTMETRICW ptm32 );
-extern void FONT_TextMetric32Ato32W(const LPTEXTMETRICA ptm32A, LPTEXTMETRICW ptm32W );
-
+extern void FONT_LogFontATo16( const LOGFONTA* font32, LPLOGFONT16 font16 );
+extern void FONT_LogFontWTo16( const LOGFONTW* font32, LPLOGFONT16 font16 );
+extern void FONT_LogFont16ToA( const LOGFONT16* font16, LPLOGFONTA font32 );
+extern void FONT_LogFont16ToW( const LOGFONT16* font16, LPLOGFONTW font32 );
+extern void FONT_TextMetricATo16(const TEXTMETRICA *ptm32, LPTEXTMETRIC16 ptm16 );
+extern void FONT_TextMetricWTo16(const TEXTMETRICW *ptm32, LPTEXTMETRIC16 ptm16 );
+extern void FONT_TextMetric16ToA(const TEXTMETRIC16 *ptm16, LPTEXTMETRICA ptm32 );
+extern void FONT_TextMetric16ToW(const TEXTMETRIC16 *ptm16, LPTEXTMETRICW ptm32 );
+extern void FONT_TextMetricAToW(const TEXTMETRICA *ptm32A, LPTEXTMETRICW ptm32W );
+extern void FONT_NewTextMetricEx16ToW(const NEWTEXTMETRICEX16*, LPNEWTEXTMETRICEXW);
+extern void FONT_EnumLogFontEx16ToW(const ENUMLOGFONTEX16*, LPENUMLOGFONTEXW);
+extern BOOL ENGINE_InitFonts(void);
 
 
 #endif /* __WINE_FONT_H */
Index: include/gdi.h
===================================================================
RCS file: /home/wine/wine/include/gdi.h,v
retrieving revision 1.40
diff -u -r1.40 gdi.h
--- include/gdi.h	2001/01/24 19:38:11	1.40
+++ include/gdi.h	2001/02/14 10:45:48
@@ -155,7 +155,8 @@
 
 /* Device functions for the Wine driver interface */
 
-typedef INT (*DEVICEFONTENUMPROC)(LPENUMLOGFONTEX16,LPNEWTEXTMETRIC16,UINT16,LPARAM);
+typedef INT (*DEVICEFONTENUMPROC)(LPENUMLOGFONTEXW,LPNEWTEXTMETRICEXW,DWORD,
+				  LPARAM);
 
 typedef struct tagDC_FUNCS
 {
@@ -184,7 +185,7 @@
     INT      (*pEndDoc)(DC*);
     INT      (*pEndPage)(DC*);
     BOOL     (*pEndPath)(DC*);
-    BOOL     (*pEnumDeviceFonts)(HDC,LPLOGFONT16,DEVICEFONTENUMPROC,LPARAM);
+    BOOL     (*pEnumDeviceFonts)(HDC,LPLOGFONTW,DEVICEFONTENUMPROC,LPARAM);
     INT      (*pEscape)(DC*,INT,INT,SEGPTR,SEGPTR);
     INT      (*pExcludeClipRect)(DC*,INT,INT,INT,INT);
     INT      (*pExtDeviceMode)(LPSTR,HWND,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,
Index: include/win16drv.h
===================================================================
RCS file: /home/wine/wine/include/win16drv.h,v
retrieving revision 1.12
diff -u -r1.12 win16drv.h
--- include/win16drv.h	2000/11/05 03:28:19	1.12
+++ include/win16drv.h	2001/02/14 10:45:48
@@ -137,7 +137,7 @@
 
 typedef struct WINE_ENUM_PRINTER_FONT_CALLBACK
 {
-    int (*proc)(LPENUMLOGFONT16, LPNEWTEXTMETRIC16, UINT16, LPARAM);
+    DEVICEFONTENUMPROC proc;
     LPARAM lp;
 } WEPFC;
 
@@ -224,8 +224,8 @@
 extern BOOL WIN16DRV_PatBlt( struct tagDC *dc, INT left, INT top,
                                INT width, INT height, DWORD rop );
 extern BOOL WIN16DRV_Ellipse(DC *dc, INT left, INT top, INT right, INT bottom);
-extern BOOL WIN16DRV_EnumDeviceFonts( HDC hdc, LPLOGFONT16 plf, 
-				        DEVICEFONTENUMPROC proc, LPARAM lp );
+extern BOOL WIN16DRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf, 
+				      DEVICEFONTENUMPROC proc, LPARAM lp );
 
 extern INT WIN16DRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd,
 				  LPDEVMODEA lpdmOutput,
Index: include/x11drv.h
===================================================================
RCS file: /home/wine/wine/include/x11drv.h,v
retrieving revision 1.70
diff -u -r1.70 x11drv.h
--- include/x11drv.h	2001/01/17 21:51:07	1.70
+++ include/x11drv.h	2001/02/14 10:45:48
@@ -92,8 +92,8 @@
 extern BOOL X11DRV_BitBlt( struct tagDC *dcDst, INT xDst, INT yDst,
                              INT width, INT height, struct tagDC *dcSrc,
                              INT xSrc, INT ySrc, DWORD rop );
-extern BOOL X11DRV_EnumDeviceFonts( HDC hdc, LPLOGFONT16 plf,
-				      DEVICEFONTENUMPROC dfeproc, LPARAM lp );
+extern BOOL X11DRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf,
+				    DEVICEFONTENUMPROC dfeproc, LPARAM lp );
 extern BOOL X11DRV_GetCharWidth( struct tagDC *dc, UINT firstChar,
                                    UINT lastChar, LPINT buffer );
 extern BOOL X11DRV_GetDCOrgEx( struct tagDC *dc, LPPOINT lpp );
Index: objects/font.c
===================================================================
RCS file: /home/wine/wine/objects/font.c,v
retrieving revision 1.36
diff -u -r1.36 font.c
--- objects/font.c	2001/01/24 19:37:14	1.36
+++ objects/font.c	2001/02/14 10:45:49
@@ -37,10 +37,8 @@
 {
   LPLOGFONTW          lpLogFontParam;
   FONTENUMPROCEXW     lpEnumFunc;
-  LPARAM                lpData;
+  LPARAM              lpData;
 
-  LPNEWTEXTMETRICEXW  lpTextMetric;
-  LPENUMLOGFONTEXW    lpLogFont;
   DWORD                 dwFlags;
 } fontEnum32;
  
@@ -92,7 +90,7 @@
 /***********************************************************************
  *              LOGFONT conversion functions.
  */
-void FONT_LogFont32ATo16( const LOGFONTA* font32, LPLOGFONT16 font16 )
+void FONT_LogFontATo16( const LOGFONTA* font32, LPLOGFONT16 font16 )
 {
     font16->lfHeight = font32->lfHeight;
     font16->lfWidth = font32->lfWidth;
@@ -110,7 +108,7 @@
     lstrcpynA( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
 }
 
-void FONT_LogFont32WTo16( const LOGFONTW* font32, LPLOGFONT16 font16 )
+void FONT_LogFontWTo16( const LOGFONTW* font32, LPLOGFONT16 font16 )
 {
     font16->lfHeight = font32->lfHeight;
     font16->lfWidth = font32->lfWidth;
@@ -130,7 +128,7 @@
     font16->lfFaceName[LF_FACESIZE-1] = 0;
 }
 
-void FONT_LogFont16To32A( const LPLOGFONT16 font16, LPLOGFONTA font32 )
+void FONT_LogFont16ToA( const LOGFONT16 *font16, LPLOGFONTA font32 )
 {
     font32->lfHeight = font16->lfHeight;
     font32->lfWidth = font16->lfWidth;
@@ -148,7 +146,7 @@
     lstrcpynA( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
 }
 
-void FONT_LogFont16To32W( const LPLOGFONT16 font16, LPLOGFONTW font32 )
+void FONT_LogFont16ToW( const LOGFONT16 *font16, LPLOGFONTW font32 )
 {
     font32->lfHeight = font16->lfHeight;
     font32->lfWidth = font16->lfWidth;
@@ -167,17 +165,31 @@
     font32->lfFaceName[LF_FACESIZE-1] = 0;
 }
 
-void FONT_EnumLogFontEx16To32A( const LPENUMLOGFONTEX16 font16, LPENUMLOGFONTEXA font32 )
+void FONT_LogFontAToW( const LOGFONTA *fontA, LPLOGFONTW fontW )
 {
-    FONT_LogFont16To32A( (LPLOGFONT16)font16, (LPLOGFONTA)font32);
+    memcpy(fontW, fontA, sizeof(LOGFONTA) - LF_FACESIZE);
+    MultiByteToWideChar(CP_ACP, 0, fontA->lfFaceName, -1, fontW->lfFaceName,
+			LF_FACESIZE);
+}
+
+void FONT_LogFontWToA( const LOGFONTW *fontW, LPLOGFONTA fontA )
+{
+    memcpy(fontA, fontW, sizeof(LOGFONTA) - LF_FACESIZE);
+    WideCharToMultiByte(CP_ACP, 0, fontW->lfFaceName, -1, fontA->lfFaceName,
+			LF_FACESIZE, NULL, NULL);
+}
+
+void FONT_EnumLogFontEx16ToA( const ENUMLOGFONTEX16 *font16, LPENUMLOGFONTEXA font32 )
+{
+    FONT_LogFont16ToA( (LPLOGFONT16)font16, (LPLOGFONTA)font32);
     lstrcpynA( font32->elfFullName, font16->elfFullName, LF_FULLFACESIZE );
     lstrcpynA( font32->elfStyle, font16->elfStyle, LF_FACESIZE );
     lstrcpynA( font32->elfScript, font16->elfScript, LF_FACESIZE );
 }
 
-void FONT_EnumLogFontEx16To32W( const LPENUMLOGFONTEX16 font16, LPENUMLOGFONTEXW font32 )
+void FONT_EnumLogFontEx16ToW( const ENUMLOGFONTEX16 *font16, LPENUMLOGFONTEXW font32 )
 {
-    FONT_LogFont16To32W( (LPLOGFONT16)font16, (LPLOGFONTW)font32);
+    FONT_LogFont16ToW( (LPLOGFONT16)font16, (LPLOGFONTW)font32);
 
     MultiByteToWideChar( CP_ACP, 0, font16->elfFullName, -1, font32->elfFullName, LF_FULLFACESIZE );
     font32->elfFullName[LF_FULLFACESIZE-1] = 0;
@@ -187,10 +199,40 @@
     font32->elfScript[LF_FACESIZE-1] = 0;
 }
 
+void FONT_EnumLogFontExWTo16( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEX16 font16 )
+{
+    FONT_LogFontWTo16( (LPLOGFONTW)fontW, (LPLOGFONT16)font16);
+
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
+			 font16->elfFullName, LF_FULLFACESIZE, NULL, NULL );
+    font16->elfFullName[LF_FULLFACESIZE-1] = '\0';
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
+			 font16->elfStyle, LF_FACESIZE, NULL, NULL );
+    font16->elfStyle[LF_FACESIZE-1] = '\0';
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
+			 font16->elfScript, LF_FACESIZE, NULL, NULL );
+    font16->elfScript[LF_FACESIZE-1] = '\0';
+}
+
+void FONT_EnumLogFontExWToA( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEXA fontA )
+{
+    FONT_LogFontWToA( (LPLOGFONTW)fontW, (LPLOGFONTA)fontA);
+
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
+			 fontA->elfFullName, LF_FULLFACESIZE, NULL, NULL );
+    fontA->elfFullName[LF_FULLFACESIZE-1] = '\0';
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
+			 fontA->elfStyle, LF_FACESIZE, NULL, NULL );
+    fontA->elfStyle[LF_FACESIZE-1] = '\0';
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
+			 fontA->elfScript, LF_FACESIZE, NULL, NULL );
+    fontA->elfScript[LF_FACESIZE-1] = '\0';
+}
+
 /***********************************************************************
  *              TEXTMETRIC conversion functions.
  */
-void FONT_TextMetric32Ato16(const LPTEXTMETRICA ptm32, LPTEXTMETRIC16 ptm16 )
+void FONT_TextMetricATo16(const TEXTMETRICA *ptm32, LPTEXTMETRIC16 ptm16 )
 {
     ptm16->tmHeight = ptm32->tmHeight;
     ptm16->tmAscent = ptm32->tmAscent;
@@ -214,7 +256,7 @@
     ptm16->tmCharSet = ptm32->tmCharSet;
 }
 
-void FONT_TextMetric32Wto16(const LPTEXTMETRICW ptm32, LPTEXTMETRIC16 ptm16 )
+void FONT_TextMetricWTo16(const TEXTMETRICW *ptm32, LPTEXTMETRIC16 ptm16 )
 {
     ptm16->tmHeight = ptm32->tmHeight;
     ptm16->tmAscent = ptm32->tmAscent;
@@ -238,7 +280,7 @@
     ptm16->tmCharSet = ptm32->tmCharSet;
 }
 
-void FONT_TextMetric16to32A(const LPTEXTMETRIC16 ptm16, LPTEXTMETRICA ptm32 )
+void FONT_TextMetric16ToA(const TEXTMETRIC16 *ptm16, LPTEXTMETRICA ptm32 )
 {
     ptm32->tmHeight = ptm16->tmHeight;
     ptm32->tmAscent = ptm16->tmAscent;
@@ -262,7 +304,7 @@
     ptm32->tmCharSet = ptm16->tmCharSet;
 }
 
-void FONT_TextMetric16to32W(const LPTEXTMETRIC16 ptm16, LPTEXTMETRICW ptm32 )
+void FONT_TextMetric16ToW(const TEXTMETRIC16 *ptm16, LPTEXTMETRICW ptm32 )
 {
     ptm32->tmHeight = ptm16->tmHeight;
     ptm32->tmAscent = ptm16->tmAscent;
@@ -286,7 +328,7 @@
     ptm32->tmCharSet = ptm16->tmCharSet;
 }
 
-void FONT_TextMetric32Ato32W(const LPTEXTMETRICA ptm32A, LPTEXTMETRICW ptm32W )
+void FONT_TextMetricAToW(const TEXTMETRICA *ptm32A, LPTEXTMETRICW ptm32W )
 {
     ptm32W->tmHeight = ptm32A->tmHeight;
     ptm32W->tmAscent = ptm32A->tmAscent;
@@ -310,69 +352,130 @@
     ptm32W->tmCharSet = ptm32A->tmCharSet;
 }
 
+void FONT_TextMetricWToA(const TEXTMETRICW *ptmW, LPTEXTMETRICA ptmA )
+{
+    ptmA->tmHeight = ptmW->tmHeight;
+    ptmA->tmAscent = ptmW->tmAscent;
+    ptmA->tmDescent = ptmW->tmDescent;
+    ptmA->tmInternalLeading = ptmW->tmInternalLeading;
+    ptmA->tmExternalLeading = ptmW->tmExternalLeading;
+    ptmA->tmAveCharWidth = ptmW->tmAveCharWidth;
+    ptmA->tmMaxCharWidth = ptmW->tmMaxCharWidth;
+    ptmA->tmWeight = ptmW->tmWeight;
+    ptmA->tmOverhang = ptmW->tmOverhang;
+    ptmA->tmDigitizedAspectX = ptmW->tmDigitizedAspectX;
+    ptmA->tmDigitizedAspectY = ptmW->tmDigitizedAspectY;
+    ptmA->tmFirstChar = ptmW->tmFirstChar;
+    ptmA->tmLastChar = ptmW->tmLastChar;
+    ptmA->tmDefaultChar = ptmW->tmDefaultChar;
+    ptmA->tmBreakChar = ptmW->tmBreakChar;
+    ptmA->tmItalic = ptmW->tmItalic;
+    ptmA->tmUnderlined = ptmW->tmUnderlined;
+    ptmA->tmStruckOut = ptmW->tmStruckOut;
+    ptmA->tmPitchAndFamily = ptmW->tmPitchAndFamily;
+    ptmA->tmCharSet = ptmW->tmCharSet;
+}
+
+
+void FONT_NewTextMetricExWTo16(const NEWTEXTMETRICEXW *ptmW, LPNEWTEXTMETRICEX16 ptm16 )
+{
+    FONT_TextMetricWTo16((LPTEXTMETRICW)ptmW, (LPTEXTMETRIC16)ptm16);
+    ptm16->ntmetm.ntmFlags = ptmW->ntmetm.ntmFlags;
+    ptm16->ntmetm.ntmSizeEM = ptmW->ntmetm.ntmSizeEM;
+    ptm16->ntmetm.ntmCellHeight = ptmW->ntmetm.ntmCellHeight;
+    ptm16->ntmetm.ntmAvgWidth = ptmW->ntmetm.ntmAvgWidth;
+    memcpy(&ptm16->ntmeFontSignature, &ptmW->ntmeFontSignature,
+	   sizeof(FONTSIGNATURE));
+}
+
+void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, LPNEWTEXTMETRICEXA ptmA )
+{
+    FONT_TextMetricWToA((LPTEXTMETRICW)ptmW, (LPTEXTMETRICA)ptmA);
+    ptmA->ntmetm.ntmFlags = ptmW->ntmetm.ntmFlags;
+    ptmA->ntmetm.ntmSizeEM = ptmW->ntmetm.ntmSizeEM;
+    ptmA->ntmetm.ntmCellHeight = ptmW->ntmetm.ntmCellHeight;
+    ptmA->ntmetm.ntmAvgWidth = ptmW->ntmetm.ntmAvgWidth;
+    memcpy(&ptmA->ntmeFontSignature, &ptmW->ntmeFontSignature,
+	   sizeof(FONTSIGNATURE));
+}
+
+void FONT_NewTextMetricEx16ToW(const NEWTEXTMETRICEX16 *ptm16, LPNEWTEXTMETRICEXW ptmW )
+{
+    FONT_TextMetric16ToW((LPTEXTMETRIC16)ptm16, (LPTEXTMETRICW)ptmW);
+    ptmW->ntmetm.ntmFlags = ptm16->ntmetm.ntmFlags;
+    ptmW->ntmetm.ntmSizeEM = ptm16->ntmetm.ntmSizeEM;
+    ptmW->ntmetm.ntmCellHeight = ptm16->ntmetm.ntmCellHeight;
+    ptmW->ntmetm.ntmAvgWidth = ptm16->ntmetm.ntmAvgWidth;
+    memcpy(&ptmW->ntmeFontSignature, &ptm16->ntmeFontSignature,
+	   sizeof(FONTSIGNATURE));
+}
+
+
 /***********************************************************************
  *           CreateFontIndirect16   (GDI.57)
  */
-HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *font )
+HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *plf16 )
 {
-    HFONT hFont = 0;
-
-    if (font)
-    {
-	    FONTOBJ* fontPtr;
-	if ((fontPtr = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC, &hFont )))
-	{
-	    memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
+    LOGFONTW lfW;
 
-	    TRACE("(%i %i %i %i) '%s' %s %s => %04x\n",
-                  font->lfHeight, font->lfWidth, 
-                  font->lfEscapement, font->lfOrientation,
-                  font->lfFaceName ? font->lfFaceName : "NULL",
-                  font->lfWeight > 400 ? "Bold" : "",
-                  font->lfItalic ? "Italic" : "", hFont);
-
-	    if (font->lfEscapement != font->lfOrientation) {
-	      /* this should really depend on whether GM_ADVANCED is set */
-	      fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
-	      WARN("orientation angle %f set to "
-                   "escapement angle %f for new font %04x\n", 
-                   font->lfOrientation/10., font->lfEscapement/10., hFont);
-	    }
-	    GDI_ReleaseObj( hFont );
-	}
+    if(plf16) {
+        FONT_LogFont16ToW( plf16, &lfW );
+	return CreateFontIndirectW( &lfW );
+    } else {
+        return CreateFontIndirectW( NULL );
     }
-    else WARN("(NULL) => NULL\n");
-
-    return hFont;
 }
 
+
 /***********************************************************************
  *           CreateFontIndirectA   (GDI32.44)
  */
-HFONT WINAPI CreateFontIndirectA( const LOGFONTA *font )
+HFONT WINAPI CreateFontIndirectA( const LOGFONTA *plfA )
 {
-    LOGFONT16 font16;
+    LOGFONTW lfW;
 
-    if (font) {
-	FONT_LogFont32ATo16( font, &font16 );
-	return CreateFontIndirect16( &font16 );
+    if (plfA) {
+	FONT_LogFontAToW( plfA, &lfW );
+	return CreateFontIndirectW( &lfW );
      } else
-	return CreateFontIndirect16( NULL );
+	return CreateFontIndirectW( NULL );
 
 }
 
 /***********************************************************************
  *           CreateFontIndirectW   (GDI32.45)
  */
-HFONT WINAPI CreateFontIndirectW( const LOGFONTW *font )
+HFONT WINAPI CreateFontIndirectW( const LOGFONTW *plf )
 {
-    LOGFONT16 font16;
+    HFONT hFont = 0;
+
+    if (plf)
+    {
+        FONTOBJ* fontPtr;
+	if ((fontPtr = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC, &hFont )))
+	{
+	    memcpy( &fontPtr->logfont, plf, sizeof(LOGFONTW) );
+
+	    TRACE("(%ld %ld %ld %ld) '%s' %s %s => %04x\n",
+                  plf->lfHeight, plf->lfWidth, 
+                  plf->lfEscapement, plf->lfOrientation,
+                  debugstr_w(plf->lfFaceName),
+                  plf->lfWeight > 400 ? "Bold" : "",
+                  plf->lfItalic ? "Italic" : "", hFont);
+
+	    if (plf->lfEscapement != plf->lfOrientation) {
+	      /* this should really depend on whether GM_ADVANCED is set */
+	      fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
+	      WARN("orientation angle %f set to "
+                   "escapement angle %f for new font %04x\n", 
+                   plf->lfOrientation/10., plf->lfEscapement/10., hFont);
+	    }
+	    GDI_ReleaseObj( hFont );
+	}
+    }
+    else WARN("(NULL) => NULL\n");
 
-    if (font) {
-	FONT_LogFont32WTo16( font, &font16 );
-	return CreateFontIndirect16( &font16 );
-    } else
-	return CreateFontIndirect16( NULL );
+    return hFont;
 }
 
 /***********************************************************************
@@ -386,8 +489,6 @@
 {
     LOGFONT16 logfont;
 
-    TRACE("('%s',%d,%d)\n", (name ? name : "(null)") , height, width);
-
     logfont.lfHeight = height;
     logfont.lfWidth = width;
     logfont.lfEscapement = esc;
@@ -419,9 +520,28 @@
                               DWORD outpres, DWORD clippres, DWORD quality,
                               DWORD pitch, LPCSTR name )
 {
-    return (HFONT)CreateFont16( height, width, esc, orient, weight, italic,
-                                  underline, strikeout, charset, outpres,
-                                  clippres, quality, pitch, name );
+    LOGFONTA logfont;
+
+    logfont.lfHeight = height;
+    logfont.lfWidth = width;
+    logfont.lfEscapement = esc;
+    logfont.lfOrientation = orient;
+    logfont.lfWeight = weight;
+    logfont.lfItalic = italic;
+    logfont.lfUnderline = underline;
+    logfont.lfStrikeOut = strikeout;
+    logfont.lfCharSet = charset;
+    logfont.lfOutPrecision = outpres;
+    logfont.lfClipPrecision = clippres;
+    logfont.lfQuality = quality;
+    logfont.lfPitchAndFamily = pitch;
+   
+    if (name) 
+	lstrcpynA(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
+    else 
+	logfont.lfFaceName[0] = '\0';
+
+    return CreateFontIndirectA( &logfont );
 }
 
 /*************************************************************************
@@ -433,13 +553,29 @@
                               DWORD outpres, DWORD clippres, DWORD quality,
                               DWORD pitch, LPCWSTR name )
 {
-    LPSTR namea = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
-    HFONT ret = (HFONT)CreateFont16( height, width, esc, orient, weight,
-                                         italic, underline, strikeout, charset,
-                                         outpres, clippres, quality, pitch,
-                                         namea );
-    if (namea) HeapFree( GetProcessHeap(), 0, namea );
-    return ret;
+    LOGFONTW logfont;
+
+    logfont.lfHeight = height;
+    logfont.lfWidth = width;
+    logfont.lfEscapement = esc;
+    logfont.lfOrientation = orient;
+    logfont.lfWeight = weight;
+    logfont.lfItalic = italic;
+    logfont.lfUnderline = underline;
+    logfont.lfStrikeOut = strikeout;
+    logfont.lfCharSet = charset;
+    logfont.lfOutPrecision = outpres;
+    logfont.lfClipPrecision = clippres;
+    logfont.lfQuality = quality;
+    logfont.lfPitchAndFamily = pitch;
+   
+    if (name) 
+	lstrcpynW(logfont.lfFaceName, name, 
+		  sizeof(logfont.lfFaceName) / sizeof(WCHAR));
+    else 
+	logfont.lfFaceName[0] = '\0';
+
+    return CreateFontIndirectW( &logfont );
 }
 
 
@@ -448,8 +584,12 @@
  */
 INT16 FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer )
 {
+    LOGFONT16 lf16;
+
+    FONT_LogFontWTo16( &font->logfont, &lf16 );
+
     if (count > sizeof(LOGFONT16)) count = sizeof(LOGFONT16);
-    memcpy( buffer, &font->logfont, count );
+    memcpy( buffer, &lf16, count );
     return count;
 }
 
@@ -458,12 +598,12 @@
  */
 INT FONT_GetObjectA( FONTOBJ *font, INT count, LPSTR buffer )
 {
-    LOGFONTA fnt32;
+    LOGFONTA lfA;
 
-    FONT_LogFont16To32A( &font->logfont, &fnt32 );
+    FONT_LogFontWToA( &font->logfont, &lfA );
 
-    if (count > sizeof(fnt32)) count = sizeof(fnt32);
-    memcpy( buffer, &fnt32, count );
+    if (count > sizeof(lfA)) count = sizeof(lfA);
+    memcpy( buffer, &lfA, count );
     return count;
 }
 /***********************************************************************
@@ -471,12 +611,8 @@
  */
 INT FONT_GetObjectW( FONTOBJ *font, INT count, LPSTR buffer )
 {
-    LOGFONTW fnt32;
-
-    FONT_LogFont16To32W( &font->logfont, &fnt32 );
-
-    if (count > sizeof(fnt32)) count = sizeof(fnt32);
-    memcpy( buffer, &fnt32, count );
+    if (count > sizeof(LOGFONTW)) count = sizeof(LOGFONTW);
+    memcpy( buffer, &font->logfont, count );
     return count;
 }
 
@@ -487,17 +623,17 @@
  * Called by the device driver layer to pass font info
  * down to the application.
  */
-static INT FONT_EnumInstance16( LPENUMLOGFONTEX16 plf, 
-				  LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
+static INT FONT_EnumInstance16( LPENUMLOGFONTEXW plf, LPNEWTEXTMETRICEXW ptm,
+				DWORD fType, LPARAM lp )
 {
 #define pfe ((fontEnum16*)lp)
     if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET || 
 	pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
     {
-	memcpy( pfe->lpLogFont, plf, sizeof(ENUMLOGFONT16) );
-	memcpy( pfe->lpTextMetric, ptm, sizeof(NEWTEXTMETRIC16) );
-
-        return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric, fType, (LPARAM)(pfe->lpData) );
+        FONT_EnumLogFontExWTo16(plf, pfe->lpLogFont);
+	FONT_NewTextMetricExWTo16(ptm, pfe->lpTextMetric);
+        return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric,
+				(UINT16)fType, (LPARAM)(pfe->lpData) );
     }
 #undef pfe
     return 1;
@@ -506,8 +642,8 @@
 /***********************************************************************
  *              FONT_EnumInstance
  */
-static INT FONT_EnumInstance( LPENUMLOGFONTEX16 plf,
-				  LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
+static INT FONT_EnumInstance( LPENUMLOGFONTEXW plf, LPNEWTEXTMETRICEXW ptm,
+			      DWORD fType, LPARAM lp )
 {
     /* lfCharSet is at the same offset in both LOGFONTA and LOGFONTW */
 
@@ -519,20 +655,19 @@
 
 	if( pfe->dwFlags & ENUM_UNICODE )
 	{
-	    FONT_EnumLogFontEx16To32W( plf, pfe->lpLogFont );
-	    FONT_TextMetric16to32W( (LPTEXTMETRIC16)ptm, (LPTEXTMETRICW)(pfe->lpTextMetric) );
-        
-	    return pfe->lpEnumFunc( pfe->lpLogFont, pfe->lpTextMetric, fType, pfe->lpData );
+	    return pfe->lpEnumFunc( plf, ptm, fType, pfe->lpData );
 	}
 	else
 	{
 	    ENUMLOGFONTEXA logfont;
+	    NEWTEXTMETRICEXA tmA;
 
-	    FONT_EnumLogFontEx16To32A( plf, &logfont);
-	    FONT_TextMetric16to32A( (LPTEXTMETRIC16)ptm, (LPTEXTMETRICA)pfe->lpTextMetric );
+	    FONT_EnumLogFontExWToA( plf, &logfont);
+	    FONT_NewTextMetricExWToA( ptm, &tmA );
 
 	    return pfe->lpEnumFunc( (LPENUMLOGFONTEXW)&logfont, 
-				pfe->lpTextMetric, fType, pfe->lpData );
+				    (LPNEWTEXTMETRICEXW)&tmA, fType,
+				    pfe->lpData );
 	}
     }
 #undef pfe
@@ -546,7 +681,7 @@
                                    FONTENUMPROCEX16 efproc, LPARAM lParam,
                                    DWORD dwFlags)
 {
-    BOOL (*enum_func)(HDC,LPLOGFONT16,DEVICEFONTENUMPROC,LPARAM);
+    BOOL (*enum_func)(HDC,LPLOGFONTW,DEVICEFONTENUMPROC,LPARAM);
     INT16	retVal = 0;
     DC* 	dc = DC_GetDCPtr( hDC );
 
@@ -556,13 +691,15 @@
 
     if (enum_func)
     {
-	LPNEWTEXTMETRICEX16	lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
+	LPNEWTEXTMETRICEX16 lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
 	if( lptm16 )
 	{
-	    LPENUMLOGFONTEX16	lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
+	    LPENUMLOGFONTEX16 lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
 	    if( lplf16 )
 	    {
 		fontEnum16	fe16;
+		LOGFONTW        lfW;
+		FONT_LogFont16ToW(plf, &lfW);
 
 		fe16.lpLogFontParam = plf;
 		fe16.lpEnumFunc = efproc;
@@ -573,7 +710,8 @@
 		fe16.segTextMetric = SEGPTR_GET(lptm16);
 		fe16.segLogFont = SEGPTR_GET(lplf16);
 
-		retVal = enum_func( hDC, plf, FONT_EnumInstance16, (LPARAM)&fe16 );
+		retVal = enum_func( hDC, &lfW, FONT_EnumInstance16,
+				    (LPARAM)&fe16 );
 		SEGPTR_FREE(lplf16);
 	    }
 	    SEGPTR_FREE(lptm16);
@@ -585,10 +723,11 @@
 /***********************************************************************
  *		FONT_EnumFontFamiliesEx
  */
-static INT FONT_EnumFontFamiliesEx( HDC hDC, LPLOGFONTW plf, FONTENUMPROCEXW efproc, 
-					           LPARAM lParam, DWORD dwUnicode)
+static INT FONT_EnumFontFamiliesEx( HDC hDC, LPLOGFONTW plf,
+				    FONTENUMPROCEXW efproc, 
+				    LPARAM lParam, DWORD dwUnicode)
 {
-    BOOL (*enum_func)(HDC,LPLOGFONT16,DEVICEFONTENUMPROC,LPARAM);
+    BOOL (*enum_func)(HDC,LPLOGFONTW,DEVICEFONTENUMPROC,LPARAM);
     INT ret = 0;
     DC *dc = DC_GetDCPtr( hDC );
 
@@ -598,36 +737,15 @@
 
     if (enum_func)
     {
-	LOGFONT16		lf16;
-	NEWTEXTMETRICEXW 	tm32w;
-	ENUMLOGFONTEXW	lf32w;
-	fontEnum32		fe32;
+	fontEnum32 fe32;
 
 	fe32.lpLogFontParam = plf;
 	fe32.lpEnumFunc = efproc;
 	fe32.lpData = lParam;
 	
-	fe32.lpTextMetric = &tm32w;
-	fe32.lpLogFont = &lf32w;
 	fe32.dwFlags = dwUnicode;
 
-	/* the only difference between LOGFONT32A and LOGFONT32W is in the lfFaceName */
-
-	if( plf->lfFaceName[0] )
-	{
-	    if( dwUnicode )
-            {
-                WideCharToMultiByte( CP_ACP, 0, plf->lfFaceName, -1,
-                                     lf16.lfFaceName, LF_FACESIZE, NULL, NULL );
-                lf16.lfFaceName[LF_FACESIZE-1] = 0;
-            }
-	    else
-		lstrcpynA( lf16.lfFaceName, (LPCSTR)plf->lfFaceName, LF_FACESIZE );
-	}
-	else lf16.lfFaceName[0] = '\0';
-	lf16.lfCharSet = plf->lfCharSet;
-
-	ret = enum_func( hDC, &lf16, FONT_EnumInstance, (LPARAM)&fe32 );
+	ret = enum_func( hDC, plf, FONT_EnumInstance, (LPARAM)&fe32 );
     }
     return ret;
 }
@@ -649,8 +767,11 @@
                                     FONTENUMPROCEXA efproc, 
                                     LPARAM lParam, DWORD dwFlags)
 {
-    return  FONT_EnumFontFamiliesEx( hDC, (LPLOGFONTW)plf, 
-				      (FONTENUMPROCEXW)efproc, lParam, 0);
+    LOGFONTW lfW;
+    FONT_LogFontAToW( plf, &lfW );
+
+    return  FONT_EnumFontFamiliesEx( hDC, &lfW,
+				     (FONTENUMPROCEXW)efproc, lParam, 0);
 }
 
 /***********************************************************************
@@ -680,8 +801,7 @@
     if( lpFamily ) lstrcpynA( lf.lfFaceName, lpFamily, LF_FACESIZE );
     else lf.lfFaceName[0] = lf.lfFaceName[1] = '\0';
 
-    return FONT_EnumFontFamiliesEx( hDC, (LPLOGFONTW)&lf, 
-					   (FONTENUMPROCEXW)efproc, lpData, 0 );
+    return EnumFontFamiliesExA( hDC, &lf, (FONTENUMPROCEXA)efproc, lpData, 0 );
 }
 
 /***********************************************************************
@@ -696,8 +816,7 @@
     if( lpFamily ) lstrcpynW( lf.lfFaceName, lpFamily, LF_FACESIZE );
     else lf.lfFaceName[0] = 0;
 
-    return FONT_EnumFontFamiliesEx( hDC, &lf, (FONTENUMPROCEXW)efproc, 
-	    					lpData, ENUM_UNICODE );
+    return EnumFontFamiliesExW( hDC, &lf, (FONTENUMPROCEXW)efproc, lpData, 0 );
 }
 
 /***********************************************************************
@@ -836,6 +955,24 @@
  */
 INT WINAPI GetTextFaceA( HDC hdc, INT count, LPSTR name )
 {
+    INT res = GetTextFaceW(hdc, 0, NULL);
+    LPWSTR nameW = HeapAlloc( GetProcessHeap(), 0, res * 2 );
+    GetTextFaceW( hdc, res, nameW );
+    
+    if (name)
+        res = WideCharToMultiByte( CP_ACP, 0, nameW, -1, name, count,
+				   NULL, NULL);
+    else
+        res = WideCharToMultiByte( CP_ACP, 0, nameW, -1, NULL, 0, NULL, NULL);
+    HeapFree( GetProcessHeap(), 0, nameW );
+    return res;
+}
+
+/***********************************************************************
+ *           GetTextFaceW    (GDI32.235)
+ */
+INT WINAPI GetTextFaceW( HDC hdc, INT count, LPWSTR name )
+{
     FONTOBJ *font;
     INT     ret = 0;
 
@@ -846,28 +983,16 @@
     {
         if (name)
         {
-            lstrcpynA( name, font->logfont.lfFaceName, count );
-            ret = strlen(name);
+            lstrcpynW( name, font->logfont.lfFaceName, count );
+            ret = strlenW(name);
         }
-        else ret = strlen(font->logfont.lfFaceName) + 1;
+        else ret = strlenW(font->logfont.lfFaceName) + 1;
         GDI_ReleaseObj( dc->hFont );
     }
     GDI_ReleaseObj( hdc );
     return ret;
 }
 
-/***********************************************************************
- *           GetTextFaceW    (GDI32.235)
- */
-INT WINAPI GetTextFaceW( HDC hdc, INT count, LPWSTR name )
-{
-    LPSTR nameA = HeapAlloc( GetProcessHeap(), 0, count );
-    INT res = GetTextFaceA(hdc,count,nameA);
-    if (name) res = MultiByteToWideChar( CP_ACP, 0, nameA, -1, name, count );
-    HeapFree( GetProcessHeap(), 0, nameA );
-    return res;
-}
-
 
 /***********************************************************************
  *           GetTextExtent16    (GDI.91)
@@ -1051,7 +1176,7 @@
     TEXTMETRICA tm32;
 
     if (!GetTextMetricsA( (HDC)hdc, &tm32 )) return FALSE;
-    FONT_TextMetric32Ato16( &tm32, metrics );
+    FONT_TextMetricATo16( &tm32, metrics );
     return TRUE;
 }
 
@@ -1120,7 +1245,7 @@
 {
     TEXTMETRICA tm;
     if (!GetTextMetricsA( (HDC16)hdc, &tm )) return FALSE;
-    FONT_TextMetric32Ato32W( &tm, metrics );
+    FONT_TextMetricAToW( &tm, metrics );
     return TRUE;
 }
 
Index: objects/gdiobj.c
===================================================================
RCS file: /home/wine/wine/objects/gdiobj.c,v
retrieving revision 1.43
diff -u -r1.43 gdiobj.c
--- objects/gdiobj.c	2001/01/15 20:12:56	1.43
+++ objects/gdiobj.c	2001/02/14 10:45:49
@@ -96,61 +96,54 @@
 {
     { 0, FONT_MAGIC, 1 },   /* header */
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
-      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
+      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} }
 };
-/* Filler to make the location counter dword aligned again.  This is necessary
-   since (a) FONTOBJ is packed, (b) gcc places initialised variables in the code
-   segment, and (c) Solaris assembler is stupid.  */
-static UINT16 align_OEMFixedFont = 1;
 
 static FONTOBJ AnsiFixedFont =
 {
     { 0, FONT_MAGIC, 1 },   /* header */
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
+      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} }
 };
-static UINT16 align_AnsiFixedFont = 1;
 
 static FONTOBJ AnsiVarFont =
 {
     { 0, FONT_MAGIC, 1 },   /* header */
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" }
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS,
+      {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'} }
 };
-static UINT16 align_AnsiVarFont = 1;
 
 static FONTOBJ SystemFont =
 {
     { 0, FONT_MAGIC, 1 },
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "System" }
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS,
+      {'S','y','s','t','e','m','\0'} }
 };
-static UINT16 align_SystemFont = 1;
 
 static FONTOBJ DeviceDefaultFont =
 {
     { 0, FONT_MAGIC, 1 },   /* header */
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "" }
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, {'\0'} }
 };
-static UINT16 align_DeviceDefaultFont = 1;
 
 static FONTOBJ SystemFixedFont =
 {
     { 0, FONT_MAGIC, 1 },   /* header */
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
+      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} }
 };
-static UINT16 align_SystemFixedFont = 1;
 
 /* FIXME: Is this correct? */
 static FONTOBJ DefaultGuiFont =
 {
     { 0, FONT_MAGIC, 1 },   /* header */
     { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" }
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS,
+      {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'} }
 };
-static UINT16 align_DefaultGuiFont = 1;
 
 
 static GDIOBJHDR * StockObjects[NB_STOCK_OBJECTS] =
@@ -328,15 +321,6 @@
     /* create GDI heap */
     if ((instance = LoadLibrary16( "GDI.EXE" )) < 32) return FALSE;
     GDI_HeapSel = GlobalHandleToSel16( instance );
-
-    /* Kill some warnings.  */
-    (void)align_OEMFixedFont;
-    (void)align_AnsiFixedFont;
-    (void)align_AnsiVarFont;
-    (void)align_SystemFont;
-    (void)align_DeviceDefaultFont;
-    (void)align_SystemFixedFont;
-    (void)align_DefaultGuiFont;
 
     /* TWEAK: Initialize font hints */
     ReadFontInformation("OEMFixed", &OEMFixedFont, 0, 0, 0, 0, 0);


More information about the wine-patches mailing list