gdi32: Move the rest of the font matching code out of freetype.c.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
4cddf0d47d
commit
3b87839ec9
|
@ -1461,8 +1461,9 @@ static struct gdi_font_face *find_best_matching_face( const struct gdi_font_fami
|
||||||
return best->scalable ? best : best_bitmap;
|
return best->scalable ? best : best_bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gdi_font_face *find_matching_face_by_name( const WCHAR *name, const WCHAR *subst, const LOGFONTW *lf,
|
static struct gdi_font_face *find_matching_face_by_name( const WCHAR *name, const WCHAR *subst,
|
||||||
FONTSIGNATURE fs, BOOL can_use_bitmap )
|
const LOGFONTW *lf, FONTSIGNATURE fs,
|
||||||
|
BOOL can_use_bitmap )
|
||||||
{
|
{
|
||||||
struct gdi_font_family *family;
|
struct gdi_font_family *family;
|
||||||
struct gdi_font_face *face;
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
|
static struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
|
||||||
BOOL can_use_bitmap, BOOL want_vertical )
|
BOOL can_use_bitmap, BOOL want_vertical )
|
||||||
{
|
{
|
||||||
struct gdi_font_family *family;
|
struct gdi_font_family *family;
|
||||||
struct gdi_font_face *face;
|
struct gdi_font_face *face;
|
||||||
|
@ -1524,6 +1525,59 @@ struct gdi_font_face *find_any_face( const LOGFONTW *lf, FONTSIGNATURE fs,
|
||||||
return NULL;
|
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 */
|
/* realized font objects */
|
||||||
|
|
||||||
#define FIRST_FONT_HANDLE 1
|
#define FIRST_FONT_HANDLE 1
|
||||||
|
|
|
@ -2217,9 +2217,8 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont )
|
||||||
{
|
{
|
||||||
struct gdi_font *font;
|
struct gdi_font *font;
|
||||||
Face *face;
|
Face *face;
|
||||||
Family *family;
|
|
||||||
INT height;
|
INT height;
|
||||||
BOOL can_use_bitmap, want_vertical;
|
BOOL can_use_bitmap;
|
||||||
LOGFONTW lf;
|
LOGFONTW lf;
|
||||||
CHARSETINFO csi;
|
CHARSETINFO csi;
|
||||||
FMAT2 dcmat;
|
FMAT2 dcmat;
|
||||||
|
@ -2279,61 +2278,12 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont )
|
||||||
if(!strcmpiW(lf.lfFaceName, SymbolW))
|
if(!strcmpiW(lf.lfFaceName, SymbolW))
|
||||||
lf.lfCharSet = SYMBOL_CHARSET;
|
lf.lfCharSet = SYMBOL_CHARSET;
|
||||||
|
|
||||||
if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
|
if (!(face = find_matching_face( &lf, &csi, can_use_bitmap, &orig_name )))
|
||||||
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])
|
|
||||||
{
|
{
|
||||||
INT acp = GetACP();
|
FIXME("can't find a single appropriate font - bailing\n");
|
||||||
if(!TranslateCharsetInfo((DWORD*)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE)) {
|
return NULL;
|
||||||
FIXME("TCI failed on codepage %d\n", acp);
|
|
||||||
csi.fs.fsCsb[0] = 0;
|
|
||||||
} else
|
|
||||||
lf.lfCharSet = csi.ciCharset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
height = lf.lfHeight;
|
||||||
family = face->family;
|
|
||||||
|
|
||||||
TRACE("not in cache\n");
|
TRACE("not in cache\n");
|
||||||
font = create_gdi_font( face, orig_name, &lf );
|
font = create_gdi_font( face, orig_name, &lf );
|
||||||
|
@ -2345,7 +2295,7 @@ found_face:
|
||||||
font->codepage = csi.ciACP;
|
font->codepage = csi.ciACP;
|
||||||
}
|
}
|
||||||
else
|
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),
|
TRACE( "Chosen: %s (%s/%p:%u)\n", debugstr_w(face->full_name), debugstr_w(face->file),
|
||||||
face->data_ptr, face->face_index );
|
face->data_ptr, face->face_index );
|
||||||
|
|
|
@ -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 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 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,
|
extern struct gdi_font_face *find_matching_face( LOGFONTW *lf, CHARSETINFO *csi, BOOL can_use_bitmap,
|
||||||
FONTSIGNATURE fs, BOOL can_use_bitmap ) DECLSPEC_HIDDEN;
|
const WCHAR **orig_name ) 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 void free_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
|
extern void free_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
|
||||||
extern void cache_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
|
extern void cache_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue