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