X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/6bb4a8bf9aaa63141ad7c12ab6b6ba9939050178..40fb2103c2986cbb91add4afed635886c4f87ae5:/src/fontset.c diff --git a/src/fontset.c b/src/fontset.c index 4901fc7141..4c54d63639 100644 --- a/src/fontset.c +++ b/src/fontset.c @@ -262,7 +262,7 @@ static Lisp_Object make_fontset P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); static Lisp_Object fontset_pattern_regexp P_ ((Lisp_Object)); static void accumulate_script_ranges P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); -static Lisp_Object find_font_encoding P_ ((char *)); +static Lisp_Object find_font_encoding P_ ((Lisp_Object)); static void set_fontset_font P_ ((Lisp_Object, Lisp_Object)); @@ -774,6 +774,23 @@ make_fontset (frame, name, base) } +/* Set the ASCII font of the default fontset to FONTNAME if that is + not yet set. */ +void +set_default_ascii_font (fontname) + Lisp_Object fontname; +{ + if (! CONSP (FONTSET_ASCII (Vdefault_fontset))) + { + int id = fs_query_fontset (fontname, 2); + + if (id >= 0) + fontname = XCDR (FONTSET_ASCII (FONTSET_FROM_ID (id))); + FONTSET_ASCII (Vdefault_fontset) + = Fcons (make_number (0), fontname); + } +} + /********** INTERFACES TO xfaces.c, xfns.c, and dispextern.h **********/ @@ -973,6 +990,7 @@ fs_load_font (f, fontname, charset) int charset; { struct font_info *fontp; + Lisp_Object fullname; if (!fontname) /* No way to get fontname. */ @@ -983,12 +1001,13 @@ fs_load_font (f, fontname, charset) return fontp; fontname = fontp->full_name; + fullname = build_string (fontp->full_name); if (charset < 0) { Lisp_Object charset_symbol; - charset_symbol = find_font_encoding (fontname); + charset_symbol = find_font_encoding (fullname); if (CONSP (charset_symbol)) charset_symbol = XCAR (charset_symbol); charset = XINT (CHARSET_SYMBOL_ID (charset_symbol)); @@ -1001,8 +1020,8 @@ fs_load_font (f, fontname, charset) { fontp->vertical_centering = (STRINGP (Vvertical_centering_font_regexp) - && (fast_c_string_match_ignore_case - (Vvertical_centering_font_regexp, fontname) >= 0)); + && (fast_string_match_ignore_case + (Vvertical_centering_font_regexp, fullname) >= 0)); if (find_ccl_program_func) (*find_ccl_program_func) (fontp); @@ -1023,7 +1042,7 @@ fs_load_font (f, fontname, charset) static Lisp_Object find_font_encoding (fontname) - char *fontname; + Lisp_Object fontname; { Lisp_Object tail, elt; @@ -1032,7 +1051,7 @@ find_font_encoding (fontname) elt = XCAR (tail); if (CONSP (elt) && STRINGP (XCAR (elt)) - && fast_c_string_match_ignore_case (XCAR (elt), fontname) >= 0 + && fast_string_match_ignore_case (XCAR (elt), fontname) >= 0 && (SYMBOLP (XCDR (elt)) ? CHARSETP (XCDR (elt)) : CONSP (XCDR (elt)) && CHARSETP (XCAR (XCDR (elt))))) @@ -1067,16 +1086,34 @@ fontset_pattern_regexp (pattern) || strcmp (SDATA (pattern), CACHED_FONTSET_NAME)) { /* We must at first update the cached data. */ - char *regex = (char *) alloca (SCHARS (pattern) * 2 + 3); - char *p0, *p1 = regex; + unsigned char *regex, *p0, *p1; + int ndashes = 0, nstars = 0; + + for (p0 = SDATA (pattern); *p0; p0++) + { + if (*p0 == '-') + ndashes++; + else if (*p0 == '*') + nstars++; + } + + /* If PATTERN is not full XLFD we conert "*" to ".*". Otherwise + we convert "*" to "[^-]*" which is much faster in regular + expression matching. */ + if (ndashes < 14) + p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 2 * nstars + 1); + else + p1 = regex = (unsigned char *) alloca (SBYTES (pattern) + 5 * nstars + 1); - /* Convert "*" to ".*", "?" to ".". */ *p1++ = '^'; - for (p0 = (char *) SDATA (pattern); *p0; p0++) + for (p0 = SDATA (pattern); *p0; p0++) { if (*p0 == '*') { - *p1++ = '.'; + if (ndashes < 14) + *p1++ = '.'; + else + *p1++ = '[', *p1++ = '^', *p1++ = '-', *p1++ = ']'; *p1++ = '*'; } else if (*p0 == '?') @@ -1095,49 +1132,52 @@ fontset_pattern_regexp (pattern) } /* Return ID of the base fontset named NAME. If there's no such - fontset, return -1. */ + fontset, return -1. NAME_PATTERN specifies how to treat NAME as this: + 0: pattern containing '*' and '?' as wildcards + 1: regular expression + 2: literal fontset name +*/ int -fs_query_fontset (name, regexpp) +fs_query_fontset (name, name_pattern) Lisp_Object name; - int regexpp; + int name_pattern; { Lisp_Object tem; int i; name = Fdowncase (name); - if (!regexpp) + if (name_pattern != 1) { tem = Frassoc (name, Vfontset_alias_alist); if (NILP (tem)) tem = Fassoc (name, Vfontset_alias_alist); if (CONSP (tem) && STRINGP (XCAR (tem))) name = XCAR (tem); - else + else if (name_pattern == 0) { tem = fontset_pattern_regexp (name); if (STRINGP (tem)) { name = tem; - regexpp = 1; + name_pattern = 1; } } } for (i = 0; i < ASIZE (Vfontset_table); i++) { - Lisp_Object fontset; - unsigned char *this_name; + Lisp_Object fontset, this_name; fontset = FONTSET_FROM_ID (i); if (NILP (fontset) || !BASE_FONTSET_P (fontset)) continue; - this_name = SDATA (FONTSET_NAME (fontset)); - if (regexpp - ? fast_c_string_match_ignore_case (name, this_name) >= 0 - : !strcmp (SDATA (name), this_name)) + this_name = FONTSET_NAME (fontset); + if (name_pattern == 1 + ? fast_string_match (name, this_name) >= 0 + : !strcmp (SDATA (name), SDATA (this_name))) return i; } return -1; @@ -1189,19 +1229,18 @@ list_fontsets (f, pattern, size) for (id = 0; id < ASIZE (Vfontset_table); id++) { - Lisp_Object fontset; - unsigned char *name; + Lisp_Object fontset, name; fontset = FONTSET_FROM_ID (id); if (NILP (fontset) || !BASE_FONTSET_P (fontset) || !EQ (frame, FONTSET_FRAME (fontset))) continue; - name = SDATA (FONTSET_NAME (fontset)); + name = FONTSET_NAME (fontset); if (STRINGP (regexp) - ? (fast_c_string_match_ignore_case (regexp, name) < 0) - : strcmp (SDATA (pattern), name)) + ? (fast_string_match (regexp, name) < 0) + : strcmp (SDATA (pattern), SDATA (name))) continue; val = Fcons (Fcopy_sequence (FONTSET_NAME (fontset)), val); @@ -1266,7 +1305,11 @@ check_fontset_name (name) return Vdefault_fontset; CHECK_STRING (name); - id = fs_query_fontset (name, 0); + /* First try NAME as literal. */ + id = fs_query_fontset (name, 2); + if (id < 0) + /* For backward compatibility, try again NAME as pattern. */ + id = fs_query_fontset (name, 0); if (id < 0) error ("Fontset `%s' does not exist", SDATA (name)); return FONTSET_FROM_ID (id); @@ -1384,7 +1427,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) Lisp_Object name, target, font_spec, frame, add; { Lisp_Object fontset; - Lisp_Object font_def, registry; + Lisp_Object font_def, registry, family; Lisp_Object encoding, repertory; Lisp_Object range_list; struct charset *charset = NULL; @@ -1415,16 +1458,13 @@ appended. By default, FONT-SPEC overrides the previous settings. */) CHECK_STRING (AREF (font_spec, j)); ASET (font_spec, j, Fdowncase (AREF (font_spec, j))); } + family = AREF (font_spec, FONT_SPEC_FAMILY_INDEX); /* REGISTRY should not be omitted. */ CHECK_STRING (AREF (font_spec, FONT_SPEC_REGISTRY_INDEX)); - registry = Fdowncase (AREF (font_spec, FONT_SPEC_REGISTRY_INDEX)); - ASET (font_spec, FONT_SPEC_REGISTRY_INDEX, registry); - + registry = AREF (font_spec, FONT_SPEC_REGISTRY_INDEX); } else if (CONSP (font_spec)) { - Lisp_Object family; - family = XCAR (font_spec); registry = XCDR (font_spec); @@ -1446,9 +1486,9 @@ appended. By default, FONT-SPEC overrides the previous settings. */) } if (STRINGP (font_spec)) - encoding = find_font_encoding ((char *) SDATA (font_spec)); + encoding = find_font_encoding (font_spec); else - encoding = find_font_encoding ((char *) SDATA (registry)); + encoding = find_font_encoding (concat2 (family, registry)); if (SYMBOLP (encoding)) { CHECK_CHARSET (encoding); @@ -2106,21 +2146,6 @@ syms_of_fontset () FONTSET_ID (Vdefault_fontset) = make_number (0); FONTSET_NAME (Vdefault_fontset) = build_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default"); - { - Lisp_Object default_ascii_font; - -#if defined (macintosh) - default_ascii_font - = build_string ("-apple-monaco-medium-r-*--*-120-*-*-*-*-mac-roman"); -#elif defined (WINDOWSNT) - default_ascii_font - = build_string ("-*-courier new-normal-r-*-*-*-100-*-*-*-*-iso8859-1"); -#else - default_ascii_font - = build_string ("-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1"); -#endif - FONTSET_ASCII (Vdefault_fontset) = default_ascii_font; - } AREF (Vfontset_table, 0) = Vdefault_fontset; next_fontset_id = 1;