[pkg-wine-party] [SCM] Debian Wine packaging branch, lenny, updated. wine-1.0.0-1-126-gccc5cbd
Alexandre Julliard
julliard at winehq.org
Thu Oct 30 14:43:42 UTC 2008
The following commit has been merged in the lenny branch:
commit 38b87ec415dca951579edf03eea12602ccf59f5c
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Sun Jun 22 22:41:47 2008 +0900
gdi32: Extend the font substitution test, make it pass under Wine.
(cherry picked from commit 41aad2dce28ca0dd9d23fa6234ad8523302d6054)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 9b5f18c..459558d 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1008,7 +1008,7 @@ static void LoadSubstList(void)
/* Win 2000 doesn't allow mapping between different charsets
or mapping of DEFAULT_CHARSET */
- if((psub->to.charset != psub->from.charset) ||
+ if ((psub->from.charset && psub->to.charset != psub->from.charset) ||
psub->to.charset == DEFAULT_CHARSET) {
HeapFree(GetProcessHeap(), 0, psub->to.name);
HeapFree(GetProcessHeap(), 0, psub->from.name);
@@ -2124,84 +2124,144 @@ static const struct nls_update_font_list
UINT ansi_cp, oem_cp;
const char *oem, *fixed, *system;
const char *courier, *serif, *small, *sserif;
- /* these are for font substitute */
+ /* these are for font substitutes */
const char *shelldlg, *tmsrmn;
+ const char *fixed_0, *system_0, *courier_0, *serif_0, *small_0, *sserif_0,
+ *helv_0, *tmsrmn_0;
+ const struct subst
+ {
+ const char *from, *to;
+ } arial_0, courier_new_0, times_new_roman_0;
} nls_update_font_list[] =
{
/* Latin 1 (United States) */
{ 1252, 437, "vgaoem.fon", "vgafix.fon", "vgasys.fon",
"coure.fon", "serife.fon", "smalle.fon", "sserife.fon",
"Tahoma","Times New Roman",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Latin 1 (Multilingual) */
{ 1252, 850, "vga850.fon", "vgafix.fon", "vgasys.fon",
"coure.fon", "serife.fon", "smalle.fon", "sserife.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Eastern Europe */
{ 1250, 852, "vga852.fon", "vgafixe.fon", "vgasyse.fon",
"couree.fon", "serifee.fon", "smallee.fon", "sserifee.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,238", "System,238",
+ "Courier New,238", "MS Serif,238", "Small Fonts,238",
+ "MS Sans Serif,238", "MS Sans Serif,238", "MS Serif,238",
+ { "Arial CE,0", "Arial,238" },
+ { "Courier New CE,0", "Courier New,238" },
+ { "Times New Roman CE,0", "Times New Roman,238" }
},
/* Cyrillic */
{ 1251, 866, "vga866.fon", "vgafixr.fon", "vgasysr.fon",
"courer.fon", "serifer.fon", "smaller.fon", "sserifer.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,204", "System,204",
+ "Courier New,204", "MS Serif,204", "Small Fonts,204",
+ "MS Sans Serif,204", "MS Sans Serif,204", "MS Serif,204",
+ { "Arial Cyr,0", "Arial,204" },
+ { "Courier New Cyr,0", "Courier New,204" },
+ { "Times New Roman Cyr,0", "Times New Roman,204" }
},
/* Greek */
{ 1253, 737, "vga869.fon", "vgafixg.fon", "vgasysg.fon",
"coureg.fon", "serifeg.fon", "smalleg.fon", "sserifeg.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,161", "System,161",
+ "Courier New,161", "MS Serif,161", "Small Fonts,161",
+ "MS Sans Serif,161", "MS Sans Serif,161", "MS Serif,161",
+ { "Arial Greek,0", "Arial,161" },
+ { "Courier New Greek,0", "Courier New,161" },
+ { "Times New Roman Greek,0", "Times New Roman,161" }
},
/* Turkish */
{ 1254, 857, "vga857.fon", "vgafixt.fon", "vgasyst.fon",
"couret.fon", "serifet.fon", "smallet.fon", "sserifet.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,162", "System,162",
+ "Courier New,162", "MS Serif,162", "Small Fonts,162",
+ "MS Sans Serif,162", "MS Sans Serif,162", "MS Serif,162",
+ { "Arial Tur,0", "Arial,162" },
+ { "Courier New Tur,0", "Courier New,162" },
+ { "Times New Roman Tur,0", "Times New Roman,162" }
},
/* Hebrew */
{ 1255, 862, "vgaoem.fon", "vgaf1255.fon", "vgas1255.fon",
"coue1255.fon", "sere1255.fon", "smae1255.fon", "ssee1255.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,177", "System,177",
+ "Courier New,177", "MS Serif,177", "Small Fonts,177",
+ "MS Sans Serif,177", "MS Sans Serif,177", "MS Serif,177",
+ { 0 }, { 0 }, { 0 }
},
/* Arabic */
{ 1256, 720, "vgaoem.fon", "vgaf1256.fon", "vgas1256.fon",
"coue1256.fon", "sere1256.fon", "smae1256.fon", "ssee1256.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,178", "System,178",
+ "Courier New,178", "MS Serif,178", "Small Fonts,178",
+ "MS Sans Serif,178", "MS Sans Serif,178", "MS Serif,178",
+ { 0 }, { 0 }, { 0 }
},
/* Baltic */
{ 1257, 775, "vga775.fon", "vgaf1257.fon", "vgas1257.fon",
"coue1257.fon", "sere1257.fon", "smae1257.fon", "ssee1257.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ "Fixedsys,186", "System,186",
+ "Courier New,186", "MS Serif,186", "Small Fonts,186",
+ "MS Sans Serif,186", "MS Sans Serif,186", "MS Serif,186",
+ { "Arial Baltic,0", "Arial,186" },
+ { "Courier New Baltic,0", "Courier New,186" },
+ { "Times New Roman Baltic,0", "Times New Roman,186" }
},
/* Vietnamese */
{ 1258, 1258, "vga850.fon", "vgafix.fon", "vgasys.fon",
"coure.fon", "serife.fon", "smalle.fon", "sserife.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Thai */
{ 874, 874, "vga850.fon", "vgaf874.fon", "vgas874.fon",
"coure.fon", "serife.fon", "smalle.fon", "ssee874.fon",
"Tahoma","Times New Roman", /* FIXME unverified */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Japanese */
{ 932, 932, "vga932.fon", "jvgafix.fon", "jvgasys.fon",
"coure.fon", "serife.fon", "jsmalle.fon", "sserife.fon",
"MS UI Gothic","MS Serif",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Chinese Simplified */
{ 936, 936, "vga936.fon", "svgafix.fon", "svgasys.fon",
"coure.fon", "serife.fon", "smalle.fon", "sserife.fon",
"Tahoma", "Times New Roman", /* FIXME unverified */
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Korean */
{ 949, 949, "vga949.fon", "hvgafix.fon", "hvgasys.fon",
"coure.fon", "serife.fon", "smalle.fon", "sserife.fon",
"Gulim", "Batang",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
},
/* Chinese Traditional */
{ 950, 950, "vga950.fon", "cvgafix.fon", "cvgasys.fon",
"coure.fon", "serife.fon", "smalle.fon", "sserife.fon",
"PMingLiU", "MingLiU",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ { 0 }, { 0 }, { 0 }
}
};
@@ -2248,12 +2308,21 @@ static void add_font_list(HKEY hkey, const struct nls_update_font_list *fl)
RegSetValueExA(hkey, "Small Fonts", 0, REG_SZ, (const BYTE *)fl->small, strlen(fl->small)+1);
}
+static void set_value_key(HKEY hkey, const char *name, const char *value)
+{
+ if (value)
+ RegSetValueExA(hkey, name, 0, REG_SZ, (const BYTE *)value, strlen(value) + 1);
+ else if (name)
+ RegDeleteValueA(hkey, name);
+}
+
static void update_font_info(void)
{
char buf[40], cpbuf[40];
DWORD len, type;
HKEY hkey = 0;
UINT i, ansi_cp = 0, oem_cp = 0;
+ BOOL done = FALSE;
if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Wine\\Fonts", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL) != ERROR_SUCCESS)
return;
@@ -2285,11 +2354,11 @@ static void update_font_info(void)
for (i = 0; i < sizeof(nls_update_font_list)/sizeof(nls_update_font_list[0]); i++)
{
+ HKEY hkey;
+
if (nls_update_font_list[i].ansi_cp == ansi_cp &&
nls_update_font_list[i].oem_cp == oem_cp)
{
- HKEY hkey;
-
hkey = create_config_fonts_registry_key();
RegSetValueExA(hkey, "OEMFONT.FON", 0, REG_SZ, (const BYTE *)nls_update_font_list[i].oem, strlen(nls_update_font_list[i].oem)+1);
RegSetValueExA(hkey, "FIXEDFON.FON", 0, REG_SZ, (const BYTE *)nls_update_font_list[i].fixed, strlen(nls_update_font_list[i].fixed)+1);
@@ -2310,12 +2379,38 @@ static void update_font_info(void)
strlen(nls_update_font_list[i].shelldlg)+1);
RegSetValueExA(hkey, "Tms Rmn", 0, REG_SZ, (const BYTE *)nls_update_font_list[i].tmsrmn,
strlen(nls_update_font_list[i].tmsrmn)+1);
+
+ set_value_key(hkey, "Fixedsys,0", nls_update_font_list[i].fixed_0);
+ set_value_key(hkey, "System,0", nls_update_font_list[i].system_0);
+ set_value_key(hkey, "Courier,0", nls_update_font_list[i].courier_0);
+ set_value_key(hkey, "MS Serif,0", nls_update_font_list[i].serif_0);
+ set_value_key(hkey, "Small Fonts,0", nls_update_font_list[i].small_0);
+ set_value_key(hkey, "MS Sans Serif,0", nls_update_font_list[i].sserif_0);
+ set_value_key(hkey, "Helv,0", nls_update_font_list[i].helv_0);
+ set_value_key(hkey, "Tms Rmn,0", nls_update_font_list[i].tmsrmn_0);
+
+ set_value_key(hkey, nls_update_font_list[i].arial_0.from, nls_update_font_list[i].arial_0.to);
+ set_value_key(hkey, nls_update_font_list[i].courier_new_0.from, nls_update_font_list[i].courier_new_0.to);
+ set_value_key(hkey, nls_update_font_list[i].times_new_roman_0.from, nls_update_font_list[i].times_new_roman_0.to);
+
+ RegCloseKey(hkey);
+ }
+ done = TRUE;
+ }
+ else
+ {
+ /* Delete the FontSubstitutes from other locales */
+ if (!RegCreateKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes", &hkey ))
+ {
+ set_value_key(hkey, nls_update_font_list[i].arial_0.from, NULL);
+ set_value_key(hkey, nls_update_font_list[i].courier_new_0.from, NULL);
+ set_value_key(hkey, nls_update_font_list[i].times_new_roman_0.from, NULL);
RegCloseKey(hkey);
}
- return;
}
}
- FIXME("there is no font defaults for codepages %u,%u\n", ansi_cp, oem_cp);
+ if (!done)
+ FIXME("there is no font defaults for codepages %u,%u\n", ansi_cp, oem_cp);
}
@@ -3149,6 +3244,7 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont)
LOGFONTW lf;
CHARSETINFO csi;
HFONTLIST *hflist;
+ FontSubst *psub = NULL;
EnterCriticalSection( &freetype_cs );
@@ -3231,7 +3327,6 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont)
family = NULL;
if(lf.lfFaceName[0] != '\0') {
- FontSubst *psub;
SYSTEM_LINKS *font_link;
CHILD_FONT *font_link_entry;
LPWSTR FaceName = lf.lfFaceName;
@@ -3247,9 +3342,10 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont)
psub = get_font_subst(&font_subst_list, FaceName, lf.lfCharSet);
if(psub) {
- TRACE("substituting %s -> %s\n", debugstr_w(FaceName),
- debugstr_w(psub->to.name));
- strcpyW(FaceName, psub->to.name);
+ TRACE("substituting %s,%d -> %s,%d\n", debugstr_w(FaceName), lf.lfCharSet,
+ debugstr_w(psub->to.name), (psub->to.charset != -1) ? psub->to.charset : lf.lfCharSet);
+ if (psub->to.charset != -1)
+ lf.lfCharSet = psub->to.charset;
}
/* We want a match on name and charset or just name if
@@ -3260,7 +3356,9 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont)
*/
LIST_FOR_EACH(family_elem_ptr, &font_list) {
family = LIST_ENTRY(family_elem_ptr, Family, entry);
- if(!strcmpiW(family->FamilyName, FaceName)) {
+ if (!strcmpiW(family->FamilyName, FaceName) ||
+ (psub && !strcmpiW(family->FamilyName, psub->to.name)))
+ {
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])
@@ -3294,6 +3392,8 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont)
}
}
+ psub = NULL; /* substitution is no more relevant */
+
/* If requested charset was DEFAULT_CHARSET then try using charset
corresponding to the current ansi codepage */
if (!csi.fs.fsCsb[0] || lf.lfWeight == FW_DONTCARE)
@@ -3478,7 +3578,7 @@ found:
}
ret->orientation = FT_IS_SCALABLE(ret->ft_face) ? lf.lfOrientation : 0;
- ret->name = strdupW(family->FamilyName);
+ ret->name = psub ? strdupW(psub->from.name) : strdupW(family->FamilyName);
ret->underline = lf.lfUnderline ? 0xff : 0;
ret->strikeout = lf.lfStrikeOut ? 0xff : 0;
create_child_font_list(ret);
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 710148a..10290f5 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -1771,11 +1771,23 @@ static void test_GetTextMetrics(void)
static void test_nonexistent_font(void)
{
+ static const struct
+ {
+ const char *name;
+ int charset;
+ } font_subst[] =
+ {
+ { "Times New Roman Baltic", 186 },
+ { "Times New Roman CE", 238 },
+ { "Times New Roman CYR", 204 },
+ { "Times New Roman Greek", 161 },
+ { "Times New Roman TUR", 162 }
+ };
LOGFONTA lf;
HDC hdc;
HFONT hfont;
CHARSETINFO csi;
- INT cs, expected_cs;
+ INT cs, expected_cs, i;
char buf[LF_FACESIZE];
if (!is_truetype_font_installed("Arial") ||
@@ -1842,22 +1854,6 @@ todo_wine /* Wine uses Arial for all substitutions */
memset(&lf, 0, sizeof(lf));
lf.lfHeight = -13;
lf.lfWeight = FW_DONTCARE;
- strcpy(lf.lfFaceName, "Times New Roman CE");
- hfont = CreateFontIndirectA(&lf);
- hfont = SelectObject(hdc, hfont);
- GetTextFaceA(hdc, sizeof(buf), buf);
-todo_wine /* Wine uses Arial for all substitutions */
- ok(!lstrcmpiA(buf, "Times New Roman CE") /* XP, Vista */ ||
- !lstrcmpiA(buf, "MS Serif") /* Win9x */ ||
- !lstrcmpiA(buf, "MS Sans Serif"), /* win2k3 */
- "Got %s\n", buf);
- cs = GetTextCharset(hdc);
- ok(cs == expected_cs, "expected %d, got %d\n", expected_cs, cs);
- DeleteObject(SelectObject(hdc, hfont));
-
- memset(&lf, 0, sizeof(lf));
- lf.lfHeight = -13;
- lf.lfWeight = FW_DONTCARE;
strcpy(lf.lfFaceName, "Times New Roman");
hfont = CreateFontIndirectA(&lf);
hfont = SelectObject(hdc, hfont);
@@ -1867,18 +1863,46 @@ todo_wine /* Wine uses Arial for all substitutions */
ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d\n", cs);
DeleteObject(SelectObject(hdc, hfont));
- memset(&lf, 0, sizeof(lf));
- lf.lfHeight = -13;
- lf.lfWeight = FW_REGULAR;
- strcpy(lf.lfFaceName, "Times New Roman CE");
- hfont = CreateFontIndirectA(&lf);
- hfont = SelectObject(hdc, hfont);
- GetTextFaceA(hdc, sizeof(buf), buf);
- ok(!lstrcmpiA(buf, "Arial") /* XP, Vista */ ||
- !lstrcmpiA(buf, "Times New Roman") /* Win9x */, "Got %s\n", buf);
- cs = GetTextCharset(hdc);
- ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d\n", cs);
- DeleteObject(SelectObject(hdc, hfont));
+ for (i = 0; i < sizeof(font_subst)/sizeof(font_subst[0]); i++)
+ {
+ memset(&lf, 0, sizeof(lf));
+ lf.lfHeight = -13;
+ lf.lfWeight = FW_REGULAR;
+ strcpy(lf.lfFaceName, font_subst[i].name);
+ hfont = CreateFontIndirectA(&lf);
+ hfont = SelectObject(hdc, hfont);
+ cs = GetTextCharset(hdc);
+ if (font_subst[i].charset == expected_cs)
+ {
+ ok(cs == expected_cs, "expected %d, got %d\n", expected_cs, cs);
+ GetTextFaceA(hdc, sizeof(buf), buf);
+ ok(!lstrcmpiA(buf, font_subst[i].name), "expected %s, got %s\n", font_subst[i].name, buf);
+ }
+ else
+ {
+ ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d\n", cs);
+ GetTextFaceA(hdc, sizeof(buf), buf);
+ ok(!lstrcmpiA(buf, "Arial") /* XP, Vista */ ||
+ !lstrcmpiA(buf, "Times New Roman") /* Win9x */, "got %s\n", buf);
+ }
+ DeleteObject(SelectObject(hdc, hfont));
+
+ memset(&lf, 0, sizeof(lf));
+ lf.lfHeight = -13;
+ lf.lfWeight = FW_DONTCARE;
+ strcpy(lf.lfFaceName, font_subst[i].name);
+ hfont = CreateFontIndirectA(&lf);
+ hfont = SelectObject(hdc, hfont);
+ GetTextFaceA(hdc, sizeof(buf), buf);
+ ok(!lstrcmpiA(buf, "Arial") /* Wine */ ||
+ !lstrcmpiA(buf, font_subst[i].name) /* XP, Vista */ ||
+ !lstrcmpiA(buf, "MS Serif") /* Win9x */ ||
+ !lstrcmpiA(buf, "MS Sans Serif"), /* win2k3 */
+ "got %s\n", buf);
+ cs = GetTextCharset(hdc);
+ ok(cs == expected_cs, "expected %d, got %d\n", expected_cs, cs);
+ DeleteObject(SelectObject(hdc, hfont));
+ }
ReleaseDC(0, hdc);
}
--
Debian Wine packaging
More information about the pkg-wine-party
mailing list