1 /* fontset.c -- fontset module.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 @addtogroup m17nFontset
25 @brief A fontset is an object that maps a character to fonts.
27 A @e fontset is an object of the type @c MFontset. When drawing an
28 M-text, a fontset provides rules to select a font for each
29 character in the M-text according to the following information.
31 @li The script character property of a character.
32 @li The language text property of a character.
33 @li The charset text property of a character.
35 The documentation of mdraw_text () describes how that information is
38 /***ja @addtogroup m17nFontset
40 @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ïʸ»ú¤«¤é¥Õ¥©¥ó¥È¤Ø¤ÎÂбþÉÕ¤±¤ò¹Ô¤¦¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
42 @e ¥Õ¥©¥ó¥È¥»¥Ã¥È ¤Ï @c MFontset ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£M-text ¤ò
43 ɽ¼¨¤¹¤ëºÝ¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï M-text Ãæ¤Î¸Ä¡¹¤Îʸ»ú¤ËÂФ·¤Æ¤É¤Î¥Õ¥©
44 ¥ó¥È¤òÍѤ¤¤ë¤«¤Îµ¬Â§¤ò¡¢°Ê²¼¤Î¾ðÊó¤Ë½¾¤Ã¤ÆÍ¿¤¨¤ë¡£
46 @li ʸ»ú¤Îʸ»ú¥×¥í¥Ñ¥Æ¥£ "¥¹¥¯¥ê¥×¥È"
47 @li ʸ»ú¤Î¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£ "¸À¸ì"
48 @li ʸ»ú¤Î¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£ "ʸ»ú¥»¥Ã¥È"
50 ¤³¤ì¤é¤Î¾ðÊ󤬤ɤΤ褦¤ËÍѤ¤¤é¤ì¤ë¤«¤Ï mdraw_text () ¤ÎÀâÌÀ¤ò»²¾È
57 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
58 /*** @addtogroup m17nInternal
68 #include "m17n-misc.h"
72 #include "character.h"
74 #include "internal-gui.h"
82 /* Name of the fontset. */
85 /* Initialized to 0, and incremented by one each time the fontset is
89 /* Database from which to load the contents of the fontset. Once
90 loaded, this member is set to NULL. */
93 /* SCRIPT vs PER-LANGUAGE (which is a plist LANGUAGE vs FONT-GROUP) */
96 /* CHARSET vs FONT-GROUP */
102 /* Plist of Mt vs font specs. */
103 MPlist *font_spec_list;
106 static MFontset *default_fontset;
108 static MPlist *fontset_list;
110 struct MRealizedFontset
112 /* Fontset from which the realized fontset is realized. */
115 /* Initialized to <fontset>->tick. */
118 /* Font spec extracted from a face. */
121 /* The frame on which the realized fontset is realized. */
133 load_font_group (MPlist *plist, MPlist *elt, MPlist *spec_list)
137 /* ELT ::= ( FONT-SPEC-LIST [ LAYOUTER ] ) ... */
139 MFont font, *spec = NULL;
140 MSymbol layouter_name;
142 if (! MPLIST_PLIST_P (elt))
143 MWARNING (MERROR_FONTSET);
144 elt2 = MPLIST_PLIST (elt);
145 if (! MPLIST_PLIST_P (elt2))
146 MWARNING (MERROR_FONTSET);
147 mfont__set_spec_from_plist (&font, MPLIST_PLIST (elt2));
148 MPLIST_DO (p, spec_list)
150 if (! memcmp (MPLIST_VAL (p), &font, sizeof (MFont)))
152 spec = MPLIST_VAL (p);
158 MSTRUCT_MALLOC (spec, MERROR_FONTSET);
160 mplist_add (spec_list, Mt, spec);
162 elt2 = MPLIST_NEXT (elt2);
164 if (MPLIST_SYMBOL_P (elt2))
165 layouter_name = MPLIST_SYMBOL (elt2);
166 if (layouter_name == Mnil)
168 plist = mplist_add (plist, layouter_name, spec);
171 /* ANSI-C requires some statement after a label. */
177 /* Load FONTSET->per_script from the data in FONTSET->mdb. */
180 load_fontset_contents (MFontset *fontset)
182 MPlist *per_script, *per_charset, *fallback, *spec_list, *font_group;
183 MSymbol script, lang;
184 MPlist *fontset_def, *plist;
186 fontset->per_script = per_script = mplist ();
187 fontset->per_charset = per_charset = mplist ();
188 fontset->fallback = fallback = mplist ();
189 fontset->font_spec_list = spec_list = mplist ();
190 if (! (fontset_def = (MPlist *) mdatabase_load (fontset->mdb)))
193 MPLIST_DO (plist, fontset_def)
195 /* PLIST ::= ( SCRIPT ( LANGUAGE FONT-SPEC-ELT ... ) ... )
196 | (CHARSET FONT-SPEC-ELT ...)
200 if (! MPLIST_PLIST_P (plist))
201 MWARNING (MERROR_FONTSET);
202 elt = MPLIST_PLIST (plist);
203 if (! MPLIST_SYMBOL_P (elt))
204 MWARNING (MERROR_FONTSET);
205 script = MPLIST_SYMBOL (elt);
206 elt = MPLIST_NEXT (elt);
207 if (! MPLIST_PLIST_P (elt))
208 MWARNING (MERROR_FONTSET);
210 fallback = load_font_group (fallback, elt, spec_list);
211 else if (MPLIST_PLIST_P (MPLIST_PLIST (elt)))
213 font_group = mplist_find_by_key (fontset->per_charset, script);
216 font_group = mplist ();
217 per_charset = mplist_add (per_charset, script, font_group);
219 load_font_group (font_group, elt, spec_list);
223 MPlist *per_lang = mplist_find_by_key (fontset->per_script, script);
227 per_lang = mplist ();
228 per_script = mplist_add (per_script, script, per_lang);
233 /* ELT ::= ( LANGUAGE FONT-DEF ...) ... */
236 if (! MPLIST_PLIST_P (elt))
237 MWARNING (MERROR_FONTSET);
238 elt2 = MPLIST_PLIST (elt);
239 if (! MPLIST_SYMBOL_P (elt2))
240 MWARNING (MERROR_FONTSET);
241 lang = MPLIST_SYMBOL (elt2);
244 font_group = mplist_find_by_key (per_lang, lang);
247 font_group = mplist ();
248 mplist_add (per_lang, lang, font_group);
250 elt2 = MPLIST_NEXT (elt2);
251 load_font_group (font_group, elt2, spec_list);
257 /* ANSI-C requires some statement after a label. */
261 M17N_OBJECT_UNREF (fontset_def);
266 free_fontset (void *object)
268 MFontset *fontset = (MFontset *) object;
269 MPlist *plist, *pl, *p;
271 if (fontset->per_script)
273 MPLIST_DO (plist, fontset->per_script)
275 MPLIST_DO (pl, MPLIST_PLIST (plist))
277 p = MPLIST_PLIST (pl);
278 M17N_OBJECT_UNREF (p);
280 pl = MPLIST_PLIST (plist);
281 M17N_OBJECT_UNREF (pl);
283 M17N_OBJECT_UNREF (fontset->per_script);
285 if (fontset->per_charset)
287 MPLIST_DO (plist, fontset->per_charset)
289 pl = MPLIST_PLIST (plist);
290 M17N_OBJECT_UNREF (pl);
292 M17N_OBJECT_UNREF (fontset->per_charset);
294 if (fontset->fallback)
295 M17N_OBJECT_UNREF (fontset->fallback);
296 plist = mplist_find_by_key (fontset_list, fontset->name);
300 if (fontset->font_spec_list)
302 if (((M17NObject *) (fontset->font_spec_list))->ref_count == 1)
303 MPLIST_DO (plist, fontset->font_spec_list)
304 free (MPLIST_VAL (plist));
305 M17N_OBJECT_UNREF (fontset->font_spec_list);
311 realize_font_group (MFrame *frame, MFont *request, MPlist *font_group,
314 MPlist *plist = MPLIST_VAL (font_group), *pl, *p;
316 mplist_set (font_group, Mnil, NULL);
317 MPLIST_DO (pl, plist)
319 MSymbol layouter = MPLIST_KEY (pl);
320 MFont this_request = *request;
321 MRealizedFont *rfont;
323 mfont__resize (MPLIST_VAL (pl), &this_request);
324 rfont = mfont__select (frame, MPLIST_VAL (pl), &this_request,
325 size, layouter == Mt ? Mnil : layouter);
329 MPLIST_DO (p, font_group)
330 if (((MRealizedFont *) (MPLIST_VAL (p)))->score > rfont->score)
332 mplist_push (p, Mt, rfont);
338 realize_fontset_elements (MFrame *frame, MRealizedFontset *realized,
339 MFontset *fontset, MFont *request)
341 MPlist *per_script, *per_lang, *per_charset, *font_group;
344 realized->fontset = fontset;
345 realized->tick = fontset->tick;
346 realized->spec = *request;
347 realized->frame = frame;
348 realized->per_script = per_script = mplist ();
349 MPLIST_DO (plist, fontset->per_script)
351 per_lang = mplist ();
352 per_script = mplist_add (per_script, MPLIST_KEY (plist), per_lang);
353 MPLIST_DO (pl, MPLIST_PLIST (plist))
355 font_group = mplist ();
356 mplist_add (font_group, Mplist, MPLIST_VAL (pl));
357 per_lang = mplist_add (per_lang, MPLIST_KEY (pl), font_group);
361 realized->per_charset = per_charset = mplist ();
362 MPLIST_DO (plist, fontset->per_charset)
364 font_group = mplist ();
365 mplist_add (font_group, Mplist, MPLIST_VAL (plist));
366 per_charset = mplist_add (per_charset, MPLIST_KEY (plist), font_group);
369 realized->fallback = mplist ();
370 mplist_add (realized->fallback, Mplist, fontset->fallback);
375 free_realized_fontset_elements (MRealizedFontset *realized)
377 MPlist *plist, *pl, *p;
378 MRealizedFont *rfont;
380 if (realized->per_script)
382 MPLIST_DO (plist, realized->per_script)
384 MPLIST_DO (pl, MPLIST_PLIST (plist))
386 MPLIST_DO (p, MPLIST_PLIST (pl))
387 if ((rfont = MPLIST_VAL (p)) && ! rfont->frame)
389 p = MPLIST_PLIST (pl);
390 M17N_OBJECT_UNREF (p);
392 pl = MPLIST_PLIST (plist);
393 M17N_OBJECT_UNREF (pl);
395 M17N_OBJECT_UNREF (realized->per_script);
397 if (realized->per_charset)
399 MPLIST_DO (plist, realized->per_charset)
401 MPLIST_DO (pl, MPLIST_PLIST (plist))
402 if ((rfont = MPLIST_VAL (pl)) && ! rfont->frame)
404 pl = MPLIST_PLIST (plist);
405 M17N_OBJECT_UNREF (pl);
407 M17N_OBJECT_UNREF (realized->per_charset);
409 if (realized->fallback)
411 MPLIST_DO (plist, realized->fallback)
412 if ((rfont = MPLIST_VAL (plist)) && ! rfont->frame)
414 M17N_OBJECT_UNREF (realized->fallback);
419 update_fontset_elements (MRealizedFontset *realized)
421 free_realized_fontset_elements (realized);
422 realize_fontset_elements (realized->frame, realized, realized->fontset,
432 mfont__fontset_init ()
434 Mfontset = msymbol ("fontset");
435 Mfontset->managing_key = 1;
436 fontset_list = mplist ();
437 default_fontset = mfontset ("default");
438 if (! default_fontset->mdb)
443 mfont_put_prop (&font, Mregistry, msymbol ("iso8859-1"));
444 mfontset_modify_entry (default_fontset, Mnil, Mnil, Mnil,
446 mfont_put_prop (&font, Mregistry, msymbol ("iso10646-1"));
447 mfontset_modify_entry (default_fontset, Mnil, Mnil, Mnil,
455 mfont__fontset_fini ()
457 while (! MPLIST_TAIL_P (fontset_list))
458 free_fontset ((MFontset *) MPLIST_VAL (fontset_list));
459 M17N_OBJECT_UNREF (fontset_list);
465 mfont__realize_fontset (MFrame *frame, MFontset *fontset, MFace *face)
467 MRealizedFontset *realized;
472 load_fontset_contents (fontset);
474 mfont__set_spec_from_face (&request, face);
475 if (request.property[MFONT_SIZE] <= 0)
478 request.property[MFONT_SIZE] = 120;
480 MPLIST_DO (plist, frame->realized_fontset_list)
482 realized = (MRealizedFontset *) MPLIST_VAL (plist);
483 if (fontset->name == MPLIST_KEY (plist)
484 && ! memcmp (&request, &realized->spec, sizeof (request)))
488 MSTRUCT_MALLOC (realized, MERROR_FONTSET);
489 realize_fontset_elements (frame, realized, fontset, &request);
490 mplist_add (frame->realized_fontset_list, fontset->name, realized);
496 mfont__free_realized_fontset (MRealizedFontset *realized)
498 free_realized_fontset_elements (realized);
504 mfont__lookup_fontset (MRealizedFontset *realized, MGlyph *g, int *num,
505 MSymbol script, MSymbol language, MSymbol charset,
508 MFrame *frame = realized->frame;
509 MCharset *preferred_charset = (charset == Mnil ? NULL : MCHARSET (charset));
510 MPlist *per_charset, *per_script, *per_lang;
511 MPlist *font_groups[256], *plist;
512 int n_font_group = 0;
513 MRealizedFont *rfont;
516 if (realized->tick != realized->fontset->tick)
517 update_fontset_elements (realized);
519 if (preferred_charset
520 && (per_charset = mplist_get (realized->per_charset, charset)) != NULL)
521 font_groups[n_font_group++] = per_charset;
523 && ((per_script = mplist_find_by_key (realized->per_script, script))
526 /* We prefer font groups in this order:
527 (1) group matching LANGUAGE
528 (2) group for generic LANGUAGE
529 (3) group non-matching LANGUAGE */
530 if (language == Mnil)
532 per_lang = mplist_find_by_key (MPLIST_PLIST (per_script), language);
535 font_groups[n_font_group++] = MPLIST_PLIST (per_lang);
538 MPLIST_DO (per_lang, MPLIST_PLIST (per_script))
539 if (MPLIST_KEY (per_lang) != language)
540 font_groups[n_font_group++] = MPLIST_PLIST (per_lang);
545 plist = mplist_get (MPLIST_PLIST (per_script), Mt);
547 font_groups[n_font_group++] = plist;
549 MPLIST_DO (per_lang, MPLIST_PLIST (per_script))
550 if (MPLIST_KEY (per_lang) != language
551 && MPLIST_KEY (per_lang) != Mt)
552 font_groups[n_font_group++] = MPLIST_PLIST (per_lang);
554 font_groups[n_font_group++] = realized->fallback;
556 if (n_font_group == 1)
558 /* As we only have a fallback font group, try all the other
560 MPLIST_DO (per_script, realized->per_script)
561 MPLIST_DO (per_lang, MPLIST_PLIST (per_script))
562 font_groups[n_font_group++] = MPLIST_PLIST (per_lang);
563 MPLIST_DO (per_charset, realized->per_charset)
564 font_groups[n_font_group++] = MPLIST_PLIST (per_charset);
567 for (i = 0; i < n_font_group; i++)
571 if (MPLIST_PLIST_P (font_groups[i]))
572 realize_font_group (frame, &realized->spec, font_groups[i], size);
574 MPLIST_DO (plist, font_groups[i])
576 rfont = (MRealizedFont *) MPLIST_VAL (plist);
577 if (rfont->status < 0)
579 /* Check if this font can display all glyphs. */
580 for (j = 0; j < *num; j++)
582 g[j].code = mfont__encode_char (rfont, g[j].c);
583 if (g[j].code == MCHAR_INVALID_CODE)
588 if (rfont->status > 0
589 || mfont__open (rfont) == 0)
590 /* We found a font that can display all glyphs. */
594 if (! MPLIST_TAIL_P (plist))
598 if (i < n_font_group)
601 /* We couldn't find a font that can display all glyphs. Find one
602 that can display at least the first glyph. */
603 for (i = 0; i < n_font_group; i++)
605 MPLIST_DO (plist, font_groups[i])
607 rfont = (MRealizedFont *) MPLIST_VAL (plist);
608 if (rfont->status < 0)
610 g->code = mfont__encode_char (rfont, g->c);
611 if (g->code != MCHAR_INVALID_CODE)
613 if (rfont->status > 0
614 || mfont__open (rfont) == 0)
618 if (! MPLIST_TAIL_P (plist))
621 return (i < n_font_group ? rfont : NULL);
625 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
630 /*** @addtogroup m17nFontset */
635 @brief Return a fontset.
637 The mfontset () function returns a pointer to a fontset object of
638 name $NAME. If $NAME is @c NULL, it returns a pointer to the
641 If no fontset has the name $NAME, a new one is created. At that
642 time, if there exists a data \<@c fontset, $NAME\> in the m17n
643 database, the fontset contents are initialized according to the
644 data. If no such data exists, the fontset contents are left
647 The macro M17N_INIT () creates the default fontset. An
648 application program can modify it before the first call of
652 This function returns a pointer to the found or newly created
655 @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤òÊÖ¤¹.
657 ´Ø¿ô mfontset () ¤Ï̾Á° $NAME ¤ò»ý¤Ä¥Õ¥©¥ó¥È¥»¥Ã¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
658 ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ $NAME ¤¬ @c NULL ¤Ê¤é¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È¥»¥Ã¥È
661 $NAME ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥Õ¥©¥ó¥È¥»¥Ã¥È¤¬¤Ê¤±¤ì¤Ð¡¢¿·¤·¤¤¤â¤Î¤¬ºî¤é¤ì
662 ¤ë¡£¤½¤ÎºÝ¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë \<@c fontset, $NAME\> ¤È¤¤¤¦¥Ç¡¼¥¿
663 ¤¬¤¢¤ì¤Ð¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï¤½¤Î¥Ç¡¼¥¿¤Ë±è¤Ã¤Æ½é´ü²½¤µ¤ì¤ë¡£¤Ê¤±¤ì¤Ð¡¢
666 ¥Þ¥¯¥í M17N_INIT () ¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¥»¥Ã¥È¤òºî¤ë¡£¥¢¥×¥ê¥±¡¼
667 ¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï mframe () ¤ò½é¤á¤Æ¸Æ¤Ö¤Þ¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È
668 ¥»¥Ã¥È¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
671 ¤³¤Î´Ø¿ô¤Ï¸«¤Ä¤«¤Ã¤¿¡¢¤¢¤ë¤¤¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
675 mfontset (char *name)
681 fontset = default_fontset;
684 sym = msymbol (name);
685 fontset = mplist_get (fontset_list, sym);
688 M17N_OBJECT (fontset, free_fontset, MERROR_FONTSET);
690 fontset->mdb = mdatabase_find (Mfontset, sym, Mnil, Mnil);
693 fontset->per_script = mplist ();
694 fontset->per_charset = mplist ();
695 fontset->fallback = mplist ();
697 mplist_put (fontset_list, sym, fontset);
700 M17N_OBJECT_REF (fontset);
707 @brief Return the name of a fontset.
709 The mfontset_name () function returns the name of fontset $FONTSET. */
711 @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î̾Á°¤òÊÖ¤¹.
713 ´Ø¿ô mfontset_name () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤Î̾Á°¤òÊÖ¤¹¡£ */
715 mfontset_name (MFontset *fontset)
717 return fontset->name;
723 @brief Make a copy of a fontset.
725 The mfontset_copy () function makes a copy of fontset $FONTSET, gives it a
726 name $NAME, and returns a pointer to the created copy. $NAME must
727 not be a name of existing fontset. In such case, this function
728 returns NULL without making a copy. */
730 @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
732 ´Ø¿ô mfontset_copy () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤Î¥³¥Ô¡¼¤òºî¤Ã¤Æ¡¢
733 ̾Á° $NAME ¤òÍ¿¤¨¡¢¤½¤Î¥³¥Ô¡¼¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£$NAME ¤Ï´û¸¤Î
734 ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î̾Á°¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤½¤Î¾ì¹ç¤Ë¤Ï¥³¥Ô¡¼¤òºî¤é¤º
738 mfontset_copy (MFontset *fontset, char *name)
740 MSymbol sym = msymbol (name);
741 MFontset *copy = mplist_get (fontset_list, sym);
746 M17N_OBJECT (copy, free_fontset, MERROR_FONTSET);
749 if (fontset->per_script)
751 copy->per_script = mplist ();
752 MPLIST_DO (plist, fontset->per_script)
754 MPlist *new = mplist ();
756 MPLIST_DO (pl, MPLIST_PLIST (plist))
757 mplist_add (new, MPLIST_KEY (pl), mplist_copy (MPLIST_PLIST (pl)));
758 mplist_add (copy->per_script, MPLIST_KEY (plist), new);
761 if (fontset->per_charset)
763 copy->per_charset = mplist ();
764 MPLIST_DO (plist, fontset->per_charset)
765 mplist_add (copy->per_charset, MPLIST_KEY (plist),
766 mplist_copy (MPLIST_PLIST (plist)));
768 if (fontset->fallback)
769 copy->fallback = mplist_copy (fontset->fallback);
771 copy->font_spec_list = fontset->font_spec_list;
772 M17N_OBJECT_REF (copy->font_spec_list);
774 mplist_put (fontset_list, sym, copy);
775 M17N_OBJECT_REF (copy);
782 @brief Modify the contents of a fontset.
784 The mfontset_modify_entry () function associates, in fontset
785 $FONTSET, a copy of $FONT with the $SCRIPT / $LANGUAGE pair or
788 Each font in a fontset is associated with a particular
789 script/language pair, with a particular charset, or with the
790 symbol @c Mnil. The fonts that are associated with the same item
793 If $SCRIPT is not @c Mnil, it must be a symbol identifying a
794 script. In this case, $LANGUAGE is either a symbol identifying a
795 language or @c Mnil, and $FONT is associated with the $SCRIPT /
798 If $CHARSET is not @c Mnil, it must be a symbol representing a
799 charset object. In this case, $FONT is associated with that
802 If both $SCRIPT and $CHARSET are not @c Mnil, two copies of $FONT
803 are created. Then one is associated with the $SCRIPT / $LANGUAGE
804 pair and the other with that charset.
806 If both $SCRIPT and $CHARSET are @c Mnil, $FONT is associated with
807 @c Mnil. This kind of fonts are called @e fallback @e fonts.
809 The argument $HOW specifies the priority of $FONT. If $HOW is
810 positive, $FONT has the highest priority in the group of fonts
811 that are associated with the same item. If $HOW is negative,
812 $FONT has the lowest priority. If $HOW is zero, $FONT becomes the
813 only available font for the associated item; all the other fonts
814 are removed from the group.
816 If $LAYOUTER_NAME is not @c Mnil, it must be a symbol
817 representing a @ref flt. In that case, if $FONT is selected for
818 drawing an M-text, that font layout table is used to generate a
819 glyph code sequence from a character sequence.
822 If the operation was successful, mfontset_modify_entry () returns 0.
823 Otherwise it returns -1 and assigns an error code to the external
824 variable #merror_code. */
827 @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ÎÆâÍƤòÊѹ¹¤¹¤ë.
829 ´Ø¿ô mfontset_modify_entry () ¤Ï¡¢$LANGUAGE ¤È $SCRIPT ¤ÎÁȤ߹ç¤ï
830 ¤»¤Þ¤¿¤Ï $CHARSET ¤ËÂФ·¤Æ $FONT ¤Î¥³¥Ô¡¼¤ò»È¤¦¤è¤¦¤Ë¡¢¥Õ¥©¥ó¥È¥»¥Ã
831 ¥È $FONTSET ¤òÀßÄꤹ¤ë¡£
833 ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î³Æ¥Õ¥©¥ó¥È¤Ï¡¢ÆÃÄê¤Î¥¹¥¯¥ê¥×¥È¤È¸À¸ì¤Î¥Ú¥¢¡¢ÆÃÄê¤Î
834 ʸ»ú¥»¥Ã¥È¡¢¥·¥ó¥Ü¥ë @c Mnil ¤Î¤¤¤º¤ì¤«¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¡£Æ±¤¸
835 ¤â¤Î¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ï¥°¥ë¡¼¥×¤ò¹½À®¤¹¤ë¡£
837 $SCRIPT ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥¹¥¯¥ê¥×¥È¤òÆÃÄꤹ¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
838 ¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢$LANGUAGE ¤Ï¸À¸ì¤òÆÃÄꤹ¤ë¥·¥ó¥Ü¥ë¤« @c
839 Mnil ¤Ç¤¢¤ê¡¢$FONT ¤Ïthe $SCRIPT / $LANGUAGE ¥Ú¥¢¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£
841 $CHARSET ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢Ê¸»ú¥»¥Ã¥È¥ª¥Ö¥¸¥§¥¯¥È¤òɽ¤¹¥·¥ó¥Ü¥ë
842 ¤Ç¤¢¤ë¡£¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï $FONT ¤Ï¤½¤Îʸ»ú¥»¥Ã¥È¤È´ØÏ¢ÉÕ¤±¤é¤ì
845 $SCRIPT ¤È $CHARSET ¤ÎÁÐÊý¤¬ @c Mnil ¤Ç¤Ê¤¤¾ì¹ç¤Ë¤Ï $FONT ¤Î¥³¥Ô¡¼
846 ¤¬£²¤Äºî¤é¤ì¡¢¤½¤ì¤¾¤ì $SCRIPT / $LANGUAGE ¥Ú¥¢¤Èʸ»ú¥»¥Ã¥È¤Ë´ØÏ¢
849 $SCRIPT ¤È $CHARSET ¤ÎÁÐÊý¤¬ @c Mnil ¤Ê¤é¤Ð¡¢ $FONT ¤Ï @c Mnil ¤È
850 ´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£¤³¤Î¼ï¤Î¥Õ¥©¥ó¥È¤Ï @e fallback @e font ¤È¸Æ¤Ð¤ì¤ë¡£
852 °ú¿ô $HOW ¤Ï $FONT ¤ÎÍ¥ÀèÅÙ¤ò»ØÄꤹ¤ë¡£$HOW ¤¬Àµ¤Ê¤é¤Ð¡¢$FONT ¤ÏƱ
853 ¤¸¤â¤Î¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥°¥ë¡¼¥×Ãæ¤ÇºÇ¹â¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¡£$HOW ¤¬Éé¤Ê
854 ¤é¤Ð¡¢ºÇÄã¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¡£$HOW ¤¬ 0 ¤Ê¤é¤Ð¡¢$FONT ¤Ï´ØÏ¢ÉÕ¤±¤é¤ì¤¿
855 ¤â¤Î¤ËÂФ¹¤ëÍ£°ì¤ÎÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤È¤Ê¤ê¡¢Â¾¤Î¥Õ¥©¥ó¥È¤Ï¥°¥ë¡¼¥×
858 $LAYOUTER_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢@ref flt ¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
859 ¥·¥ó¥Ü¥ë¤Ç¤¢¤ì¤Ð¡¢$FONT ¤òÍѤ¤¤ÆM-text ¤òɽ¼¨¤¹¤ëºÝ¤Ë¤Ï¡¢¤½¤Î FONT
860 LAYOUT TABLE ¤ò»È¤Ã¤Æʸ»úÎ󤫤饰¥ê¥Õ¥³¡¼¥ÉÎó¤òÀ¸À®¤¹¤ë¡£
863 ½èÍý¤¬À®¸ù¤·¤¿¤È¤¡¢mfontset_modify_entry () ¤Ï 0 ¤òÊÖ¤¹¡£
864 ¼ºÇÔ¤·¤¿¤È¤¤Ï -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤ò
872 mfontset_modify_entry (MFontset *fontset,
873 MSymbol script, MSymbol language, MSymbol charset,
874 MFont *spec, MSymbol layouter_name,
877 MPlist *per_lang, *plist[3], *pl;
882 load_fontset_contents (fontset);
884 if (! fontset->font_spec_list)
885 fontset->font_spec_list = mplist ();
887 MPLIST_DO (pl, fontset->font_spec_list)
889 if (! memcmp (MPLIST_VAL (pl), spec, sizeof (MFont)))
891 font = MPLIST_VAL (pl);
899 mplist_add (fontset->font_spec_list, Mt, font);
905 if (language == Mnil)
907 per_lang = mplist_get (fontset->per_script, script);
909 mplist_add (fontset->per_script, script, per_lang = mplist ());
910 plist[i] = mplist_get (per_lang, language);
912 mplist_add (per_lang, language, plist[i] = mplist ());
917 plist[i] = mplist_get (fontset->per_charset, charset);
919 mplist_add (fontset->per_charset, charset, plist[i] = mplist ());
922 if (script == Mnil && charset == Mnil)
924 plist[i++] = fontset->fallback;
927 if (layouter_name == Mnil)
929 for (i--; i >= 0; i--)
932 mplist_push (plist[i], layouter_name, font);
934 mplist_add (plist[i], layouter_name, font);
937 mplist_set (plist[i], Mnil, NULL);
938 mplist_add (plist[i], layouter_name, font);
949 @brief Lookup a fontset.
951 The mfontset_lookup () function lookups $FONTSET and returns a
952 plist that describes the contents of $FONTSET corresponding to the
953 specified script, language, and charset.
955 If $SCRIPT is @c Mt, keys of the returned plist are script name
956 symbols for which some fonts are specified and values are NULL.
958 If $SCIRPT is a script symbol, the returned plist is decided by
961 If $LANGUAGE is @c Mt, keys of the plist are language name symbols
962 for which some fonts are specified and values are NULL. A key may
963 be @c Mt which means some fallback fonts are specified for the
966 If $LANGUAGE is a language name symbol, the plist is a @c
967 FONT-GROUP for the specified script and langauge.
969 If $LANGAUGE is @c Mt, the plist is fallback @c FONT-GROUP for the
972 If $SCRIPT is @c Mnil, the returned plist is decided as below.
974 If $CHARSET is @c Mt, keys of the returned plist are charset name
975 symbols for which some fonts are specified and values are NULL.
977 If $CHARSET is a charset symbol, the plist is a @c FONT-GROUP for
980 If $CHARSET is @c Mnil, the plist is a fallback @c FONT-GROUP.
982 @c FONT-GROUP is a plist whose keys are FLT name symbols (@c Mt if
983 no FLT is associated with the font) and values are pointers to
987 It returns a plist describing the contents of a fontset. The
988 plist should be freed by m17n_object_unref (). */
991 mfontset_lookup (MFontset *fontset,
992 MSymbol script, MSymbol language, MSymbol charset)
994 MPlist *plist = mplist (), *pl, *p;
997 load_fontset_contents (fontset);
1000 if (! fontset->per_script)
1003 MPLIST_DO (pl, fontset->per_script)
1004 p = mplist_add (p, MPLIST_KEY (pl), NULL);
1009 if (! fontset->per_script)
1011 pl = mplist_get (fontset->per_script, script);
1018 p = mplist_add (p, MPLIST_KEY (pl), NULL);
1021 if (language == Mnil)
1023 pl = mplist_get (pl, language);
1025 else if (charset != Mnil)
1027 if (! fontset->per_charset)
1032 MPLIST_DO (pl, fontset->per_charset)
1033 p = mplist_add (p, MPLIST_KEY (pl), NULL);
1036 pl = mplist_get (fontset->per_charset, charset);
1039 pl = fontset->fallback;
1042 return mplist_copy (pl);
1048 /*** @addtogroup m17nDebug */
1053 @brief Dump a fontset.
1055 The mdebug_dump_fontset () function prints fontset $FONTSET in a human readable
1056 way to the stderr. $INDENT specifies how many columns to indent
1057 the lines but the first one.
1060 This function returns $FONTSET. */
1062 @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ò¥À¥ó¥×¤¹¤ë.
1064 ´Ø¿ô mdebug_dump_face () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤ò stderr ¤Ë¿Í
1065 ´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ
1069 ¤³¤Î´Ø¿ô¤Ï $FONTSET ¤òÊÖ¤¹¡£ */
1072 mdebug_dump_fontset (MFontset *fontset, int indent)
1074 char *prefix = (char *) alloca (indent + 1);
1075 MPlist *plist, *pl, *p;
1077 memset (prefix, 32, indent);
1080 fprintf (stderr, "(fontset %s", fontset->name->name);
1081 if (fontset->per_script)
1082 MPLIST_DO (plist, fontset->per_script)
1084 fprintf (stderr, "\n %s(%s", prefix, MPLIST_KEY (plist)->name);
1085 MPLIST_DO (pl, MPLIST_PLIST (plist))
1087 fprintf (stderr, "\n %s(%s", prefix, MPLIST_KEY (pl)->name);
1088 MPLIST_DO (p, MPLIST_PLIST (pl))
1090 fprintf (stderr, "\n %s(%s ", prefix,
1091 MPLIST_KEY (p)->name);
1092 mdebug_dump_font (MPLIST_VAL (p));
1093 fprintf (stderr, ")");
1095 fprintf (stderr, ")");
1097 fprintf (stderr, ")");
1099 if (fontset->per_charset)
1100 MPLIST_DO (pl, fontset->per_charset)
1102 fprintf (stderr, "\n %s(%s", prefix, MPLIST_KEY (pl)->name);
1103 MPLIST_DO (p, MPLIST_PLIST (pl))
1105 fprintf (stderr, "\n %s(%s ", prefix, MPLIST_KEY (p)->name);
1106 mdebug_dump_font (MPLIST_VAL (p));
1107 fprintf (stderr, ")");
1109 fprintf (stderr, ")");
1112 if (fontset->fallback)
1113 MPLIST_DO (p, fontset->fallback)
1115 fprintf (stderr, "\n %s(%s ", prefix, MPLIST_KEY (p)->name);
1116 mdebug_dump_font (MPLIST_VAL (p));
1117 fprintf (stderr, ")");
1120 fprintf (stderr, ")");