fontdialog patch

Rein Klazes rklazes at xs4all.nl
Tue Dec 30 07:50:08 CST 2003


Hi,

Changelog:
	dlls/commdlg	: Makefile.in,
			 cdlg_xx.rc,
			 cdlg.h,
			 fontdlg.c,
			 fontdlg16.c
	include		: wingdi.h

	- Add a bitmap resource with the font icons: TrueType, printer,
	OpenType and Type 1. Modify the code so that they will be used
	if or when the needed bits are passed to the FontEnumProc.
	- Use EnumFontFamiliesEx instead of EnumFontFamilies.
	- Fix the fixme in the WM_MEASUREITEM message handler.

Rein.
-- 
Rein Klazes
rklazes at xs4all.nl
-------------- next part --------------
--- wine/dlls/commdlg/Makefile.in	2003-12-12 09:57:34.000000000 +0100
+++ mywine/dlls/commdlg/Makefile.in	2003-12-12 16:50:05.000000000 +0100
@@ -31,6 +31,7 @@
 RC_BINSRC = cdlg_xx.rc
 RC_BINARIES = \
 	800.bmp \
+	fontpics.bmp \
 	cdrom.ico \
 	floppy.ico \
 	folder2.ico \
--- wine/dlls/commdlg/cdlg_xx.rc	2003-12-16 09:19:43.000000000 +0100
+++ mywine/dlls/commdlg/cdlg_xx.rc	2003-12-18 19:19:11.000000000 +0100
@@ -566,3 +566,56 @@
  '00 00 80 00 00 00 80 00 00 00 80 00 00 00 C0 00'
  '00 00 E0 01 00 00 FF FF 00 00 FF FF 00 00'
 } */
+
+/* BINRES fontpics.bmp */
+38 BITMAP DISCARDABLE LOADONCALL fontpics.bmp
+/*{
+ '42 4D E6 02 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 64 00 00 00 0C 00 00 00 01 00 04 00 00 00'
+ '00 00 70 02 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 CC CC CC CC C5 55 55 5C CC CC'
+ 'CC C0 00 00 00 00 00 00 00 CC CC CC CC 78 06 87'
+ 'CC CC CC CC CC CC CC 78 06 87 CC CC CC CC CC CC'
+ 'CC CC CC CC CC CC CC CC 00 00 CC CC CC CC CC C5'
+ '5C CC CC CC CC 07 77 77 77 77 77 77 77 0C CC CC'
+ 'C8 87 CC C7 67 CC CC CC CC CC C8 87 CC C7 67 CC'
+ 'CC CC CC CC C7 97 7C C7 87 CC CC CC 00 00 CC CC'
+ '66 66 66 C5 5C CC CC CC CC 07 77 77 77 77 99 AA'
+ '77 0C CC CC 70 7C CC CC 76 7C CC CC CC CC 70 7C'
+ '66 6C 76 7C CC CC CC CC C9 99 97 C9 99 97 CC CC'
+ '00 00 CC CC CC 66 CC C5 5C CC CC CC CC C0 00 08'
+ '88 88 88 00 00 CC CC CC 80 CC CC CC C8 6C CC CC'
+ 'CC CC 80 CC CC C6 C8 6C CC CC CC CC C9 99 C7 C7'
+ '99 C7 CC CC 00 00 CC CC CC 66 CC C5 5C CC CC CC'
+ 'CC C8 0F FF FF FF FF FF 08 CC CC CC 00 CC CC CC'
+ 'C7 67 CC CC CC CC 00 6C C6 66 C7 67 CC CC CC CC'
+ 'C7 99 CC 77 99 CC CC CC 00 00 CC CC CC 66 CC C5'
+ '5C CC CC CC CC C8 FF F8 88 88 88 FF F8 CC CC CC'
+ '00 CC CC CC CC 67 CC CC CC CC 00 C6 CC 6C CC 67'
+ 'CC CC CC CC C7 99 CC C8 99 7C CC CC 00 00 CC CC'
+ 'CC 65 CC C5 5C CC 5C CC CC C8 0F FF FF FF FF FF'
+ '08 CC CC CC 80 CC CC CC CC 66 CC CC CC CC 80 C6'
+ '6C 66 6C 66 CC CC CC CC CC 99 7C C7 99 7C CC CC'
+ '00 00 CC CC CC 65 5C C5 5C C5 5C CC CC C8 FF F8'
+ '88 88 88 FF F8 CC CC CC 70 7C CC CC CC 66 CC CC'
+ 'CC CC 70 7C 6C 6C CC 66 CC CC CC CC CC 89 7C CC'
+ '99 7C CC CC 00 00 CC CC CC 65 55 55 55 55 5C CC'
+ 'CC C8 0F FF FF FF FF FF 08 CC CC CC C0 8C CC CC'
+ 'CC 68 CC CC CC CC C0 8C 66 CC CC 68 CC CC CC CC'
+ 'CC C9 9C CC 99 9C CC CC 00 00 CC 6C CC 66 CC C6'
+ 'CC CC CC CC CC C8 FF F8 88 88 88 FF F8 CC CC CC'
+ 'C7 07 CC CC C7 67 CC CC CC CC C7 07 CC CC C7 67'
+ 'CC CC CC CC CC CC 77 CC 89 9C CC CC 00 00 CC 66'
+ 'CC 66 CC 66 CC CC CC CC CC C8 0F FF FF FF FF FF'
+ '08 CC CC CC CC 78 7C CC 78 7C CC CC CC CC CC 78'
+ '7C CC 78 7C CC CC CC CC CC CC CC 89 97 7C CC CC'
+ '00 00 CC 66 66 66 66 66 CC CC CC CC CC C8 88 88'
+ '88 88 88 88 88 CC CC CC CC CC 78 06 77 CC CC CC'
+ 'CC CC CC CC 78 06 77 CC CC CC CC CC CC CC CC CC'
+ 'CC CC CC CC 00 00'
+}*/ 
+
--- wine/dlls/commdlg/cdlg.h	2003-12-12 09:57:34.000000000 +0100
+++ mywine/dlls/commdlg/cdlg.h	2003-12-19 20:41:51.000000000 +0100
@@ -203,9 +203,10 @@
   int  added;
 } CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
 
-INT AddFontFamily(const LOGFONTA *lplf, UINT nFontType, LPCHOOSEFONTA lpcf, 
-					HWND hwnd, LPCFn_ENUMSTRUCT e);
-INT AddFontStyle(const ENUMLOGFONTEXA *lpElfex, const TEXTMETRICA *metrics,
+INT AddFontFamily(const ENUMLOGFONTEXA *lpElfex, const NEWTEXTMETRICEXA *lpNTM,
+                  UINT nFontType, LPCHOOSEFONTA lpcf, HWND hwnd,
+                  LPCFn_ENUMSTRUCT e);
+INT AddFontStyle(const ENUMLOGFONTEXA *lpElfex, const NEWTEXTMETRICEXA *metrics,
                  UINT nFontType, LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3,
                  HWND hDlg, BOOL iswin16);
 void _dump_cf_flags(DWORD cflags);
--- wine/dlls/commdlg/fontdlg.c	2003-12-12 09:57:36.000000000 +0100
+++ mywine/dlls/commdlg/fontdlg.c	2003-12-19 20:40:27.000000000 +0100
@@ -41,7 +41,9 @@
 
 #include "cdlg.h"
 
-static HBITMAP hBitmapTT = 0;
+/* image list with TrueType bitmaps and more */
+static HIMAGELIST himlTT = 0;
+#define TTBITMAP_XSIZE 20 /* x-size of the bitmaps */
 
 
 INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
@@ -394,11 +396,12 @@
 /*************************************************************************
  *              AddFontFamily                               [internal]
  */
-INT AddFontFamily(const LOGFONTA *lplf, UINT nFontType,
-        LPCHOOSEFONTA lpcf, HWND hwnd, LPCFn_ENUMSTRUCT e)
+INT AddFontFamily(const ENUMLOGFONTEXA *lpElfex, const NEWTEXTMETRICEXA *lpNTM,
+        UINT nFontType, LPCHOOSEFONTA lpcf, HWND hwnd, LPCFn_ENUMSTRUCT e)
 {
     int i;
     WORD w;
+    const LOGFONTA *lplf = &(lpElfex->elfLogFont);
 
     TRACE("font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType);
 
@@ -418,8 +421,9 @@
     if (i == CB_ERR) {
         i = SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName);
         if( i != CB_ERR) {
-            w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
             /* store some important font information */
+            w = (lplf->lfPitchAndFamily) << 8 |
+                (HIWORD(lpNTM->ntmTm.ntmFlags) & 0xff);
             SendMessageA(hwnd, CB_SETITEMDATA, i, MAKELONG(nFontType,w));
         }
     }
@@ -429,12 +433,13 @@
 /*************************************************************************
  *              FontFamilyEnumProc32                           [internal]
  */
-static INT WINAPI FontFamilyEnumProc(const LOGFONTA *lpLogFont,
+static INT WINAPI FontFamilyEnumProc(const ENUMLOGFONTEXA *lpElfex,
         const TEXTMETRICA *metrics, DWORD dwFontType, LPARAM lParam)
 {
     LPCFn_ENUMSTRUCT e;
     e=(LPCFn_ENUMSTRUCT)lParam;
-    return AddFontFamily(lpLogFont, dwFontType, e->lpcf32a, e->hWnd1, e);
+    return AddFontFamily( lpElfex, (NEWTEXTMETRICEXA *) metrics,
+            dwFontType, e->lpcf32a, e->hWnd1, e);
 }
 
 /*************************************************************************
@@ -545,7 +550,7 @@
 /***********************************************************************
  *                 AddFontStyle                          [internal]
  */
-INT AddFontStyle( const ENUMLOGFONTEXA *lpElfex, const TEXTMETRICA *lpTM,
+INT AddFontStyle( const ENUMLOGFONTEXA *lpElfex, const NEWTEXTMETRICEXA *lpNTM,
                 UINT nFontType, LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3,
                 HWND hDlg, BOOL iswin16)
 {
@@ -566,8 +571,8 @@
     {
         INT points;
         if(!(hdc = CFn_GetDC(lpcf))) return 0;
-        points = MulDiv( lpTM->tmHeight - lpTM->tmInternalLeading, 72,
-                GetDeviceCaps(hdc, LOGPIXELSY));
+        points = MulDiv( lpNTM->ntmTm.tmHeight - lpNTM->ntmTm.tmInternalLeading,
+                72, GetDeviceCaps(hdc, LOGPIXELSY));
         CFn_ReleaseDC(lpcf, hdc);
         i = AddFontSizeToCombo3(hcmb3, points, lpcf);
         if( i) return 0;
@@ -669,8 +674,8 @@
     HWND hcmb2=s->hWnd1;
     HWND hcmb3=s->hWnd2;
     HWND hDlg=GetParent(hcmb3);
-    return AddFontStyle( lpElfex, metrics, dwFontType, s->lpcf32a,
-            hcmb2, hcmb3, hDlg, FALSE);
+    return AddFontStyle( lpElfex, (const NEWTEXTMETRICEXA *) metrics,
+            dwFontType, s->lpcf32a, hcmb2, hcmb3, hDlg, FALSE);
 }
 
 /***********************************************************************
@@ -696,8 +701,9 @@
         EndDialog (hDlg, 0);
         return FALSE;
     }
-    if (!hBitmapTT)
-        hBitmapTT = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_TRTYPE));
+    if (!himlTT)
+        himlTT = ImageList_LoadImageA( COMDLG32_hInstance, MAKEINTRESOURCEA(38),
+                TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0);
 
     if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
         ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
@@ -737,9 +743,14 @@
     s.hWnd1=GetDlgItem(hDlg,cmb1);
     s.lpcf32a=lpcf;
     do {
+        LOGFONTA elf;
         s.added = 0;
-        if (!EnumFontFamiliesA(hdc, NULL, FontFamilyEnumProc, (LPARAM)&s)) {
-            TRACE("EnumFontFamilies returns 0\n");
+        elf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
+        elf.lfPitchAndFamily = 0;
+        elf.lfFaceName[0] = '\0'; /* enum all fonts */
+        if (!EnumFontFamiliesExA(hdc, &elf, FontFamilyEnumProc, (LPARAM)&s, 0))
+        {
+            TRACE("EnumFontFamiliesEx returns 0\n");
             break;
         }
         if (s.added) break;
@@ -808,13 +819,23 @@
  */
 LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
-    BITMAP bm;
+    HDC hdc;
+    HFONT hfontprev;
+    TEXTMETRICW tm;
     LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam;
-    if (!hBitmapTT)
-        hBitmapTT = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_TRTYPE));
-    GetObjectA( hBitmapTT, sizeof(bm), &bm );
-    lpmi->itemHeight=bm.bmHeight;
-    /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
+    if (!himlTT)
+        himlTT = ImageList_LoadImageA( COMDLG32_hInstance, MAKEINTRESOURCEA(38),
+                TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0);
+    ImageList_GetIconSize( himlTT, 0, &lpmi->itemHeight);
+    lpmi->itemHeight += 2;
+    /* use MAX of bitmap height and tm.tmHeight .*/
+    hdc=GetDC( hDlg);
+    if(!hdc) return 0;
+    hfontprev = SelectObject( hdc, GetStockObject( SYSTEM_FONT));
+    GetTextMetricsW( hdc, &tm);
+    if( tm.tmHeight > lpmi->itemHeight) lpmi->itemHeight = tm.tmHeight;
+    SelectObject( hdc, hfontprev);
+    ReleaseDC( hDlg, hdc);
     return 0;
 }
 
@@ -826,12 +847,10 @@
 {
     HBRUSH hBrush;
     char buffer[40];
-    BITMAP bm;
     COLORREF cr, oldText=0, oldBk=0;
     RECT rect;
-    HDC hMemDC;
     int nFontType;
-    HBITMAP objPrev; /* for TT usage */
+    int idx;
     LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
 
     if (lpdi->itemID == (UINT)-1)  /* got no items */
@@ -862,19 +881,23 @@
             /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
             SendMessageA(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
                          (LPARAM)buffer);
-            GetObjectA( hBitmapTT, sizeof(bm), &bm );
-            TextOutA(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
+            TextOutA(lpdi->hDC, lpdi->rcItem.left + TTBITMAP_XSIZE + 10,
                      lpdi->rcItem.top, buffer, strlen(buffer));
             nFontType = SendMessageA(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
-            if (nFontType & TRUETYPE_FONTTYPE)
-            {
-                hMemDC = CreateCompatibleDC(lpdi->hDC);
-                objPrev = SelectObject(hMemDC, hBitmapTT);
-                BitBlt(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
-                       bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-                SelectObject(hMemDC, objPrev);
-                DeleteDC(hMemDC);
-            }
+            idx = -1;
+            if (nFontType & TRUETYPE_FONTTYPE) {
+                idx = 0;  /* picture: TT */
+                if( nFontType & NTM_TT_OPENTYPE)
+                    idx = 2; /* picture: O */
+            } else if( nFontType & NTM_PS_OPENTYPE)
+                idx = 3; /* picture: O+ps */
+            else if( nFontType & NTM_TYPE1)
+                idx = 4; /* picture: a */
+            else if( nFontType & DEVICE_FONTTYPE)
+                idx = 1; /* picture: printer */
+            if( idx >= 0)
+                ImageList_Draw( himlTT, idx, lpdi->hDC, lpdi->rcItem.left,
+                        lpdi->rcItem.top, ILD_TRANSPARENT);
             break;
         case cmb2:
         case cmb3:
@@ -927,7 +950,7 @@
 LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
         LPCHOOSEFONTA lpcf)
 {
-    int i,j;
+    int i;
     long l;
     HDC hdc;
     LPLOGFONTA lpxx=lpcf->lpLogFont;
@@ -1000,13 +1023,11 @@
                 SendDlgItemMessageA(hDlg,cmb1,CB_GETLBTEXT,i,
                                     (LPARAM)str);
                 l=SendDlgItemMessageA(hDlg,cmb1,CB_GETITEMDATA,i,0);
-                j=HIWORD(l);
                 lpcf->nFontType = LOWORD(l);
                 /* FIXME:   lpcf->nFontType |= ....  SIMULATED_FONTTYPE and so */
                 /* same value reported to the EnumFonts
                    call back with the extra FONTTYPE_...  bits added */
-                lpxx->lfPitchAndFamily=j&0xff;
-                lpxx->lfCharSet=j>>8;
+                lpxx->lfPitchAndFamily = HIWORD(l) >> 8;
             }
             strcpy(lpxx->lfFaceName,str);
             i=SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0);
@@ -1035,6 +1056,8 @@
             i=SendDlgItemMessageA(hDlg, cmb5, CB_GETCURSEL, 0, 0);
             if (i!=CB_ERR)
                 lpxx->lfCharSet=SendDlgItemMessageA(hDlg, cmb5, CB_GETITEMDATA, i, 0);
+            else
+                lpxx->lfCharSet = DEFAULT_CHARSET;
             lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
             lpxx->lfUnderline=IsDlgButtonChecked(hDlg,chx2);
             lpxx->lfWidth=lpxx->lfOrientation=lpxx->lfEscapement=0;
--- wine/dlls/commdlg/fontdlg16.c	2003-12-12 09:57:36.000000000 +0100
+++ mywine/dlls/commdlg/fontdlg16.c	2003-12-20 15:25:33.000000000 +0100
@@ -59,12 +59,13 @@
     lstrcpynA( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
 };
 
-static void FONT_Metrics16To32A( const TEXTMETRIC16 *pm16, TEXTMETRICA *pm32a)
+static void FONT_Metrics16To32A( const TEXTMETRIC16 *pm16,
+                                 NEWTEXTMETRICEXA *pnm32a)
 {
-    ZeroMemory( pm32a, sizeof(TEXTMETRICA));
+    ZeroMemory( pnm32a, sizeof(NEWTEXTMETRICEXA));
     /* NOTE: only the fields used by AddFontStyle() are filled in */
-    pm32a->tmHeight = pm16->tmHeight;
-    pm32a->tmExternalLeading = pm16->tmExternalLeading;
+    pnm32a->ntmTm.tmHeight = pm16->tmHeight;
+    pnm32a->ntmTm.tmExternalLeading = pm16->tmExternalLeading;
 };
 
 static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
@@ -108,10 +109,13 @@
   HWND hDlg=GetParent(hwnd);
   LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
   LOGFONT16 *lplf = MapSL( logfont );
-  LOGFONTA lf32a;
-  FONT_LogFont16To32A(lplf, &lf32a);
-  return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
-                       hwnd,NULL);
+  TEXTMETRIC16 *lpmtrx16 = MapSL(metrics);
+  ENUMLOGFONTEXA elf32a;
+  NEWTEXTMETRICEXA nmtrx32a;
+  FONT_LogFont16To32A(lplf, &(elf32a.elfLogFont));
+  FONT_Metrics16To32A(lpmtrx16, &nmtrx32a);
+  return AddFontFamily(&elf32a, &nmtrx32a, nFontType,
+          (LPCHOOSEFONTA)lpcf->lpTemplateName, hwnd,NULL);
 }
 
 /***********************************************************************
@@ -127,10 +131,10 @@
   LOGFONT16 *lplf = MapSL(logfont);
   TEXTMETRIC16 *lpmtrx16 = MapSL(metrics);
   ENUMLOGFONTEXA elf32a;
-  TEXTMETRICA mtrx32a;
+  NEWTEXTMETRICEXA nmtrx32a;
   FONT_LogFont16To32A(lplf, &(elf32a.elfLogFont));
-  FONT_Metrics16To32A(lpmtrx16, &mtrx32a);
-  return AddFontStyle(&elf32a, &mtrx32a, nFontType,
+  FONT_Metrics16To32A(lpmtrx16, &nmtrx32a);
+  return AddFontStyle(&elf32a, &nmtrx32a, nFontType,
           (LPCHOOSEFONTA)lpcf->lpTemplateName, hcmb2, hcmb3, hDlg, TRUE);
 }
 
--- wine/include/wingdi.h	2003-12-02 08:04:42.000000000 +0100
+++ mywine/include/wingdi.h	2003-12-14 19:31:26.000000000 +0100
@@ -1098,6 +1098,15 @@
 #define NTM_BOLD        0x00000020L
 #define NTM_ITALIC      0x00000001L
 
+/* Win2K additions */    
+#define NTM_NONNEGATIVE_AC  0x00010000L
+#define NTM_PS_OPENTYPE     0x00020000L
+#define NTM_TT_OPENTYPE     0x00040000L
+#define NTM_MULTIPLEMASTER  0x00080000L
+#define NTM_TYPE1           0x00100000L
+#define NTM_DSIG            0x00200000L
+
+
 typedef struct
 {
     LONG      tmHeight;


More information about the wine-patches mailing list