fontdialog: points <-> font height conversions

Rein Klazes rklazes at xs4all.nl
Wed Dec 10 13:20:09 CST 2003


Hi,

Changelog:
	dlls/commdlg	: fontdlg.h
			  fontdlg.c
			  fontdlg16.c

	Do conversions between the font size specified in points
	(or decipoints) and height specified in logical units.

Rein.
-- 
Rein Klazes
rklazes at xs4all.nl
-------------- next part --------------
--- refwine/dlls/commdlg/fontdlg.h	2003-12-10 11:02:56.000000000 +0100
+++ mywine/dlls/commdlg/fontdlg.h	2003-12-10 16:20:26.000000000 +0100
@@ -45,9 +45,9 @@
 
 INT AddFontFamily(const LOGFONTA *lplf, UINT nFontType, LPCHOOSEFONTA lpcf, 
 					HWND hwnd, LPCFn_ENUMSTRUCT e);
-INT AddFontStyle(const ENUMLOGFONTEXA *lpElfex, UINT nFontType,
-                                        LPCHOOSEFONTA lpcf, HWND hcmb2,
-                                        HWND hcmb3, HWND hDlg, BOOL iswin16);
+INT AddFontStyle(const ENUMLOGFONTEXA *lpElfex, const TEXTMETRICA *metrics,
+                 UINT nFontType, LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3,
+                 HWND hDlg, BOOL iswin16);
 void _dump_cf_flags(DWORD cflags);
 
 LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
--- refwine/dlls/commdlg/fontdlg.c	2003-12-10 08:34:46.000000000 +0100
+++ mywine/dlls/commdlg/fontdlg.c	2003-12-10 16:40:38.000000000 +0100
@@ -524,16 +524,38 @@
     return 0;
 }
 
+/*************************************************************************
+ *              CFn_GetDC                           [internal]
+ */
+inline HDC CFn_GetDC(LPCHOOSEFONTA lpcf)
+{
+    HDC ret = ((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC) ?
+        lpcf->hDC :
+        GetDC(0);
+    if(!ret) ERR("HDC failure!!!\n");
+    return ret;
+}
+
+/*************************************************************************
+ *              CFn_ReleaseDC                           [internal]
+ */
+inline void CFn_ReleaseDC(LPCHOOSEFONTA lpcf, HDC hdc)
+{
+        if(!((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC))
+            ReleaseDC(0, hdc);
+}
+
 /***********************************************************************
  *                 AddFontStyle                          [internal]
  */
-INT AddFontStyle( const ENUMLOGFONTEXA *lpElfex, UINT nFontType,
-                 LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3, HWND hDlg,
-                 BOOL iswin16)
+INT AddFontStyle( const ENUMLOGFONTEXA *lpElfex, const TEXTMETRICA *lpTM,
+                UINT nFontType, LPCHOOSEFONTA lpcf, HWND hcmb2, HWND hcmb3,
+                HWND hDlg, BOOL iswin16)
 {
     int i;
     const LOGFONTA *lplf = &(lpElfex->elfLogFont);
     HWND hcmb5;
+    HDC hdc;
 
     TRACE("(nFontType=%d)\n",nFontType);
     TRACE("  %s h=%ld w=%ld e=%ld o=%ld wg=%ld i=%d u=%d s=%d"
@@ -545,15 +567,20 @@
             lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily);
     if (nFontType & RASTER_FONTTYPE)
     {
-        if (AddFontSizeToCombo3(hcmb3, lplf->lfHeight, lpcf)) return 0;
+        INT points;
+        if(!(hdc = CFn_GetDC(lpcf))) return 0;
+        points = MulDiv( lpTM->tmHeight - lpTM->tmInternalLeading, 72,
+                GetDeviceCaps(hdc, LOGPIXELSY));
+        CFn_ReleaseDC(lpcf, hdc);
+        i = AddFontSizeToCombo3(hcmb3, points, lpcf);
+        if( i) return 0;
     } else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0;
 
     if (!SendMessageA(hcmb2, CB_GETCOUNT, 0, 0))
     {
-        HDC hdc= ((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
+        if(!(hdc = CFn_GetDC(lpcf))) return 0;
         i=SetFontStylesToCombo2(hcmb2,hdc,lplf);
-        if (!((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC))
-            ReleaseDC(hDlg,hdc);
+        CFn_ReleaseDC(lpcf, hdc);
         if (i)
             return 0;
     }
@@ -645,7 +672,7 @@
     HWND hcmb2=s->hWnd1;
     HWND hcmb3=s->hWnd2;
     HWND hDlg=GetParent(hcmb3);
-    return AddFontStyle( lpElfex, dwFontType, s->lpcf32a,
+    return AddFontStyle( lpElfex, metrics, dwFontType, s->lpcf32a,
             hcmb2, hcmb3, hDlg, FALSE);
 }
 
@@ -658,6 +685,7 @@
     HDC hdc;
     int i,j,init=0;
     long pstyle;
+    CFn_ENUMSTRUCT s;
     LPLOGFONTA lpxx;
     HCURSOR hcursor=SetCursor(LoadCursorA(0,(LPSTR)IDC_WAIT));
 
@@ -704,81 +732,75 @@
         ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
         ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
     }
-    hdc= ((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
-    if (hdc)
+    if(!(hdc = CFn_GetDC(lpcf)))
     {
-        CFn_ENUMSTRUCT s;
-        s.hWnd1=GetDlgItem(hDlg,cmb1);
-        s.lpcf32a=lpcf;
-        do {
-            s.added = 0;
-            if (!EnumFontFamiliesA(hdc, NULL, FontFamilyEnumProc, (LPARAM)&s)) {
-                TRACE("EnumFontFamilies returns 0\n");
-                break;
-            }
-            if (s.added) break;
-            if (lpcf->Flags & CF_FIXEDPITCHONLY) {
-                FIXME("No font found with fixed pitch only, dropping flag.\n");
-                lpcf->Flags &= ~CF_FIXEDPITCHONLY;
-                continue;
-            }
-            if (lpcf->Flags & CF_TTONLY) {
-                FIXME("No font found with truetype only, dropping flag.\n");
-                lpcf->Flags &= ~CF_TTONLY;
-                continue;
-            }
+        EndDialog (hDlg, 0);
+        return FALSE;
+    }
+    s.hWnd1=GetDlgItem(hDlg,cmb1);
+    s.lpcf32a=lpcf;
+    do {
+        s.added = 0;
+        if (!EnumFontFamiliesA(hdc, NULL, FontFamilyEnumProc, (LPARAM)&s)) {
+            TRACE("EnumFontFamilies returns 0\n");
             break;
-        } while (1);
+        }
+        if (s.added) break;
+        if (lpcf->Flags & CF_FIXEDPITCHONLY) {
+            FIXME("No font found with fixed pitch only, dropping flag.\n");
+            lpcf->Flags &= ~CF_FIXEDPITCHONLY;
+            continue;
+        }
+        if (lpcf->Flags & CF_TTONLY) {
+            FIXME("No font found with truetype only, dropping flag.\n");
+            lpcf->Flags &= ~CF_TTONLY;
+            continue;
+        }
+        break;
+    } while (1);
 
 
-        if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
-        {
-            /* look for fitting font name in combobox1 */
-            j=SendDlgItemMessageA(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
-            if (j!=CB_ERR)
-            {
-                INT height = lpxx->lfHeight < 0 ? -lpxx->lfHeight :
-                    lpxx->lfHeight;
-                int charset = lpxx->lfCharSet;
-                pstyle = MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:
-                        FW_NORMAL,lpxx->lfItalic !=0);
-                SendDlgItemMessageA(hDlg, cmb1, CB_SETCURSEL, j, 0);
-                SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
-                        (LPARAM)GetDlgItem(hDlg,cmb1));
-                init=1;
-                /* look for fitting font style in combobox2 */
-                CFn_FitFontStyle(hDlg, pstyle);
-                /* look for fitting font size in combobox3 */
-                CFn_FitFontSize(hDlg, height);
-                CFn_FitCharSet( hDlg, charset );
-            }
-        }
-        if (!init)
-        {
-            SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
+    if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
+    {
+        /* look for fitting font name in combobox1 */
+        j=SendDlgItemMessageA(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
+        if (j!=CB_ERR)
+        {
+            INT height = lpxx->lfHeight < 0 ? -lpxx->lfHeight :
+                lpxx->lfHeight;
+            INT points;
+            int charset = lpxx->lfCharSet;
+            points = MulDiv( height, 72, GetDeviceCaps(hdc, LOGPIXELSY));
+            pstyle = MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:
+                    FW_NORMAL,lpxx->lfItalic !=0);
+            SendDlgItemMessageA(hDlg, cmb1, CB_SETCURSEL, j, 0);
             SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
                     (LPARAM)GetDlgItem(hDlg,cmb1));
-        }
-        if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
-        {
-            j=SendDlgItemMessageA(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
-            if (j!=CB_ERR)
-            {
-                j=SendDlgItemMessageA(hDlg,cmb2,CB_SETCURSEL,j,0);
-                SendMessageA(hDlg,WM_COMMAND,cmb2,
-                        MAKELONG(HWND_16(GetDlgItem(hDlg,cmb2)),CBN_SELCHANGE));
-            }
+            init=1;
+            /* look for fitting font style in combobox2 */
+            CFn_FitFontStyle(hDlg, pstyle);
+            /* look for fitting font size in combobox3 */
+            CFn_FitFontSize(hDlg, points);
+            CFn_FitCharSet( hDlg, charset );
         }
     }
-    else
+    if (!init)
     {
-        WARN("HDC failure !!!\n");
-        EndDialog (hDlg, 0);
-        return FALSE;
+        SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
+        SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
+                (LPARAM)GetDlgItem(hDlg,cmb1));
     }
-
-    if (!((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC))
-        ReleaseDC(hDlg,hdc);
+    if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
+    {
+        j=SendDlgItemMessageA(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
+        if (j!=CB_ERR)
+        {
+            j=SendDlgItemMessageA(hDlg,cmb2,CB_SETCURSEL,j,0);
+            SendMessageA(hDlg,WM_COMMAND,cmb2,
+                    MAKELONG(HWND_16(GetDlgItem(hDlg,cmb2)),CBN_SELCHANGE));
+        }
+    }
+    CFn_ReleaseDC(lpcf, hdc);
     SetCursor(hcursor);
     return TRUE;
 }
@@ -919,54 +941,48 @@
     case cmb1:
         if (HIWORD(wParam)==CBN_SELCHANGE)
         {
-            hdc=((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
-            if (hdc)
-            {
-                INT pointsize; /* save current pointsize */
-                LONG pstyle;  /* save current style */
-                int charset;
-                int idx;
-                idx = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0);
-                pointsize = (int)SendDlgItemMessageA( hDlg, cmb3, CB_GETITEMDATA,
-                        idx, 0);
-                idx = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0);
-                pstyle = SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, idx, 0);
-                idx = SendDlgItemMessageA(hDlg, cmb5, CB_GETCURSEL, 0, 0);
-                charset = SendDlgItemMessageA(hDlg, cmb5, CB_GETITEMDATA, idx, 0);
-                
-                SendDlgItemMessageA(hDlg, cmb2, CB_RESETCONTENT, 0, 0);
-                SendDlgItemMessageA(hDlg, cmb3, CB_RESETCONTENT, 0, 0);
-                SendDlgItemMessageA(hDlg, cmb5, CB_RESETCONTENT, 0, 0);
-                i=SendDlgItemMessageA(hDlg, cmb1, CB_GETCURSEL, 0, 0);
-                if (i!=CB_ERR)
-                {
-                    HCURSOR hcursor=SetCursor(LoadCursorA(0,(LPSTR)IDC_WAIT));
-                    CFn_ENUMSTRUCT s;
-                    LOGFONTA enumlf;
-                    SendDlgItemMessageA(hDlg, cmb1, CB_GETLBTEXT, i,
-                                        (LPARAM)enumlf.lfFaceName);
-                    TRACE("WM_COMMAND/cmb1 =>%s\n",enumlf.lfFaceName);
-                    s.hWnd1=GetDlgItem(hDlg, cmb2);
-                    s.hWnd2=GetDlgItem(hDlg, cmb3);
-                    s.lpcf32a=lpcf;
-                    enumlf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
-                    enumlf.lfPitchAndFamily = 0;
-                    EnumFontFamiliesExA(hdc, &enumlf,
-                            (FONTENUMPROCA)FontStyleEnumProc, (LPARAM)&s, 0);
-                    CFn_FitFontStyle(hDlg, pstyle);
-                    if( pointsize != CB_ERR) CFn_FitFontSize(hDlg, pointsize);
-                    if( charset != CB_ERR) CFn_FitCharSet( hDlg, charset );
-                    SetCursor(hcursor);
-                }
-                if (!((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC))
-                    ReleaseDC(hDlg,hdc);
-            }
-            else
+            INT pointsize; /* save current pointsize */
+            LONG pstyle;  /* save current style */
+            int charset;
+            int idx;
+            if(!(hdc = CFn_GetDC(lpcf)))
             {
-                WARN("HDC failure !!!\n");
                 EndDialog (hDlg, 0);
                 return TRUE;
             }
+            idx = SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0);
+            pointsize = (int)SendDlgItemMessageA( hDlg, cmb3, CB_GETITEMDATA,
+                    idx, 0);
+            idx = SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0);
+            pstyle = SendDlgItemMessageA(hDlg, cmb2, CB_GETITEMDATA, idx, 0);
+            idx = SendDlgItemMessageA(hDlg, cmb5, CB_GETCURSEL, 0, 0);
+            charset = SendDlgItemMessageA(hDlg, cmb5, CB_GETITEMDATA, idx, 0);
+            
+            SendDlgItemMessageA(hDlg, cmb2, CB_RESETCONTENT, 0, 0);
+            SendDlgItemMessageA(hDlg, cmb3, CB_RESETCONTENT, 0, 0);
+            SendDlgItemMessageA(hDlg, cmb5, CB_RESETCONTENT, 0, 0);
+            i=SendDlgItemMessageA(hDlg, cmb1, CB_GETCURSEL, 0, 0);
+            if (i!=CB_ERR)
+            {
+                HCURSOR hcursor=SetCursor(LoadCursorA(0,(LPSTR)IDC_WAIT));
+                CFn_ENUMSTRUCT s;
+                LOGFONTA enumlf;
+                SendDlgItemMessageA(hDlg, cmb1, CB_GETLBTEXT, i,
+                                    (LPARAM)enumlf.lfFaceName);
+                TRACE("WM_COMMAND/cmb1 =>%s\n",enumlf.lfFaceName);
+                s.hWnd1=GetDlgItem(hDlg, cmb2);
+                s.hWnd2=GetDlgItem(hDlg, cmb3);
+                s.lpcf32a=lpcf;
+                enumlf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
+                enumlf.lfPitchAndFamily = 0;
+                EnumFontFamiliesExA(hdc, &enumlf,
+                        (FONTENUMPROCA)FontStyleEnumProc, (LPARAM)&s, 0);
+                CFn_FitFontStyle(hDlg, pstyle);
+                if( pointsize != CB_ERR) CFn_FitFontSize(hDlg, pointsize);
+                if( charset != CB_ERR) CFn_FitCharSet( hDlg, charset );
+                SetCursor(hcursor);
+            }
+            CFn_ReleaseDC(lpcf, hdc);
         }
     case chx1:
     case chx2:
@@ -1006,10 +1022,19 @@
                     lpcf->nFontType |= BOLD_FONTTYPE;
             }
             i=SendDlgItemMessageA(hDlg, cmb3, CB_GETCURSEL, 0, 0);
-            if (i!=CB_ERR)
-                lpxx->lfHeight=-LOWORD(SendDlgItemMessageA(hDlg, cmb3, CB_GETITEMDATA, i, 0));
+            if( i != CB_ERR) 
+                lpcf->iPointSize = 10 * LOWORD(SendDlgItemMessageA(hDlg, cmb3,
+                            CB_GETITEMDATA , i, 0));
             else
-                lpxx->lfHeight=0;
+                lpcf->iPointSize = 100;
+            hdc = CFn_GetDC(lpcf);
+            if( hdc)
+            {
+                lpxx->lfHeight = - MulDiv( lpcf->iPointSize ,
+                        GetDeviceCaps(hdc, LOGPIXELSY), 720);
+                CFn_ReleaseDC(lpcf, hdc);
+            } else 
+                lpxx->lfHeight = -lpcf->iPointSize / 10;
             i=SendDlgItemMessageA(hDlg, cmb5, CB_GETCURSEL, 0, 0);
             if (i!=CB_ERR)
                 lpxx->lfCharSet=SendDlgItemMessageA(hDlg, cmb5, CB_GETITEMDATA, i, 0);
@@ -1019,7 +1044,6 @@
             lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
             lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
             lpxx->lfQuality=DEFAULT_QUALITY;
-            lpcf->iPointSize= -10*lpxx->lfHeight;
 
             wininfo.cbSize=sizeof(wininfo);
 
@@ -1059,8 +1083,8 @@
     case IDOK:
         if (  (!(lpcf->Flags & CF_LIMITSIZE))  ||
               ( (lpcf->Flags & CF_LIMITSIZE) &&
-                (-lpxx->lfHeight >= lpcf->nSizeMin) &&
-                (-lpxx->lfHeight <= lpcf->nSizeMax)))
+                (lpcf->iPointSize >= 10 * lpcf->nSizeMin) &&
+                (lpcf->iPointSize <= 10 * lpcf->nSizeMax)))
             EndDialog(hDlg, TRUE);
         else
         {
@@ -1118,7 +1142,6 @@
         info.rcWindow.bottom--;
         info.rcWindow.top++;
         info.rcWindow.left++;
-        lf.lfHeight = MulDiv(lf.lfHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72);
         hOrigFont = SelectObject( hdc, CreateFontIndirectA( &lf ) );
         rgbPrev=SetTextColor( hdc, lpcf->rgbColors );
         
--- refwine/dlls/commdlg/fontdlg16.c	2003-12-10 11:02:50.000000000 +0100
+++ mywine/dlls/commdlg/fontdlg16.c	2003-12-10 11:10:17.000000000 +0100
@@ -59,6 +59,14 @@
     lstrcpynA( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
 };
 
+static void FONT_Metrics16To32A( const TEXTMETRIC16 *pm16, TEXTMETRICA *pm32a)
+{
+    ZeroMemory( pm32a, sizeof(TEXTMETRICA));
+    /* NOTE: only the fields used by AddFontStyle() are filled in */
+    pm32a->tmHeight = pm16->tmHeight;
+    pm32a->tmExternalLeading = pm16->tmExternalLeading;
+};
+
 static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
 {
   chf32a->lStructSize=sizeof(CHOOSEFONTA);
@@ -117,10 +125,13 @@
   HWND hDlg=GetParent(hcmb3);
   LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
   LOGFONT16 *lplf = MapSL(logfont);
+  TEXTMETRIC16 *lpmtrx16 = MapSL(metrics);
   ENUMLOGFONTEXA elf32a;
+  TEXTMETRICA mtrx32a;
   FONT_LogFont16To32A(lplf, &(elf32a.elfLogFont));
-  return AddFontStyle(&elf32a, nFontType, (LPCHOOSEFONTA)lpcf->lpTemplateName,
-                      hcmb2, hcmb3, hDlg, TRUE);
+  FONT_Metrics16To32A(lpmtrx16, &mtrx32a);
+  return AddFontStyle(&elf32a, &mtrx32a, nFontType,
+          (LPCHOOSEFONTA)lpcf->lpTemplateName, hcmb2, hcmb3, hDlg, TRUE);
 }
 
 /***********************************************************************


More information about the wine-patches mailing list