Commit 8b77111c authored by Andrew Innes's avatar Andrew Innes

(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.
parent 9c5becd8
...@@ -1646,7 +1646,7 @@ x_to_w32_color (colorname) ...@@ -1646,7 +1646,7 @@ x_to_w32_color (colorname)
if (isdigit (colorname[len - 1])) if (isdigit (colorname[len - 1]))
{ {
char *ptr, *approx = alloca (len); char *ptr, *approx = alloca (len + 1);
strcpy (approx, colorname); strcpy (approx, colorname);
ptr = &approx[len - 1]; ptr = &approx[len - 1];
...@@ -5625,7 +5625,18 @@ w32_load_system_font (f,fontname,size) ...@@ -5625,7 +5625,18 @@ w32_load_system_font (f,fontname,size)
if (codepage == CP_UNICODE) if (codepage == CP_UNICODE)
font->double_byte_p = 1; font->double_byte_p = 1;
else 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); SelectObject (hdc, oldobj);
ReleaseDC (dpyinfo->root_window, hdc); ReleaseDC (dpyinfo->root_window, hdc);
...@@ -5846,17 +5857,30 @@ x_to_w32_charset (lpcs) ...@@ -5846,17 +5857,30 @@ x_to_w32_charset (lpcs)
char * lpcs; char * lpcs;
{ {
Lisp_Object this_entry, w32_charset; 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. /* Look through w32-charset-info-alist for the character set.
Format of each entry is Format of each entry is
(CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)). (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)) if (NILP(this_entry))
{ {
/* At startup, we want iso8859-1 fonts to come up properly. */ /* 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; return ANSI_CHARSET;
else else
return DEFAULT_CHARSET; return DEFAULT_CHARSET;
...@@ -6088,13 +6112,15 @@ w32_codepage_for_font (char *fontname) ...@@ -6088,13 +6112,15 @@ w32_codepage_for_font (char *fontname)
if (!charset) if (!charset)
return CP_UNKNOWN; return CP_UNKNOWN;
charset_str = (char *) alloca (strlen (charset)); charset_str = (char *) alloca (strlen (charset) + 1);
strcpy (charset_str, charset); strcpy (charset_str, charset);
#if 0
/* Remove leading "*-". */ /* Remove leading "*-". */
if (strncmp ("*-", charset_str, 2) == 0) if (strncmp ("*-", charset_str, 2) == 0)
charset = charset_str + 2; charset = charset_str + 2;
else else
#endif
charset = charset_str; charset = charset_str;
/* Stop match at wildcard (including preceding '-'). */ /* Stop match at wildcard (including preceding '-'). */
...@@ -6250,20 +6276,33 @@ x_to_w32_font (lpxstr, lplogfont) ...@@ -6250,20 +6276,33 @@ x_to_w32_font (lpxstr, lplogfont)
{ {
int fields, tem; int fields, tem;
char name[50], weight[20], slant, pitch, pixels[10], height[10], 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; char * encoding;
int dpi = one_w32_display_info.resy; int dpi = one_w32_display_info.resy;
fields = sscanf (lpxstr, 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); 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. */ /* 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.
if (fields < 9) However, we need to cope with this particular form, which is
fields = 0; 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] != '*') if (fields > 0 && name[0] != '*')
{ {
...@@ -6331,9 +6370,11 @@ x_to_w32_font (lpxstr, lplogfont) ...@@ -6331,9 +6370,11 @@ x_to_w32_font (lpxstr, lplogfont)
remainder[len-1] = 0; remainder[len-1] = 0;
} }
encoding = remainder; encoding = remainder;
#if 0
if (strncmp (encoding, "*-", 2) == 0) if (strncmp (encoding, "*-", 2) == 0)
encoding += 2; encoding += 2;
lplogfont->lfCharSet = x_to_w32_charset (fields > 0 ? encoding : ""); #endif
lplogfont->lfCharSet = x_to_w32_charset (encoding);
} }
else else
{ {
...@@ -6953,7 +6994,7 @@ w32_list_synthesized_fonts (f, pattern, size, max_names) ...@@ -6953,7 +6994,7 @@ w32_list_synthesized_fonts (f, pattern, size, max_names)
full_pattn = XSTRING (pattern)->data; full_pattn = XSTRING (pattern)->data;
pattn_part2 = alloca (XSTRING (pattern)->size); pattn_part2 = alloca (XSTRING (pattern)->size + 1);
/* Allow some space for wildcard expansion. */ /* Allow some space for wildcard expansion. */
new_pattn = alloca (XSTRING (pattern)->size + 100); new_pattn = alloca (XSTRING (pattern)->size + 100);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment