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 /* Check if any window system is used now. */
83 void (*check_window_system_func
) P_ ((void));
88 struct fontset_data
*fontset_data
89 = (struct fontset_data
*) xmalloc (sizeof (struct fontset_data
));
91 bzero (fontset_data
, sizeof (struct fontset_data
));
97 free_fontset_data (fontset_data
)
98 struct fontset_data
*fontset_data
;
100 if (fontset_data
->fontset_table
)
104 for (i
= 0; i
< fontset_data
->n_fontsets
; i
++)
108 xfree (fontset_data
->fontset_table
[i
]->name
);
109 for (j
= 0; j
<= MAX_CHARSET
; j
++)
110 if (fontset_data
->fontset_table
[i
]->fontname
[j
])
111 xfree (fontset_data
->fontset_table
[i
]->fontname
[j
]);
112 xfree (fontset_data
->fontset_table
[i
]);
114 xfree (fontset_data
->fontset_table
);
117 xfree (fontset_data
);
120 /* Load a font named FONTNAME for displaying CHARSET on frame F.
121 All fonts for frame F is stored in a table pointed by FONT_TABLE.
122 Return a pointer to the struct font_info of the loaded font.
123 If loading fails, return 0;
124 If FONTNAME is NULL, the name is taken from the information of FONTSET.
125 If FONTSET is given, try to load a font whose size matches that of
126 FONTSET, and, the font index is stored in the table for FONTSET.
128 If you give FONTSET argument, don't call this function directry,
129 instead call macro FS_LOAD_FONT with the same argument. */
132 fs_load_font (f
, font_table
, charset
, fontname
, fontset
)
134 struct font_info
*font_table
;
135 int charset
, fontset
;
138 Lisp_Object font_list
;
139 Lisp_Object list
, elt
;
142 struct fontset_info
*fontsetp
= 0;
143 struct font_info
*fontp
;
145 if (fontset
>= 0 && fontset
< FRAME_FONTSET_DATA (f
)->n_fontsets
)
147 fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
148 font_idx
= fontsetp
->font_indexes
[charset
];
150 /* We have already loaded a font. */
151 return font_table
+ font_idx
;
152 else if (font_idx
== FONT_NOT_FOUND
)
153 /* We have already tried loading a font and failed. */
156 fontname
= fontsetp
->fontname
[charset
];
160 /* No way to get fontname. */
163 /* If CHARSET is not ASCII and FONTSET is specified, we must load a
164 font of appropriate size to be used with other fonts in this
166 if (charset
!= CHARSET_ASCII
&& fontsetp
)
168 /* If we have not yet loaded ASCII font of FONTSET, we must load
169 it now to decided the size and height of this fontset. */
170 if (fontsetp
->size
== 0)
172 fontp
= fs_load_font (f
, font_table
, CHARSET_ASCII
, 0, fontset
);
174 /* Any fontset should contain avairable ASCII. */
177 /* Now we have surely decided the size of this fontset. */
178 size
= fontsetp
->size
* CHARSET_WIDTH (charset
);
181 fontp
= (*load_font_func
) (f
, fontname
, size
);
186 fontsetp
->font_indexes
[charset
] = FONT_NOT_FOUND
;
190 /* Fill in fields (CHARSET, ENCODING, and FONT_ENCODER) which are
191 not set by (*load_font_func). */
192 fontp
->charset
= charset
;
194 if (fontp
->encoding
[1] != FONT_ENCODING_NOT_DECIDED
)
196 /* The font itself tells which code points to be used. Use this
197 encoding for all other charsets. */
200 fontp
->encoding
[0] = fontp
->encoding
[1];
201 for (i
= MIN_CHARSET_OFFICIAL_DIMENSION1
; i
<= MAX_CHARSET
; i
++)
202 fontp
->encoding
[i
] = fontp
->encoding
[1];
206 /* The font itself doesn't tell which code points to be used. */
209 /* At first, set 1 (means 0xA0..0xFF) as the default. */
210 fontp
->encoding
[0] = 1;
211 for (i
= MIN_CHARSET_OFFICIAL_DIMENSION1
; i
<= MAX_CHARSET
; i
++)
212 fontp
->encoding
[i
] = 1;
213 /* Then override them by a specification in Vfont_encoding_alist. */
214 for (list
= Vfont_encoding_alist
; CONSP (list
); list
= XCONS (list
)->cdr
)
216 elt
= XCONS (list
)->car
;
218 && STRINGP (XCONS (elt
)->car
) && CONSP (XCONS (elt
)->cdr
)
219 && (fast_c_string_match_ignore_case (XCONS (elt
)->car
, fontname
)
224 for (tmp
= XCONS (elt
)->cdr
; CONSP (tmp
); tmp
= XCONS (tmp
)->cdr
)
225 if (CONSP (XCONS (tmp
)->car
)
226 && ((i
= get_charset_id (XCONS (XCONS (tmp
)->car
)->car
))
228 && INTEGERP (XCONS (XCONS (tmp
)->car
)->cdr
)
229 && XFASTINT (XCONS (XCONS (tmp
)->car
)->cdr
) < 4)
231 = XFASTINT (XCONS (XCONS (tmp
)->car
)->cdr
);
236 fontp
->font_encoder
= (struct ccl_program
*) 0;
237 for (list
= Vfont_ccl_encoder_alist
; CONSP (list
); list
= XCONS (list
)->cdr
)
239 elt
= XCONS (list
)->car
;
241 && STRINGP (XCONS (elt
)->car
) && VECTORP (XCONS (elt
)->cdr
)
242 && fast_c_string_match_ignore_case (XCONS (elt
)->car
, fontname
) >= 0)
245 = (struct ccl_program
*) xmalloc (sizeof (struct ccl_program
));
246 setup_ccl_program (fontp
->font_encoder
, XCONS (elt
)->cdr
);
251 /* If FONTSET is specified, setup various fields of it. */
254 fontsetp
->font_indexes
[charset
] = fontp
->font_idx
;
255 if (charset
== CHARSET_ASCII
)
257 /* Decide or change the size and height of this fontset. */
258 if (fontsetp
->size
== 0)
260 fontsetp
->size
= fontp
->size
;
261 fontsetp
->height
= fontp
->height
;
263 else if (fontsetp
->size
!= fontp
->size
264 || fontsetp
->height
!= fontp
->height
)
266 /* When loading ASCII font of the different size from
267 the size of FONTSET, we have to update the size of
268 FONTSET. Since changing the size of FONTSET may make
269 some fonts already loaded inappropriate to be used in
270 FONTSET, we must delete the record of such fonts. In
271 that case, we also have to calculate the height of
272 FONTSET from the remaining fonts. */
275 fontsetp
->size
= fontp
->size
;
276 fontsetp
->height
= fontp
->height
;
277 for (i
= CHARSET_ASCII
+ 1; i
<= MAX_CHARSET
; i
++)
279 font_idx
= fontsetp
->font_indexes
[i
];
282 struct font_info
*fontp2
= font_table
+ font_idx
;
284 if (fontp2
->size
!= fontp
->size
* CHARSET_WIDTH (i
))
285 fontsetp
->font_indexes
[i
] = FONT_NOT_OPENED
;
286 /* The following code should be disabled until
287 Emacs supports variable height lines. */
289 else if (fontsetp
->height
< fontp
->height
)
290 fontsetp
->height
= fontp
->height
;
301 /* Return ID of the fontset named NAME on frame F. */
304 fs_query_fontset (f
, name
)
308 struct fontset_data
*fontset_data
= FRAME_FONTSET_DATA (f
);
311 for (i
= 0; i
< fontset_data
->n_fontsets
; i
++)
312 if (!my_strcasecmp(name
, fontset_data
->fontset_table
[i
]->name
))
317 /* Register a fontset specified by FONTSET_INFO for frame FRAME.
318 Return the fontset ID if successfully registered, else return -1.
319 FONTSET_INFO is a cons of name of the fontset and FONTLIST, where
320 FONTLIST is an alist of charsets vs fontnames. */
323 fs_register_fontset (f
, fontset_info
)
325 Lisp_Object fontset_info
;
327 struct fontset_data
*fontset_data
= FRAME_FONTSET_DATA (f
);
328 Lisp_Object name
, fontlist
;
330 struct fontset_info
*fontsetp
;
333 if (!CONSP (fontset_info
)
334 || !STRINGP (XCONS (fontset_info
)->car
)
335 || !CONSP (XCONS (fontset_info
)->cdr
))
336 /* Invalid data in FONTSET_INFO. */
339 name
= XCONS (fontset_info
)->car
;
340 if ((fontset
= fs_query_fontset (f
, XSTRING (name
)->data
)) >= 0)
341 /* This fontset already exists on frame F. */
344 fontsetp
= (struct fontset_info
*) xmalloc (sizeof (struct fontset_info
));
346 fontsetp
->name
= (char *) xmalloc (XSTRING (name
)->size
+ 1);
347 bcopy(XSTRING (name
)->data
, fontsetp
->name
, XSTRING (name
)->size
+ 1);
349 fontsetp
->size
= fontsetp
->height
= 0;
351 for (i
= 0; i
<= MAX_CHARSET
; i
++)
353 fontsetp
->fontname
[i
] = (char *) 0;
354 fontsetp
->font_indexes
[i
] = FONT_NOT_OPENED
;
357 for (fontlist
= XCONS (fontset_info
)->cdr
; CONSP (fontlist
);
358 fontlist
= XCONS (fontlist
)->cdr
)
360 Lisp_Object tem
= Fcar (fontlist
);
364 && (charset
= get_charset_id (XCONS (tem
)->car
)) >= 0
365 && STRINGP (XCONS (tem
)->cdr
))
367 fontsetp
->fontname
[charset
]
368 = (char *) xmalloc (XSTRING (XCONS (tem
)->cdr
)->size
+ 1);
369 bcopy (XSTRING (XCONS (tem
)->cdr
)->data
,
370 fontsetp
->fontname
[charset
],
371 XSTRING (XCONS (tem
)->cdr
)->size
+ 1);
374 /* Broken or invalid data structure. */
378 /* Do we need to create the table? */
379 if (fontset_data
->fontset_table_size
== 0)
381 fontset_data
->fontset_table_size
= 8;
382 fontset_data
->fontset_table
383 = (struct fontset_info
**) xmalloc (fontset_data
->fontset_table_size
384 * sizeof (struct fontset_info
*));
386 /* Do we need to grow the table? */
387 else if (fontset_data
->n_fontsets
>= fontset_data
->fontset_table_size
)
389 fontset_data
->fontset_table_size
+= 8;
390 fontset_data
->fontset_table
391 = (struct fontset_info
**) xrealloc (fontset_data
->fontset_table
,
392 fontset_data
->fontset_table_size
393 * sizeof (struct fontset_info
*));
395 fontset
= fontset_data
->n_fontsets
++;
396 fontset_data
->fontset_table
[fontset
] = fontsetp
;
401 /* Cache data used by fontset_pattern_regexp. The car part is a
402 pattern string containing at least one wild card, the cdr part is
403 the corresponding regular expression. */
404 static Lisp_Object Vcached_fontset_data
;
406 #define CACHED_FONTSET_NAME (XSTRING (XCONS (Vcached_fontset_data)->car)->data)
407 #define CACHED_FONTSET_REGEX (XCONS (Vcached_fontset_data)->cdr)
409 /* If fontset name PATTERN contains any wild card, return regular
410 expression corresponding to PATTERN. */
413 fontset_pattern_regexp (pattern
)
416 if (!index (XSTRING (pattern
)->data
, '*')
417 && !index (XSTRING (pattern
)->data
, '?'))
418 /* PATTERN does not contain any wild cards. */
421 if (!CONSP (Vcached_fontset_data
)
422 || strcmp (XSTRING (pattern
)->data
, CACHED_FONTSET_NAME
))
424 /* We must at first update the cached data. */
425 char *regex
= (char *) alloca (XSTRING (pattern
)->size
* 2);
426 char *p0
, *p1
= regex
;
428 /* Convert "*" to ".*", "?" to ".". */
430 for (p0
= (char *) XSTRING (pattern
)->data
; *p0
; p0
++)
445 Vcached_fontset_data
= Fcons (build_string (XSTRING (pattern
)->data
),
446 build_string (regex
));
449 return CACHED_FONTSET_REGEX
;
452 DEFUN ("query-fontset", Fquery_fontset
, Squery_fontset
, 1, 1, 0,
453 "Return a fontset name which matches PATTERN, nil if no matching fontset.\n\
454 PATTERN can contain `*' or `?' as a wild card\n\
455 just like X's font name matching algorithm allows.")
459 Lisp_Object regexp
, tem
;
461 (*check_window_system_func
) ();
463 CHECK_STRING (pattern
, 0);
465 if (XSTRING (pattern
)->size
== 0)
468 tem
= Frassoc (pattern
, Vfontset_alias_alist
);
472 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 Lisp_Object
Fframe_char_width ();
497 /* Return a list of names of available fontsets matching PATTERN on
498 frame F. If SIZE is not 0, it is the size (maximum bound width) of
499 fontsets to be listed. */
502 list_fontsets (f
, pattern
, size
)
508 Lisp_Object regexp
, val
;
510 regexp
= fontset_pattern_regexp (pattern
);
513 for (i
= 0; i
< FRAME_FONTSET_DATA (f
)->n_fontsets
; i
++)
515 struct fontset_info
*fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[i
];
516 int name_matched
= 0;
517 int size_matched
= 0;
521 if (fast_c_string_match_ignore_case (regexp
, fontsetp
->name
) >= 0)
526 if (!my_strcasecmp (XSTRING (pattern
)->data
, fontsetp
->name
))
532 if (!size
|| fontsetp
->size
== size
)
534 else if (fontsetp
->size
== 0)
536 /* No font of this fontset has loaded yet. Try loading
540 for (j
= 0; j
<= MAX_CHARSET
; j
++)
541 if (fontsetp
->fontname
[j
])
543 if ((*load_font_func
) (f
, fontsetp
->fontname
[j
], size
))
550 val
= Fcons (build_string (fontsetp
->name
), val
);
557 DEFUN ("new-fontset", Fnew_fontset
, Snew_fontset
, 2, 2, 0,
558 "Create a new fontset NAME which contains fonts in FONTLIST.\n\
559 FONTLIST is an alist of charsets vs corresponding font names.")
561 Lisp_Object name
, fontlist
;
563 Lisp_Object fullname
, fontset_info
;
566 (*check_window_system_func
) ();
568 CHECK_STRING (name
, 0);
569 CHECK_LIST (fontlist
, 1);
571 fullname
= Fquery_fontset (name
);
572 if (!NILP (fullname
))
573 error ("Fontset \"%s\" matches the existing fontset \"%s\"",
574 XSTRING (name
)->data
, XSTRING (fullname
)->data
);
576 /* Check the validity of FONTLIST. */
577 for (tail
= fontlist
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
579 Lisp_Object tem
= XCONS (tail
)->car
;
583 || (charset
= get_charset_id (XCONS (tem
)->car
)) < 0
584 || !STRINGP (XCONS (tem
)->cdr
))
585 error ("Elements of fontlist must be a cons of charset and font name");
588 fontset_info
= Fcons (name
, fontlist
);
589 Vglobal_fontset_alist
= Fcons (fontset_info
, Vglobal_fontset_alist
);
591 /* Register this fontset for all existing frames. */
593 Lisp_Object framelist
, frame
;
595 FOR_EACH_FRAME (framelist
, frame
)
596 if (!FRAME_TERMCAP_P (XFRAME (frame
)))
597 fs_register_fontset (XFRAME (frame
), fontset_info
);
603 extern Lisp_Object
Fframe_parameters ();
604 extern Lisp_Object Qfont
;
605 Lisp_Object Qfontset
;
607 DEFUN ("set-fontset-font", Fset_fontset_font
, Sset_fontset_font
, 3, 4, 0,
608 "Set FONTNAME for a font of CHARSET in fontset NAME on frame FRAME.\n\
609 If FRAME is omitted or nil, all frames are affected.")
610 (name
, charset_symbol
, fontname
, frame
)
611 Lisp_Object name
, charset_symbol
, fontname
, frame
;
614 Lisp_Object fullname
, fontlist
;
616 (*check_window_system_func
) ();
618 CHECK_STRING (name
, 0);
619 CHECK_SYMBOL (charset_symbol
, 1);
620 CHECK_STRING (fontname
, 2);
622 CHECK_LIVE_FRAME (frame
, 3);
624 if ((charset
= get_charset_id (charset_symbol
)) < 0)
625 error ("Invalid charset: %s", XSYMBOL (charset_symbol
)->name
->data
);
627 fullname
= Fquery_fontset (name
);
629 error ("Fontset \"%s\" does not exist", XSTRING (name
)->data
);
631 /* If FRAME is not specified, we must, at first, update contents of
632 `global-fontset-alist' for a frame created in the future. */
635 Lisp_Object fontset_info
= Fassoc (fullname
, Vglobal_fontset_alist
);
636 Lisp_Object tem
= Fassq (charset_symbol
, XCONS (fontset_info
)->cdr
);
639 XCONS (fontset_info
)->cdr
640 = Fcons (Fcons (charset_symbol
, fontname
),
641 XCONS (fontset_info
)->cdr
);
643 XCONS (tem
)->cdr
= fontname
;
646 /* Then, update information in the specified frame or all existing
649 Lisp_Object framelist
, tem
;
651 FOR_EACH_FRAME (framelist
, tem
)
652 if (!FRAME_TERMCAP_P (XFRAME (tem
))
653 && (NILP (frame
) || EQ (frame
, tem
)))
655 FRAME_PTR f
= XFRAME (tem
);
656 int fontset
= fs_query_fontset (f
, XSTRING (fullname
)->data
);
657 struct fontset_info
*fontsetp
658 = FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
660 if (fontsetp
->fontname
[charset
])
661 xfree (fontsetp
->fontname
[charset
]);
662 fontsetp
->fontname
[charset
]
663 = (char *) xmalloc (XSTRING (fontname
)->size
+ 1);
664 bcopy (XSTRING (fontname
)->data
, fontsetp
->fontname
[charset
],
665 XSTRING (fontname
)->size
+ 1);
666 fontsetp
->font_indexes
[charset
] = FONT_NOT_OPENED
;
668 if (charset
== CHARSET_ASCII
)
670 Lisp_Object font_param
= Fassq (Qfont
, Fframe_parameters (tem
));
672 if (set_frame_fontset_func
673 && !NILP (font_param
)
674 && !strcmp (XSTRING (fullname
)->data
,
675 XSTRING (XCONS (font_param
)->cdr
)->data
))
676 /* This fontset is the default fontset on frame TEM.
677 We may have to resize this frame because of new
679 (*set_frame_fontset_func
) (f
, fullname
, Qnil
);
687 DEFUN ("font-info", Ffont_info
, Sfont_info
, 1, 2, 0,
688 "Return information about a font named NAME on frame FRAME.\n\
689 If FRAME is omitted or nil, use the selected frame.\n\
690 The returned value is a vector of OPENED-NAME, FULL-NAME, CHARSET, SIZE,\n\
691 HEIGHT, BASELINE-OFFSET, RELATIVE-COMPOSE, and DEFAULT-ASCENT,\n\
693 OPENED-NAME is the name used for opening the font,\n\
694 FULL-NAME is the full name of the font,\n\
695 CHARSET is the charset displayed by the font,\n\
696 SIZE is the minimum bound width of the font,\n\
697 HEIGHT is the height of the font,\n\
698 BASELINE-OFFSET is the upward offset pixels from ASCII baseline,\n\
699 RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling\n\
700 how to compose characters.\n\
701 If the named font is not yet loaded, return nil.")
703 Lisp_Object name
, frame
;
706 struct font_info
*fontp
;
709 (*check_window_system_func
) ();
711 CHECK_STRING (name
, 0);
716 CHECK_LIVE_FRAME (frame
, 1);
720 if (!query_font_func
)
721 error ("Font query function is not supported");
723 fontp
= (*query_font_func
) (f
, XSTRING (name
)->data
);
727 info
= Fmake_vector (make_number (8), Qnil
);
729 XVECTOR (info
)->contents
[0] = build_string (fontp
->name
);
730 XVECTOR (info
)->contents
[1] = build_string (fontp
->full_name
);
731 XVECTOR (info
)->contents
[2] = CHARSET_SYMBOL (fontp
->charset
);
732 XVECTOR (info
)->contents
[3] = make_number (fontp
->size
);
733 XVECTOR (info
)->contents
[4] = make_number (fontp
->height
);
734 XVECTOR (info
)->contents
[5] = make_number (fontp
->baseline_offset
);
735 XVECTOR (info
)->contents
[6] = make_number (fontp
->relative_compose
);
736 XVECTOR (info
)->contents
[7] = make_number (fontp
->default_ascent
);
741 DEFUN ("fontset-info", Ffontset_info
, Sfontset_info
, 1, 2, 0,
742 "Return information about a fontset named NAME on frame FRAME.\n\
743 If FRAME is omitted or nil, use the selected frame.\n\
744 The returned value is a vector of SIZE, HEIGHT, and FONT-LIST,\n\
746 SIZE is the minimum bound width of ASCII font of the fontset,\n\
747 HEIGHT is the height of the tallest font in the fontset, and\n\
748 FONT-LIST is an alist of the format:\n\
749 (CHARSET REQUESTED-FONT-NAME LOADED-FONT-NAME).\n\
750 LOADED-FONT-NAME t means the font is not yet loaded, nil means the\n\
753 Lisp_Object name
, frame
;
757 struct fontset_info
*fontsetp
;
758 Lisp_Object info
, val
;
761 (*check_window_system_func
) ();
763 CHECK_STRING(name
, 0);
768 CHECK_LIVE_FRAME (frame
, 1);
772 fontset
= fs_query_fontset (f
, XSTRING (name
)->data
);
774 error ("Fontset \"%s\" does not exist", XSTRING (name
)->data
);
776 info
= Fmake_vector (make_number (3), Qnil
);
778 fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
780 XVECTOR (info
)->contents
[0] = make_number (fontsetp
->size
);
781 XVECTOR (info
)->contents
[1] = make_number (fontsetp
->height
);
783 for (i
= 0; i
<= MAX_CHARSET
; i
++)
784 if (fontsetp
->fontname
[i
])
786 int font_idx
= fontsetp
->font_indexes
[i
];
789 if (font_idx
== FONT_NOT_OPENED
)
791 else if (font_idx
== FONT_NOT_FOUND
)
795 = build_string ((*get_font_info_func
) (f
, font_idx
)->full_name
);
796 val
= Fcons (Fcons (CHARSET_SYMBOL (i
),
797 Fcons (build_string (fontsetp
->fontname
[i
]),
798 Fcons (loaded
, Qnil
))),
801 XVECTOR (info
)->contents
[2] = val
;
809 for (i
= 0; i
< 256; i
++)
810 my_strcasetbl
[i
] = (i
>= 'A' && i
<= 'Z') ? i
+ 'a' - 'A' : i
;
813 /* Window system initializer should have set proper functions. */
816 Qfontset
= intern ("fontset");
817 staticpro (&Qfontset
);
819 Vcached_fontset_data
= Qnil
;
820 staticpro (&Vcached_fontset_data
);
822 DEFVAR_LISP ("global-fontset-alist", &Vglobal_fontset_alist
,
823 "Internal data for fontset. Not for external use.\n\
824 This is an alist associating fontset names with the lists of fonts\n\
825 contained in them.\n\
826 Newly created frames make their own fontset database from here.");
827 Vglobal_fontset_alist
= Qnil
;
829 DEFVAR_LISP ("font-encoding-alist", &Vfont_encoding_alist
,
830 "Alist of fontname patterns vs corresponding encoding info.\n\
831 Each element looks like (REGEXP . ENCODING-INFO),\n\
832 where ENCODING-INFO is an alist of CHARSET vs ENCODING.\n\
833 ENCODING is one of the following integer values:\n\
834 0: code points 0x20..0x7F or 0x2020..0x7F7F are used,\n\
835 1: code points 0xA0..0xFF or 0xA0A0..0xFFFF are used,\n\
836 2: code points 0x20A0..0x7FFF are used,\n\
837 3: code points 0xA020..0xFF7F are used.");
838 Vfont_encoding_alist
= Qnil
;
840 DEFVAR_LISP ("use-default-ascent", &Vuse_default_ascent
,
841 "Char table of characters whose ascent values should be ignored.\n\
842 If an entry for a character is non-nil, the ascent value of the glyph\n\
843 is assumed to be what specified by _MULE_DEFAULT_ASCENT property of a font.\n\
845 This affects how a composite character which contains\n\
846 such a character is displayed on screen.");
847 Vuse_default_ascent
= Qnil
;
849 DEFVAR_LISP ("ignore-relative-composition", &Vignore_relative_composition
,
850 "Char table of characters which is not composed relatively.\n\
851 If an entry for a character is non-nil, a composite character\n\
852 which contains that character is displayed so that\n\
853 the glyph of that character is put without considering\n\
854 an ascent and descent value of a previous character.");
855 Vuse_default_ascent
= Qnil
;
857 DEFVAR_LISP ("alternate-fontname-alist", &Valternate_fontname_alist
,
858 "Alist of fontname vs list of the alternate fontnames.\n\
859 When a specified font name is not found, the corresponding\n\
860 alternate fontnames (if any) are tried instead.");
861 Valternate_fontname_alist
= Qnil
;
863 DEFVAR_LISP ("fontset-alias-alist", &Vfontset_alias_alist
,
864 "Alist of fontset names vs the aliases.");
865 Vfontset_alias_alist
= Qnil
;
867 DEFVAR_LISP ("highlight-wrong-size-font", &Vhighlight_wrong_size_font
,
868 "*Non-nil means highlight characters shown in wrong size fonts somehow.\n\
869 The way to highlight them depends on window system on which Emacs runs.\n\
870 On X11, a rectangle is shown around each such character.");
871 Vhighlight_wrong_size_font
= Qnil
;
873 DEFVAR_LISP ("clip-large-size-font", &Vclip_large_size_font
,
874 "*Non-nil means characters shown in overlarge fonts are clipped.\n\
875 The height of clipping area is the same as that of an ASCII character.\n\
876 The width of the area is the same as that of an ASCII character,\n\
877 or twice as wide, depending on the character set's column-width.\n\
879 If the only font you have for a specific character set is too large,\n\
880 and clipping these characters makes them hard to read,\n\
881 you can set this variable to nil to display the characters without clipping.\n\
882 The drawback is that you will get some garbage left on your screen.");
883 Vclip_large_size_font
= Qt
;
885 defsubr (&Squery_fontset
);
886 defsubr (&Snew_fontset
);
887 defsubr (&Sset_fontset_font
);
888 defsubr (&Sfont_info
);
889 defsubr (&Sfontset_info
);