3 Copyright (C) 2001-2012 Free Software Foundation, Inc.
4 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5 2005, 2006, 2007, 2008, 2009, 2010, 2011
6 National Institute of Advanced Industrial Science and Technology (AIST)
7 Registration Number H14PRO021
8 Copyright (C) 2003, 2006
9 National Institute of Advanced Industrial Science and Technology (AIST)
10 Registration Number H13PRO009
12 This file is part of GNU Emacs.
14 GNU Emacs is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
19 GNU Emacs is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
32 #include "blockinput.h"
33 #include "character.h"
39 #include "dispextern.h"
40 #include "intervals.h"
52 #include "termhooks.h"
58 A fontset is a collection of font related information to give
59 similar appearance (style, etc) of characters. A fontset has two
60 roles. One is to use for the frame parameter `font' as if it is an
61 ASCII font. In that case, Emacs uses the font specified for
62 `ascii' script for the frame's default font.
64 Another role, the more important one, is to provide information
65 about which font to use for each non-ASCII character.
67 There are two kinds of fontsets; base and realized. A base fontset
68 is created by `new-fontset' from Emacs Lisp explicitly. A realized
69 fontset is created implicitly when a face is realized for ASCII
70 characters. A face is also realized for non-ASCII characters based
71 on an ASCII face. All of non-ASCII faces based on the same ASCII
72 face share the same realized fontset.
74 A fontset object is implemented by a char-table whose default value
75 and parent are always nil.
77 An element of a base fontset is a vector of FONT-DEFs which itself
78 is a vector [ FONT-SPEC ENCODING REPERTORY ].
80 An element of a realized fontset is nil, t, 0, or a vector of this
83 [ CHARSET-ORDERED-LIST-TICK PREFERRED-RFONT-DEF
84 RFONT-DEF0 RFONT-DEF1 ... ]
86 RFONT-DEFn (i.e. Realized FONT-DEF) has this form:
88 [ FACE-ID FONT-DEF FONT-OBJECT SORTING-SCORE ]
90 RFONT-DEFn are automatically reordered by the current charset
93 The value nil means that we have not yet generated the above vector
94 from the base of the fontset.
96 The value t means that no font is available for the corresponding
99 The value 0 means that no font is available for the corresponding
100 range of characters in this fontset, but may be available in the
104 A fontset has 9 extra slots.
106 The 1st slot: the ID number of the fontset
109 base: the name of the fontset
114 realized: the base fontset
118 realized: the frame that the fontset belongs to
121 base: the font name for ASCII characters
126 realized: the ID number of a face to use for characters that
127 has no font in a realized fontset.
131 realized: Alist of font index vs the corresponding repertory
136 realized: If the base is not the default fontset, a fontset
137 realized from the default fontset, else nil.
140 base: Same as element value (but for fallback fonts).
143 All fontsets are recorded in the vector Vfontset_table.
148 There's a special base fontset named `default fontset' which
149 defines the default font specifications. When a base fontset
150 doesn't specify a font for a specific character, the corresponding
151 value in the default fontset is used.
153 The parent of a realized fontset created for such a face that has
154 no fontset is the default fontset.
157 These structures are hidden from the other codes than this file.
158 The other codes handle fontsets only by their ID numbers. They
159 usually use the variable name `fontset' for IDs. But, in this
160 file, we always use variable name `id' for IDs, and name `fontset'
161 for an actual fontset object, i.e., char-table.
165 /********** VARIABLES and FUNCTION PROTOTYPES **********/
167 static Lisp_Object Qfontset
;
168 static Lisp_Object Qfontset_info
;
169 static Lisp_Object Qprepend
, Qappend
;
172 /* Vector containing all fontsets. */
173 static Lisp_Object Vfontset_table
;
175 /* Next possibly free fontset ID. Usually this keeps the minimum
176 fontset ID not yet used. */
177 static int next_fontset_id
;
179 /* The default fontset. This gives default FAMILY and REGISTRY of
180 font for each character. */
181 static Lisp_Object Vdefault_fontset
;
183 /* Check if any window system is used now. */
184 void (*check_window_system_func
) (void);
187 /* Prototype declarations for static functions. */
188 static void fontset_add (Lisp_Object
, Lisp_Object
, Lisp_Object
, Lisp_Object
);
189 static Lisp_Object
fontset_find_font (Lisp_Object
, int, struct face
*,
191 static void reorder_font_vector (Lisp_Object
, struct font
*);
192 static Lisp_Object
fontset_font (Lisp_Object
, int, struct face
*, int);
193 static Lisp_Object
make_fontset (Lisp_Object
, Lisp_Object
, Lisp_Object
);
194 static Lisp_Object
fontset_pattern_regexp (Lisp_Object
);
195 static void accumulate_script_ranges (Lisp_Object
, Lisp_Object
,
197 static void set_fontset_font (Lisp_Object
, Lisp_Object
);
199 /* Return 1 if ID is a valid fontset id, else return 0.
200 Optimized away if ENABLE_CHECKING is not defined. */
203 fontset_id_valid_p (int id
)
205 return (id
>= 0 && id
< ASIZE (Vfontset_table
) - 1);
210 /********** MACROS AND FUNCTIONS TO HANDLE FONTSET **********/
212 /* Return the fontset with ID. No check of ID's validness. */
213 #define FONTSET_FROM_ID(id) AREF (Vfontset_table, id)
215 /* Access special values of FONTSET. */
217 #define FONTSET_ID(fontset) XCHAR_TABLE (fontset)->extras[0]
219 set_fontset_id (Lisp_Object fontset
, Lisp_Object id
)
221 set_char_table_extras (fontset
, 0, id
);
224 /* Access special values of (base) FONTSET. */
226 #define FONTSET_NAME(fontset) XCHAR_TABLE (fontset)->extras[1]
228 set_fontset_name (Lisp_Object fontset
, Lisp_Object name
)
230 set_char_table_extras (fontset
, 1, name
);
233 #define FONTSET_ASCII(fontset) XCHAR_TABLE (fontset)->extras[4]
235 set_fontset_ascii (Lisp_Object fontset
, Lisp_Object ascii
)
237 set_char_table_extras (fontset
, 4, ascii
);
240 /* Access special values of (realized) FONTSET. */
242 #define FONTSET_BASE(fontset) XCHAR_TABLE (fontset)->extras[2]
244 set_fontset_base (Lisp_Object fontset
, Lisp_Object base
)
246 set_char_table_extras (fontset
, 2, base
);
249 #define FONTSET_FRAME(fontset) XCHAR_TABLE (fontset)->extras[3]
251 set_fontset_frame (Lisp_Object fontset
, Lisp_Object frame
)
253 set_char_table_extras (fontset
, 3, frame
);
256 #define FONTSET_NOFONT_FACE(fontset) XCHAR_TABLE (fontset)->extras[5]
258 set_fontset_nofont_face (Lisp_Object fontset
, Lisp_Object face
)
260 set_char_table_extras (fontset
, 5, face
);
263 #define FONTSET_DEFAULT(fontset) XCHAR_TABLE (fontset)->extras[7]
265 set_fontset_default (Lisp_Object fontset
, Lisp_Object def
)
267 set_char_table_extras (fontset
, 7, def
);
270 /* For both base and realized fontset. */
272 #define FONTSET_FALLBACK(fontset) XCHAR_TABLE (fontset)->extras[8]
274 set_fontset_fallback (Lisp_Object fontset
, Lisp_Object fallback
)
276 set_char_table_extras (fontset
, 8, fallback
);
279 #define BASE_FONTSET_P(fontset) (NILP (FONTSET_BASE (fontset)))
281 /* Macros for FONT-DEF and RFONT-DEF of fontset. */
282 #define FONT_DEF_NEW(font_def, font_spec, encoding, repertory) \
284 (font_def) = Fmake_vector (make_number (3), (font_spec)); \
285 ASET ((font_def), 1, encoding); \
286 ASET ((font_def), 2, repertory); \
289 #define FONT_DEF_SPEC(font_def) AREF (font_def, 0)
290 #define FONT_DEF_ENCODING(font_def) AREF (font_def, 1)
291 #define FONT_DEF_REPERTORY(font_def) AREF (font_def, 2)
293 #define RFONT_DEF_FACE(rfont_def) AREF (rfont_def, 0)
294 #define RFONT_DEF_SET_FACE(rfont_def, face_id) \
295 ASET ((rfont_def), 0, make_number (face_id))
296 #define RFONT_DEF_FONT_DEF(rfont_def) AREF (rfont_def, 1)
297 #define RFONT_DEF_SPEC(rfont_def) FONT_DEF_SPEC (AREF (rfont_def, 1))
298 #define RFONT_DEF_OBJECT(rfont_def) AREF (rfont_def, 2)
299 #define RFONT_DEF_SET_OBJECT(rfont_def, object) \
300 ASET ((rfont_def), 2, (object))
301 /* Score of RFONT_DEF is an integer value; the lowest 8 bits represent
302 the order of listing by font backends, the higher bits represents
303 the order given by charset priority list. The smaller value is
305 #define RFONT_DEF_SCORE(rfont_def) XINT (AREF (rfont_def, 3))
306 #define RFONT_DEF_SET_SCORE(rfont_def, score) \
307 ASET ((rfont_def), 3, make_number (score))
308 #define RFONT_DEF_NEW(rfont_def, font_def) \
310 (rfont_def) = Fmake_vector (make_number (4), Qnil); \
311 ASET ((rfont_def), 1, (font_def)); \
312 RFONT_DEF_SET_SCORE ((rfont_def), 0); \
316 /* Return the element of FONTSET for the character C. If FONTSET is a
317 base fontset other then the default fontset and FONTSET doesn't
318 contain information for C, return the information in the default
321 #define FONTSET_REF(fontset, c) \
322 (EQ (fontset, Vdefault_fontset) \
323 ? CHAR_TABLE_REF (fontset, c) \
324 : fontset_ref ((fontset), (c)))
327 fontset_ref (Lisp_Object fontset
, int c
)
331 elt
= CHAR_TABLE_REF (fontset
, c
);
332 if (NILP (elt
) && ! EQ (fontset
, Vdefault_fontset
)
333 /* Don't check Vdefault_fontset for a realized fontset. */
334 && NILP (FONTSET_BASE (fontset
)))
335 elt
= CHAR_TABLE_REF (Vdefault_fontset
, c
);
339 /* Set elements of FONTSET for characters in RANGE to the value ELT.
340 RANGE is a cons (FROM . TO), where FROM and TO are character codes
341 specifying a range. */
343 #define FONTSET_SET(fontset, range, elt) \
344 Fset_char_table_range ((fontset), (range), (elt))
347 /* Modify the elements of FONTSET for characters in RANGE by replacing
348 with ELT or adding ELT. RANGE is a cons (FROM . TO), where FROM
349 and TO are character codes specifying a range. If ADD is nil,
350 replace with ELT, if ADD is `prepend', prepend ELT, otherwise,
353 #define FONTSET_ADD(fontset, range, elt, add) \
356 ? (set_fontset_fallback \
357 (fontset, Fmake_vector (make_number (1), (elt)))) \
359 Fset_char_table_range (fontset, range, \
360 Fmake_vector (make_number (1), elt)))) \
361 : fontset_add ((fontset), (range), (elt), (add)))
364 fontset_add (Lisp_Object fontset
, Lisp_Object range
, Lisp_Object elt
, Lisp_Object add
)
367 int idx
= (EQ (add
, Qappend
) ? 0 : 1);
369 args
[1 - idx
] = Fmake_vector (make_number (1), elt
);
373 int from
= XINT (XCAR (range
));
374 int to
= XINT (XCDR (range
));
378 from1
= from
, to1
= to
;
379 args
[idx
] = char_table_ref_and_range (fontset
, from
, &from1
, &to1
);
380 char_table_set_range (fontset
, from
, to1
,
381 NILP (args
[idx
]) ? args
[1 - idx
]
382 : Fvconcat (2, args
));
388 args
[idx
] = FONTSET_FALLBACK (fontset
);
390 (fontset
, NILP (args
[idx
]) ? args
[1 - idx
] : Fvconcat (2, args
));
395 fontset_compare_rfontdef (const void *val1
, const void *val2
)
397 return (RFONT_DEF_SCORE (*(Lisp_Object
*) val1
)
398 - RFONT_DEF_SCORE (*(Lisp_Object
*) val2
));
401 /* Update FONT-GROUP which has this form:
402 [ CHARSET-ORDERED-LIST-TICK PREFERRED-RFONT-DEF
403 RFONT-DEF0 RFONT-DEF1 ... ]
404 Reorder RFONT-DEFs according to the current language, and update
405 CHARSET-ORDERED-LIST-TICK.
407 If PREFERRED_FAMILY is not nil, that family has the higher priority
408 if the encoding charsets or languages in font-specs are the same. */
411 reorder_font_vector (Lisp_Object font_group
, struct font
*font
)
413 Lisp_Object vec
, font_object
;
416 int score_changed
= 0;
419 XSETFONT (font_object
, font
);
423 vec
= XCDR (font_group
);
425 /* Exclude the tailing nil element from the reordering. */
426 if (NILP (AREF (vec
, size
- 1)))
429 for (i
= 0; i
< size
; i
++)
431 Lisp_Object rfont_def
= AREF (vec
, i
);
432 Lisp_Object font_def
= RFONT_DEF_FONT_DEF (rfont_def
);
433 Lisp_Object font_spec
= FONT_DEF_SPEC (font_def
);
434 int score
= RFONT_DEF_SCORE (rfont_def
) & 0xFF;
435 Lisp_Object otf_spec
= Ffont_get (font_spec
, QCotf
);
437 if (! NILP (otf_spec
))
438 /* A font-spec with :otf is preferable regardless of encoding
441 else if (! font_match_p (font_spec
, font_object
))
443 Lisp_Object encoding
= FONT_DEF_ENCODING (font_def
);
445 if (! NILP (encoding
))
449 for (tail
= Vcharset_ordered_list
;
450 ! EQ (tail
, Vcharset_non_preferred_head
) && CONSP (tail
);
452 if (EQ (encoding
, XCAR (tail
)))
454 else if (score
<= min (INT_MAX
, MOST_POSITIVE_FIXNUM
) - 0x100)
459 Lisp_Object lang
= Ffont_get (font_spec
, QClang
);
462 && ! EQ (lang
, Vcurrent_iso639_language
)
463 && (! CONSP (Vcurrent_iso639_language
)
464 || NILP (Fmemq (lang
, Vcurrent_iso639_language
))))
468 if (RFONT_DEF_SCORE (rfont_def
) != score
)
470 RFONT_DEF_SET_SCORE (rfont_def
, score
);
476 qsort (XVECTOR (vec
)->contents
, size
, word_size
,
477 fontset_compare_rfontdef
);
478 XSETCAR (font_group
, make_number (charset_ordered_list_tick
));
481 /* Return a font-group (actually a cons (-1 . FONT-GROUP-VECTOR)) for
482 character C in FONTSET. If C is -1, return a fallback font-group.
483 If C is not -1, the value may be Qt (FONTSET doesn't have a font
484 for C even in the fallback group), or 0 (a font for C may be found
485 only in the fallback group). */
488 fontset_get_font_group (Lisp_Object fontset
, int c
)
490 Lisp_Object font_group
;
491 Lisp_Object base_fontset
;
492 int from
= 0, to
= MAX_CHAR
, i
;
494 eassert (! BASE_FONTSET_P (fontset
));
496 font_group
= CHAR_TABLE_REF (fontset
, c
);
498 font_group
= FONTSET_FALLBACK (fontset
);
499 if (! NILP (font_group
))
501 base_fontset
= FONTSET_BASE (fontset
);
502 if (NILP (base_fontset
))
505 font_group
= char_table_ref_and_range (base_fontset
, c
, &from
, &to
);
507 font_group
= FONTSET_FALLBACK (base_fontset
);
508 if (NILP (font_group
))
510 font_group
= make_number (0);
512 char_table_set_range (fontset
, from
, to
, font_group
);
515 if (!VECTORP (font_group
))
517 font_group
= Fcopy_sequence (font_group
);
518 for (i
= 0; i
< ASIZE (font_group
); i
++)
519 if (! NILP (AREF (font_group
, i
)))
521 Lisp_Object rfont_def
;
523 RFONT_DEF_NEW (rfont_def
, AREF (font_group
, i
));
524 /* Remember the original order. */
525 RFONT_DEF_SET_SCORE (rfont_def
, i
);
526 ASET (font_group
, i
, rfont_def
);
528 font_group
= Fcons (make_number (-1), font_group
);
530 char_table_set_range (fontset
, from
, to
, font_group
);
532 set_fontset_fallback (fontset
, font_group
);
536 /* Return RFONT-DEF (vector) in the realized fontset FONTSET for the
537 character C. If no font is found, return Qnil if there's a
538 possibility that the default fontset or the fallback font groups
539 have a proper font, and return Qt if not.
541 If a font is found but is not yet opened, open it (if FACE is not
542 NULL) or return Qnil (if FACE is NULL).
544 ID is a charset-id that must be preferred, or -1 meaning no
547 If FALLBACK is nonzero, search only fallback fonts. */
550 fontset_find_font (Lisp_Object fontset
, int c
, struct face
*face
, int id
, int fallback
)
552 Lisp_Object vec
, font_group
;
553 int i
, charset_matched
= 0, found_index
;
554 FRAME_PTR f
= (FRAMEP (FONTSET_FRAME (fontset
))
555 ? XFRAME (FONTSET_FRAME (fontset
)) : XFRAME (selected_frame
));
556 Lisp_Object rfont_def
;
558 font_group
= fontset_get_font_group (fontset
, fallback
? -1 : c
);
559 if (! CONSP (font_group
))
561 vec
= XCDR (font_group
);
562 if (ASIZE (vec
) == 0)
567 if (XINT (XCAR (font_group
)) != charset_ordered_list_tick
)
568 /* We have just created the font-group,
569 or the charset priorities were changed. */
570 reorder_font_vector (font_group
, face
->ascii_face
->font
);
572 /* Find a spec matching with the charset ID to try at
574 for (i
= 0; i
< ASIZE (vec
); i
++)
576 Lisp_Object repertory
;
578 rfont_def
= AREF (vec
, i
);
579 if (NILP (rfont_def
))
581 repertory
= FONT_DEF_REPERTORY (RFONT_DEF_FONT_DEF (rfont_def
));
583 if (XINT (repertory
) == id
)
591 /* Find the first available font in the vector of RFONT-DEF. */
592 for (i
= 0; i
< ASIZE (vec
); i
++)
594 Lisp_Object font_def
;
595 Lisp_Object font_entity
, font_object
;
600 if (charset_matched
> 0)
602 /* Try the element matching with the charset ID at first. */
603 found_index
= charset_matched
;
604 /* Make this negative so that we don't come here in the
606 charset_matched
= - charset_matched
;
607 /* We must try the first element in the next loop. */
611 else if (i
== - charset_matched
)
613 /* We have already tried this element and the followings
614 that have the same font specifications in the first
615 iteration. So, skip them all. */
616 rfont_def
= AREF (vec
, i
);
617 font_def
= RFONT_DEF_FONT_DEF (rfont_def
);
618 for (; i
+ 1 < ASIZE (vec
); i
++)
620 rfont_def
= AREF (vec
, i
+ 1);
621 if (NILP (rfont_def
))
623 if (! EQ (RFONT_DEF_FONT_DEF (rfont_def
), font_def
))
629 rfont_def
= AREF (vec
, found_index
);
630 if (NILP (rfont_def
))
634 /* This is a sign of not to try the other fonts. */
637 if (INTEGERP (RFONT_DEF_FACE (rfont_def
))
638 && XINT (RFONT_DEF_FACE (rfont_def
)) < 0)
639 /* We couldn't open this font last time. */
642 font_object
= RFONT_DEF_OBJECT (rfont_def
);
643 if (NILP (font_object
))
645 font_def
= RFONT_DEF_FONT_DEF (rfont_def
);
648 /* We have not yet opened the font. */
650 /* Find a font best-matching with the spec without checking
651 the support of the character C. That checking is costly,
652 and even without the checking, the found font supports C
653 in high possibility. */
654 font_entity
= font_find_for_lface (f
, face
->lface
,
655 FONT_DEF_SPEC (font_def
), -1);
656 if (NILP (font_entity
))
658 /* Record that no font matches the spec. */
659 RFONT_DEF_SET_FACE (rfont_def
, -1);
662 font_object
= font_open_for_lface (f
, font_entity
, face
->lface
,
663 FONT_DEF_SPEC (font_def
));
664 if (NILP (font_object
))
666 /* Something strange happened, perhaps because of a
667 Font-backend problem. Too avoid crashing, record
668 that this spec is unusable. It may be better to find
669 another font of the same spec, but currently we don't
671 RFONT_DEF_SET_FACE (rfont_def
, -1);
674 RFONT_DEF_SET_OBJECT (rfont_def
, font_object
);
677 if (font_has_char (f
, font_object
, c
))
680 /* Find a font already opened, matching with the current spec,
682 font_def
= RFONT_DEF_FONT_DEF (rfont_def
);
683 for (; found_index
+ 1 < ASIZE (vec
); found_index
++)
685 rfont_def
= AREF (vec
, found_index
+ 1);
686 if (NILP (rfont_def
))
688 if (! EQ (RFONT_DEF_FONT_DEF (rfont_def
), font_def
))
690 font_object
= RFONT_DEF_OBJECT (rfont_def
);
691 if (! NILP (font_object
) && font_has_char (f
, font_object
, c
))
698 /* Find a font-entity with the current spec and supporting C. */
699 font_entity
= font_find_for_lface (f
, face
->lface
,
700 FONT_DEF_SPEC (font_def
), c
);
701 if (! NILP (font_entity
))
703 /* We found a font. Open it and insert a new element for
708 font_object
= font_open_for_lface (f
, font_entity
, face
->lface
,
710 if (NILP (font_object
))
712 RFONT_DEF_NEW (rfont_def
, font_def
);
713 RFONT_DEF_SET_OBJECT (rfont_def
, font_object
);
714 RFONT_DEF_SET_SCORE (rfont_def
, RFONT_DEF_SCORE (rfont_def
));
715 new_vec
= Fmake_vector (make_number (ASIZE (vec
) + 1), Qnil
);
717 for (j
= 0; j
< found_index
; j
++)
718 ASET (new_vec
, j
, AREF (vec
, j
));
719 ASET (new_vec
, j
, rfont_def
);
720 for (j
++; j
< ASIZE (new_vec
); j
++)
721 ASET (new_vec
, j
, AREF (vec
, j
- 1));
722 XSETCDR (font_group
, new_vec
);
730 FONTSET_SET (fontset
, make_number (c
), make_number (0));
734 if (fallback
&& found_index
> 0)
736 /* The order of fonts in the fallback font-group is not that
737 important, and it is better to move the found font to the
738 first of the group so that the next try will find it
740 for (i
= found_index
; i
> 0; i
--)
741 ASET (vec
, i
, AREF (vec
, i
- 1));
742 ASET (vec
, 0, rfont_def
);
749 fontset_font (Lisp_Object fontset
, int c
, struct face
*face
, int id
)
751 Lisp_Object rfont_def
, default_rfont_def
IF_LINT (= Qnil
);
752 Lisp_Object base_fontset
;
754 /* Try a font-group of FONTSET. */
755 FONT_DEFERRED_LOG ("current fontset: font for", make_number (c
), Qnil
);
756 rfont_def
= fontset_find_font (fontset
, c
, face
, id
, 0);
757 if (VECTORP (rfont_def
))
759 if (NILP (rfont_def
))
760 FONTSET_SET (fontset
, make_number (c
), make_number (0));
762 /* Try a font-group of the default fontset. */
763 base_fontset
= FONTSET_BASE (fontset
);
764 if (! EQ (base_fontset
, Vdefault_fontset
))
766 if (NILP (FONTSET_DEFAULT (fontset
)))
769 make_fontset (FONTSET_FRAME (fontset
), Qnil
, Vdefault_fontset
));
770 FONT_DEFERRED_LOG ("default fontset: font for", make_number (c
), Qnil
);
772 = fontset_find_font (FONTSET_DEFAULT (fontset
), c
, face
, id
, 0);
773 if (VECTORP (default_rfont_def
))
774 return default_rfont_def
;
775 if (NILP (default_rfont_def
))
776 FONTSET_SET (FONTSET_DEFAULT (fontset
), make_number (c
),
780 /* Try a fallback font-group of FONTSET. */
781 if (! EQ (rfont_def
, Qt
))
783 FONT_DEFERRED_LOG ("current fallback: font for", make_number (c
), Qnil
);
784 rfont_def
= fontset_find_font (fontset
, c
, face
, id
, 1);
785 if (VECTORP (rfont_def
))
787 /* Remember that FONTSET has no font for C. */
788 FONTSET_SET (fontset
, make_number (c
), Qt
);
791 /* Try a fallback font-group of the default fontset. */
792 if (! EQ (base_fontset
, Vdefault_fontset
)
793 && ! EQ (default_rfont_def
, Qt
))
795 FONT_DEFERRED_LOG ("default fallback: font for", make_number (c
), Qnil
);
796 rfont_def
= fontset_find_font (FONTSET_DEFAULT (fontset
), c
, face
, id
, 1);
797 if (VECTORP (rfont_def
))
799 /* Remember that the default fontset has no font for C. */
800 FONTSET_SET (FONTSET_DEFAULT (fontset
), make_number (c
), Qt
);
806 /* Return a newly created fontset with NAME. If BASE is nil, make a
807 base fontset. Otherwise make a realized fontset whose base is
811 make_fontset (Lisp_Object frame
, Lisp_Object name
, Lisp_Object base
)
814 int size
= ASIZE (Vfontset_table
);
815 int id
= next_fontset_id
;
817 /* Find a free slot in Vfontset_table. Usually, next_fontset_id is
818 the next available fontset ID. So it is expected that this loop
819 terminates quickly. In addition, as the last element of
820 Vfontset_table is always nil, we don't have to check the range of
822 while (!NILP (AREF (Vfontset_table
, id
))) id
++;
825 Vfontset_table
= larger_vector (Vfontset_table
, 1, -1);
827 fontset
= Fmake_char_table (Qfontset
, Qnil
);
829 set_fontset_id (fontset
, make_number (id
));
831 set_fontset_name (fontset
, name
);
834 set_fontset_name (fontset
, Qnil
);
835 set_fontset_frame (fontset
, frame
);
836 set_fontset_base (fontset
, base
);
839 ASET (Vfontset_table
, id
, fontset
);
840 next_fontset_id
= id
+ 1;
845 /********** INTERFACES TO xfaces.c, xfns.c, and dispextern.h **********/
847 /* Return the name of the fontset who has ID. */
850 fontset_name (int id
)
854 fontset
= FONTSET_FROM_ID (id
);
855 return FONTSET_NAME (fontset
);
859 /* Return the ASCII font name of the fontset who has ID. */
862 fontset_ascii (int id
)
864 Lisp_Object fontset
, elt
;
866 fontset
= FONTSET_FROM_ID (id
);
867 elt
= FONTSET_ASCII (fontset
);
874 free_realized_fontset (FRAME_PTR f
, Lisp_Object fontset
)
880 for (tail
= FONTSET_OBJLIST (fontset
); CONSP (tail
); tail
= XCDR (tail
))
882 eassert (FONT_OBJECT_P (XCAR (tail
)));
883 font_close_object (f
, XCAR (tail
));
888 /* Free fontset of FACE defined on frame F. Called from
889 free_realized_face. */
892 free_face_fontset (FRAME_PTR f
, struct face
*face
)
896 fontset
= FONTSET_FROM_ID (face
->fontset
);
899 eassert (! BASE_FONTSET_P (fontset
));
900 eassert (f
== XFRAME (FONTSET_FRAME (fontset
)));
901 free_realized_fontset (f
, fontset
);
902 ASET (Vfontset_table
, face
->fontset
, Qnil
);
903 if (face
->fontset
< next_fontset_id
)
904 next_fontset_id
= face
->fontset
;
905 if (! NILP (FONTSET_DEFAULT (fontset
)))
907 int id
= XINT (FONTSET_ID (FONTSET_DEFAULT (fontset
)));
909 fontset
= AREF (Vfontset_table
, id
);
910 eassert (!NILP (fontset
) && ! BASE_FONTSET_P (fontset
));
911 eassert (f
== XFRAME (FONTSET_FRAME (fontset
)));
912 free_realized_fontset (f
, fontset
);
913 ASET (Vfontset_table
, id
, Qnil
);
914 if (id
< next_fontset_id
)
915 next_fontset_id
= face
->fontset
;
922 /* Return 1 if FACE is suitable for displaying character C.
923 Otherwise return 0. Called from the macro FACE_SUITABLE_FOR_CHAR_P
924 when C is not an ASCII character. */
927 face_suitable_for_char_p (struct face
*face
, int c
)
929 Lisp_Object fontset
, rfont_def
;
931 fontset
= FONTSET_FROM_ID (face
->fontset
);
932 rfont_def
= fontset_font (fontset
, c
, NULL
, -1);
933 return (VECTORP (rfont_def
)
934 && INTEGERP (RFONT_DEF_FACE (rfont_def
))
935 && face
->id
== XINT (RFONT_DEF_FACE (rfont_def
)));
940 /* Return ID of face suitable for displaying character C on frame F.
941 FACE must be realized for ASCII characters in advance. Called from
942 the macro FACE_FOR_CHAR. */
945 face_for_char (FRAME_PTR f
, struct face
*face
, int c
, int pos
, Lisp_Object object
)
947 Lisp_Object fontset
, rfont_def
, charset
;
951 /* If face->fontset is negative (that happens when no font is found
952 for face), just return face->ascii_face because we can't do
953 anything. Perhaps, we should fix the callers to assure
954 that face->fontset is always valid. */
955 if (ASCII_CHAR_P (c
) || face
->fontset
< 0)
956 return face
->ascii_face
->id
;
958 eassert (fontset_id_valid_p (face
->fontset
));
959 fontset
= FONTSET_FROM_ID (face
->fontset
);
960 eassert (!BASE_FONTSET_P (fontset
));
969 charset
= Fget_char_property (make_number (pos
), Qcharset
, object
);
970 if (CHARSETP (charset
))
974 val
= assq_no_quit (charset
, Vfont_encoding_charset_alist
);
975 if (CONSP (val
) && CHARSETP (XCDR (val
)))
976 charset
= XCDR (val
);
977 id
= XINT (CHARSET_SYMBOL_ID (charset
));
983 rfont_def
= fontset_font (fontset
, c
, face
, id
);
984 if (VECTORP (rfont_def
))
986 if (INTEGERP (RFONT_DEF_FACE (rfont_def
)))
987 face_id
= XINT (RFONT_DEF_FACE (rfont_def
));
990 Lisp_Object font_object
;
992 font_object
= RFONT_DEF_OBJECT (rfont_def
);
993 face_id
= face_for_font (f
, font_object
, face
);
994 RFONT_DEF_SET_FACE (rfont_def
, face_id
);
999 if (INTEGERP (FONTSET_NOFONT_FACE (fontset
)))
1000 face_id
= XINT (FONTSET_NOFONT_FACE (fontset
));
1003 face_id
= face_for_font (f
, Qnil
, face
);
1004 set_fontset_nofont_face (fontset
, make_number (face_id
));
1007 eassert (face_id
>= 0);
1013 font_for_char (struct face
*face
, int c
, int pos
, Lisp_Object object
)
1015 Lisp_Object fontset
, rfont_def
, charset
;
1018 if (ASCII_CHAR_P (c
))
1020 Lisp_Object font_object
;
1022 XSETFONT (font_object
, face
->ascii_face
->font
);
1026 eassert (fontset_id_valid_p (face
->fontset
));
1027 fontset
= FONTSET_FROM_ID (face
->fontset
);
1028 eassert (!BASE_FONTSET_P (fontset
));
1036 charset
= Fget_char_property (make_number (pos
), Qcharset
, object
);
1037 if (CHARSETP (charset
))
1041 val
= assq_no_quit (charset
, Vfont_encoding_charset_alist
);
1042 if (CONSP (val
) && CHARSETP (XCDR (val
)))
1043 charset
= XCDR (val
);
1044 id
= XINT (CHARSET_SYMBOL_ID (charset
));
1050 rfont_def
= fontset_font (fontset
, c
, face
, id
);
1051 return (VECTORP (rfont_def
)
1052 ? RFONT_DEF_OBJECT (rfont_def
)
1057 /* Make a realized fontset for ASCII face FACE on frame F from the
1058 base fontset BASE_FONTSET_ID. If BASE_FONTSET_ID is -1, use the
1059 default fontset as the base. Value is the id of the new fontset.
1060 Called from realize_x_face. */
1063 make_fontset_for_ascii_face (FRAME_PTR f
, int base_fontset_id
, struct face
*face
)
1065 Lisp_Object base_fontset
, fontset
, frame
;
1067 XSETFRAME (frame
, f
);
1068 if (base_fontset_id
>= 0)
1070 base_fontset
= FONTSET_FROM_ID (base_fontset_id
);
1071 if (!BASE_FONTSET_P (base_fontset
))
1072 base_fontset
= FONTSET_BASE (base_fontset
);
1073 eassert (BASE_FONTSET_P (base_fontset
));
1076 base_fontset
= Vdefault_fontset
;
1078 fontset
= make_fontset (frame
, Qnil
, base_fontset
);
1079 return XINT (FONTSET_ID (fontset
));
1084 /* Cache data used by fontset_pattern_regexp. The car part is a
1085 pattern string containing at least one wild card, the cdr part is
1086 the corresponding regular expression. */
1087 static Lisp_Object Vcached_fontset_data
;
1089 #define CACHED_FONTSET_NAME SSDATA (XCAR (Vcached_fontset_data))
1090 #define CACHED_FONTSET_REGEX (XCDR (Vcached_fontset_data))
1092 /* If fontset name PATTERN contains any wild card, return regular
1093 expression corresponding to PATTERN. */
1096 fontset_pattern_regexp (Lisp_Object pattern
)
1098 if (!strchr (SSDATA (pattern
), '*')
1099 && !strchr (SSDATA (pattern
), '?'))
1100 /* PATTERN does not contain any wild cards. */
1103 if (!CONSP (Vcached_fontset_data
)
1104 || strcmp (SSDATA (pattern
), CACHED_FONTSET_NAME
))
1106 /* We must at first update the cached data. */
1107 unsigned char *regex
, *p0
, *p1
;
1108 int ndashes
= 0, nstars
= 0, nescs
= 0;
1110 for (p0
= SDATA (pattern
); *p0
; p0
++)
1114 else if (*p0
== '*')
1117 || *p0
== '.' || *p0
== '\\'
1118 || *p0
== '+' || *p0
== '^'
1123 /* If PATTERN is not full XLFD we convert "*" to ".*". Otherwise
1124 we convert "*" to "[^-]*" which is much faster in regular
1125 expression matching. */
1127 p1
= regex
= alloca (SBYTES (pattern
) + 2 * nstars
+ 2 * nescs
+ 1);
1129 p1
= regex
= alloca (SBYTES (pattern
) + 5 * nstars
+ 2 * nescs
+ 1);
1132 for (p0
= SDATA (pattern
); *p0
; p0
++)
1139 *p1
++ = '[', *p1
++ = '^', *p1
++ = '-', *p1
++ = ']';
1142 else if (*p0
== '?')
1145 || *p0
== '.' || *p0
== '\\'
1146 || *p0
== '+' || *p0
== '^'
1148 *p1
++ = '\\', *p1
++ = *p0
;
1155 Vcached_fontset_data
= Fcons (build_string (SSDATA (pattern
)),
1156 build_string ((char *) regex
));
1159 return CACHED_FONTSET_REGEX
;
1162 /* Return ID of the base fontset named NAME. If there's no such
1163 fontset, return -1. NAME_PATTERN specifies how to treat NAME as this:
1164 0: pattern containing '*' and '?' as wildcards
1165 1: regular expression
1166 2: literal fontset name
1170 fs_query_fontset (Lisp_Object name
, int name_pattern
)
1175 name
= Fdowncase (name
);
1176 if (name_pattern
!= 1)
1178 tem
= Frassoc (name
, Vfontset_alias_alist
);
1180 tem
= Fassoc (name
, Vfontset_alias_alist
);
1181 if (CONSP (tem
) && STRINGP (XCAR (tem
)))
1183 else if (name_pattern
== 0)
1185 tem
= fontset_pattern_regexp (name
);
1194 for (i
= 0; i
< ASIZE (Vfontset_table
); i
++)
1196 Lisp_Object fontset
, this_name
;
1198 fontset
= FONTSET_FROM_ID (i
);
1200 || !BASE_FONTSET_P (fontset
))
1203 this_name
= FONTSET_NAME (fontset
);
1204 if (name_pattern
== 1
1205 ? fast_string_match_ignore_case (name
, this_name
) >= 0
1206 : !xstrcasecmp (SSDATA (name
), SSDATA (this_name
)))
1213 DEFUN ("query-fontset", Fquery_fontset
, Squery_fontset
, 1, 2, 0,
1214 doc
: /* Return the name of a fontset that matches PATTERN.
1215 The value is nil if there is no matching fontset.
1216 PATTERN can contain `*' or `?' as a wildcard
1217 just as X font name matching algorithm allows.
1218 If REGEXPP is non-nil, PATTERN is a regular expression. */)
1219 (Lisp_Object pattern
, Lisp_Object regexpp
)
1221 Lisp_Object fontset
;
1224 (*check_window_system_func
) ();
1226 CHECK_STRING (pattern
);
1228 if (SCHARS (pattern
) == 0)
1231 id
= fs_query_fontset (pattern
, !NILP (regexpp
));
1235 fontset
= FONTSET_FROM_ID (id
);
1236 return FONTSET_NAME (fontset
);
1239 /* Return a list of base fontset names matching PATTERN on frame F. */
1242 list_fontsets (FRAME_PTR f
, Lisp_Object pattern
, int size
)
1244 Lisp_Object frame
, regexp
, val
;
1247 XSETFRAME (frame
, f
);
1249 regexp
= fontset_pattern_regexp (pattern
);
1252 for (id
= 0; id
< ASIZE (Vfontset_table
); id
++)
1254 Lisp_Object fontset
, name
;
1256 fontset
= FONTSET_FROM_ID (id
);
1258 || !BASE_FONTSET_P (fontset
)
1259 || !EQ (frame
, FONTSET_FRAME (fontset
)))
1261 name
= FONTSET_NAME (fontset
);
1263 if (STRINGP (regexp
)
1264 ? (fast_string_match (regexp
, name
) < 0)
1265 : strcmp (SSDATA (pattern
), SSDATA (name
)))
1268 val
= Fcons (Fcopy_sequence (FONTSET_NAME (fontset
)), val
);
1275 /* Free all realized fontsets whose base fontset is BASE. */
1278 free_realized_fontsets (Lisp_Object base
)
1283 /* For the moment, this doesn't work because free_realized_face
1284 doesn't remove FACE from a cache. Until we find a solution, we
1285 suppress this code, and simply use Fclear_face_cache even though
1286 that is not efficient. */
1288 for (id
= 0; id
< ASIZE (Vfontset_table
); id
++)
1290 Lisp_Object
this = AREF (Vfontset_table
, id
);
1292 if (EQ (FONTSET_BASE (this), base
))
1296 for (tail
= FONTSET_FACE_ALIST (this); CONSP (tail
);
1299 FRAME_PTR f
= XFRAME (FONTSET_FRAME (this));
1300 int face_id
= XINT (XCDR (XCAR (tail
)));
1301 struct face
*face
= FACE_FROM_ID (f
, face_id
);
1303 /* Face THIS itself is also freed by the following call. */
1304 free_realized_face (f
, face
);
1310 /* But, we don't have to call Fclear_face_cache if no fontset has
1311 been realized from BASE. */
1312 for (id
= 0; id
< ASIZE (Vfontset_table
); id
++)
1314 Lisp_Object
this = AREF (Vfontset_table
, id
);
1316 if (CHAR_TABLE_P (this) && EQ (FONTSET_BASE (this), base
))
1318 Fclear_face_cache (Qt
);
1326 /* Check validity of NAME as a fontset name and return the
1327 corresponding fontset. If not valid, signal an error.
1329 If NAME is t, return Vdefault_fontset. If NAME is nil, return the
1332 Set *FRAME to the actual frame. */
1335 check_fontset_name (Lisp_Object name
, Lisp_Object
*frame
)
1340 *frame
= selected_frame
;
1341 CHECK_LIVE_FRAME (*frame
);
1344 return Vdefault_fontset
;
1347 id
= FRAME_FONTSET (XFRAME (*frame
));
1351 CHECK_STRING (name
);
1352 /* First try NAME as literal. */
1353 id
= fs_query_fontset (name
, 2);
1355 /* For backward compatibility, try again NAME as pattern. */
1356 id
= fs_query_fontset (name
, 0);
1358 error ("Fontset `%s' does not exist", SDATA (name
));
1360 return FONTSET_FROM_ID (id
);
1364 accumulate_script_ranges (Lisp_Object arg
, Lisp_Object range
, Lisp_Object val
)
1366 if (EQ (XCAR (arg
), val
))
1369 XSETCDR (arg
, Fcons (Fcons (XCAR (range
), XCDR (range
)), XCDR (arg
)));
1371 XSETCDR (arg
, Fcons (Fcons (range
, range
), XCDR (arg
)));
1376 /* Callback function for map_charset_chars in Fset_fontset_font.
1377 ARG is a vector [ FONTSET FONT_DEF ADD ASCII SCRIPT_RANGE_LIST ].
1379 In FONTSET, set FONT_DEF in a fashion specified by ADD for
1380 characters in RANGE and ranges in SCRIPT_RANGE_LIST before RANGE.
1381 The consumed ranges are popped up from SCRIPT_RANGE_LIST, and the
1382 new SCRIPT_RANGE_LIST is stored in ARG.
1384 If ASCII is nil, don't set FONT_DEF for ASCII characters. It is
1385 assured that SCRIPT_RANGE_LIST doesn't contain ASCII in that
1389 set_fontset_font (Lisp_Object arg
, Lisp_Object range
)
1391 Lisp_Object fontset
, font_def
, add
, ascii
, script_range_list
;
1392 int from
= XINT (XCAR (range
)), to
= XINT (XCDR (range
));
1394 fontset
= AREF (arg
, 0);
1395 font_def
= AREF (arg
, 1);
1396 add
= AREF (arg
, 2);
1397 ascii
= AREF (arg
, 3);
1398 script_range_list
= AREF (arg
, 4);
1400 if (NILP (ascii
) && from
< 0x80)
1405 range
= Fcons (make_number (0x80), XCDR (range
));
1408 #define SCRIPT_FROM XINT (XCAR (XCAR (script_range_list)))
1409 #define SCRIPT_TO XINT (XCDR (XCAR (script_range_list)))
1410 #define POP_SCRIPT_RANGE() script_range_list = XCDR (script_range_list)
1412 for (; CONSP (script_range_list
) && SCRIPT_TO
< from
; POP_SCRIPT_RANGE ())
1413 FONTSET_ADD (fontset
, XCAR (script_range_list
), font_def
, add
);
1414 if (CONSP (script_range_list
))
1416 if (SCRIPT_FROM
< from
)
1417 range
= Fcons (make_number (SCRIPT_FROM
), XCDR (range
));
1418 while (CONSP (script_range_list
) && SCRIPT_TO
<= to
)
1419 POP_SCRIPT_RANGE ();
1420 if (CONSP (script_range_list
) && SCRIPT_FROM
<= to
)
1421 XSETCAR (XCAR (script_range_list
), make_number (to
+ 1));
1424 FONTSET_ADD (fontset
, range
, font_def
, add
);
1425 ASET (arg
, 4, script_range_list
);
1428 static void update_auto_fontset_alist (Lisp_Object
, Lisp_Object
);
1431 DEFUN ("set-fontset-font", Fset_fontset_font
, Sset_fontset_font
, 3, 5, 0,
1433 Modify fontset NAME to use FONT-SPEC for TARGET characters.
1435 NAME is a fontset name string, nil for the fontset of FRAME, or t for
1436 the default fontset.
1438 TARGET may be a cons; (FROM . TO), where FROM and TO are characters.
1439 In that case, use FONT-SPEC for all characters in the range FROM and
1442 TARGET may be a script name symbol. In that case, use FONT-SPEC for
1443 all characters that belong to the script.
1445 TARGET may be a charset. In that case, use FONT-SPEC for all
1446 characters in the charset.
1448 TARGET may be nil. In that case, use FONT-SPEC for any characters for
1449 that no FONT-SPEC is specified.
1451 FONT-SPEC may one of these:
1452 * A font-spec object made by the function `font-spec' (which see).
1453 * A cons (FAMILY . REGISTRY), where FAMILY is a font family name and
1454 REGISTRY is a font registry name. FAMILY may contain foundry
1455 name, and REGISTRY may contain encoding name.
1456 * A font name string.
1457 * nil, which explicitly specifies that there's no font for TARGET.
1459 Optional 4th argument FRAME is a frame or nil for the selected frame
1460 that is concerned in the case that NAME is nil.
1462 Optional 5th argument ADD, if non-nil, specifies how to add FONT-SPEC
1463 to the font specifications for TARGET previously set. If it is
1464 `prepend', FONT-SPEC is prepended. If it is `append', FONT-SPEC is
1465 appended. By default, FONT-SPEC overrides the previous settings. */)
1466 (Lisp_Object name
, Lisp_Object target
, Lisp_Object font_spec
, Lisp_Object frame
, Lisp_Object add
)
1468 Lisp_Object fontset
;
1469 Lisp_Object font_def
, registry
, family
;
1470 Lisp_Object range_list
;
1471 struct charset
*charset
= NULL
;
1472 Lisp_Object fontname
;
1473 int ascii_changed
= 0;
1475 fontset
= check_fontset_name (name
, &frame
);
1478 if (CONSP (font_spec
))
1480 Lisp_Object spec
= Ffont_spec (0, NULL
);
1482 font_parse_family_registry (XCAR (font_spec
), XCDR (font_spec
), spec
);
1484 fontname
= Ffont_xlfd_name (font_spec
, Qnil
);
1486 else if (STRINGP (font_spec
))
1488 Lisp_Object args
[2];
1490 fontname
= font_spec
;
1492 args
[1] = font_spec
;
1493 font_spec
= Ffont_spec (2, args
);
1495 else if (FONT_SPEC_P (font_spec
))
1496 fontname
= Ffont_xlfd_name (font_spec
, Qnil
);
1497 else if (! NILP (font_spec
))
1498 Fsignal (Qfont
, list2 (build_string ("Invalid font-spec"), font_spec
));
1500 if (! NILP (font_spec
))
1502 Lisp_Object encoding
, repertory
;
1504 family
= AREF (font_spec
, FONT_FAMILY_INDEX
);
1505 if (! NILP (family
) )
1506 family
= SYMBOL_NAME (family
);
1507 registry
= AREF (font_spec
, FONT_REGISTRY_INDEX
);
1508 if (! NILP (registry
))
1509 registry
= Fdowncase (SYMBOL_NAME (registry
));
1510 encoding
= find_font_encoding (concat3 (family
, build_string ("-"),
1512 if (NILP (encoding
))
1515 if (SYMBOLP (encoding
))
1517 CHECK_CHARSET (encoding
);
1518 encoding
= repertory
= CHARSET_SYMBOL_ID (encoding
);
1522 repertory
= XCDR (encoding
);
1523 encoding
= XCAR (encoding
);
1524 CHECK_CHARSET (encoding
);
1525 encoding
= CHARSET_SYMBOL_ID (encoding
);
1526 if (! NILP (repertory
) && SYMBOLP (repertory
))
1528 CHECK_CHARSET (repertory
);
1529 repertory
= CHARSET_SYMBOL_ID (repertory
);
1532 FONT_DEF_NEW (font_def
, font_spec
, encoding
, repertory
);
1537 if (CHARACTERP (target
))
1539 if (XFASTINT (target
) < 0x80)
1540 error ("Can't set a font for partial ASCII range");
1541 range_list
= Fcons (Fcons (target
, target
), Qnil
);
1543 else if (CONSP (target
))
1545 Lisp_Object from
, to
;
1547 from
= Fcar (target
);
1549 CHECK_CHARACTER (from
);
1550 CHECK_CHARACTER (to
);
1551 if (XFASTINT (from
) < 0x80)
1553 if (XFASTINT (from
) != 0 || XFASTINT (to
) < 0x7F)
1554 error ("Can't set a font for partial ASCII range");
1557 range_list
= Fcons (target
, Qnil
);
1559 else if (SYMBOLP (target
) && !NILP (target
))
1561 Lisp_Object script_list
;
1565 script_list
= XCHAR_TABLE (Vchar_script_table
)->extras
[0];
1566 if (! NILP (Fmemq (target
, script_list
)))
1568 if (EQ (target
, Qlatin
))
1570 val
= Fcons (target
, Qnil
);
1571 map_char_table (accumulate_script_ranges
, Qnil
, Vchar_script_table
,
1573 range_list
= Fnreverse (XCDR (val
));
1575 if (CHARSETP (target
))
1577 CHECK_CHARSET_GET_CHARSET (target
, charset
);
1578 if (charset
->ascii_compatible_p
)
1581 else if (NILP (range_list
))
1582 error ("Invalid script or charset name: %s",
1583 SDATA (SYMBOL_NAME (target
)));
1585 else if (NILP (target
))
1586 range_list
= Fcons (Qnil
, Qnil
);
1588 error ("Invalid target for setting a font");
1594 if (NILP (font_spec
))
1595 error ("Can't set ASCII font to nil");
1596 val
= CHAR_TABLE_REF (fontset
, 0);
1597 if (! NILP (val
) && EQ (add
, Qappend
))
1598 /* We are going to change just an additional font for ASCII. */
1606 arg
= Fmake_vector (make_number (5), Qnil
);
1607 ASET (arg
, 0, fontset
);
1608 ASET (arg
, 1, font_def
);
1610 ASET (arg
, 3, ascii_changed
? Qt
: Qnil
);
1611 ASET (arg
, 4, range_list
);
1613 map_charset_chars (set_fontset_font
, Qnil
, arg
, charset
,
1614 CHARSET_MIN_CODE (charset
),
1615 CHARSET_MAX_CODE (charset
));
1616 range_list
= AREF (arg
, 4);
1618 for (; CONSP (range_list
); range_list
= XCDR (range_list
))
1619 FONTSET_ADD (fontset
, XCAR (range_list
), font_def
, add
);
1623 Lisp_Object tail
, fr
, alist
;
1624 int fontset_id
= XINT (FONTSET_ID (fontset
));
1626 set_fontset_ascii (fontset
, fontname
);
1627 name
= FONTSET_NAME (fontset
);
1628 FOR_EACH_FRAME (tail
, fr
)
1630 FRAME_PTR f
= XFRAME (fr
);
1631 Lisp_Object font_object
;
1634 if (FRAME_INITIAL_P (f
) || FRAME_TERMCAP_P (f
))
1636 if (fontset_id
!= FRAME_FONTSET (f
))
1638 face
= FACE_FROM_ID (f
, DEFAULT_FACE_ID
);
1640 font_object
= font_load_for_lface (f
, face
->lface
, font_spec
);
1642 font_object
= font_open_by_spec (f
, font_spec
);
1643 if (! NILP (font_object
))
1645 update_auto_fontset_alist (font_object
, fontset
);
1646 alist
= Fcons (Fcons (Qfont
, Fcons (name
, font_object
)), Qnil
);
1647 Fmodify_frame_parameters (fr
, alist
);
1652 /* Free all realized fontsets whose base is FONTSET. This way, the
1653 specified character(s) are surely redisplayed by a correct
1655 free_realized_fontsets (fontset
);
1661 DEFUN ("new-fontset", Fnew_fontset
, Snew_fontset
, 2, 2, 0,
1662 doc
: /* Create a new fontset NAME from font information in FONTLIST.
1664 FONTLIST is an alist of scripts vs the corresponding font specification list.
1665 Each element of FONTLIST has the form (SCRIPT FONT-SPEC ...), where a
1666 character of SCRIPT is displayed by a font that matches one of
1669 SCRIPT is a symbol that appears in the first extra slot of the
1670 char-table `char-script-table'.
1672 FONT-SPEC is a vector, a cons, or a string. See the documentation of
1673 `set-fontset-font' for the meaning. */)
1674 (Lisp_Object name
, Lisp_Object fontlist
)
1676 Lisp_Object fontset
;
1679 CHECK_STRING (name
);
1680 CHECK_LIST (fontlist
);
1682 name
= Fdowncase (name
);
1683 id
= fs_query_fontset (name
, 0);
1686 Lisp_Object font_spec
= Ffont_spec (0, NULL
);
1687 Lisp_Object short_name
;
1691 if (font_parse_xlfd (SSDATA (name
), SBYTES (name
), font_spec
) < 0)
1692 error ("Fontset name must be in XLFD format");
1693 short_name
= AREF (font_spec
, FONT_REGISTRY_INDEX
);
1694 if (strncmp (SSDATA (SYMBOL_NAME (short_name
)), "fontset-", 8)
1695 || SBYTES (SYMBOL_NAME (short_name
)) < 9)
1696 error ("Registry field of fontset name must be \"fontset-*\"");
1697 Vfontset_alias_alist
= Fcons (Fcons (name
, SYMBOL_NAME (short_name
)),
1698 Vfontset_alias_alist
);
1699 ASET (font_spec
, FONT_REGISTRY_INDEX
, Qiso8859_1
);
1700 fontset
= make_fontset (Qnil
, name
, Qnil
);
1701 len
= font_unparse_xlfd (font_spec
, 0, xlfd
, 256);
1703 error ("Invalid fontset name (perhaps too long): %s", SDATA (name
));
1704 set_fontset_ascii (fontset
, make_unibyte_string (xlfd
, len
));
1708 fontset
= FONTSET_FROM_ID (id
);
1709 free_realized_fontsets (fontset
);
1710 Fset_char_table_range (fontset
, Qt
, Qnil
);
1713 for (; CONSP (fontlist
); fontlist
= XCDR (fontlist
))
1715 Lisp_Object elt
, script
;
1717 elt
= XCAR (fontlist
);
1718 script
= Fcar (elt
);
1720 if (CONSP (elt
) && (NILP (XCDR (elt
)) || CONSP (XCDR (elt
))))
1721 for (; CONSP (elt
); elt
= XCDR (elt
))
1722 Fset_fontset_font (name
, script
, XCAR (elt
), Qnil
, Qappend
);
1724 Fset_fontset_font (name
, script
, elt
, Qnil
, Qappend
);
1730 /* Alist of automatically created fontsets. Each element is a cons
1731 (FONT-SPEC . FONTSET-ID). */
1732 static Lisp_Object auto_fontset_alist
;
1734 /* Number of automatically created fontsets. */
1735 static ptrdiff_t num_auto_fontsets
;
1737 /* Return a fontset synthesized from FONT-OBJECT. This is called from
1738 x_new_font when FONT-OBJECT is used for the default ASCII font of a
1739 frame, and the returned fontset is used for the default fontset of
1740 that frame. The fontset specifies a font of the same registry as
1741 FONT-OBJECT for all characters in the repertory of the registry
1742 (see Vfont_encoding_alist). If the repertory is not known, the
1743 fontset specifies the font for all Latin characters assuming that a
1744 user intends to use FONT-OBJECT for Latin characters. */
1747 fontset_from_font (Lisp_Object font_object
)
1749 Lisp_Object font_name
= font_get_name (font_object
);
1750 Lisp_Object font_spec
= copy_font_spec (font_object
);
1751 Lisp_Object registry
= AREF (font_spec
, FONT_REGISTRY_INDEX
);
1752 Lisp_Object fontset_spec
, alias
, name
, fontset
;
1755 val
= assoc_no_quit (font_spec
, auto_fontset_alist
);
1757 return XINT (FONTSET_ID (XCDR (val
)));
1758 if (num_auto_fontsets
++ == 0)
1759 alias
= intern ("fontset-startup");
1762 char temp
[sizeof "fontset-auto" + INT_STRLEN_BOUND (ptrdiff_t)];
1764 sprintf (temp
, "fontset-auto%"pD
"d", num_auto_fontsets
- 1);
1765 alias
= intern (temp
);
1767 fontset_spec
= copy_font_spec (font_spec
);
1768 ASET (fontset_spec
, FONT_REGISTRY_INDEX
, alias
);
1769 name
= Ffont_xlfd_name (fontset_spec
, Qnil
);
1770 eassert (!NILP (name
));
1771 fontset
= make_fontset (Qnil
, name
, Qnil
);
1772 Vfontset_alias_alist
= Fcons (Fcons (name
, SYMBOL_NAME (alias
)),
1773 Vfontset_alias_alist
);
1774 alias
= Fdowncase (AREF (font_object
, FONT_NAME_INDEX
));
1775 Vfontset_alias_alist
= Fcons (Fcons (name
, alias
), Vfontset_alias_alist
);
1776 auto_fontset_alist
= Fcons (Fcons (font_spec
, fontset
), auto_fontset_alist
);
1777 font_spec
= Ffont_spec (0, NULL
);
1778 ASET (font_spec
, FONT_REGISTRY_INDEX
, registry
);
1780 Lisp_Object target
= find_font_encoding (SYMBOL_NAME (registry
));
1783 target
= XCDR (target
);
1784 if (! CHARSETP (target
))
1786 Fset_fontset_font (name
, target
, font_spec
, Qnil
, Qnil
);
1787 Fset_fontset_font (name
, Qnil
, font_spec
, Qnil
, Qnil
);
1790 set_fontset_ascii (fontset
, font_name
);
1792 return XINT (FONTSET_ID (fontset
));
1796 /* Update auto_fontset_alist for FONTSET. When an ASCII font of
1797 FONTSET is changed, we delete an entry of FONTSET if any from
1798 auto_fontset_alist so that FONTSET is not re-used by
1799 fontset_from_font. */
1802 update_auto_fontset_alist (Lisp_Object font_object
, Lisp_Object fontset
)
1804 Lisp_Object prev
, tail
;
1806 for (prev
= Qnil
, tail
= auto_fontset_alist
; CONSP (tail
);
1807 prev
= tail
, tail
= XCDR (tail
))
1808 if (EQ (fontset
, XCDR (XCAR (tail
))))
1811 auto_fontset_alist
= XCDR (tail
);
1813 XSETCDR (prev
, XCDR (tail
));
1819 /* Return a cons (FONT-OBJECT . GLYPH-CODE).
1820 FONT-OBJECT is the font for the character at POSITION in the current
1821 buffer. This is computed from all the text properties and overlays
1822 that apply to POSITION. POSITION may be nil, in which case,
1823 FONT-SPEC is the font for displaying the character CH with the
1826 GLYPH-CODE is the glyph code in the font to use for the character.
1828 If the 2nd optional arg CH is non-nil, it is a character to check
1829 the font instead of the character at POSITION.
1831 It returns nil in the following cases:
1833 (1) The window system doesn't have a font for the character (thus
1834 it is displayed by an empty box).
1836 (2) The character code is invalid.
1838 (3) If POSITION is not nil, and the current buffer is not displayed
1841 In addition, the returned font name may not take into account of
1842 such redisplay engine hooks as what used in jit-lock-mode if
1843 POSITION is currently not visible. */
1846 DEFUN ("internal-char-font", Finternal_char_font
, Sinternal_char_font
, 1, 2, 0,
1847 doc
: /* For internal use only. */)
1848 (Lisp_Object position
, Lisp_Object ch
)
1850 ptrdiff_t pos
, pos_byte
, dummy
;
1856 if (NILP (position
))
1858 CHECK_CHARACTER (ch
);
1860 f
= XFRAME (selected_frame
);
1861 face_id
= lookup_basic_face (f
, DEFAULT_FACE_ID
);
1869 CHECK_NUMBER_COERCE_MARKER (position
);
1870 if (! (BEGV
<= XINT (position
) && XINT (position
) < ZV
))
1871 args_out_of_range_3 (position
, make_number (BEGV
), make_number (ZV
));
1872 pos
= XINT (position
);
1873 pos_byte
= CHAR_TO_BYTE (pos
);
1875 c
= FETCH_CHAR (pos_byte
);
1881 window
= Fget_buffer_window (Fcurrent_buffer (), Qnil
);
1884 w
= XWINDOW (window
);
1885 f
= XFRAME (w
->frame
);
1886 face_id
= face_at_buffer_position (w
, pos
, -1, -1, &dummy
,
1889 if (! CHAR_VALID_P (c
))
1891 face_id
= FACE_FOR_CHAR (f
, FACE_FROM_ID (f
, face_id
), c
, pos
, Qnil
);
1892 face
= FACE_FROM_ID (f
, face_id
);
1895 unsigned code
= face
->font
->driver
->encode_char (face
->font
, c
);
1896 Lisp_Object font_object
;
1898 if (code
== FONT_INVALID_CODE
)
1900 XSETFONT (font_object
, face
->font
);
1901 return Fcons (font_object
, INTEGER_TO_CONS (code
));
1907 DEFUN ("fontset-info", Ffontset_info
, Sfontset_info
, 1, 2, 0,
1908 doc
: /* Return information about a fontset FONTSET on frame FRAME.
1910 FONTSET is a fontset name string, nil for the fontset of FRAME, or t
1911 for the default fontset. FRAME nil means the selected frame.
1913 The value is a char-table whose elements have this form:
1915 ((FONT OPENED-FONT ...) ...)
1917 FONT is a name of font specified for a range of characters.
1919 OPENED-FONT is a name of a font actually opened.
1921 The char-table has one extra slot. If FONTSET is not the default
1922 fontset, the value the extra slot is a char-table containing the
1923 information about the derived fonts from the default fontset. The
1924 format is the same as above. */)
1925 (Lisp_Object fontset
, Lisp_Object frame
)
1927 Lisp_Object
*realized
[2], fontsets
[2], tables
[2];
1928 Lisp_Object val
, elt
;
1931 (*check_window_system_func
) ();
1933 fontset
= check_fontset_name (fontset
, &frame
);
1935 /* Recode fontsets realized on FRAME from the base fontset FONTSET
1936 in the table `realized'. */
1937 realized
[0] = alloca (word_size
* ASIZE (Vfontset_table
));
1938 for (i
= j
= 0; i
< ASIZE (Vfontset_table
); i
++)
1940 elt
= FONTSET_FROM_ID (i
);
1942 && EQ (FONTSET_BASE (elt
), fontset
)
1943 && EQ (FONTSET_FRAME (elt
), frame
))
1944 realized
[0][j
++] = elt
;
1946 realized
[0][j
] = Qnil
;
1948 realized
[1] = alloca (word_size
* ASIZE (Vfontset_table
));
1949 for (i
= j
= 0; ! NILP (realized
[0][i
]); i
++)
1951 elt
= FONTSET_DEFAULT (realized
[0][i
]);
1953 realized
[1][j
++] = elt
;
1955 realized
[1][j
] = Qnil
;
1957 tables
[0] = Fmake_char_table (Qfontset_info
, Qnil
);
1958 fontsets
[0] = fontset
;
1959 if (!EQ (fontset
, Vdefault_fontset
))
1961 tables
[1] = Fmake_char_table (Qnil
, Qnil
);
1962 set_char_table_extras (tables
[0], 0, tables
[1]);
1963 fontsets
[1] = Vdefault_fontset
;
1966 /* Accumulate information of the fontset in TABLE. The format of
1967 each element is ((FONT-SPEC OPENED-FONT ...) ...). */
1968 for (k
= 0; k
<= 1; k
++)
1970 for (c
= 0; c
<= MAX_CHAR
; )
1972 int from
= c
, to
= MAX_5_BYTE_CHAR
;
1974 if (c
<= MAX_5_BYTE_CHAR
)
1976 val
= char_table_ref_and_range (fontsets
[k
], c
, &from
, &to
);
1980 val
= FONTSET_FALLBACK (fontsets
[k
]);
1987 /* At first, set ALIST to ((FONT-SPEC) ...). */
1988 for (alist
= Qnil
, i
= 0; i
< ASIZE (val
); i
++)
1989 if (! NILP (AREF (val
, i
)))
1990 alist
= Fcons (Fcons (FONT_DEF_SPEC (AREF (val
, i
)), Qnil
),
1992 alist
= Fnreverse (alist
);
1994 /* Then store opened font names to cdr of each elements. */
1995 for (i
= 0; ! NILP (realized
[k
][i
]); i
++)
1997 if (c
<= MAX_5_BYTE_CHAR
)
1998 val
= FONTSET_REF (realized
[k
][i
], c
);
2000 val
= FONTSET_FALLBACK (realized
[k
][i
]);
2001 if (! CONSP (val
) || ! VECTORP (XCDR (val
)))
2003 /* VAL: (int . [[FACE-ID FONT-DEF FONT-OBJECT int] ... ]) */
2005 for (j
= 0; j
< ASIZE (val
); j
++)
2007 elt
= AREF (val
, j
);
2008 if (FONT_OBJECT_P (RFONT_DEF_OBJECT (elt
)))
2010 Lisp_Object font_object
= RFONT_DEF_OBJECT (elt
);
2011 Lisp_Object slot
, name
;
2013 slot
= Fassq (RFONT_DEF_SPEC (elt
), alist
);
2014 name
= AREF (font_object
, FONT_NAME_INDEX
);
2015 if (NILP (Fmember (name
, XCDR (slot
))))
2016 nconc2 (slot
, Fcons (name
, Qnil
));
2021 /* Store ALIST in TBL for characters C..TO. */
2022 if (c
<= MAX_5_BYTE_CHAR
)
2023 char_table_set_range (tables
[k
], c
, to
, alist
);
2025 set_char_table_defalt (tables
[k
], alist
);
2027 /* At last, change each elements to font names. */
2028 for (; CONSP (alist
); alist
= XCDR (alist
))
2031 XSETCAR (elt
, Ffont_xlfd_name (XCAR (elt
), Qnil
));
2036 if (EQ (fontset
, Vdefault_fontset
))
2044 DEFUN ("fontset-font", Ffontset_font
, Sfontset_font
, 2, 3, 0,
2045 doc
: /* Return a font name pattern for character CH in fontset NAME.
2046 If NAME is t, find a pattern in the default fontset.
2047 If NAME is nil, find a pattern in the fontset of the selected frame.
2049 The value has the form (FAMILY . REGISTRY), where FAMILY is a font
2050 family name and REGISTRY is a font registry name. This is actually
2051 the first font name pattern for CH in the fontset or in the default
2054 If the 2nd optional arg ALL is non-nil, return a list of all font name
2056 (Lisp_Object name
, Lisp_Object ch
, Lisp_Object all
)
2059 Lisp_Object fontset
, elt
, list
, repertory
, val
;
2064 fontset
= check_fontset_name (name
, &frame
);
2066 CHECK_CHARACTER (ch
);
2071 for (i
= 0, elt
= FONTSET_REF (fontset
, c
); i
< 2;
2072 i
++, elt
= FONTSET_FALLBACK (fontset
))
2074 for (j
= 0; j
< ASIZE (elt
); j
++)
2076 Lisp_Object family
, registry
;
2078 val
= AREF (elt
, j
);
2081 repertory
= AREF (val
, 1);
2082 if (INTEGERP (repertory
))
2084 struct charset
*charset
= CHARSET_FROM_ID (XINT (repertory
));
2086 if (! CHAR_CHARSET_P (c
, charset
))
2089 else if (CHAR_TABLE_P (repertory
))
2091 if (NILP (CHAR_TABLE_REF (repertory
, c
)))
2094 val
= AREF (val
, 0);
2095 /* VAL is a FONT-SPEC */
2096 family
= AREF (val
, FONT_FAMILY_INDEX
);
2097 if (! NILP (family
))
2098 family
= SYMBOL_NAME (family
);
2099 registry
= AREF (val
, FONT_REGISTRY_INDEX
);
2100 if (! NILP (registry
))
2101 registry
= SYMBOL_NAME (registry
);
2102 val
= Fcons (family
, registry
);
2105 list
= Fcons (val
, list
);
2107 if (EQ (fontset
, Vdefault_fontset
))
2109 fontset
= Vdefault_fontset
;
2111 return (Fnreverse (list
));
2114 DEFUN ("fontset-list", Ffontset_list
, Sfontset_list
, 0, 0, 0,
2115 doc
: /* Return a list of all defined fontset names. */)
2118 Lisp_Object fontset
, list
;
2122 for (i
= 0; i
< ASIZE (Vfontset_table
); i
++)
2124 fontset
= FONTSET_FROM_ID (i
);
2126 && BASE_FONTSET_P (fontset
))
2127 list
= Fcons (FONTSET_NAME (fontset
), list
);
2134 #ifdef ENABLE_CHECKING
2136 Lisp_Object
dump_fontset (Lisp_Object
) EXTERNALLY_VISIBLE
;
2139 dump_fontset (Lisp_Object fontset
)
2143 vec
= Fmake_vector (make_number (3), Qnil
);
2144 ASET (vec
, 0, FONTSET_ID (fontset
));
2146 if (BASE_FONTSET_P (fontset
))
2148 ASET (vec
, 1, FONTSET_NAME (fontset
));
2154 frame
= FONTSET_FRAME (fontset
);
2157 FRAME_PTR f
= XFRAME (frame
);
2159 if (FRAME_LIVE_P (f
))
2161 Fcons (FONTSET_NAME (FONTSET_BASE (fontset
)),
2165 Fcons (FONTSET_NAME (FONTSET_BASE (fontset
)), Qnil
));
2167 if (!NILP (FONTSET_DEFAULT (fontset
)))
2168 ASET (vec
, 2, FONTSET_ID (FONTSET_DEFAULT (fontset
)));
2173 DEFUN ("fontset-list-all", Ffontset_list_all
, Sfontset_list_all
, 0, 0, 0,
2174 doc
: /* Return a brief summary of all fontsets for debug use. */)
2180 for (i
= 0, val
= Qnil
; i
< ASIZE (Vfontset_table
); i
++)
2181 if (! NILP (AREF (Vfontset_table
, i
)))
2182 val
= Fcons (dump_fontset (AREF (Vfontset_table
, i
)), val
);
2183 return (Fnreverse (val
));
2185 #endif /* ENABLE_CHECKING */
2188 syms_of_fontset (void)
2190 DEFSYM (Qfontset
, "fontset");
2191 Fput (Qfontset
, Qchar_table_extra_slots
, make_number (9));
2192 DEFSYM (Qfontset_info
, "fontset-info");
2193 Fput (Qfontset_info
, Qchar_table_extra_slots
, make_number (1));
2195 DEFSYM (Qprepend
, "prepend");
2196 DEFSYM (Qappend
, "append");
2197 DEFSYM (Qlatin
, "latin");
2199 Vcached_fontset_data
= Qnil
;
2200 staticpro (&Vcached_fontset_data
);
2202 Vfontset_table
= Fmake_vector (make_number (32), Qnil
);
2203 staticpro (&Vfontset_table
);
2205 Vdefault_fontset
= Fmake_char_table (Qfontset
, Qnil
);
2206 staticpro (&Vdefault_fontset
);
2207 set_fontset_id (Vdefault_fontset
, make_number (0));
2210 build_pure_c_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default"));
2211 ASET (Vfontset_table
, 0, Vdefault_fontset
);
2212 next_fontset_id
= 1;
2214 auto_fontset_alist
= Qnil
;
2215 staticpro (&auto_fontset_alist
);
2217 DEFVAR_LISP ("font-encoding-charset-alist", Vfont_encoding_charset_alist
,
2219 Alist of charsets vs the charsets to determine the preferred font encoding.
2220 Each element looks like (CHARSET . ENCODING-CHARSET),
2221 where ENCODING-CHARSET is a charset registered in the variable
2222 `font-encoding-alist' as ENCODING.
2224 When a text has a property `charset' and the value is CHARSET, a font
2225 whose encoding corresponds to ENCODING-CHARSET is preferred. */);
2226 Vfont_encoding_charset_alist
= Qnil
;
2228 DEFVAR_LISP ("use-default-ascent", Vuse_default_ascent
,
2230 Char table of characters whose ascent values should be ignored.
2231 If an entry for a character is non-nil, the ascent value of the glyph
2232 is assumed to be specified by _MULE_DEFAULT_ASCENT property of a font.
2234 This affects how a composite character which contains
2235 such a character is displayed on screen. */);
2236 Vuse_default_ascent
= Qnil
;
2238 DEFVAR_LISP ("ignore-relative-composition", Vignore_relative_composition
,
2240 Char table of characters which are not composed relatively.
2241 If an entry for a character is non-nil, a composition sequence
2242 which contains that character is displayed so that
2243 the glyph of that character is put without considering
2244 an ascent and descent value of a previous character. */);
2245 Vignore_relative_composition
= Qnil
;
2247 DEFVAR_LISP ("alternate-fontname-alist", Valternate_fontname_alist
,
2248 doc
: /* Alist of fontname vs list of the alternate fontnames.
2249 When a specified font name is not found, the corresponding
2250 alternate fontnames (if any) are tried instead. */);
2251 Valternate_fontname_alist
= Qnil
;
2253 DEFVAR_LISP ("fontset-alias-alist", Vfontset_alias_alist
,
2254 doc
: /* Alist of fontset names vs the aliases. */);
2255 Vfontset_alias_alist
= Fcons (Fcons (FONTSET_NAME (Vdefault_fontset
),
2256 build_pure_c_string ("fontset-default")),
2259 DEFVAR_LISP ("vertical-centering-font-regexp",
2260 Vvertical_centering_font_regexp
,
2261 doc
: /* Regexp matching font names that require vertical centering on display.
2262 When a character is displayed with such fonts, the character is displayed
2263 at the vertical center of lines. */);
2264 Vvertical_centering_font_regexp
= Qnil
;
2266 DEFVAR_LISP ("otf-script-alist", Votf_script_alist
,
2267 doc
: /* Alist of OpenType script tags vs the corresponding script names. */);
2268 Votf_script_alist
= Qnil
;
2270 defsubr (&Squery_fontset
);
2271 defsubr (&Snew_fontset
);
2272 defsubr (&Sset_fontset_font
);
2273 defsubr (&Sinternal_char_font
);
2274 defsubr (&Sfontset_info
);
2275 defsubr (&Sfontset_font
);
2276 defsubr (&Sfontset_list
);
2277 #ifdef ENABLE_CHECKING
2278 defsubr (&Sfontset_list_all
);