mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-14 09:39:42 +00:00
(x_to_w32_color): Fix argument to alloca.
(w32_load_system_font): Don't believe what GetLanguageFontInfo says; query codepage info directly to determine if font is double byte. (x_to_w32_charset): Handle private format for unknown charsets. Handle wildcards in charset spec, by ignoring them. (w32_codepage_for_font): Fix argument to alloca. Don't remove "*-" prefix from charset. (x_to_w32_font): Enlarge remainder array for safety. Specifically handle the truncated font spec form constructed by font_list_1, so that we correctly identify the charset fields. Don't remove "*-" prefix from charset. (w32_list_synthesized_fonts): Fix argument to alloca.
This commit is contained in:
parent
9c5becd89a
commit
8b77111c23
71
src/w32fns.c
71
src/w32fns.c
@ -1646,7 +1646,7 @@ x_to_w32_color (colorname)
|
||||
|
||||
if (isdigit (colorname[len - 1]))
|
||||
{
|
||||
char *ptr, *approx = alloca (len);
|
||||
char *ptr, *approx = alloca (len + 1);
|
||||
|
||||
strcpy (approx, colorname);
|
||||
ptr = &approx[len - 1];
|
||||
@ -5625,7 +5625,18 @@ w32_load_system_font (f,fontname,size)
|
||||
if (codepage == CP_UNICODE)
|
||||
font->double_byte_p = 1;
|
||||
else
|
||||
font->double_byte_p = GetFontLanguageInfo(hdc) & GCP_DBCS;
|
||||
{
|
||||
/* Unfortunately, some fonts (eg. MingLiU, a big5 ttf font)
|
||||
don't report themselves as double byte fonts, when
|
||||
patently they are. So instead of trusting
|
||||
GetFontLanguageInfo, we check the properties of the
|
||||
codepage directly, since that is ultimately what we are
|
||||
working from anyway. */
|
||||
/* font->double_byte_p = GetFontLanguageInfo(hdc) & GCP_DBCS; */
|
||||
CPINFO cpi = {0};
|
||||
GetCPInfo (codepage, &cpi);
|
||||
font->double_byte_p = cpi.MaxCharSize > 1;
|
||||
}
|
||||
|
||||
SelectObject (hdc, oldobj);
|
||||
ReleaseDC (dpyinfo->root_window, hdc);
|
||||
@ -5846,17 +5857,30 @@ x_to_w32_charset (lpcs)
|
||||
char * lpcs;
|
||||
{
|
||||
Lisp_Object this_entry, w32_charset;
|
||||
char *charset;
|
||||
int len = strlen (lpcs);
|
||||
|
||||
/* Support "*-#nnn" format for unknown charsets. */
|
||||
if (strncmp (lpcs, "*-#", 3) == 0)
|
||||
return atoi (lpcs + 3);
|
||||
|
||||
/* Handle wildcards by ignoring them; eg. treat "big5*-*" as "big5". */
|
||||
charset = alloca (len + 1);
|
||||
strcpy (charset, lpcs);
|
||||
lpcs = strchr (charset, '*');
|
||||
if (lpcs)
|
||||
*lpcs = 0;
|
||||
|
||||
/* Look through w32-charset-info-alist for the character set.
|
||||
Format of each entry is
|
||||
(CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
|
||||
*/
|
||||
this_entry = Fassoc (build_string(lpcs), Vw32_charset_info_alist);
|
||||
this_entry = Fassoc (build_string(charset), Vw32_charset_info_alist);
|
||||
|
||||
if (NILP(this_entry))
|
||||
{
|
||||
/* At startup, we want iso8859-1 fonts to come up properly. */
|
||||
if (stricmp(lpcs, "iso8859-1") == 0)
|
||||
if (stricmp(charset, "iso8859-1") == 0)
|
||||
return ANSI_CHARSET;
|
||||
else
|
||||
return DEFAULT_CHARSET;
|
||||
@ -6088,13 +6112,15 @@ w32_codepage_for_font (char *fontname)
|
||||
if (!charset)
|
||||
return CP_UNKNOWN;
|
||||
|
||||
charset_str = (char *) alloca (strlen (charset));
|
||||
charset_str = (char *) alloca (strlen (charset) + 1);
|
||||
strcpy (charset_str, charset);
|
||||
|
||||
#if 0
|
||||
/* Remove leading "*-". */
|
||||
if (strncmp ("*-", charset_str, 2) == 0)
|
||||
charset = charset_str + 2;
|
||||
else
|
||||
#endif
|
||||
charset = charset_str;
|
||||
|
||||
/* Stop match at wildcard (including preceding '-'). */
|
||||
@ -6250,20 +6276,33 @@ x_to_w32_font (lpxstr, lplogfont)
|
||||
{
|
||||
int fields, tem;
|
||||
char name[50], weight[20], slant, pitch, pixels[10], height[10],
|
||||
width[10], resy[10], remainder[20];
|
||||
width[10], resy[10], remainder[50];
|
||||
char * encoding;
|
||||
int dpi = one_w32_display_info.resy;
|
||||
|
||||
fields = sscanf (lpxstr,
|
||||
"-%*[^-]-%49[^-]-%19[^-]-%c-%*[^-]-%*[^-]-%9[^-]-%9[^-]-%*[^-]-%9[^-]-%c-%9[^-]-%19s",
|
||||
"-%*[^-]-%49[^-]-%19[^-]-%c-%*[^-]-%*[^-]-%9[^-]-%9[^-]-%*[^-]-%9[^-]-%c-%9[^-]-%49s",
|
||||
name, weight, &slant, pixels, height, resy, &pitch, width, remainder);
|
||||
if (fields == EOF) return (FALSE);
|
||||
if (fields == EOF)
|
||||
return (FALSE);
|
||||
|
||||
/* If wildcards cover more than one field, we don't know which
|
||||
field is which, so don't fill any in. */
|
||||
|
||||
if (fields < 9)
|
||||
fields = 0;
|
||||
/* In the general case when wildcards cover more than one field,
|
||||
we don't know which field is which, so don't fill any in.
|
||||
However, we need to cope with this particular form, which is
|
||||
generated by font_list_1 (invoked by try_font_list):
|
||||
"-raster-6x10-*-gb2312*-*"
|
||||
and make sure to correctly parse the charset field. */
|
||||
if (fields == 3)
|
||||
{
|
||||
fields = sscanf (lpxstr,
|
||||
"-%*[^-]-%49[^-]-*-%49s",
|
||||
name, remainder);
|
||||
}
|
||||
else if (fields < 9)
|
||||
{
|
||||
fields = 0;
|
||||
remainder[0] = 0;
|
||||
}
|
||||
|
||||
if (fields > 0 && name[0] != '*')
|
||||
{
|
||||
@ -6331,9 +6370,11 @@ x_to_w32_font (lpxstr, lplogfont)
|
||||
remainder[len-1] = 0;
|
||||
}
|
||||
encoding = remainder;
|
||||
#if 0
|
||||
if (strncmp (encoding, "*-", 2) == 0)
|
||||
encoding += 2;
|
||||
lplogfont->lfCharSet = x_to_w32_charset (fields > 0 ? encoding : "");
|
||||
#endif
|
||||
lplogfont->lfCharSet = x_to_w32_charset (encoding);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -6953,7 +6994,7 @@ w32_list_synthesized_fonts (f, pattern, size, max_names)
|
||||
|
||||
full_pattn = XSTRING (pattern)->data;
|
||||
|
||||
pattn_part2 = alloca (XSTRING (pattern)->size);
|
||||
pattn_part2 = alloca (XSTRING (pattern)->size + 1);
|
||||
/* Allow some space for wildcard expansion. */
|
||||
new_pattn = alloca (XSTRING (pattern)->size + 100);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user