gdi32: Move font signature of font link from Face to SYSTEM_LINKS.

This commit is contained in:
Kusanagi Kouichi 2012-03-08 22:33:02 +09:00 committed by Alexandre Julliard
parent e86519c9b3
commit d696d5fee8
1 changed files with 63 additions and 62 deletions

View File

@ -265,7 +265,6 @@ typedef struct tagFace {
DWORD font_data_size;
FT_Long face_index;
FONTSIGNATURE fs;
FONTSIGNATURE fs_links;
DWORD ntmFlags;
FT_Fixed font_version;
BOOL scalable;
@ -351,6 +350,7 @@ struct tagGdiFont {
typedef struct {
struct list entry;
const WCHAR *font_name;
FONTSIGNATURE fs;
struct list links;
} SYSTEM_LINKS;
@ -1231,7 +1231,6 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family)
needed = sizeof(face->fs);
RegQueryValueExW(hkey_face, face_font_sig_value, NULL, NULL, (BYTE*)&face->fs, &needed);
memset(&face->fs_links, 0, sizeof(face->fs_links));
if(reg_load_dword(hkey_face, face_height_value, (DWORD*)&face->size.height) != ERROR_SUCCESS)
{
@ -1643,7 +1642,6 @@ static void AddFaceToList(FT_Face ft_face, char *fake_family, const char *file,
face->vertical = vertical;
face->external = (flags & ADDFONT_EXTERNAL_FONT) ? TRUE : FALSE;
face->fs = fs;
memset(&face->fs_links, 0, sizeof(face->fs_links));
if(FT_IS_SCALABLE(ft_face)) {
memset(&face->size, 0, sizeof(face->size));
@ -2000,13 +1998,11 @@ static void populate_system_links(const WCHAR *name, const WCHAR *const *values)
Face *face;
const char *file;
WCHAR *fileW;
FONTSIGNATURE fs;
if (values)
{
SYSTEM_LINKS *font_link;
memset(&fs, 0, sizeof(fs));
psub = get_font_subst(&font_subst_list, name, -1);
/* Don't store fonts that are only substitutes for other fonts */
if(psub)
@ -2024,6 +2020,7 @@ static void populate_system_links(const WCHAR *name, const WCHAR *const *values)
list_add_tail(&system_links, &font_link->entry);
}
memset(&font_link->fs, 0, sizeof font_link->fs);
for (i = 0; values[i] != NULL; i++)
{
CHILD_FONT *child_font;
@ -2064,23 +2061,14 @@ static void populate_system_links(const WCHAR *name, const WCHAR *const *values)
child_font = HeapAlloc(GetProcessHeap(), 0, sizeof(*child_font));
child_font->face = face;
child_font->font = NULL;
fs.fsCsb[0] |= face->fs.fsCsb[0];
fs.fsCsb[1] |= face->fs.fsCsb[1];
font_link->fs.fsCsb[0] |= face->fs.fsCsb[0];
font_link->fs.fsCsb[1] |= face->fs.fsCsb[1];
TRACE("Adding file %s index %ld\n", child_font->face->file, child_font->face->face_index);
list_add_tail(&font_link->links, &child_font->entry);
TRACE("added internal SystemLink for %s to %s in %s\n", debugstr_w(name), debugstr_w(value),debugstr_w(fileW));
HeapFree(GetProcessHeap(), 0, fileW);
}
family = find_family_from_name(font_link->font_name);
if(family)
{
LIST_FOR_EACH_ENTRY(face, &family->faces, Face, entry)
{
face->fs_links = fs;
}
}
}
}
@ -2100,8 +2088,6 @@ static BOOL init_system_links(void)
static const WCHAR tahoma_ttf[] = {'t','a','h','o','m','a','.','t','t','f',0};
static const WCHAR System[] = {'S','y','s','t','e','m',0};
static const WCHAR MS_Shell_Dlg[] = {'M','S',' ','S','h','e','l','l',' ','D','l','g',0};
FONTSIGNATURE fs;
Family *family;
Face *face;
FontSubst *psub;
UINT i, j;
@ -2116,7 +2102,6 @@ static BOOL init_system_links(void)
index = 0;
while(RegEnumValueW(hkey, index++, value, &val_len, NULL, &type, (LPBYTE)data, &data_len) == ERROR_SUCCESS)
{
memset(&fs, 0, sizeof(fs));
psub = get_font_subst(&font_subst_list, value, -1);
/* Don't store fonts that are only substitutes for other fonts */
if(psub)
@ -2126,6 +2111,7 @@ static BOOL init_system_links(void)
}
font_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*font_link));
font_link->font_name = strdupW(value);
memset(&font_link->fs, 0, sizeof font_link->fs);
list_init(&font_link->links);
for(entry = data; (char*)entry < (char*)data + data_len && *entry != 0; entry = next)
{
@ -2157,19 +2143,11 @@ static BOOL init_system_links(void)
child_font = HeapAlloc(GetProcessHeap(), 0, sizeof(*child_font));
child_font->face = face;
child_font->font = NULL;
fs.fsCsb[0] |= face->fs.fsCsb[0];
fs.fsCsb[1] |= face->fs.fsCsb[1];
font_link->fs.fsCsb[0] |= face->fs.fsCsb[0];
font_link->fs.fsCsb[1] |= face->fs.fsCsb[1];
TRACE("Adding file %s index %ld\n", child_font->face->file, child_font->face->face_index);
list_add_tail(&font_link->links, &child_font->entry);
}
family = find_family_from_name(font_link->font_name);
if(family)
{
LIST_FOR_EACH_ENTRY(face, &family->faces, Face, entry)
{
face->fs_links = fs;
}
}
list_add_tail(&system_links, &font_link->entry);
next:
val_len = max_val + 1;
@ -2214,8 +2192,8 @@ skip_internal:
system_font_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*system_font_link));
system_font_link->font_name = strdupW(System);
memset(&system_font_link->fs, 0, sizeof system_font_link->fs);
list_init(&system_font_link->links);
memset(&fs, 0, sizeof(fs));
face = find_face_from_filename(tahoma_ttf, Tahoma);
if(face)
@ -2223,8 +2201,8 @@ skip_internal:
child_font = HeapAlloc(GetProcessHeap(), 0, sizeof(*child_font));
child_font->face = face;
child_font->font = NULL;
fs.fsCsb[0] |= face->fs.fsCsb[0];
fs.fsCsb[1] |= face->fs.fsCsb[1];
system_font_link->fs.fsCsb[0] |= face->fs.fsCsb[0];
system_font_link->fs.fsCsb[1] |= face->fs.fsCsb[1];
TRACE("Found Tahoma in %s index %ld\n", child_font->face->file, child_font->face->face_index);
list_add_tail(&system_font_link->links, &child_font->entry);
}
@ -2238,19 +2216,11 @@ skip_internal:
new_child = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_child));
new_child->face = font_link_entry->face;
new_child->font = NULL;
fs.fsCsb[0] |= font_link_entry->face->fs.fsCsb[0];
fs.fsCsb[1] |= font_link_entry->face->fs.fsCsb[1];
system_font_link->fs.fsCsb[0] |= font_link_entry->face->fs.fsCsb[0];
system_font_link->fs.fsCsb[1] |= font_link_entry->face->fs.fsCsb[1];
list_add_tail(&system_font_link->links, &new_child->entry);
}
}
family = find_family_from_name(system_font_link->font_name);
if(family)
{
LIST_FOR_EACH_ENTRY(face, &family->faces, Face, entry)
{
face->fs_links = fs;
}
}
list_add_tail(&system_links, &system_font_link->entry);
return ret;
}
@ -3426,7 +3396,7 @@ static FT_Face OpenFontFace(GdiFont *font, Face *face, LONG width, LONG height)
}
static int get_nearest_charset(Face *face, int *cp)
static int get_nearest_charset(const WCHAR *family_name, Face *face, int *cp)
{
/* Only get here if lfCharSet == DEFAULT_CHARSET or we couldn't find
a single face with the requested charset. The idea is to check if
@ -3439,9 +3409,17 @@ static int get_nearest_charset(Face *face, int *cp)
*cp = acp;
if(TranslateCharsetInfo((DWORD*)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE))
if(csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0]))
{
const SYSTEM_LINKS *font_link;
if (csi.fs.fsCsb[0] & face->fs.fsCsb[0])
return csi.ciCharset;
font_link = find_font_link(family_name);
if (font_link != NULL && csi.fs.fsCsb[0] & font_link->fs.fsCsb[0])
return csi.ciCharset;
}
for(i = 0; i < 32; i++) {
fs0 = 1L << i;
if(face->fs.fsCsb[0] & fs0) {
@ -3935,6 +3913,7 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
FMAT2 dcmat;
FontSubst *psub = NULL;
DC *dc = get_dc_ptr( dev->hdc );
const SYSTEM_LINKS *font_link;
if (!hfont) /* notification that the font has been changed by another driver */
{
@ -4031,7 +4010,6 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
family = NULL;
if(lf.lfFaceName[0] != '\0') {
SYSTEM_LINKS *font_link;
CHILD_FONT *font_link_entry;
LPWSTR FaceName = lf.lfFaceName;
@ -4055,11 +4033,18 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
if (!strcmpiW(family->FamilyName, FaceName) ||
(psub && !strcmpiW(family->FamilyName, psub->to.name)))
{
font_link = find_font_link(family->FamilyName);
LIST_FOR_EACH(face_elem_ptr, &family->faces) {
face = LIST_ENTRY(face_elem_ptr, Face, entry);
if((csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0])) || !csi.fs.fsCsb[0])
if(face->scalable || can_use_bitmap)
goto found;
if (!(face->scalable || can_use_bitmap))
continue;
if (csi.fs.fsCsb[0] & face->fs.fsCsb[0])
goto found;
if (font_link != NULL &&
csi.fs.fsCsb[0] & font_link->fs.fsCsb[0])
goto found;
if (!csi.fs.fsCsb[0])
goto found;
}
}
}
@ -4070,9 +4055,13 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
LIST_FOR_EACH(face_elem_ptr, &family->faces) {
face = LIST_ENTRY(face_elem_ptr, Face, entry);
if(face->FullName && !strcmpiW(face->FullName, FaceName) &&
((csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0])) || !csi.fs.fsCsb[0]))
(face->scalable || can_use_bitmap))
{
if(face->scalable || can_use_bitmap)
if (csi.fs.fsCsb[0] & face->fs.fsCsb[0] || !csi.fs.fsCsb[0])
goto found_face;
font_link = find_font_link(family->FamilyName);
if (font_link != NULL &&
csi.fs.fsCsb[0] & font_link->fs.fsCsb[0])
goto found_face;
}
}
@ -4090,14 +4079,17 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
TRACE("found entry in system list\n");
LIST_FOR_EACH_ENTRY(font_link_entry, &font_link->links, CHILD_FONT, entry)
{
const SYSTEM_LINKS *links;
face = font_link_entry->face;
if (!(face->scalable || can_use_bitmap))
continue;
family = face->family;
if(csi.fs.fsCsb[0] &
(face->fs.fsCsb[0] | face->fs_links.fsCsb[0]) || !csi.fs.fsCsb[0])
{
if(face->scalable || can_use_bitmap)
goto found;
}
if (csi.fs.fsCsb[0] & face->fs.fsCsb[0] || !csi.fs.fsCsb[0])
goto found;
links = find_font_link(family->FamilyName);
if (links != NULL && csi.fs.fsCsb[0] & links->fs.fsCsb[0])
goto found;
}
}
}
@ -4134,11 +4126,15 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
LIST_FOR_EACH(family_elem_ptr, &font_list) {
family = LIST_ENTRY(family_elem_ptr, Family, entry);
if(!strcmpiW(family->FamilyName, lf.lfFaceName)) {
font_link = find_font_link(family->FamilyName);
LIST_FOR_EACH(face_elem_ptr, &family->faces) {
face = LIST_ENTRY(face_elem_ptr, Face, entry);
if(csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0]))
if(face->scalable || can_use_bitmap)
goto found;
if (!(face->scalable || can_use_bitmap))
continue;
if (csi.fs.fsCsb[0] & face->fs.fsCsb[0])
goto found;
if (font_link != NULL && csi.fs.fsCsb[0] & font_link->fs.fsCsb[0])
goto found;
}
}
}
@ -4146,10 +4142,12 @@ static HFONT freetype_SelectFont( PHYSDEV dev, HFONT hfont )
last_resort_family = NULL;
LIST_FOR_EACH(family_elem_ptr, &font_list) {
family = LIST_ENTRY(family_elem_ptr, Family, entry);
font_link = find_font_link(family->FamilyName);
LIST_FOR_EACH(face_elem_ptr, &family->faces) {
face = LIST_ENTRY(face_elem_ptr, Face, entry);
if(face->vertical == want_vertical &&
(csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0]))) {
(csi.fs.fsCsb[0] & face->fs.fsCsb[0] ||
(font_link != NULL && csi.fs.fsCsb[0] & font_link->fs.fsCsb[0]))) {
if(face->scalable)
goto found;
if(can_use_bitmap && !last_resort_family)
@ -4195,9 +4193,12 @@ found:
height = lf.lfHeight;
face = best = best_bitmap = NULL;
font_link = find_font_link(family->FamilyName);
LIST_FOR_EACH_ENTRY(face, &family->faces, Face, entry)
{
if((csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0])) || !csi.fs.fsCsb[0])
if (csi.fs.fsCsb[0] & face->fs.fsCsb[0] ||
(font_link != NULL && csi.fs.fsCsb[0] & font_link->fs.fsCsb[0]) ||
!csi.fs.fsCsb[0])
{
BOOL italic, bold;
@ -4244,7 +4245,7 @@ found_face:
ret->codepage = csi.ciACP;
}
else
ret->charset = get_nearest_charset(face, &ret->codepage);
ret->charset = get_nearest_charset(family->FamilyName, face, &ret->codepage);
TRACE("Chosen: %s %s (%s/%p:%ld)\n", debugstr_w(family->FamilyName),
debugstr_w(face->StyleName), face->file, face->font_data_ptr, face->face_index);