Alexandre Julliard : wineconsole: If necessary, fallback to a font without the right properties instead of failing.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 28 09:12:37 CDT 2016


Module: wine
Branch: master
Commit: e1fc8dcdee1fec9a67e5f10de7ed1a6952261ba7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e1fc8dcdee1fec9a67e5f10de7ed1a6952261ba7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Mar 28 18:18:11 2016 +0900

wineconsole: If necessary, fallback to a font without the right properties instead of failing.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/wineconsole/dialog.c       |  6 ++--
 programs/wineconsole/user.c         | 65 ++++++++++++++++++++++++-------------
 programs/wineconsole/winecon_user.h |  4 +--
 3 files changed, 48 insertions(+), 27 deletions(-)

diff --git a/programs/wineconsole/dialog.c b/programs/wineconsole/dialog.c
index cae02cb..04edfd1 100644
--- a/programs/wineconsole/dialog.c
+++ b/programs/wineconsole/dialog.c
@@ -303,7 +303,7 @@ static int CALLBACK font_enum_size2(const LOGFONTW* lf, const TEXTMETRICW* tm,
     struct dialog_info*	di = (struct dialog_info*)lParam;
 
     WCUSER_DumpTextMetric(tm, FontType);
-    if (WCUSER_ValidateFontMetric(di->data, tm, FontType, TRUE))
+    if (WCUSER_ValidateFontMetric(di->data, tm, FontType, 0))
     {
 	di->nFont++;
     }
@@ -317,7 +317,7 @@ static int CALLBACK font_enum(const LOGFONTW* lf, const TEXTMETRICW* tm,
     struct dialog_info*	di = (struct dialog_info*)lParam;
 
     WCUSER_DumpLogFont("DlgFamily: ", lf, FontType);
-    if (WCUSER_ValidateFont(di->data, lf))
+    if (WCUSER_ValidateFont(di->data, lf, 0))
     {
         if (FontType & RASTER_FONTTYPE)
         {
@@ -375,7 +375,7 @@ static int CALLBACK font_enum_size(const LOGFONTW* lf, const TEXTMETRICW* tm,
         return 0;
     }
 
-    if (WCUSER_ValidateFontMetric(di->data, tm, FontType, TRUE))
+    if (WCUSER_ValidateFontMetric(di->data, tm, FontType, 0))
     {
 	int	idx = 0;
 
diff --git a/programs/wineconsole/user.c b/programs/wineconsole/user.c
index e723745..40a0757 100644
--- a/programs/wineconsole/user.c
+++ b/programs/wineconsole/user.c
@@ -333,7 +333,7 @@ static BOOL WCUSER_AreFontsEqual(const struct config_data* config, const LOGFONT
 struct font_chooser
 {
     struct inner_data*	data;
-    BOOL                check_screen_size;
+    int                 pass;
     BOOL                done;
 };
 
@@ -343,15 +343,26 @@ struct font_chooser
  * Returns true if the font described in tm is usable as a font for the renderer
  */
 BOOL WCUSER_ValidateFontMetric(const struct inner_data* data, const TEXTMETRICW* tm,
-                               DWORD type, BOOL check_screen_size)
+                               DWORD type, int pass)
 {
-    BOOL        ret = TRUE;
-
-    if (check_screen_size && (type & RASTER_FONTTYPE))
-        ret = (tm->tmMaxCharWidth * data->curcfg.win_width < GetSystemMetrics(SM_CXSCREEN) &&
-               tm->tmHeight * data->curcfg.win_height < GetSystemMetrics(SM_CYSCREEN));
-    return ret && !tm->tmItalic && !tm->tmUnderlined && !tm->tmStruckOut &&
-        (tm->tmCharSet == DEFAULT_CHARSET || tm->tmCharSet == g_uiDefaultCharset);
+    switch (pass)  /* we get increasingly lenient in later passes */
+    {
+    case 0:
+        if (type & RASTER_FONTTYPE)
+        {
+            if (tm->tmMaxCharWidth * data->curcfg.win_width >= GetSystemMetrics(SM_CXSCREEN) ||
+                tm->tmHeight * data->curcfg.win_height >= GetSystemMetrics(SM_CYSCREEN))
+                return FALSE;
+        }
+        /* fall through */
+    case 1:
+        if (tm->tmCharSet != DEFAULT_CHARSET && tm->tmCharSet != g_uiDefaultCharset) return FALSE;
+        /* fall through */
+    case 2:
+        if (tm->tmItalic || tm->tmUnderlined || tm->tmStruckOut) return FALSE;
+        break;
+    }
+    return TRUE;
 }
 
 /******************************************************************
@@ -359,12 +370,22 @@ BOOL WCUSER_ValidateFontMetric(const struct inner_data* data, const TEXTMETRICW*
  *
  * Returns true if the font family described in lf is usable as a font for the renderer
  */
-BOOL WCUSER_ValidateFont(const struct inner_data* data, const LOGFONTW* lf)
+BOOL WCUSER_ValidateFont(const struct inner_data* data, const LOGFONTW* lf, int pass)
 {
-    return (lf->lfPitchAndFamily & 3) == FIXED_PITCH &&
-        /* (lf->lfPitchAndFamily & 0xF0) == FF_MODERN && */
-        lf->lfFaceName[0] != '@' &&
-        (lf->lfCharSet == DEFAULT_CHARSET || lf->lfCharSet == g_uiDefaultCharset);
+    switch (pass)  /* we get increasingly lenient in later passes */
+    {
+    case 0:
+    case 1:
+        if (lf->lfCharSet != DEFAULT_CHARSET && lf->lfCharSet != g_uiDefaultCharset) return FALSE;
+        /* fall through */
+    case 2:
+        if ((lf->lfPitchAndFamily & 3) != FIXED_PITCH) return FALSE;
+        /* fall through */
+    case 3:
+        if (lf->lfFaceName[0] == '@') return FALSE;
+        break;
+    }
+    return TRUE;
 }
 
 /******************************************************************
@@ -379,7 +400,7 @@ static int CALLBACK get_first_font_enum_2(const LOGFONTW* lf, const TEXTMETRICW*
     struct font_chooser*	fc = (struct font_chooser*)lParam;
 
     WCUSER_DumpTextMetric(tm, FontType);
-    if (WCUSER_ValidateFontMetric(fc->data, tm, FontType, fc->check_screen_size))
+    if (WCUSER_ValidateFontMetric(fc->data, tm, FontType, fc->pass))
     {
         LOGFONTW mlf = *lf;
 
@@ -417,7 +438,7 @@ static int CALLBACK get_first_font_enum(const LOGFONTW* lf, const TEXTMETRICW* t
     struct font_chooser*	fc = (struct font_chooser*)lParam;
 
     WCUSER_DumpLogFont("InitFamily: ", lf, FontType);
-    if (WCUSER_ValidateFont(fc->data, lf))
+    if (WCUSER_ValidateFont(fc->data, lf, fc->pass))
     {
         EnumFontFamiliesW(PRIVATE(fc->data)->hMemDC, lf->lfFaceName,
                           get_first_font_enum_2, lParam);
@@ -537,13 +558,13 @@ static void     WCUSER_SetFontPmt(struct inner_data* data, const WCHAR* font,
     /* try to find an acceptable font */
     WINE_WARN("Couldn't match the font from registry... trying to find one\n");
     fc.data = data;
-    fc.check_screen_size = TRUE;
     fc.done = FALSE;
-    EnumFontFamiliesW(PRIVATE(data)->hMemDC, NULL, get_first_font_enum, (LPARAM)&fc);
-    if (fc.done) return;
-    fc.check_screen_size = FALSE;
-    EnumFontFamiliesW(PRIVATE(data)->hMemDC, NULL, get_first_font_enum, (LPARAM)&fc);
-    if (!fc.done) WINECON_Fatal("Couldn't find a decent font, aborting\n");
+    for (fc.pass = 0; fc.pass <= 4; fc.pass++)
+    {
+        EnumFontFamiliesW(PRIVATE(data)->hMemDC, NULL, get_first_font_enum, (LPARAM)&fc);
+        if (fc.done) return;
+    }
+    WINECON_Fatal("Couldn't find a decent font, aborting\n");
 }
 
 /******************************************************************
diff --git a/programs/wineconsole/winecon_user.h b/programs/wineconsole/winecon_user.h
index 7c5174f..bd026ef 100644
--- a/programs/wineconsole/winecon_user.h
+++ b/programs/wineconsole/winecon_user.h
@@ -45,9 +45,9 @@ struct inner_data_user {
 /* from user.c */
 extern const COLORREF WCUSER_ColorMap[16];
 extern BOOL WCUSER_GetProperties(struct inner_data*, BOOL);
-extern BOOL WCUSER_ValidateFont(const struct inner_data* data, const LOGFONTW* lf);
+extern BOOL WCUSER_ValidateFont(const struct inner_data* data, const LOGFONTW* lf, int pass);
 extern BOOL WCUSER_ValidateFontMetric(const struct inner_data* data, const TEXTMETRICW* tm,
-                                      DWORD type, BOOL check_screen_size);
+                                      DWORD type, int pass);
 extern HFONT WCUSER_CopyFont(struct config_data* config, HWND hWnd,
                              const LOGFONTW* lf, LONG* el);
 extern void WCUSER_FillLogFont(LOGFONTW* lf, const WCHAR* name,




More information about the wine-cvs mailing list