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
) (/* 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
) (/* Lisp_Object pattern, face, frame, width */);
69 /* Load a font named NAME for frame F and return a pointer to the
70 information of the loaded font. If loading is failed, return 0. */
71 struct font_info
*(*load_font_func
) (/* FRAME_PTR f; char *name */);
73 /* Return a pointer to struct font_info of a font named NAME for frame F. */
74 struct font_info
*(*query_font_func
) (/* FRAME_PTR f; char *name */);
76 /* Additional function for setting fontset or changing fontset
77 contents of frame F. */
78 void (*set_frame_fontset_func
) (/* FRAME_PTR f; Lisp_Object arg, oldval */);
80 /* Check if any window system is used now. */
81 void (*check_window_system_func
) ();
86 struct fontset_data
*fontset_data
87 = (struct fontset_data
*) xmalloc (sizeof (struct fontset_data
));
89 bzero (fontset_data
, sizeof (struct fontset_data
));
95 free_fontset_data (fontset_data
)
96 struct fontset_data
*fontset_data
;
100 for (i
= 0; i
< fontset_data
->n_fontsets
; i
++)
104 xfree (fontset_data
->fontset_table
[i
]->name
);
105 for (j
= 0; j
<= MAX_CHARSET
; j
++)
106 if (fontset_data
->fontset_table
[i
]->fontname
[j
])
107 xfree (fontset_data
->fontset_table
[i
]->fontname
[j
]);
108 xfree (fontset_data
->fontset_table
[i
]);
110 xfree (fontset_data
->fontset_table
);
112 xfree (fontset_data
);
115 /* Load a font named FONTNAME for displaying CHARSET on frame F.
116 All fonts for frame F is stored in a table pointed by FONT_TABLE.
117 Return a pointer to the struct font_info of the loaded font.
118 If loading fails, return 0;
119 If FONTNAME is NULL, the name is taken from the information of FONTSET.
120 If FONTSET is given, try to load a font whose size matches that of
121 FONTSET, and, the font index is stored in the table for FONTSET.
123 If you give FONTSET argument, don't call this function directry,
124 instead call macro FS_LOAD_FONT with the same argument. */
127 fs_load_font (f
, font_table
, charset
, fontname
, fontset
)
129 struct font_info
*font_table
;
130 int charset
, fontset
;
133 Lisp_Object font_list
;
134 Lisp_Object list
, elt
;
137 struct fontset_info
*fontsetp
= 0;
138 struct font_info
*fontp
;
140 if (fontset
>= 0 && fontset
< FRAME_FONTSET_DATA (f
)->n_fontsets
)
142 fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
143 font_idx
= fontsetp
->font_indexes
[charset
];
145 /* We have already loaded a font. */
146 return font_table
+ font_idx
;
147 else if (font_idx
== FONT_NOT_FOUND
)
148 /* We have already tried loading a font and failed. */
151 fontname
= fontsetp
->fontname
[charset
];
155 /* No way to get fontname. */
158 /* If CHARSET is not ASCII and FONTSET is specified, we must load a
159 font of appropriate size to be used with other fonts in this
161 if (charset
!= CHARSET_ASCII
&& fontsetp
)
163 /* If we have not yet loaded ASCII font of FONTSET, we must load
164 it now to decided the size and height of this fontset. */
165 if (fontsetp
->size
== 0)
167 fontp
= fs_load_font (f
, font_table
, CHARSET_ASCII
, 0, fontset
);
169 /* Any fontset should contain avairable ASCII. */
172 /* Now we have surely decided the size of this fontset. */
173 size
= fontsetp
->size
* CHARSET_WIDTH (charset
);
176 fontp
= (*load_font_func
) (f
, fontname
, size
);
181 fontsetp
->font_indexes
[charset
] = FONT_NOT_FOUND
;
185 /* Fill in fields (CHARSET, ENCODING, and FONT_ENCODER) which are
186 not set by (*load_font_func). */
187 fontp
->charset
= charset
;
189 if (fontp
->encoding
[1] != FONT_ENCODING_NOT_DECIDED
)
191 /* The font itself tells which code points to be used. Use this
192 encoding for all other charsets. */
195 fontp
->encoding
[0] = fontp
->encoding
[1];
196 for (i
= MIN_CHARSET_OFFICIAL_DIMENSION1
; i
<= MAX_CHARSET
; i
++)
197 fontp
->encoding
[i
] = fontp
->encoding
[1];
201 /* The font itself doesn't tell which code points to be used. */
204 /* At first, set 1 (means 0xA0..0xFF) as the default. */
205 fontp
->encoding
[0] = 1;
206 for (i
= MIN_CHARSET_OFFICIAL_DIMENSION1
; i
<= MAX_CHARSET
; i
++)
207 fontp
->encoding
[i
] = 1;
208 /* Then override them by a specification in Vfont_encoding_alist. */
209 for (list
= Vfont_encoding_alist
; CONSP (list
); list
= XCONS (list
)->cdr
)
211 elt
= XCONS (list
)->car
;
213 && STRINGP (XCONS (elt
)->car
) && CONSP (XCONS (elt
)->cdr
)
214 && (fast_c_string_match_ignore_case (XCONS (elt
)->car
, fontname
)
219 for (tmp
= XCONS (elt
)->cdr
; CONSP (tmp
); tmp
= XCONS (tmp
)->cdr
)
220 if (CONSP (XCONS (tmp
)->car
)
221 && ((i
= get_charset_id (XCONS (XCONS (tmp
)->car
)->car
))
223 && INTEGERP (XCONS (XCONS (tmp
)->car
)->cdr
)
224 && XFASTINT (XCONS (XCONS (tmp
)->car
)->cdr
) < 4)
226 = XFASTINT (XCONS (XCONS (tmp
)->car
)->cdr
);
231 fontp
->font_encoder
= (struct ccl_program
*) 0;
232 for (list
= Vfont_ccl_encoder_alist
; CONSP (list
); list
= XCONS (list
)->cdr
)
234 elt
= XCONS (list
)->car
;
236 && STRINGP (XCONS (elt
)->car
) && VECTORP (XCONS (elt
)->cdr
)
237 && fast_c_string_match_ignore_case (XCONS (elt
)->car
, fontname
) >= 0)
240 = (struct ccl_program
*) xmalloc (sizeof (struct ccl_program
));
241 setup_ccl_program (fontp
->font_encoder
, XCONS (elt
)->cdr
);
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, 1, 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.")
454 Lisp_Object regexp
, tem
;
456 (*check_window_system_func
) ();
458 CHECK_STRING (pattern
, 0);
460 if (XSTRING (pattern
)->size
== 0)
463 tem
= Frassoc (pattern
, Vfontset_alias_alist
);
467 regexp
= fontset_pattern_regexp (pattern
);
469 for (tem
= Vglobal_fontset_alist
; CONSP (tem
); tem
= XCONS (tem
)->cdr
)
471 Lisp_Object fontset_name
= XCONS (XCONS (tem
)->car
)->car
;
474 if (fast_c_string_match_ignore_case (regexp
,
475 XSTRING (fontset_name
)->data
)
481 if (!my_strcasecmp (XSTRING (pattern
)->data
,
482 XSTRING (fontset_name
)->data
))
490 Lisp_Object
Fframe_char_width ();
492 /* Return a list of names of available fontsets matching PATTERN on
493 frame F. If SIZE is not 0, it is the size (maximum bound width) of
494 fontsets to be listed. */
497 list_fontsets (f
, pattern
, size
)
503 Lisp_Object regexp
, val
;
505 regexp
= fontset_pattern_regexp (pattern
);
508 for (i
= 0; i
< FRAME_FONTSET_DATA (f
)->n_fontsets
; i
++)
510 struct fontset_info
*fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[i
];
511 int name_matched
= 0;
512 int size_matched
= 0;
516 if (fast_c_string_match_ignore_case (regexp
, fontsetp
->name
) >= 0)
521 if (!my_strcasecmp (XSTRING (pattern
)->data
, fontsetp
->name
))
527 if (!size
|| fontsetp
->size
== size
)
529 else if (fontsetp
->size
== 0)
531 /* No font of this fontset has loaded yet. Try loading
535 for (j
= 0; j
<= MAX_CHARSET
; j
++)
536 if (fontsetp
->fontname
[j
])
538 if ((*load_font_func
) (f
, fontsetp
->fontname
[j
], size
))
545 val
= Fcons (build_string (fontsetp
->name
), val
);
552 DEFUN ("new-fontset", Fnew_fontset
, Snew_fontset
, 2, 2, 0,
553 "Create a new fontset NAME which contains fonts in FONTLIST.\n\
554 FONTLIST is an alist of charsets vs corresponding font names.")
556 Lisp_Object name
, fontlist
;
558 Lisp_Object fullname
, fontset_info
;
561 (*check_window_system_func
) ();
563 CHECK_STRING (name
, 0);
564 CHECK_LIST (fontlist
, 1);
566 fullname
= Fquery_fontset (name
);
567 if (!NILP (fullname
))
568 error ("Fontset \"%s\" matches the existing fontset \"%s\"",
569 XSTRING (name
)->data
, XSTRING (fullname
)->data
);
571 /* Check the validity of FONTLIST. */
572 for (tail
= fontlist
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
574 Lisp_Object tem
= XCONS (tail
)->car
;
578 || (charset
= get_charset_id (XCONS (tem
)->car
)) < 0
579 || !STRINGP (XCONS (tem
)->cdr
))
580 error ("Elements of fontlist must be a cons of charset and font name");
583 fontset_info
= Fcons (name
, fontlist
);
584 Vglobal_fontset_alist
= Fcons (fontset_info
, Vglobal_fontset_alist
);
586 /* Register this fontset for all existing frames. */
588 Lisp_Object framelist
, frame
;
590 FOR_EACH_FRAME (framelist
, frame
)
591 if (!FRAME_TERMCAP_P (XFRAME (frame
)))
592 fs_register_fontset (XFRAME (frame
), fontset_info
);
598 extern Lisp_Object
Fframe_parameters ();
599 extern Lisp_Object Qfont
;
600 Lisp_Object Qfontset
;
602 DEFUN ("set-fontset-font", Fset_fontset_font
, Sset_fontset_font
, 3, 4, 0,
603 "Set FONTNAME for a font of CHARSET in fontset NAME on frame FRAME.\n\
604 If FRAME is omitted or nil, all frames are affected.")
605 (name
, charset_symbol
, fontname
, frame
)
606 Lisp_Object name
, charset_symbol
, fontname
, frame
;
609 Lisp_Object fullname
, fontlist
;
611 (*check_window_system_func
) ();
613 CHECK_STRING (name
, 0);
614 CHECK_SYMBOL (charset_symbol
, 1);
615 CHECK_STRING (fontname
, 2);
617 CHECK_LIVE_FRAME (frame
, 3);
619 if ((charset
= get_charset_id (charset_symbol
)) < 0)
620 error ("Invalid charset: %s", XSYMBOL (charset_symbol
)->name
->data
);
622 fullname
= Fquery_fontset (name
);
624 error ("Fontset \"%s\" does not exist", XSTRING (name
)->data
);
626 /* If FRAME is not specified, we must, at first, update contents of
627 `global-fontset-alist' for a frame created in the future. */
630 Lisp_Object fontset_info
= Fassoc (fullname
, Vglobal_fontset_alist
);
631 Lisp_Object tem
= Fassq (charset_symbol
, XCONS (fontset_info
)->cdr
);
634 XCONS (fontset_info
)->cdr
635 = Fcons (Fcons (charset_symbol
, fontname
),
636 XCONS (fontset_info
)->cdr
);
638 XCONS (tem
)->cdr
= fontname
;
641 /* Then, update information in the specified frame or all existing
644 Lisp_Object framelist
, tem
;
646 FOR_EACH_FRAME (framelist
, tem
)
647 if (!FRAME_TERMCAP_P (XFRAME (tem
))
648 && (NILP (frame
) || EQ (frame
, tem
)))
650 FRAME_PTR f
= XFRAME (tem
);
651 int fontset
= fs_query_fontset (f
, XSTRING (fullname
)->data
);
652 struct fontset_info
*fontsetp
653 = FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
655 if (fontsetp
->fontname
[charset
])
656 xfree (fontsetp
->fontname
[charset
]);
657 fontsetp
->fontname
[charset
]
658 = (char *) xmalloc (XSTRING (fontname
)->size
+ 1);
659 bcopy (XSTRING (fontname
)->data
, fontsetp
->fontname
[charset
],
660 XSTRING (fontname
)->size
+ 1);
661 fontsetp
->font_indexes
[charset
] = FONT_NOT_OPENED
;
663 if (charset
== CHARSET_ASCII
)
665 Lisp_Object font_param
= Fassq (Qfont
, Fframe_parameters (tem
));
667 if (set_frame_fontset_func
668 && !NILP (font_param
)
669 && !strcmp (XSTRING (fullname
)->data
,
670 XSTRING (XCONS (font_param
)->cdr
)->data
))
671 /* This fontset is the default fontset on frame TEM.
672 We may have to resize this frame because of new
674 (*set_frame_fontset_func
) (f
, fullname
, Qnil
);
682 DEFUN ("font-info", Ffont_info
, Sfont_info
, 1, 2, 0,
683 "Return information about a font named NAME on frame FRAME.\n\
684 If FRAME is omitted or nil, use the selected frame.\n\
685 The returned value is a vector of OPENED-NAME, FULL-NAME, CHARSET, SIZE,\n\
686 HEIGHT, BASELINE-OFFSET, RELATIVE-COMPOSE, and DEFAULT-ASCENT,\n\
688 OPENED-NAME is the name used for opening the font,\n\
689 FULL-NAME is the full name of the font,\n\
690 CHARSET is the charset displayed by the font,\n\
691 SIZE is the minimum bound width of the font,\n\
692 HEIGHT is the height of the font,\n\
693 BASELINE-OFFSET is the upward offset pixels from ASCII baseline,\n\
694 RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling\n\
695 how to compose characters.\n\
696 If the named font is not yet loaded, return nil.")
698 Lisp_Object name
, frame
;
701 struct font_info
*fontp
;
704 (*check_window_system_func
) ();
706 CHECK_STRING (name
, 0);
711 CHECK_LIVE_FRAME (frame
, 1);
715 if (!query_font_func
)
716 error ("Font query function is not supported");
718 fontp
= (*query_font_func
) (f
, XSTRING (name
)->data
);
722 info
= Fmake_vector (make_number (8), Qnil
);
724 XVECTOR (info
)->contents
[0] = build_string (fontp
->name
);
725 XVECTOR (info
)->contents
[1] = build_string (fontp
->full_name
);
726 XVECTOR (info
)->contents
[2] = CHARSET_SYMBOL (fontp
->charset
);
727 XVECTOR (info
)->contents
[3] = make_number (fontp
->size
);
728 XVECTOR (info
)->contents
[4] = make_number (fontp
->height
);
729 XVECTOR (info
)->contents
[5] = make_number (fontp
->baseline_offset
);
730 XVECTOR (info
)->contents
[6] = make_number (fontp
->relative_compose
);
731 XVECTOR (info
)->contents
[7] = make_number (fontp
->default_ascent
);
736 DEFUN ("fontset-info", Ffontset_info
, Sfontset_info
, 1, 2, 0,
737 "Return information about a fontset named NAME on frame FRAME.\n\
738 If FRAME is omitted or nil, use the selected frame.\n\
739 The returned value is a vector of SIZE, HEIGHT, and FONT-LIST,\n\
741 SIZE is the minimum bound width of ASCII font of the fontset,\n\
742 HEIGHT is the height of the tallest font in the fontset, and\n\
743 FONT-LIST is an alist of the format:\n\
744 (CHARSET REQUESTED-FONT-NAME LOADED-FONT-NAME).\n\
745 LOADED-FONT-NAME t means the font is not yet loaded, nil means the\n\
748 Lisp_Object name
, frame
;
752 struct fontset_info
*fontsetp
;
753 Lisp_Object info
, val
;
756 (*check_window_system_func
) ();
758 CHECK_STRING(name
, 0);
763 CHECK_LIVE_FRAME (frame
, 1);
767 fontset
= fs_query_fontset (f
, XSTRING (name
)->data
);
769 error ("Fontset \"%s\" does not exist", XSTRING (name
)->data
);
771 info
= Fmake_vector (make_number (3), Qnil
);
773 fontsetp
= FRAME_FONTSET_DATA (f
)->fontset_table
[fontset
];
775 XVECTOR (info
)->contents
[0] = make_number (fontsetp
->size
);
776 XVECTOR (info
)->contents
[1] = make_number (fontsetp
->height
);
778 for (i
= 0; i
<= MAX_CHARSET
; i
++)
779 if (fontsetp
->fontname
[i
])
781 int font_idx
= fontsetp
->font_indexes
[i
];
784 if (font_idx
== FONT_NOT_OPENED
)
786 else if (font_idx
== FONT_NOT_FOUND
)
790 = build_string ((*get_font_info_func
) (f
, font_idx
)->full_name
);
791 val
= Fcons (Fcons (CHARSET_SYMBOL (i
),
792 Fcons (build_string (fontsetp
->fontname
[i
]),
793 Fcons (loaded
, Qnil
))),
796 XVECTOR (info
)->contents
[2] = val
;
804 for (i
= 0; i
< 256; i
++)
805 my_strcasetbl
[i
] = (i
>= 'A' && i
<= 'Z') ? i
+ 'a' - 'A' : i
;
808 /* Window system initializer should have set proper functions. */
811 Qfontset
= intern ("fontset");
812 staticpro (&Qfontset
);
814 Vcached_fontset_data
= Qnil
;
815 staticpro (&Vcached_fontset_data
);
817 DEFVAR_LISP ("global-fontset-alist", &Vglobal_fontset_alist
,
818 "Internal data for fontset. Not for external use.\n\
819 This is an alist associating fontset names with the lists of fonts\n\
820 contained in them.\n\
821 Newly created frames make their own fontset database from here.");
822 Vglobal_fontset_alist
= Qnil
;
824 DEFVAR_LISP ("font-encoding-alist", &Vfont_encoding_alist
,
825 "Alist of fontname patterns vs corresponding encoding info.\n\
826 Each element looks like (REGEXP . ENCODING-INFO),\n\
827 where ENCODING-INFO is an alist of CHARSET vs ENCODING.\n\
828 ENCODING is one of the following integer values:\n\
829 0: code points 0x20..0x7F or 0x2020..0x7F7F are used,\n\
830 1: code points 0xA0..0xFF or 0xA0A0..0xFFFF are used,\n\
831 2: code points 0x20A0..0x7FFF are used,\n\
832 3: code points 0xA020..0xFF7F are used.");
833 Vfont_encoding_alist
= Qnil
;
835 DEFVAR_LISP ("use-default-ascent", &Vuse_default_ascent
,
836 "Char table of characters whose ascent values should be ignored.\n\
837 If an entry for a character is non-nil, the ascent value of the glyph\n\
838 is assumed to be what specified by _MULE_DEFAULT_ASCENT property of a font.\n\
840 This affects how a composite character which contains\n\
841 such a character is displayed on screen.");
842 Vuse_default_ascent
= Qnil
;
844 DEFVAR_LISP ("ignore-relative-composition", &Vignore_relative_composition
,
845 "Char table of characters which is not composed relatively.\n\
846 If an entry for a character is non-nil, a composite character\n\
847 which contains that character is displayed so that\n\
848 the glyph of that character is put without considering\n\
849 an ascent and descent value of a previous character.");
850 Vuse_default_ascent
= Qnil
;
852 DEFVAR_LISP ("alternate-fontname-alist", &Valternate_fontname_alist
,
853 "Alist of fontname vs list of the alternate fontnames.\n\
854 When a specified font name is not found, the corresponding\n\
855 alternate fontnames (if any) are tried instead.");
856 Valternate_fontname_alist
= Qnil
;
858 DEFVAR_LISP ("fontset-alias-alist", &Vfontset_alias_alist
,
859 "Alist of fontset names vs the aliases.");
860 Vfontset_alias_alist
= Qnil
;
862 DEFVAR_LISP ("highlight-wrong-size-font", &Vhighlight_wrong_size_font
,
863 "*Non-nil means highlight characters shown in wrong size fonts somehow.\n\
864 The way to highlight them depends on window system on which Emacs runs.\n\
865 On X11, a rectangle is shown around each such character.");
866 Vhighlight_wrong_size_font
= Qnil
;
868 DEFVAR_LISP ("clip-large-size-font", &Vclip_large_size_font
,
869 "*Non-nil means characters shown in overlarge fonts are clipped.\n\
870 The height of clipping area is the same as that of an ASCII character.\n\
871 The width of the area is the same as that of an ASCII character,\n\
872 or twice as wide, depending on the character set's column-width.\n\
874 If the only font you have for a specific character set is too large,\n\
875 and clipping these characters makes them hard to read,\n\
876 you can set this variable to nil to display the characters without clipping.\n\
877 The drawback is that you will get some garbage left on your screen.");
878 Vclip_large_size_font
= Qt
;
880 defsubr (&Squery_fontset
);
881 defsubr (&Snew_fontset
);
882 defsubr (&Sset_fontset_font
);
883 defsubr (&Sfont_info
);
884 defsubr (&Sfontset_info
);