X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/da41ffdd089b529c3d5216412d95840e065c3fe3..5fbd17e369ca30a47ab8a2eda0b2f2ea9b690bb4:/src/fontset.c diff --git a/src/fontset.c b/src/fontset.c index e34719e5cd..b257da117b 100644 --- a/src/fontset.c +++ b/src/fontset.c @@ -1,6 +1,6 @@ /* Fontset handler. -Copyright (C) 2001-2014 Free Software Foundation, Inc. +Copyright (C) 2001-2015 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 National Institute of Advanced Industrial Science and Technology (AIST) @@ -92,26 +92,27 @@ along with GNU Emacs. If not, see . */ range of characters in this fontset, but may be available in the default fontset. + A fontset has 8 extra slots. - A fontset has 9 extra slots. - - The 1st slot: the ID number of the fontset + The 1st slot: + base: the ID number of the fontset + realized: Likewise The 2nd slot: base: the name of the fontset realized: nil The 3rd slot: - base: nil - realized: the base fontset + base: the font name for ASCII characters + realized: nil The 4th slot: base: nil - realized: the frame that the fontset belongs to + realized: the base fontset The 5th slot: - base: the font name for ASCII characters - realized: nil + base: nil + realized: the frame that the fontset belongs to The 6th slot: base: nil @@ -119,16 +120,11 @@ along with GNU Emacs. If not, see . */ has no font in a realized fontset. The 7th slot: - base: nil - realized: Alist of font index vs the corresponding repertory - char-table. - - The 8th slot: base: nil realized: If the base is not the default fontset, a fontset - realized from the default fontset, else nil. + realized from the default fontset, else nil. - The 9th slot: + The 8th slot: base: Same as element value (but for fallback fonts). realized: Likewise. @@ -156,11 +152,6 @@ along with GNU Emacs. If not, see . */ /********** VARIABLES and FUNCTION PROTOTYPES **********/ -static Lisp_Object Qfontset; -static Lisp_Object Qfontset_info; -static Lisp_Object Qprepend, Qappend; -Lisp_Object Qlatin; - /* Vector containing all fontsets. */ static Lisp_Object Vfontset_table; @@ -393,7 +384,7 @@ reorder_font_vector (Lisp_Object font_group, struct font *font) Lisp_Object vec, font_object; int size; int i; - bool score_changed = 0; + bool score_changed = false; if (font) XSETFONT (font_object, font); @@ -448,14 +439,15 @@ reorder_font_vector (Lisp_Object font_group, struct font *font) if (RFONT_DEF_SCORE (rfont_def) != score) { RFONT_DEF_SET_SCORE (rfont_def, score); - score_changed = 1; + score_changed = true; } } if (score_changed) qsort (XVECTOR (vec)->contents, size, word_size, fontset_compare_rfontdef); - XSETCAR (font_group, make_number (charset_ordered_list_tick)); + EMACS_INT low_tick_bits = charset_ordered_list_tick & MOST_POSITIVE_FIXNUM; + XSETCAR (font_group, make_number (low_tick_bits)); } /* Return a font-group (actually a cons (-1 . FONT-GROUP-VECTOR)) for @@ -1079,10 +1071,11 @@ fontset_pattern_regexp (Lisp_Object pattern) /* If PATTERN is not full XLFD we convert "*" to ".*". Otherwise we convert "*" to "[^-]*" which is much faster in regular expression matching. */ - if (ndashes < 14) - p1 = regex = alloca (SBYTES (pattern) + 2 * nstars + 2 * nescs + 1); - else - p1 = regex = alloca (SBYTES (pattern) + 5 * nstars + 2 * nescs + 1); + ptrdiff_t regexsize = (SBYTES (pattern) + + (ndashes < 14 ? 2 : 5) * nstars + + 2 * nescs + 1); + USE_SAFE_ALLOCA; + p1 = regex = SAFE_ALLOCA (regexsize); *p1++ = '^'; for (p0 = SDATA (pattern); *p0; p0++) @@ -1110,6 +1103,7 @@ fontset_pattern_regexp (Lisp_Object pattern) Vcached_fontset_data = Fcons (build_string (SSDATA (pattern)), build_string ((char *) regex)); + SAFE_FREE (); } return CACHED_FONTSET_REGEX; @@ -1460,8 +1454,8 @@ appended. By default, FONT-SPEC overrides the previous settings. */) registry = AREF (font_spec, FONT_REGISTRY_INDEX); if (! NILP (registry)) registry = Fdowncase (SYMBOL_NAME (registry)); - encoding = find_font_encoding (concat3 (family, build_string ("-"), - registry)); + AUTO_STRING (dash, "-"); + encoding = find_font_encoding (concat3 (family, dash, registry)); if (NILP (encoding)) encoding = Qascii; @@ -1573,7 +1567,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) if (ascii_changed) { - Lisp_Object tail, fr, alist; + Lisp_Object tail, fr; int fontset_id = XINT (FONTSET_ID (fontset)); set_fontset_ascii (fontset, fontname); @@ -1596,8 +1590,8 @@ appended. By default, FONT-SPEC overrides the previous settings. */) if (! NILP (font_object)) { update_auto_fontset_alist (font_object, fontset); - alist = list1 (Fcons (Qfont, Fcons (name, font_object))); - Fmodify_frame_parameters (fr, alist); + AUTO_FRAME_ARG (arg, Qfont, Fcons (name, font_object)); + Fmodify_frame_parameters (fr, arg); } } } @@ -1843,6 +1837,10 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 2, 0, return Qnil; if (!FRAME_WINDOW_P (f)) return Qnil; + /* We need the basic faces to be valid below, so recompute them if + some code just happened to clear the face cache. */ + if (FRAME_FACE_CACHE (f)->used == 0) + recompute_basic_faces (f); face_id = FACE_FOR_CHAR (f, FACE_FROM_ID (f, face_id), c, pos, Qnil); face = FACE_FROM_ID (f, face_id); if (face->font) @@ -1888,7 +1886,9 @@ format is the same as above. */) /* Recode fontsets realized on FRAME from the base fontset FONTSET in the table `realized'. */ - realized[0] = alloca (word_size * ASIZE (Vfontset_table)); + USE_SAFE_ALLOCA; + SAFE_ALLOCA_LISP (realized[0], 2 * ASIZE (Vfontset_table)); + realized[1] = realized[0] + ASIZE (Vfontset_table); for (i = j = 0; i < ASIZE (Vfontset_table); i++) { elt = FONTSET_FROM_ID (i); @@ -1899,7 +1899,6 @@ format is the same as above. */) } realized[0][j] = Qnil; - realized[1] = alloca (word_size * ASIZE (Vfontset_table)); for (i = j = 0; ! NILP (realized[0][i]); i++) { elt = FONTSET_DEFAULT (realized[0][i]); @@ -1991,6 +1990,7 @@ format is the same as above. */) break; } + SAFE_FREE (); return tables[0]; }