2 Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN.
3 Licensed to the Free Software Foundation.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
25 #endif /* HAVE_ALLOCA_H */
32 Lisp_Object Vglobal_fontset_alist
;
33 Lisp_Object Vfont_encoding_alist
;
34 Lisp_Object Vuse_default_ascent
;
35 Lisp_Object Vignore_relative_composition
;
36 Lisp_Object Valternate_fontname_alist
;
37 Lisp_Object Vfontset_alias_alist
;
38 Lisp_Object Vhighlight_wrong_size_font
;
39 Lisp_Object Vclip_large_size_font
;
41 /* Used as a temporary in macro FS_LOAD_FONT. */
44 /* We had better have our own strcasecmp function because some system
46 static char my_strcasetbl
[256];
48 /* Compare two strings S0 and S1 while ignoring differences in case.
49 Return 1 if they differ, else return 0. */
51 my_strcasecmp (s0
, s1
)
52 unsigned char *s0
, *s1
;
55 if (my_strcasetbl
[*s0
++] != my_strcasetbl
[*s1
++]) return 1;
59 /* The following six are window system dependent functions. See
60 the comments in src/fontset.h for more detail. */
62 /* Return a pointer to struct font_info of font FONT_IDX of frame F. */
63 struct font_info
*(*get_font_info_func
) P_ ((FRAME_PTR f
, int font_idx
));
65 /* Return a list of font names which matches PATTERN. See the document of
66 `x-list-fonts' for more detail. */
67 Lisp_Object (*list_fonts_func
) P_ ((Lisp_Object pattern
, Lisp_Object face
,
68 Lisp_Object frame
, Lisp_Object width
));
70 /* Load a font named NAME for frame F and return a pointer to the
71 information of the loaded font. If loading is failed, return 0. */
72 struct font_info
*(*load_font_func
) P_ ((FRAME_PTR f
, char *name
, int));
74 /* Return a pointer to struct font_info of a font named NAME for frame F. */
75 struct font_info
*(*query_font_func
) P_ ((FRAME_PTR f
, char *name
));
77 /* Additional function for setting fontset or changing fontset
78 contents of frame F. */
79 void (*set_frame_fontset_func
) P_ ((FRAME_PTR f
, Lisp_Object arg
,
82 /* To find a CCL program, fs_load_font calls this function.
83 The argument is a pointer to the struct font_info.
84 This function set the memer `encoder' of the structure. */
85 void (*find_ccl_program_func
) P_ ((struct font_info
*));
87 /* Check if any window system is used now. */
88 void (*check_window_system_func
) P_ ((void));
93 struct fontset_data
*fontset_data
94 = (struct fontset_data
*) xmalloc (sizeof (struct fontset_data
));
96 bzero (fontset_data
, sizeof (struct fontset_data
));
102 free_fontset_data (fontset_data
)
103 struct fontset_data
*fontset_data
;
105 if (fontset_data
->fontset_table
)
109 for (i
= 0; i
< fontset_data
->n_fontsets
; i
++)
113 xfree (fontset_data
->fontset_table
[i
]->name
);
114 for (j
= 0; j
<= MAX_CHARSET
; j
++)
115 if (fontset_data
->fontset_table
[i
]->fontname
[j
])
116 xfree (fontset_data
->fontset_table
[i
]->fontname
[j
]);
117 xfree (fontset_data
->fontset_table
[i
]);
119 xfree (fontset_data
->fontset_table
);
122 xfree (fontset_data
);
125 /* Load a font named FONTNAME for displaying CHARSET on frame F.
126 All fonts for frame F is stored in a table pointed by FONT_TABLE.
127 Return a pointer to the struct font_info of the loaded font.
128 If loading fails, return 0;
129 If FONTNAME is NULL, the name is taken from the information of FONTSET.
130 If FONTSET is given, try to load a font whose size matches that of
131 FONTSET, and, the font index is stored in the table for FONTSET.
133 If you give FONTSET argument, don't call this function directry,
134 instead call macro FS_LOAD_FONT with the same argument. */
137 fs_load_font (f
, font_table
, charset
, fontname
, fontset
)
139 struct font_info
*font_table
;
140 int charset
, fontset
;
143 Lisp_Object font_list
;
144 Lisp_Object list
, elt
;
147 struct fontset_info
*fontsetp
= 0;
148 struct font_info
*fontp
;
150 if (fontset
>= 0 && fontset
< FRAME_FONTSET_DATA (f
)->n_fontsets
)
152 fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
153 font_idx
= fontsetp
->font_indexes
[charset
];
155 /* We have already loaded a font. */
156 return font_table
+ font_idx
;
157 else if (font_idx
== FONT_NOT_FOUND
)
158 /* We have already tried loading a font and failed. */
161 fontname
= fontsetp
->fontname
[charset
];
165 /* No way to get fontname. */
168 /* If CHARSET is not ASCII and FONTSET is specified, we must load a
169 font of appropriate size to be used with other fonts in this
171 if (charset
!= CHARSET_ASCII
&& fontsetp
)
173 /* If we have not yet loaded ASCII font of FONTSET, we must load
174 it now to decided the size and height of this fontset. */
175 if (fontsetp
->size
== 0)
177 fontp
= fs_load_font (f
, font_table
, CHARSET_ASCII
, 0, fontset
);
179 /* Any fontset should contain avairable ASCII. */
182 /* Now we have surely decided the size of this fontset. */
183 size
= fontsetp
->size
* CHARSET_WIDTH (charset
);
186 fontp
= (*load_font_func
) (f
, fontname
, size
);
191 fontsetp
->font_indexes
[charset
] = FONT_NOT_FOUND
;
195 /* Fill in fields (CHARSET, ENCODING, and FONT_ENCODER) which are
196 not set by (*load_font_func). */
197 fontp
->charset
= charset
;
199 if (fontp
->encoding
[1] != FONT_ENCODING_NOT_DECIDED
)
201 /* The font itself tells which code points to be used. Use this
202 encoding for all other charsets. */
205 fontp
->encoding
[0] = fontp
->encoding
[1];
206 for (i
= MIN_CHARSET_OFFICIAL_DIMENSION1
; i
<= MAX_CHARSET
; i
++)
207 fontp
->encoding
[i
] = fontp
->encoding
[1];
211 /* The font itself doesn't tell which code points to be used. */
214 /* At first, set 1 (means 0xA0..0xFF) as the default. */
215 fontp
->encoding
[0] = 1;
216 for (i
= MIN_CHARSET_OFFICIAL_DIMENSION1
; i
<= MAX_CHARSET
; i
++)
217 fontp
->encoding
[i
] = 1;
218 /* Then override them by a specification in Vfont_encoding_alist. */
219 for (list
= Vfont_encoding_alist
; CONSP (list
); list
= XCONS (list
)->cdr
)
221 elt
= XCONS (list
)->car
;
223 && STRINGP (XCONS (elt
)->car
) && CONSP (XCONS (elt
)->cdr
)
224 && (fast_c_string_match_ignore_case (XCONS (elt
)->car
, fontname
)
229 for (tmp
= XCONS (elt
)->cdr
; CONSP (tmp
); tmp
= XCONS (tmp
)->cdr
)
230 if (CONSP (XCONS (tmp
)->car
)
231 && ((i
= get_charset_id (XCONS (XCONS (tmp
)->car
)->car
))
233 && INTEGERP (XCONS (XCONS (tmp
)->car
)->cdr
)
234 && XFASTINT (XCONS (XCONS (tmp
)->car
)->cdr
) < 4)
236 = XFASTINT (XCONS (XCONS (tmp
)->car
)->cdr
);
241 fontp
->font_encoder
= (struct ccl_program
*) 0;
243 if (find_ccl_program_func
)
244 (*find_ccl_program_func
) (fontp
);
246 /* If FONTSET is specified, setup various fields of it. */
249 fontsetp
->font_indexes
[charset
] = fontp
->font_idx
;
250 if (charset
== CHARSET_ASCII
)
252 /* Decide or change the size and height of this fontset. */
253 if (fontsetp
->size
== 0)
255 fontsetp
->size
= fontp
->size
;
256 fontsetp
->height
= fontp
->height
;
258 else if (fontsetp
->size
!= fontp
->size
259 || fontsetp
->height
!= fontp
->height
)
261 /* When loading ASCII font of the different size from
262 the size of FONTSET, we have to update the size of
263 FONTSET. Since changing the size of FONTSET may make
264 some fonts already loaded inappropriate to be used in
265 FONTSET, we must delete the record of such fonts. In
266 that case, we also have to calculate the height of
267 FONTSET from the remaining fonts. */
270 fontsetp
->size
= fontp
->size
;
271 fontsetp
->height
= fontp
->height
;
272 for (i
= CHARSET_ASCII
+ 1; i
<= MAX_CHARSET
; i
++)
274 font_idx
= fontsetp
->font_indexes
[i
];
277 struct font_info
*fontp2
= font_table
+ font_idx
;
279 if (fontp2
->size
!= fontp
->size
* CHARSET_WIDTH (i
))
280 fontsetp
->font_indexes
[i
] = FONT_NOT_OPENED
;
281 /* The following code should be disabled until
282 Emacs supports variable height lines. */
284 else if (fontsetp
->height
< fontp
->height
)
285 fontsetp
->height
= fontp
->height
;
296 /* Return ID of the fontset named NAME on frame F. */
299 fs_query_fontset (f
, name
)
303 struct fontset_data
*fontset_data
= FRAME_FONTSET_DATA (f
);
306 for (i
= 0; i
< fontset_data
->n_fontsets
; i
++)
307 if (!my_strcasecmp(name
, fontset_data
->fontset_table
[i
]->name
))
312 /* Register a fontset specified by FONTSET_INFO for frame FRAME.
313 Return the fontset ID if successfully registered, else return -1.
314 FONTSET_INFO is a cons of name of the fontset and FONTLIST, where
315 FONTLIST is an alist of charsets vs fontnames. */
318 fs_register_fontset (f
, fontset_info
)
320 Lisp_Object fontset_info
;
322 struct fontset_data
*fontset_data
= FRAME_FONTSET_DATA (f
);
323 Lisp_Object name
, fontlist
;
325 struct fontset_info
*fontsetp
;
328 if (!CONSP (fontset_info
)
329 || !STRINGP (XCONS (fontset_info
)->car
)
330 || !CONSP (XCONS (fontset_info
)->cdr
))
331 /* Invalid data in FONTSET_INFO. */
334 name
= XCONS (fontset_info
)->car
;
335 if ((fontset
= fs_query_fontset (f
, XSTRING (name
)->data
)) >= 0)
336 /* This fontset already exists on frame F. */
339 fontsetp
= (struct fontset_info
*) xmalloc (sizeof (struct fontset_info
));
341 fontsetp
->name
= (char *) xmalloc (XSTRING (name
)->size
+ 1);
342 bcopy(XSTRING (name
)->data
, fontsetp
->name
, XSTRING (name
)->size
+ 1);
344 fontsetp
->size
= fontsetp
->height
= 0;
346 for (i
= 0; i
<= MAX_CHARSET
; i
++)
348 fontsetp
->fontname
[i
] = (char *) 0;
349 fontsetp
->font_indexes
[i
] = FONT_NOT_OPENED
;
352 for (fontlist
= XCONS (fontset_info
)->cdr
; CONSP (fontlist
);
353 fontlist
= XCONS (fontlist
)->cdr
)
355 Lisp_Object tem
= Fcar (fontlist
);
359 && (charset
= get_charset_id (XCONS (tem
)->car
)) >= 0
360 && STRINGP (XCONS (tem
)->cdr
))
362 fontsetp
->fontname
[charset
]
363 = (char *) xmalloc (XSTRING (XCONS (tem
)->cdr
)->size
+ 1);
364 bcopy (XSTRING (XCONS (tem
)->cdr
)->data
,
365 fontsetp
->fontname
[charset
],
366 XSTRING (XCONS (tem
)->cdr
)->size
+ 1);
369 /* Broken or invalid data structure. */
373 /* Do we need to create the table? */
374 if (fontset_data
->fontset_table_size
== 0)
376 fontset_data
->fontset_table_size
= 8;
377 fontset_data
->fontset_table
378 = (struct fontset_info
**) xmalloc (fontset_data
->fontset_table_size
379 * sizeof (struct fontset_info
*));
381 /* Do we need to grow the table? */
382 else if (fontset_data
->n_fontsets
>= fontset_data
->fontset_table_size
)
384 fontset_data
->fontset_table_size
+= 8;
385 fontset_data
->fontset_table
386 = (struct fontset_info
**) xrealloc (fontset_data
->fontset_table
,
387 fontset_data
->fontset_table_size
388 * sizeof (struct fontset_info
*));
390 fontset
= fontset_data
->n_fontsets
++;
391 fontset_data
->fontset_table
[fontset
] = fontsetp
;
396 /* Cache data used by fontset_pattern_regexp. The car part is a
397 pattern string containing at least one wild card, the cdr part is
398 the corresponding regular expression. */
399 static Lisp_Object Vcached_fontset_data
;
401 #define CACHED_FONTSET_NAME (XSTRING (XCONS (Vcached_fontset_data)->car)->data)
402 #define CACHED_FONTSET_REGEX (XCONS (Vcached_fontset_data)->cdr)
404 /* If fontset name PATTERN contains any wild card, return regular
405 expression corresponding to PATTERN. */
408 fontset_pattern_regexp (pattern
)
411 if (!index (XSTRING (pattern
)->data
, '*')
412 && !index (XSTRING (pattern
)->data
, '?'))
413 /* PATTERN does not contain any wild cards. */
416 if (!CONSP (Vcached_fontset_data
)
417 || strcmp (XSTRING (pattern
)->data
, CACHED_FONTSET_NAME
))
419 /* We must at first update the cached data. */
420 char *regex
= (char *) alloca (XSTRING (pattern
)->size
* 2);
421 char *p0
, *p1
= regex
;
423 /* Convert "*" to ".*", "?" to ".". */
425 for (p0
= (char *) XSTRING (pattern
)->data
; *p0
; p0
++)
440 Vcached_fontset_data
= Fcons (build_string (XSTRING (pattern
)->data
),
441 build_string (regex
));
444 return CACHED_FONTSET_REGEX
;
447 DEFUN ("query-fontset", Fquery_fontset
, Squery_fontset
, 1, 2, 0,
448 "Return a fontset name which matches PATTERN, nil if no matching fontset.\n\
449 PATTERN can contain `*' or `?' as a wild card\n\
450 just like X's font name matching algorithm allows.\n\
451 If REGEXPP is non-nil, pattern is regexp;\n\
452 so PATTERN is considered as regular expression.")
454 Lisp_Object pattern
, regexpp
;
456 Lisp_Object regexp
, tem
;
458 (*check_window_system_func
) ();
460 CHECK_STRING (pattern
, 0);
462 if (XSTRING (pattern
)->size
== 0)
465 tem
= Frassoc (pattern
, Vfontset_alias_alist
);
470 regexp
= fontset_pattern_regexp (pattern
);
474 for (tem
= Vglobal_fontset_alist
; CONSP (tem
); tem
= XCONS (tem
)->cdr
)
476 Lisp_Object fontset_name
= XCONS (XCONS (tem
)->car
)->car
;
479 if (fast_c_string_match_ignore_case (regexp
,
480 XSTRING (fontset_name
)->data
)
486 if (!my_strcasecmp (XSTRING (pattern
)->data
,
487 XSTRING (fontset_name
)->data
))
495 /* Return a list of names of available fontsets matching PATTERN on
496 frame F. If SIZE is not 0, it is the size (maximum bound width) of
497 fontsets to be listed. */
500 list_fontsets (f
, pattern
, size
)
506 Lisp_Object regexp
, val
;
508 regexp
= fontset_pattern_regexp (pattern
);
511 for (i
= 0; i
< FRAME_FONTSET_DATA (f
)->n_fontsets
; i
++)
513 struct fontset_info
*fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[i
];
514 int name_matched
= 0;
515 int size_matched
= 0;
519 if (fast_c_string_match_ignore_case (regexp
, fontsetp
->name
) >= 0)
524 if (!my_strcasecmp (XSTRING (pattern
)->data
, fontsetp
->name
))
530 if (!size
|| fontsetp
->size
== size
)
532 else if (fontsetp
->size
== 0)
534 /* No font of this fontset has loaded yet. Try loading
538 for (j
= 0; j
<= MAX_CHARSET
; j
++)
539 if (fontsetp
->fontname
[j
])
541 if ((*load_font_func
) (f
, fontsetp
->fontname
[j
], size
))
548 val
= Fcons (build_string (fontsetp
->name
), val
);
555 DEFUN ("new-fontset", Fnew_fontset
, Snew_fontset
, 2, 2, 0,
556 "Create a new fontset NAME which contains fonts in FONTLIST.\n\
557 FONTLIST is an alist of charsets vs corresponding font names.")
559 Lisp_Object name
, fontlist
;
561 Lisp_Object fullname
, fontset_info
;
564 (*check_window_system_func
) ();
566 CHECK_STRING (name
, 0);
567 CHECK_LIST (fontlist
, 1);
569 fullname
= Fquery_fontset (name
, Qnil
);
570 if (!NILP (fullname
))
571 error ("Fontset \"%s\" matches the existing fontset \"%s\"",
572 XSTRING (name
)->data
, XSTRING (fullname
)->data
);
574 /* Check the validity of FONTLIST. */
575 for (tail
= fontlist
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
577 Lisp_Object tem
= XCONS (tail
)->car
;
581 || (charset
= get_charset_id (XCONS (tem
)->car
)) < 0
582 || !STRINGP (XCONS (tem
)->cdr
))
583 error ("Elements of fontlist must be a cons of charset and font name");
586 fontset_info
= Fcons (name
, fontlist
);
587 Vglobal_fontset_alist
= Fcons (fontset_info
, Vglobal_fontset_alist
);
589 /* Register this fontset for all existing frames. */
591 Lisp_Object framelist
, frame
;
593 FOR_EACH_FRAME (framelist
, frame
)
594 if (!FRAME_TERMCAP_P (XFRAME (frame
)))
595 fs_register_fontset (XFRAME (frame
), fontset_info
);
601 extern Lisp_Object Qfont
;
602 Lisp_Object Qfontset
;
604 DEFUN ("set-fontset-font", Fset_fontset_font
, Sset_fontset_font
, 3, 4, 0,
605 "Set FONTNAME for a font of CHARSET in fontset NAME on frame FRAME.\n\
606 If FRAME is omitted or nil, all frames are affected.")
607 (name
, charset_symbol
, fontname
, frame
)
608 Lisp_Object name
, charset_symbol
, fontname
, frame
;
611 Lisp_Object fullname
, fontlist
;
613 (*check_window_system_func
) ();
615 CHECK_STRING (name
, 0);
616 CHECK_SYMBOL (charset_symbol
, 1);
617 CHECK_STRING (fontname
, 2);
619 CHECK_LIVE_FRAME (frame
, 3);
621 if ((charset
= get_charset_id (charset_symbol
)) < 0)
622 error ("Invalid charset: %s", XSYMBOL (charset_symbol
)->name
->data
);
624 fullname
= Fquery_fontset (name
, Qnil
);
626 error ("Fontset \"%s\" does not exist", XSTRING (name
)->data
);
628 /* If FRAME is not specified, we must, at first, update contents of
629 `global-fontset-alist' for a frame created in the future. */
632 Lisp_Object fontset_info
= Fassoc (fullname
, Vglobal_fontset_alist
);
633 Lisp_Object tem
= Fassq (charset_symbol
, XCONS (fontset_info
)->cdr
);
636 XCONS (fontset_info
)->cdr
637 = Fcons (Fcons (charset_symbol
, fontname
),
638 XCONS (fontset_info
)->cdr
);
640 XCONS (tem
)->cdr
= fontname
;
643 /* Then, update information in the specified frame or all existing
646 Lisp_Object framelist
, tem
;
648 FOR_EACH_FRAME (framelist
, tem
)
649 if (!FRAME_TERMCAP_P (XFRAME (tem
))
650 && (NILP (frame
) || EQ (frame
, tem
)))
652 FRAME_PTR f
= XFRAME (tem
);
653 int fontset
= fs_query_fontset (f
, XSTRING (fullname
)->data
);
654 struct fontset_info
*fontsetp
655 = FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
657 if (fontsetp
->fontname
[charset
])
658 xfree (fontsetp
->fontname
[charset
]);
659 fontsetp
->fontname
[charset
]
660 = (char *) xmalloc (XSTRING (fontname
)->size
+ 1);
661 bcopy (XSTRING (fontname
)->data
, fontsetp
->fontname
[charset
],
662 XSTRING (fontname
)->size
+ 1);
663 fontsetp
->font_indexes
[charset
] = FONT_NOT_OPENED
;
665 if (charset
== CHARSET_ASCII
)
667 Lisp_Object font_param
= Fassq (Qfont
, Fframe_parameters (tem
));
669 if (set_frame_fontset_func
670 && !NILP (font_param
)
671 && !strcmp (XSTRING (fullname
)->data
,
672 XSTRING (XCONS (font_param
)->cdr
)->data
))
673 /* This fontset is the default fontset on frame TEM.
674 We may have to resize this frame because of new
676 (*set_frame_fontset_func
) (f
, fullname
, Qnil
);
684 DEFUN ("font-info", Ffont_info
, Sfont_info
, 1, 2, 0,
685 "Return information about a font named NAME on frame FRAME.\n\
686 If FRAME is omitted or nil, use the selected frame.\n\
687 The returned value is a vector of OPENED-NAME, FULL-NAME, CHARSET, SIZE,\n\
688 HEIGHT, BASELINE-OFFSET, RELATIVE-COMPOSE, and DEFAULT-ASCENT,\n\
690 OPENED-NAME is the name used for opening the font,\n\
691 FULL-NAME is the full name of the font,\n\
692 CHARSET is the charset displayed by the font,\n\
693 SIZE is the minimum bound width of the font,\n\
694 HEIGHT is the height of the font,\n\
695 BASELINE-OFFSET is the upward offset pixels from ASCII baseline,\n\
696 RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling\n\
697 how to compose characters.\n\
698 If the named font is not yet loaded, return nil.")
700 Lisp_Object name
, frame
;
703 struct font_info
*fontp
;
706 (*check_window_system_func
) ();
708 CHECK_STRING (name
, 0);
713 CHECK_LIVE_FRAME (frame
, 1);
717 if (!query_font_func
)
718 error ("Font query function is not supported");
720 fontp
= (*query_font_func
) (f
, XSTRING (name
)->data
);
724 info
= Fmake_vector (make_number (8), Qnil
);
726 XVECTOR (info
)->contents
[0] = build_string (fontp
->name
);
727 XVECTOR (info
)->contents
[1] = build_string (fontp
->full_name
);
728 XVECTOR (info
)->contents
[2] = CHARSET_SYMBOL (fontp
->charset
);
729 XVECTOR (info
)->contents
[3] = make_number (fontp
->size
);
730 XVECTOR (info
)->contents
[4] = make_number (fontp
->height
);
731 XVECTOR (info
)->contents
[5] = make_number (fontp
->baseline_offset
);
732 XVECTOR (info
)->contents
[6] = make_number (fontp
->relative_compose
);
733 XVECTOR (info
)->contents
[7] = make_number (fontp
->default_ascent
);
738 DEFUN ("fontset-info", Ffontset_info
, Sfontset_info
, 1, 2, 0,
739 "Return information about a fontset named NAME on frame FRAME.\n\
740 If FRAME is omitted or nil, use the selected frame.\n\
741 The returned value is a vector of SIZE, HEIGHT, and FONT-LIST,\n\
743 SIZE is the minimum bound width of ASCII font of the fontset,\n\
744 HEIGHT is the height of the tallest font in the fontset, and\n\
745 FONT-LIST is an alist of the format:\n\
746 (CHARSET REQUESTED-FONT-NAME LOADED-FONT-NAME).\n\
747 LOADED-FONT-NAME t means the font is not yet loaded, nil means the\n\
750 Lisp_Object name
, frame
;
754 struct fontset_info
*fontsetp
;
755 Lisp_Object info
, val
;
758 (*check_window_system_func
) ();
760 CHECK_STRING(name
, 0);
765 CHECK_LIVE_FRAME (frame
, 1);
769 fontset
= fs_query_fontset (f
, XSTRING (name
)->data
);
771 error ("Fontset \"%s\" does not exist", XSTRING (name
)->data
);
773 info
= Fmake_vector (make_number (3), Qnil
);
775 fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
777 XVECTOR (info
)->contents
[0] = make_number (fontsetp
->size
);
778 XVECTOR (info
)->contents
[1] = make_number (fontsetp
->height
);
780 for (i
= 0; i
<= MAX_CHARSET
; i
++)
781 if (fontsetp
->fontname
[i
])
783 int font_idx
= fontsetp
->font_indexes
[i
];
786 if (font_idx
== FONT_NOT_OPENED
)
788 else if (font_idx
== FONT_NOT_FOUND
)
792 = build_string ((*get_font_info_func
) (f
, font_idx
)->full_name
);
793 val
= Fcons (Fcons (CHARSET_SYMBOL (i
),
794 Fcons (build_string (fontsetp
->fontname
[i
]),
795 Fcons (loaded
, Qnil
))),
798 XVECTOR (info
)->contents
[2] = val
;
807 for (i
= 0; i
< 256; i
++)
808 my_strcasetbl
[i
] = (i
>= 'A' && i
<= 'Z') ? i
+ 'a' - 'A' : i
;
811 /* Window system initializer should have set proper functions. */
814 Qfontset
= intern ("fontset");
815 staticpro (&Qfontset
);
817 Vcached_fontset_data
= Qnil
;
818 staticpro (&Vcached_fontset_data
);
820 DEFVAR_LISP ("global-fontset-alist", &Vglobal_fontset_alist
,
821 "Internal data for fontset. Not for external use.\n\
822 This is an alist associating fontset names with the lists of fonts\n\
823 contained in them.\n\
824 Newly created frames make their own fontset database from here.");
825 Vglobal_fontset_alist
= Qnil
;
827 DEFVAR_LISP ("font-encoding-alist", &Vfont_encoding_alist
,
828 "Alist of fontname patterns vs corresponding encoding info.\n\
829 Each element looks like (REGEXP . ENCODING-INFO),\n\
830 where ENCODING-INFO is an alist of CHARSET vs ENCODING.\n\
831 ENCODING is one of the following integer values:\n\
832 0: code points 0x20..0x7F or 0x2020..0x7F7F are used,\n\
833 1: code points 0xA0..0xFF or 0xA0A0..0xFFFF are used,\n\
834 2: code points 0x20A0..0x7FFF are used,\n\
835 3: code points 0xA020..0xFF7F are used.");
836 Vfont_encoding_alist
= Qnil
;
838 DEFVAR_LISP ("use-default-ascent", &Vuse_default_ascent
,
839 "Char table of characters whose ascent values should be ignored.\n\
840 If an entry for a character is non-nil, the ascent value of the glyph\n\
841 is assumed to be what specified by _MULE_DEFAULT_ASCENT property of a font.\n\
843 This affects how a composite character which contains\n\
844 such a character is displayed on screen.");
845 Vuse_default_ascent
= Qnil
;
847 DEFVAR_LISP ("ignore-relative-composition", &Vignore_relative_composition
,
848 "Char table of characters which is not composed relatively.\n\
849 If an entry for a character is non-nil, a composite character\n\
850 which contains that character is displayed so that\n\
851 the glyph of that character is put without considering\n\
852 an ascent and descent value of a previous character.");
853 Vuse_default_ascent
= Qnil
;
855 DEFVAR_LISP ("alternate-fontname-alist", &Valternate_fontname_alist
,
856 "Alist of fontname vs list of the alternate fontnames.\n\
857 When a specified font name is not found, the corresponding\n\
858 alternate fontnames (if any) are tried instead.");
859 Valternate_fontname_alist
= Qnil
;
861 DEFVAR_LISP ("fontset-alias-alist", &Vfontset_alias_alist
,
862 "Alist of fontset names vs the aliases.");
863 Vfontset_alias_alist
= Qnil
;
865 DEFVAR_LISP ("highlight-wrong-size-font", &Vhighlight_wrong_size_font
,
866 "*Non-nil means highlight characters shown in wrong size fonts somehow.\n\
867 The way to highlight them depends on window system on which Emacs runs.\n\
868 On X11, a rectangle is shown around each such character.");
869 Vhighlight_wrong_size_font
= Qnil
;
871 DEFVAR_LISP ("clip-large-size-font", &Vclip_large_size_font
,
872 "*Non-nil means characters shown in overlarge fonts are clipped.\n\
873 The height of clipping area is the same as that of an ASCII character.\n\
874 The width of the area is the same as that of an ASCII character,\n\
875 or twice as wide, depending on the character set's column-width.\n\
877 If the only font you have for a specific character set is too large,\n\
878 and clipping these characters makes them hard to read,\n\
879 you can set this variable to nil to display the characters without clipping.\n\
880 The drawback is that you will get some garbage left on your screen.");
881 Vclip_large_size_font
= Qt
;
883 defsubr (&Squery_fontset
);
884 defsubr (&Snew_fontset
);
885 defsubr (&Sset_fontset_font
);
886 defsubr (&Sfont_info
);
887 defsubr (&Sfontset_info
);