Alexandre Julliard : gdi32: Move the rest of the font matching code out of freetype.c.

Alexandre Julliard julliard at winehq.org
Wed Nov 4 15:20:32 CST 2020


Module: wine
Branch: master
Commit: 3b87839ec92ffd09baf077583321464c388a8e23
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3b87839ec92ffd09baf077583321464c388a8e23

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Nov  4 09:18:59 2020 +0100

gdi32: Move the rest of the font matching code out of freetype.c.

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

---

 dlls/gdi32/font.c        | 62 ++++++++++++++++++++++++++++++++++++++++++++----
 dlls/gdi32/freetype.c    | 60 ++++------------------------------------------
 dlls/gdi32/gdi_private.h |  6 ++---
 3 files changed, 65 insertions(+), 63 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 55030bf95bf..47d52f6c3dc 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -1461,8 +1461,9 @@ static struct gdi_font_face *find_best_matching_face( const struct gdi_font_fami
     return best->scalable ? best : best_bitmap;
 }
 
-struct gdi_font_face *find_matching_face_by_name( const WCHAR *name, const WCHAR *subst, const LOGFONTW *lf,
-                                                  FONTSIGNATURE fs, BOOL can_use_bitmap )
+static struct gdi_font_face *find_matching_face_by_name( const WCHAR *name, const WCHAR *subst,
+                                                         const LOGFONTW *lf, FONTSIGNATURE fs,
+                                                         BOOL can_use_bitmap )
 {
     struct gdi_font_family *family;
     struct gdi_font_face *face;
@@ -1489,8 +1490,8 @@ struct gdi_font_face *find_matching_face_by_name( const WCHAR *name, const WCHAR
     return NULL;
 }
 
-struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
-                                     BOOL can_use_bitmap, BOOL want_vertical )
+static struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
+                                            BOOL can_use_bitmap, BOOL want_vertical )
 {
     struct gdi_font_family *family;
     struct gdi_font_face *face;
@@ -1524,6 +1525,59 @@ struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
     return NULL;
 }
 
+struct gdi_font_face *find_matching_face( LOGFONTW *lf, CHARSETINFO *csi, BOOL can_use_bitmap,
+                                          const WCHAR **orig_name )
+{
+    BOOL want_vertical = (lf->lfFaceName[0] == '@');
+    struct gdi_font_face *face;
+
+    if (!TranslateCharsetInfo( (DWORD *)(INT_PTR)lf->lfCharSet, csi, TCI_SRCCHARSET ))
+    {
+        if (lf->lfCharSet != DEFAULT_CHARSET) FIXME( "Untranslated charset %d\n", lf->lfCharSet );
+        csi->fs.fsCsb[0] = 0;
+    }
+
+    if (lf->lfFaceName[0])
+    {
+        int subst_charset;
+        const WCHAR *subst = get_gdi_font_subst( lf->lfFaceName, lf->lfCharSet, &subst_charset );
+
+	if (subst)
+        {
+	    TRACE( "substituting %s,%d -> %s,%d\n", debugstr_w(lf->lfFaceName), lf->lfCharSet,
+                   debugstr_w(subst), (subst_charset != -1) ? subst_charset : lf->lfCharSet );
+	    if (subst_charset != -1) lf->lfCharSet = subst_charset;
+            *orig_name = lf->lfFaceName;
+	}
+
+        if ((face = find_matching_face_by_name( lf->lfFaceName, subst, lf, csi->fs, can_use_bitmap )))
+            return face;
+    }
+    *orig_name = NULL; /* substitution is no longer relevant */
+
+    /* If requested charset was DEFAULT_CHARSET then try using charset
+       corresponding to the current ansi codepage */
+    if (!csi->fs.fsCsb[0])
+    {
+        INT acp = GetACP();
+        if (!TranslateCharsetInfo( (DWORD *)(INT_PTR)acp, csi, TCI_SRCCODEPAGE ))
+        {
+            FIXME( "TCI failed on codepage %d\n", acp );
+            csi->fs.fsCsb[0] = 0;
+        }
+        else lf->lfCharSet = csi->ciCharset;
+    }
+
+    if ((face = find_any_face( lf, csi->fs, can_use_bitmap, want_vertical ))) return face;
+    if (csi->fs.fsCsb[0])
+    {
+        csi->fs.fsCsb[0] = 0;
+        if ((face = find_any_face( lf, csi->fs, can_use_bitmap, want_vertical ))) return face;
+    }
+    if (want_vertical && (face = find_any_face( lf, csi->fs, can_use_bitmap, FALSE ))) return face;
+    return NULL;
+}
+
 /* realized font objects */
 
 #define FIRST_FONT_HANDLE 1
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 464d58df09c..46ab0b9f6d7 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -2217,9 +2217,8 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont )
 {
     struct gdi_font *font;
     Face *face;
-    Family *family;
     INT height;
-    BOOL can_use_bitmap, want_vertical;
+    BOOL can_use_bitmap;
     LOGFONTW lf;
     CHARSETINFO csi;
     FMAT2 dcmat;
@@ -2279,61 +2278,12 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont )
     if(!strcmpiW(lf.lfFaceName, SymbolW))
         lf.lfCharSet = SYMBOL_CHARSET;
 
-    if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
-        switch(lf.lfCharSet) {
-	case DEFAULT_CHARSET:
-	    csi.fs.fsCsb[0] = 0;
-	    break;
-	default:
-	    FIXME("Untranslated charset %d\n", lf.lfCharSet);
-	    csi.fs.fsCsb[0] = 0;
-	    break;
-	}
-    }
-
-    family = NULL;
-    if(lf.lfFaceName[0] != '\0') {
-        LPWSTR FaceName = lf.lfFaceName;
-        int subst_charset;
-        const WCHAR *subst = get_gdi_font_subst( FaceName, lf.lfCharSet, &subst_charset );
-
-	if(subst) {
-	    TRACE("substituting %s,%d -> %s,%d\n", debugstr_w(FaceName), lf.lfCharSet,
-		  debugstr_w(subst), (subst_charset != -1) ? subst_charset : lf.lfCharSet);
-	    if (subst_charset != -1) lf.lfCharSet = subst_charset;
-            orig_name = FaceName;
-	}
-
-        if ((face = find_matching_face_by_name( FaceName, subst, &lf, csi.fs, can_use_bitmap )))
-            goto found_face;
-    }
-
-    orig_name = NULL; /* substitution is no longer relevant */
-
-    /* If requested charset was DEFAULT_CHARSET then try using charset
-       corresponding to the current ansi codepage */
-    if (!csi.fs.fsCsb[0])
+    if (!(face = find_matching_face( &lf, &csi, can_use_bitmap, &orig_name )))
     {
-        INT acp = GetACP();
-        if(!TranslateCharsetInfo((DWORD*)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE)) {
-            FIXME("TCI failed on codepage %d\n", acp);
-            csi.fs.fsCsb[0] = 0;
-        } else
-            lf.lfCharSet = csi.ciCharset;
+        FIXME("can't find a single appropriate font - bailing\n");
+        return NULL;
     }
-
-    want_vertical = (lf.lfFaceName[0] == '@');
-
-    if ((face = find_any_face( &lf, csi.fs, can_use_bitmap, want_vertical ))) goto found_face;
-    csi.fs.fsCsb[0] = 0;
-    if ((face = find_any_face( &lf, csi.fs, can_use_bitmap, want_vertical ))) goto found_face;
-    if (want_vertical && (face = find_any_face( &lf, csi.fs, can_use_bitmap, FALSE ))) goto found_face;
-    FIXME("can't find a single appropriate font - bailing\n");
-    return NULL;
-
-found_face:
     height = lf.lfHeight;
-    family = face->family;
 
     TRACE("not in cache\n");
     font = create_gdi_font( face, orig_name, &lf );
@@ -2345,7 +2295,7 @@ found_face:
         font->codepage = csi.ciACP;
     }
     else
-        font->charset = get_nearest_charset( family->family_name, face, &font->codepage );
+        font->charset = get_nearest_charset( face->family->family_name, face, &font->codepage );
 
     TRACE( "Chosen: %s (%s/%p:%u)\n", debugstr_w(face->full_name), debugstr_w(face->file),
            face->data_ptr, face->face_index );
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index ef98fa0e8fd..48bf823ff92 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -459,10 +459,8 @@ extern int add_gdi_face( const WCHAR *family_name, const WCHAR *second_name,
 
 extern struct gdi_font_link *find_gdi_font_link( const WCHAR *name ) DECLSPEC_HIDDEN;
 extern void create_child_font_list( struct gdi_font *font ) DECLSPEC_HIDDEN;
-extern struct gdi_font_face *find_matching_face_by_name( const WCHAR *name, const WCHAR *subst, const LOGFONTW *lf,
-                                                         FONTSIGNATURE fs, BOOL can_use_bitmap ) DECLSPEC_HIDDEN;
-extern struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
-                                            BOOL can_use_bitmap, BOOL want_vertical ) DECLSPEC_HIDDEN;
+extern struct gdi_font_face *find_matching_face( LOGFONTW *lf, CHARSETINFO *csi, BOOL can_use_bitmap,
+                                                 const WCHAR **orig_name ) DECLSPEC_HIDDEN;
 
 extern void free_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
 extern void cache_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list