[PATCH 2/3] gdi32: Move EnumFontFamiliesEx16() and helper functions to gdi16.c.

Michael Stefaniuc mstefani at redhat.de
Mon Feb 18 16:25:16 CST 2008


---
This duplicates for now the FONT_LogFont16ToW() function but Alexandre
told me on irc that he removed the other user of it in an yet unpublished
patch. Thus FONT_LogFont16ToW() can be removed from font.c in a later
patch.


 dlls/gdi32/font.c  |  154 --------------------------------------------
 dlls/gdi32/gdi16.c |  180 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 180 insertions(+), 154 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 27b01b1..6fb6743 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -113,20 +113,6 @@ typedef struct
 
 typedef struct
 {
-  LPLOGFONT16           lpLogFontParam;
-  FONTENUMPROC16        lpEnumFunc;
-  LPARAM                lpData;
-
-  LPNEWTEXTMETRICEX16   lpTextMetric;
-  LPENUMLOGFONTEX16     lpLogFont;
-  SEGPTR                segTextMetric;
-  SEGPTR                segLogFont;
-  DWORD                 dwFlags;
-  HDC                   hdc;
-} fontEnum16;
-
-typedef struct
-{
   LPLOGFONTW          lpLogFontParam;
   FONTENUMPROCW       lpEnumFunc;
   LPARAM              lpData;
@@ -236,21 +222,6 @@ static void FONT_LogFontWToA( const LOGFONTW *fontW, LPLOGFONTA fontA )
     fontA->lfFaceName[LF_FACESIZE-1] = 0;
 }
 
-static void FONT_EnumLogFontExWTo16( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEX16 font16 )
-{
-    FONT_LogFontWTo16( (const LOGFONTW *)fontW, (LPLOGFONT16)font16);
-
-    WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
-			 (LPSTR) font16->elfFullName, LF_FULLFACESIZE, NULL, NULL );
-    font16->elfFullName[LF_FULLFACESIZE-1] = '\0';
-    WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
-			 (LPSTR) font16->elfStyle, LF_FACESIZE, NULL, NULL );
-    font16->elfStyle[LF_FACESIZE-1] = '\0';
-    WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
-			 (LPSTR) font16->elfScript, LF_FACESIZE, NULL, NULL );
-    font16->elfScript[LF_FACESIZE-1] = '\0';
-}
-
 static void FONT_EnumLogFontExWToA( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEXA fontA )
 {
     FONT_LogFontWToA( (const LOGFONTW *)fontW, (LPLOGFONTA)fontA);
@@ -301,35 +272,6 @@ static void FONT_TextMetricWToA(const TEXTMETRICW *ptmW, LPTEXTMETRICA ptmA )
 }
 
 
-static void FONT_NewTextMetricExWTo16(const NEWTEXTMETRICEXW *ptmW, LPNEWTEXTMETRICEX16 ptm16 )
-{
-    ptm16->ntmTm.tmHeight = ptmW->ntmTm.tmHeight;
-    ptm16->ntmTm.tmAscent = ptmW->ntmTm.tmAscent;
-    ptm16->ntmTm.tmDescent = ptmW->ntmTm.tmDescent;
-    ptm16->ntmTm.tmInternalLeading = ptmW->ntmTm.tmInternalLeading;
-    ptm16->ntmTm.tmExternalLeading = ptmW->ntmTm.tmExternalLeading;
-    ptm16->ntmTm.tmAveCharWidth = ptmW->ntmTm.tmAveCharWidth;
-    ptm16->ntmTm.tmMaxCharWidth = ptmW->ntmTm.tmMaxCharWidth;
-    ptm16->ntmTm.tmWeight = ptmW->ntmTm.tmWeight;
-    ptm16->ntmTm.tmOverhang = ptmW->ntmTm.tmOverhang;
-    ptm16->ntmTm.tmDigitizedAspectX = ptmW->ntmTm.tmDigitizedAspectX;
-    ptm16->ntmTm.tmDigitizedAspectY = ptmW->ntmTm.tmDigitizedAspectY;
-    ptm16->ntmTm.tmFirstChar = ptmW->ntmTm.tmFirstChar > 255 ? 255 : ptmW->ntmTm.tmFirstChar;
-    ptm16->ntmTm.tmLastChar = ptmW->ntmTm.tmLastChar > 255 ? 255 : ptmW->ntmTm.tmLastChar;
-    ptm16->ntmTm.tmDefaultChar = ptmW->ntmTm.tmDefaultChar > 255 ? 255 : ptmW->ntmTm.tmDefaultChar;
-    ptm16->ntmTm.tmBreakChar = ptmW->ntmTm.tmBreakChar > 255 ? 255 : ptmW->ntmTm.tmBreakChar;
-    ptm16->ntmTm.tmItalic = ptmW->ntmTm.tmItalic;
-    ptm16->ntmTm.tmUnderlined = ptmW->ntmTm.tmUnderlined;
-    ptm16->ntmTm.tmStruckOut = ptmW->ntmTm.tmStruckOut;
-    ptm16->ntmTm.tmPitchAndFamily = ptmW->ntmTm.tmPitchAndFamily;
-    ptm16->ntmTm.tmCharSet = ptmW->ntmTm.tmCharSet;
-    ptm16->ntmTm.ntmFlags = ptmW->ntmTm.ntmFlags;
-    ptm16->ntmTm.ntmSizeEM = ptmW->ntmTm.ntmSizeEM;
-    ptm16->ntmTm.ntmCellHeight = ptmW->ntmTm.ntmCellHeight;
-    ptm16->ntmTm.ntmAvgWidth = ptmW->ntmTm.ntmAvgWidth;
-    memcpy(&ptm16->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE));
-}
-
 static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRICEXA *ptmA )
 {
     FONT_TextMetricWToA((const TEXTMETRICW *)ptmW, (LPTEXTMETRICA)ptmA);
@@ -673,45 +615,6 @@ static BOOL FONT_DeleteObject( HGDIOBJ handle, void *obj )
 
 
 /***********************************************************************
- *              FONT_EnumInstance16
- *
- * Called by the device driver layer to pass font info
- * down to the application.
- *
- * Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW.
- *       We have to use other types because of the FONTENUMPROCW definition.
- */
-static INT CALLBACK FONT_EnumInstance16( const LOGFONTW *plf, const TEXTMETRICW *ptm,
-                                         DWORD fType, LPARAM lp )
-{
-    fontEnum16 *pfe = (fontEnum16*)lp;
-    INT ret = 1;
-
-    if (!pfe->lpLogFontParam ||
-        pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
-        pfe->lpLogFontParam->lfCharSet == plf->lfCharSet )
-    {
-        WORD args[7];
-        DWORD result;
-
-        FONT_EnumLogFontExWTo16((const ENUMLOGFONTEXW *)plf, pfe->lpLogFont);
-        FONT_NewTextMetricExWTo16((const NEWTEXTMETRICEXW *)ptm, pfe->lpTextMetric);
-        pfe->dwFlags |= ENUM_CALLED;
-
-        args[6] = SELECTOROF(pfe->segLogFont);
-        args[5] = OFFSETOF(pfe->segLogFont);
-        args[4] = SELECTOROF(pfe->segTextMetric);
-        args[3] = OFFSETOF(pfe->segTextMetric);
-        args[2] = fType;
-        args[1] = HIWORD(pfe->lpData);
-        args[0] = LOWORD(pfe->lpData);
-        WOWCallback16Ex( (DWORD)pfe->lpEnumFunc, WCB16_PASCAL, sizeof(args), args, &result );
-        ret = LOWORD(result);
-    }
-    return ret;
-}
-
-/***********************************************************************
  *              FONT_EnumInstance
  *
  * Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW.
@@ -748,63 +651,6 @@ static INT CALLBACK FONT_EnumInstance( const LOGFONTW *plf, const TEXTMETRICW *p
 }
 
 /***********************************************************************
- *              EnumFontFamiliesEx	(GDI.613)
- */
-INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
-                                   FONTENUMPROC16 efproc, LPARAM lParam,
-                                   DWORD dwFlags)
-{
-    fontEnum16 fe16;
-    INT16	ret = 1, ret2;
-    DC* 	dc = get_dc_ptr( HDC_32(hDC) );
-    NEWTEXTMETRICEX16 tm16;
-    ENUMLOGFONTEX16 lf16;
-    LOGFONTW lfW, *plfW;
-    BOOL enum_gdi_fonts;
-
-    if (!dc) return 0;
-
-    if (plf)
-    {
-        FONT_LogFont16ToW(plf, &lfW);
-        plfW = &lfW;
-    }
-    else plfW = NULL;
-
-    fe16.hdc = HDC_32(hDC);
-    fe16.lpLogFontParam = plf;
-    fe16.lpEnumFunc = efproc;
-    fe16.lpData = lParam;
-    fe16.lpTextMetric = &tm16;
-    fe16.lpLogFont = &lf16;
-    fe16.segTextMetric = MapLS( &tm16 );
-    fe16.segLogFont = MapLS( &lf16 );
-    fe16.dwFlags = 0;
-
-    enum_gdi_fonts = GetDeviceCaps(fe16.hdc, TEXTCAPS) & TC_VA_ABLE;
-
-    if (!dc->funcs->pEnumDeviceFonts && !enum_gdi_fonts)
-    {
-        ret = 0;
-        goto done;
-    }
-
-    if (enum_gdi_fonts)
-        ret = WineEngEnumFonts( plfW, FONT_EnumInstance16, (LPARAM)&fe16 );
-    fe16.dwFlags &= ~ENUM_CALLED;
-    if (ret && dc->funcs->pEnumDeviceFonts) {
-	ret2 = dc->funcs->pEnumDeviceFonts( dc->physDev, plfW, FONT_EnumInstance16, (LPARAM)&fe16 );
-	if(fe16.dwFlags & ENUM_CALLED) /* update ret iff a font gets enumed */
-	    ret = ret2;
-    }
-done:
-    UnMapLS( fe16.segTextMetric );
-    UnMapLS( fe16.segLogFont );
-    release_dc_ptr( dc );
-    return ret;
-}
-
-/***********************************************************************
  *		FONT_EnumFontFamiliesEx
  */
 static INT FONT_EnumFontFamiliesEx( HDC hDC, LPLOGFONTW plf,
diff --git a/dlls/gdi32/gdi16.c b/dlls/gdi32/gdi16.c
index aeb0ba8..edbfe23 100644
--- a/dlls/gdi32/gdi16.c
+++ b/dlls/gdi32/gdi16.c
@@ -33,12 +33,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdi);
 #define HGDIOBJ_32(handle16)    ((HGDIOBJ)(ULONG_PTR)(handle16))
 #define HGDIOBJ_16(handle32)    ((HGDIOBJ16)(ULONG_PTR)(handle32))
 
+#define ENUM_CALLED     0x00000002
+
 struct callback16_info
 {
     FARPROC16 proc;
     LPARAM    param;
 };
 
+typedef struct
+{
+    LPLOGFONT16          lpLogFontParam;
+    FONTENUMPROC16       lpEnumFunc;
+    LPARAM               lpData;
+    LPNEWTEXTMETRICEX16  lpTextMetric;
+    LPENUMLOGFONTEX16    lpLogFont;
+    SEGPTR               segTextMetric;
+    SEGPTR               segLogFont;
+    DWORD                dwFlags;
+    HDC                  hdc;
+} fontEnum16;
+
 /* callback for LineDDA16 */
 static void CALLBACK linedda_callback( INT x, INT y, LPARAM param )
 {
@@ -119,6 +134,112 @@ static void logfont_16_to_W( const LOGFONT16 *font16, LPLOGFONTW font32 )
     font32->lfFaceName[LF_FACESIZE-1] = 0;
 }
 
+/* convert a LOGFONTW to a LOGFONT16 */
+static void logfont_W_to_16( const LOGFONTW* font32, LPLOGFONT16 font16 )
+{
+    font16->lfHeight = font32->lfHeight;
+    font16->lfWidth = font32->lfWidth;
+    font16->lfEscapement = font32->lfEscapement;
+    font16->lfOrientation = font32->lfOrientation;
+    font16->lfWeight = font32->lfWeight;
+    font16->lfItalic = font32->lfItalic;
+    font16->lfUnderline = font32->lfUnderline;
+    font16->lfStrikeOut = font32->lfStrikeOut;
+    font16->lfCharSet = font32->lfCharSet;
+    font16->lfOutPrecision = font32->lfOutPrecision;
+    font16->lfClipPrecision = font32->lfClipPrecision;
+    font16->lfQuality = font32->lfQuality;
+    font16->lfPitchAndFamily = font32->lfPitchAndFamily;
+    WideCharToMultiByte( CP_ACP, 0, font32->lfFaceName, -1,
+                         font16->lfFaceName, LF_FACESIZE, NULL, NULL );
+    font16->lfFaceName[LF_FACESIZE-1] = 0;
+}
+
+/* convert a ENUMLOGFONTEXW to a ENUMLOGFONTEX16 */
+static void enumlogfontex_W_to_16( const ENUMLOGFONTEXW *fontW,
+                                   LPENUMLOGFONTEX16 font16 )
+{
+    logfont_W_to_16( (const LOGFONTW *)fontW, (LPLOGFONT16)font16);
+
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
+                         (LPSTR) font16->elfFullName, LF_FULLFACESIZE, NULL, NULL );
+    font16->elfFullName[LF_FULLFACESIZE-1] = '\0';
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
+                         (LPSTR) font16->elfStyle, LF_FACESIZE, NULL, NULL );
+    font16->elfStyle[LF_FACESIZE-1] = '\0';
+    WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
+                         (LPSTR) font16->elfScript, LF_FACESIZE, NULL, NULL );
+    font16->elfScript[LF_FACESIZE-1] = '\0';
+}
+
+/* convert a NEWTEXTMETRICEXW to a NEWTEXTMETRICEX16 */
+static void newtextmetricex_W_to_16( const NEWTEXTMETRICEXW *ptmW,
+                                     LPNEWTEXTMETRICEX16 ptm16 )
+{
+    ptm16->ntmTm.tmHeight = ptmW->ntmTm.tmHeight;
+    ptm16->ntmTm.tmAscent = ptmW->ntmTm.tmAscent;
+    ptm16->ntmTm.tmDescent = ptmW->ntmTm.tmDescent;
+    ptm16->ntmTm.tmInternalLeading = ptmW->ntmTm.tmInternalLeading;
+    ptm16->ntmTm.tmExternalLeading = ptmW->ntmTm.tmExternalLeading;
+    ptm16->ntmTm.tmAveCharWidth = ptmW->ntmTm.tmAveCharWidth;
+    ptm16->ntmTm.tmMaxCharWidth = ptmW->ntmTm.tmMaxCharWidth;
+    ptm16->ntmTm.tmWeight = ptmW->ntmTm.tmWeight;
+    ptm16->ntmTm.tmOverhang = ptmW->ntmTm.tmOverhang;
+    ptm16->ntmTm.tmDigitizedAspectX = ptmW->ntmTm.tmDigitizedAspectX;
+    ptm16->ntmTm.tmDigitizedAspectY = ptmW->ntmTm.tmDigitizedAspectY;
+    ptm16->ntmTm.tmFirstChar = ptmW->ntmTm.tmFirstChar > 255 ? 255 : ptmW->ntmTm.tmFirstChar;
+    ptm16->ntmTm.tmLastChar = ptmW->ntmTm.tmLastChar > 255 ? 255 : ptmW->ntmTm.tmLastChar;
+    ptm16->ntmTm.tmDefaultChar = ptmW->ntmTm.tmDefaultChar > 255 ? 255 : ptmW->ntmTm.tmDefaultChar;
+    ptm16->ntmTm.tmBreakChar = ptmW->ntmTm.tmBreakChar > 255 ? 255 : ptmW->ntmTm.tmBreakChar;
+    ptm16->ntmTm.tmItalic = ptmW->ntmTm.tmItalic;
+    ptm16->ntmTm.tmUnderlined = ptmW->ntmTm.tmUnderlined;
+    ptm16->ntmTm.tmStruckOut = ptmW->ntmTm.tmStruckOut;
+    ptm16->ntmTm.tmPitchAndFamily = ptmW->ntmTm.tmPitchAndFamily;
+    ptm16->ntmTm.tmCharSet = ptmW->ntmTm.tmCharSet;
+    ptm16->ntmTm.ntmFlags = ptmW->ntmTm.ntmFlags;
+    ptm16->ntmTm.ntmSizeEM = ptmW->ntmTm.ntmSizeEM;
+    ptm16->ntmTm.ntmCellHeight = ptmW->ntmTm.ntmCellHeight;
+    ptm16->ntmTm.ntmAvgWidth = ptmW->ntmTm.ntmAvgWidth;
+    memcpy(&ptm16->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE));
+}
+
+/*
+ * callback for EnumFontFamiliesEx16
+ * Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW.
+ *       We have to use other types because of the FONTENUMPROCW definition.
+ */
+static INT CALLBACK enum_font_callback( const LOGFONTW *plf,
+                                        const TEXTMETRICW *ptm, DWORD fType,
+                                        LPARAM lp )
+{
+    fontEnum16 *pfe = (fontEnum16*)lp;
+    INT ret = 1;
+
+    if (!pfe->lpLogFontParam ||
+        pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
+        pfe->lpLogFontParam->lfCharSet == plf->lfCharSet )
+    {
+        WORD args[7];
+        DWORD result;
+
+        enumlogfontex_W_to_16((const ENUMLOGFONTEXW *)plf, pfe->lpLogFont);
+        newtextmetricex_W_to_16((const NEWTEXTMETRICEXW *)ptm, pfe->lpTextMetric);
+        pfe->dwFlags |= ENUM_CALLED;
+
+        args[6] = SELECTOROF(pfe->segLogFont);
+        args[5] = OFFSETOF(pfe->segLogFont);
+        args[4] = SELECTOROF(pfe->segTextMetric);
+        args[3] = OFFSETOF(pfe->segTextMetric);
+        args[2] = fType;
+        args[1] = HIWORD(pfe->lpData);
+        args[0] = LOWORD(pfe->lpData);
+        WOWCallback16Ex( (DWORD)pfe->lpEnumFunc, WCB16_PASCAL, sizeof(args),
+                          args, &result );
+        ret = LOWORD(result);
+    }
+    return ret;
+}
+
 
 /***********************************************************************
  *           SetBkColor    (GDI.1)
@@ -2920,6 +3041,65 @@ UINT16 WINAPI GetTextCharset16( HDC16 hdc )
 }
 
 
+/***********************************************************************
+ *           EnumFontFamiliesEx (GDI.613)
+ */
+INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
+                                   FONTENUMPROC16 efproc, LPARAM lParam,
+                                   DWORD dwFlags)
+{
+    fontEnum16 fe16;
+    INT16 ret = 1, ret2;
+    DC* dc = get_dc_ptr( HDC_32(hDC) );
+    NEWTEXTMETRICEX16 tm16;
+    ENUMLOGFONTEX16 lf16;
+    LOGFONTW lfW, *plfW;
+    BOOL enum_gdi_fonts;
+
+    if (!dc) return 0;
+
+    if (plf)
+    {
+        logfont_16_to_W(plf, &lfW);
+        plfW = &lfW;
+    }
+    else plfW = NULL;
+
+    fe16.hdc = HDC_32(hDC);
+    fe16.lpLogFontParam = plf;
+    fe16.lpEnumFunc = efproc;
+    fe16.lpData = lParam;
+    fe16.lpTextMetric = &tm16;
+    fe16.lpLogFont = &lf16;
+    fe16.segTextMetric = MapLS( &tm16 );
+    fe16.segLogFont = MapLS( &lf16 );
+    fe16.dwFlags = 0;
+
+    enum_gdi_fonts = GetDeviceCaps(fe16.hdc, TEXTCAPS) & TC_VA_ABLE;
+
+    if (!dc->funcs->pEnumDeviceFonts && !enum_gdi_fonts)
+    {
+        ret = 0;
+        goto done;
+    }
+
+    if (enum_gdi_fonts)
+        ret = WineEngEnumFonts( plfW, enum_font_callback, (LPARAM)&fe16 );
+    fe16.dwFlags &= ~ENUM_CALLED;
+    if (ret && dc->funcs->pEnumDeviceFonts) {
+        ret2 = dc->funcs->pEnumDeviceFonts( dc->physDev, plfW,
+                                            enum_font_callback, (LPARAM)&fe16 );
+        if(fe16.dwFlags & ENUM_CALLED) /* update ret iff a font gets enumed */
+            ret = ret2;
+    }
+done:
+    UnMapLS( fe16.segTextMetric );
+    UnMapLS( fe16.segLogFont );
+    release_dc_ptr( dc );
+    return ret;
+}
+
+
 /*************************************************************************
  *             GetFontLanguageInfo   (GDI.616)
  */
-- 
1.5.4.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-patches/attachments/20080218/d7a21781/attachment-0001.pgp 


More information about the wine-patches mailing list