1 /* font.c -- font module.
2 Copyright (C) 2003, 2004, 2005, 2006
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., 51 Franklin Street, Fifth Floor,
27 The m17n GUI API represents a font by an object of the type @c
28 MFont. A font can have @e font @e properties. Like other types
29 of properties, a font property consists of a key and a value. The
30 key of a font property must be one of the following symbols:
32 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
33 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
35 When the key of a font property is @c Msize or @c Mresolution, its
36 value is an integer. Otherwise the value is a symbol.
38 "The font property that belongs to font F and whose key is @c
39 Mxxx" may be shortened to "the xxx property of F".
41 The value of a foundry property is a symbol representing font
42 foundry information, e.g. adobe, misc, etc.
44 The value of a family property is a symbol representing font family
45 information, e.g. times, helvetica, etc.
47 The value of a weight property is a symbol representing weight
48 information, e.g. normal, bold, etc.
50 The value of a style property is a symbol representing slant
51 information, e.g. normal, italic, etc.
53 The value of a stretch property is a symbol representing width
54 information, e.g. normal, semicondensed, etc.
56 The value of an adstyle property is a symbol representing abstract
57 font family information, e.g. serif, sans-serif, etc.
59 The value of a registry property is a symbol representing registry
60 information, e.g. iso10646-1, iso8895-1, etc.
62 The value of a size property is an integer representing design
63 size in the unit of 1/10 point.
65 The value of a resolution property is an integer representing
66 assumed device resolution in the unit of dots per inch (dpi).
68 The value of a type property is a symbol indicating a font driver;
69 currently Mx or Mfreetype.
71 The m17n library uses font objects for two purposes: to receive
72 font specification from an application program, and to present
73 available fonts to an application program. When the m17n library
74 presents an available font to an application program, all font
75 properties have a concrete value.
77 The m17n library supports three kinds of fonts: Window system fonts,
78 FreeType fonts, and OpenType fonts.
82 <li> Window system fonts
84 The m17n-X library supports all fonts handled by an X server and
85 an X font server. The correspondence between XLFD fields and font
86 properties are shown below.
90 --------------- --------
96 ADD_STYLE_NAME adstyle
98 RESOLUTION_Y resolution
99 CHARSET_REGISTRY-CHARSET_ENCODING registry
102 XLFD fields not listed in the above table are ignored.
106 The m17n library, if configured to use the FreeType library,
107 supports all fonts that can be handled by the FreeType library.
108 The variable #mfont_freetype_path is initialized properly according
109 to the configuration of the m17n library and the environment
110 variable @c M17NDIR. See the documentation of the variable for
113 If the m17n library is configured to use the fontconfig library,
114 in addition to #mfont_freetype_path, all fonts available via
115 fontconfig are supported.
117 The family name of a FreeType font corresponds to the family
118 property. Style names of FreeType fonts correspond to the weight,
119 style, and stretch properties as below.
122 style name weight style stretch
123 ---------- ------ ----- -------
124 Regular medium r normal
125 Italic medium i normal
127 Bold Italic bold i normal
128 Narrow medium r condensed
129 Narrow Italic medium i condensed
130 Narrow Bold bold r condensed
131 Narrow Bold Italic bold i condensed
133 Black Italic black i normal
134 Oblique medium o normal
135 BoldOblique bold o normal
138 Style names not listed in the above table are treated as
141 Combination of a platform ID and an encoding ID corresponds to the
142 registry property. For example, if a font has the combination (1
143 1), the registry property is 1-1. Some frequent combinations have
144 a predefined registry property as below.
147 platform ID encoding ID registry property
148 ----------- ----------- -----------------
156 Thus, a font that has two combinations (1 0) and (3 1) corresponds
157 to four font objects whose registries are 1-0, apple-roman, 3-1,
162 The m17n library, if configured to use both the FreeType library
163 and the OTF library, supports any OpenType fonts. The list of
164 actually available fonts is created in the same way as in the case
165 of FreeType fonts. If a fontset instructs to use an OpenType font
166 via an FLT (Font Layout Table), and the FLT has an OTF-related
167 command (e.g. otf:deva), the OTF library converts a character
168 sequence to a glyph code sequence according to the OpenType layout
169 tables of the font, and the FreeType library gives a bitmap image
178 @brief ¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È.
180 m17n GUI API ¤Ï¥Õ¥©¥ó¥È¤ò @c MFont ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æɽ¸½¤¹¤ë¡£
181 ¥Õ¥©¥ó¥È¤Ï @e ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¤ë¡£Â¾¤Î¥¿¥¤¥×¤Î¥×
182 ¥í¥Ñ¥Æ¥£Æ±ÍÍ¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¥¡¼¤ÈÃͤ«¤é¤Ê¤ê¡¢¥¡¼¤Ï°Ê²¼¤Î¥·
183 ¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
185 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
186 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing
188 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution
189 ¤Î¾ì¹ç¡¢ÃͤÏÀ°¿ôÃͤǤ¢¤ê¡¢¥¡¼¤¬¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Ãͤϥ·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
191 ¡Ö¥Õ¥©¥ó¥È F ¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥¡¼¤¬ @c Mxxx
192 ¤Ç¤¢¤ë¤â¤Î¡×¤Î¤³¤È¤ò´Êñ¤Ë¡ÖF ¤Î xxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£
194 foundry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢adobe, misc
195 Åù¤Î¥Õ¥©¥ó¥È¤Î³«È¯¸µ¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
197 family ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢times, helvetica
198 Åù¤Î¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
200 weight ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, bold Åù¤ÎÂÀ¤µ¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
202 style ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, italic
203 Åù¤Î¥¹¥¿¥¤¥ë¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
205 stretch ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, semicondensed
206 Åù¤Îʸ»úÉý¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
208 adstyle ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢serif, sans-serif
209 Åù¤ÎÃê¾ÝŪ¤Ê¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
211 registry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢iso10646, iso8895-1
212 Åù¤Î¥ì¥¸¥¹¥È¥ê¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
214 size ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤òɽ¤ï¤¹À°¿ôÃͤǤ¢¤ê¡¢
215 ñ°Ì¤Ï1/10 ¥Ý¥¤¥ó¥È¤Ç¤¢¤ë¡£
217 resolution ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢ÁÛÄꤵ¤ì¤Æ¤¤¤ë¥Ç¥Ð¥¤¥¹¤Î²òÁüÅÙ¤òɽ¤ï¤¹
218 À°¿ôÃͤǤ¢¤ê¡¢Ã±°Ì¤Ïdots per inch (dpi) ¤Ç¤¢¤ë¡£
220 type ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ò»Ø¼¨¤·¡¢¸½ºß Mx ¤â¤·¤¯¤Ï
223 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò£²¤Ä¤ÎÌÜŪ¤ÇÍѤ¤¤Æ¤¤¤ë¡£¥¢¥×
224 ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¥Õ¥©¥ó¥È¤Î»ØÄê¤ò¼õ¤±¼è¤ëÌÜŪ¤È¡¢¥¢¥×¥ê¥±¡¼
225 ¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤òÄ󼨤¹¤ëÌÜŪ¤Ç¤¢¤ë¡£¥¢¥×¥ê¥±¡¼
226 ¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÂФ·¤ÆÄ󼨤ò¹Ô¤¦ºÝ¤Ë¤Ï¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¤¹¤Ù
229 m17n ¥é¥¤¥Ö¥é¥ê¤Ï Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È¡¢FreeType¥Õ¥©¥ó¥È¡¢
230 OpenType¥Õ¥©¥ó¥È¤Î£³¼ïÎà¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
234 <li> Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È
236 m17n X ¥é¥¤¥Ö¥é¥ê¤Ï¡¢X ¥µ¡¼¥Ð¤È X ¥Õ¥©¥ó¥È¥µ¡¼¥Ð¤¬¼è¤ê°·¤¦Á´¤Æ¤Î¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£
237 XLFD ¤Î³Æ¥Õ¥£¡¼¥ë¥É¤È¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ÎÂбþ¤Ï°Ê²¼¤ÎÄ̤ꡣ¤³¤Îɽ¤Ë¤Ê¤¤¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤ë¡£
240 XLFD ¥Õ¥£¡¼¥ë¥É ¥×¥í¥Ñ¥Æ¥£
241 --------------- --------
246 SETWIDTH_NAME stretch
247 ADD_STYLE_NAME adstyle
249 RESOLUTION_Y resolution
250 CHARSET_REGISTRY-CHARSET_ENCODING registry
255 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢
256 FreeType ¤¬°·¤¦¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£ÊÑ¿ô
257 #mfont_freetype_path ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ÎÀßÄê¤È´Ä¶ÊÑ¿ô @c M17NDIR
258 ¤Ë±þ¤¸¤Æ½é´ü²½¤µ¤ì¤ë¡£¾ÜºÙ¤ÏÊÑ¿ô¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
260 ¤â¤· m17n ¥é¥¤¥Ö¥é¥ê¤¬ fontconfig ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢
261 #mfont_freetype_path ¤Ë²Ã¤¨¤Æ¡¢ fontconfig ¤Ç»ÈÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤â¤¹¤Ù¤Æ¥µ¥Ý¡¼¥È¤µ¤ì¤ë¡£
263 FreeType ¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤Ï family ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£
264 FreeType ¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾¤Ï¡¢²¼¤Îɽ¤Î¤è¤¦¤Ë weight, style,
265 stretch ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£
268 ¥¹¥¿¥¤¥ë̾ weight style stretch
269 ---------- ------ ----- -------
270 Regular medium r normal
271 Italic medium i normal
273 Bold Italic bold i normal
274 Narrow medium r condensed
275 Narrow Italic medium i condensed
276 Narrow Bold bold r condensed
277 Narrow Bold Italic bold i condensed
279 Black Italic black i normal
280 Oblique medium o normal
281 BoldOblique bold o normal
284 ¾å¤Îɽ¤Ë¸½¤ï¤ì¤Ê¤¤¥¹¥¿¥¤¥ë̾¤Ï "Regular" ¤È¤·¤Æ°·¤ï¤ì¤ë¡£
286 platform ID ¤È encoding ID ¤ÎÁȤ߹ç¤ï¤»¤¬ registry
287 ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£¤¿¤È¤¨¤Ð¤¢¤ë¥Õ¥©¥ó¥È¤¬ (1 1) ¤È¤¤¤¦ ID ¤ÎÁȹ礻¤ò»ý¤Æ¤Ð¡¢
288 registry ¥×¥í¥Ñ¥Æ¥£¤Ï 1-1 ¤È¤Ê¤ë¡£ÉÑÈˤˤ¢¤é¤ï¤ì¤ëÁȹ礻¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤ÊÄêµÁºÑ¤ß
289 registry ¥×¥í¥Ñ¥Æ¥£ ¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ë¡£
292 platform ID encoding ID registry ¥×¥í¥Ñ¥Æ¥£
293 ----------- ----------- -----------------
301 ¤·¤¿¤¬¤Ã¤Æ¡¢Æó¤Ä¤ÎÁȹ礻 (1 0) ¡¢(3 1) ¤ò»ý¤Ä¥Õ¥©¥ó¥È¤Ï¡¢¤½¤ì¤¾¤ì
302 registry ¥×¥í¥Ñ¥Æ¥£¤¬ 1-0, apple-roman, 3-1, unicode-bmp
303 ¤Ç¤¢¤ë£´¤Ä¤Î¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ËÂбþ¤¹¤ë¡£
305 <li> OpenType ¥Õ¥©¥ó¥È
307 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢FreeType ¥é¥¤¥Ö¥é¥ê¤È OTF
308 ¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤹ¤ì¤Ð¡¢¤¹¤Ù¤Æ¤Î OpenType
309 ¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£¼ÂºÝ¤ËÍøÍѤǤ¤ë¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤Ï FreeType
310 ¥Õ¥©¥ó¥È¤Î¾ì¹ç¤ÈƱÍͤ˺î¤é¤ì¤ë¡£OpenType ¥Õ¥©¥ó¥È¤ò FLT (Font Layout Table)
311 ·Ðͳ¤Ç»ÈÍѤ¹¤ë¤è¤¦¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ë»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢FLT ¤Ë OTF
312 ´ØÏ¢¤Î¥³¥Þ¥ó¥É (¤¿¤È¤¨¤Ð otf:deva) ¤¬¤¢¤ì¤Ð¡¢OTF ¥é¥¤¥Ö¥é¥ê¤¬¥Õ¥©¥ó¥È¤Î OpenType
313 ¥ì¥¤¥¢¥¦¥È¥Æ¡¼¥Ö¥ë¤Ë½¾¤Ã¤Æʸ»úÎó¤ò¥°¥ê¥Õ¥³¡¼¥ÉÎó¤ËÊÑ´¹¤·¡¢FreeType
314 ¥é¥¤¥Ö¥é¥ê¤¬³Æ¥°¥ê¥Õ¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¥¤¥á¡¼¥¸¤òÄ󶡤¹¤ë¡£
322 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
323 /*** @addtogroup m17nInternal
333 #include "m17n-gui.h"
334 #include "m17n-misc.h"
335 #include "internal.h"
340 #include "language.h"
341 #include "internal-gui.h"
346 MPlist *mfont__driver_list;
348 static MSymbol M_font_capability, M_font_list, M_font_list_len;
350 /** Indices to font properties sorted by their priority. */
351 static int font_score_priority[] =
361 #define FONT_SCORE_PRIORITY_SIZE \
362 (sizeof font_score_priority / sizeof font_score_priority[0])
364 /* Indexed by a font property MFONT_XXX, and the value is how many
365 bits to shift the difference of property values. */
366 static int font_score_shift_bits[MFONT_SIZE + 1];
368 /** Predefined symbols for each font property. The order is important
369 because the function font_score () decides how well a font matches
370 with a spec by checking how close the index is. */
372 static char *common_foundry[] =
375 static char *common_family[] =
380 static char *common_weight[] =
397 static char *common_style[] =
405 static char *common_stretch[] =
416 static char *common_adstyle[] =
420 static char *common_registry[] =
423 static unsigned short font_weight_regular;
424 static unsigned short font_weight_normal;
425 static unsigned short font_weight_medium;
427 /* Table containing all the data above. */
429 struct MFontCommonNames
435 static struct MFontCommonNames font_common_names[] =
437 { sizeof (common_foundry) / sizeof (char *), common_foundry},
438 { sizeof (common_family) / sizeof (char *), common_family},
439 { sizeof (common_weight) / sizeof (char *), common_weight},
440 { sizeof (common_style) / sizeof (char *), common_style},
441 { sizeof (common_stretch) / sizeof (char *), common_stretch},
442 { sizeof (common_adstyle) / sizeof (char *), common_adstyle},
443 { sizeof (common_registry) / sizeof (char *), common_registry}
447 /** Table of available font property names. */
449 MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
452 /** Return the numeric value of SYMBOL as the Nth font property. */
454 #define FONT_PROPERTY_NUMERIC(symbol, n) \
457 : ((int) msymbol_get ((symbol), mfont__property_table[(n)].property)))
460 /** Set the numeric value of SYMBOL as the Nth font property to NUMERIC. */
462 #define SET_FONT_PROPERTY_NUMERIC(symbol, n, numeric) \
463 msymbol_put((symbol), mfont__property_table[(n)].property, \
469 struct MFontEncoding {
471 MSymbol encoding_name;
472 MCharset *encoding_charset;
473 MSymbol repertory_name;
474 MCharset *repertory_charset;
477 static MPlist *font_encoding_list;
478 static MFontEncoding default_encoding;
480 /** Load font encoding table from the data <font encoding>.
481 The data has this form:
482 (FONT-SPEC ENCODING) ...
483 where FONT-SPEC has this form:
484 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
485 All elements are symbols. */
488 load_font_encoding_table ()
491 MPlist *encoding_list, *plist, *pl, *elt;
493 font_encoding_list = pl = mplist ();
495 mdb = mdatabase_find (Mfont, msymbol ("encoding"), Mnil, Mnil);
497 || ! (encoding_list = (MPlist *) mdatabase_load (mdb)))
498 MERROR (MERROR_FONT, -1);
500 MPLIST_DO (plist, encoding_list)
502 MFontEncoding *encoding;
505 MSTRUCT_CALLOC (encoding, MERROR_FONT);
507 if (! MPLIST_PLIST_P (plist)
508 || (elt = MPLIST_PLIST (plist), mplist_length (elt) < 2)
509 || ! MPLIST_PLIST_P (elt))
510 MWARNING (MERROR_FONT);
511 registry = mfont__set_spec_from_plist (&encoding->spec,
513 elt = MPLIST_NEXT (elt);
514 if (! MPLIST_SYMBOL_P (elt))
515 MWARNING (MERROR_FONT);
516 encoding->encoding_name = MPLIST_SYMBOL (elt);
517 elt = MPLIST_NEXT (elt);
518 if (MPLIST_TAIL_P (elt))
519 encoding->repertory_name = encoding->encoding_name;
520 else if (! MPLIST_SYMBOL_P (elt))
521 MWARNING (MERROR_FONT);
523 encoding->repertory_name = MPLIST_SYMBOL (elt);
525 if (registry == Mnil)
526 mplist_push (font_encoding_list, Mt, encoding);
528 pl = mplist_add (pl, registry, encoding);
535 M17N_OBJECT_UNREF (encoding_list);
544 static MPlist *font_resize_list;
546 /** Load font size table from the data <font size>.
547 The data has this form:
548 (FONT-SPEC RESIZE-FACTOR) ...
549 where FONT-SPEC has this form:
550 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
551 All elements of FONT-SPEC are symbols. */
554 load_font_resize_table ()
557 MPlist *size_adjust_list, *plist, *pl, *elt;
559 font_resize_list = pl = mplist ();
561 mdb = mdatabase_find (Mfont, msymbol ("resize"), Mnil, Mnil);
564 if (! (size_adjust_list = (MPlist *) mdatabase_load (mdb)))
565 MERROR (MERROR_FONT, -1);
567 MPLIST_DO (plist, size_adjust_list)
572 MSTRUCT_CALLOC (resize, MERROR_FONT);
574 if (! MPLIST_PLIST_P (plist)
575 || (elt = MPLIST_PLIST (plist), mplist_length (elt) != 2)
576 || ! MPLIST_PLIST_P (elt))
577 MWARNING (MERROR_FONT);
578 registry = mfont__set_spec_from_plist (&resize->spec,
580 elt = MPLIST_NEXT (elt);
581 if (! MPLIST_INTEGER_P (elt))
582 MWARNING (MERROR_FONT);
583 resize->resize = MPLIST_INTEGER (elt);
585 if (registry == Mnil)
587 pl = mplist_add (pl, registry, resize);
594 M17N_OBJECT_UNREF (size_adjust_list);
598 /** Return a font encoding (and repertory) of FONT. */
600 static MFontEncoding *
601 find_encoding (MFont *font)
603 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
604 MFontEncoding *encoding = NULL;
607 if (! font_encoding_list)
608 load_font_encoding_table ();
609 plist = font_encoding_list;
610 while (! MPLIST_TAIL_P (plist))
612 encoding = (MFontEncoding *) MPLIST_VAL (plist);
613 if (mfont__match_p (font, &encoding->spec, MFONT_REGISTRY))
615 if (encoding->encoding_name != Mnil
616 && ! encoding->encoding_charset)
618 encoding->encoding_charset = MCHARSET (encoding->encoding_name);
619 if (! encoding->encoding_charset)
625 if (encoding->repertory_name == encoding->encoding_name)
626 encoding->repertory_charset = encoding->encoding_charset;
627 else if (encoding->repertory_name != Mnil)
629 encoding->repertory_charset
630 = MCHARSET (encoding->repertory_name);
631 if (! encoding->repertory_charset)
637 font->encoding = encoding;
641 if (registry && MPLIST_KEY (plist) != Mt)
643 plist = mplist_find_by_key (plist, registry);
648 plist = MPLIST_NEXT (plist);
650 font->encoding = &default_encoding;
651 return &default_encoding;
658 unsigned char *p = (unsigned char *) name;
662 return (OTF_Tag) ((p[0] << 24)
666 : (p[2] << 8) | p[3]))));
670 OTF_tag_name (OTF_Tag tag, char *name)
672 name[0] = (char) (tag >> 24);
673 name[1] = (char) ((tag >> 16) & 0xFF);
674 name[2] = (char) ((tag >> 8) & 0xFF);
675 name[3] = (char) (tag & 0xFF);
678 #endif /* not HAVE_OTF */
680 /* XLFD parser/generator */
682 /** Indices to each field of split font name. */
698 XLFD_REGISTRY, /* This contains ENCODING. */
704 xlfd_parse_name (const char *name, MFont *font)
706 char *field[XLFD_FIELD_MAX];
707 unsigned short resy, avgwidth;
718 for (i = 1, p = copy, name++; *name; p++, name++)
723 && i < XLFD_FIELD_MAX)
726 if (field[i - 1][0] == '*')
731 *p = tolower (*name);
734 if (field[i - 1][0] == '*')
736 while (i < XLFD_FIELD_MAX)
739 resy = field[XLFD_RESY] ? atoi (field[XLFD_RESY]) : 0;
740 avgwidth = ((field[XLFD_AVGWIDTH] && isdigit (field[XLFD_AVGWIDTH][0]))
741 ? atoi (field[XLFD_AVGWIDTH]) : 1);
744 else if (! field[XLFD_PIXEL])
745 size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0;
746 else if (field[XLFD_PIXEL][0] == '[')
748 /* The pixel size field specifies a transformation matrix of the
749 form "[A B C D]". The XLFD spec says that the scalar value N
750 for the pixel size is equivalent to D. */
751 char *p0 = field[XLFD_PIXEL] + 1, *p1;
754 for (i = 0; i < 4; i++, p0 = p1)
755 d = strtod (p0, &p1);
759 size = atoi (field[XLFD_PIXEL]) * 10;
761 if (field[XLFD_FOUNDRY])
763 sym = msymbol (field[XLFD_FOUNDRY]);
765 sym = msymbol ("Nil");
766 mfont__set_property (font, MFONT_FOUNDRY, sym);
768 if (field[XLFD_FAMILY])
770 sym = msymbol (field[XLFD_FAMILY]);
772 sym = msymbol ("Nil");
773 mfont__set_property (font, MFONT_FAMILY, sym);
775 if (field[XLFD_WEIGHT])
776 mfont__set_property (font, MFONT_WEIGHT, msymbol (field[XLFD_WEIGHT]));
777 if (field[XLFD_SLANT])
778 mfont__set_property (font, MFONT_STYLE, msymbol (field[XLFD_SLANT]));
779 if (field[XLFD_SWIDTH])
780 mfont__set_property (font, MFONT_STRETCH, msymbol (field[XLFD_SWIDTH]));
781 if (field[XLFD_ADSTYLE])
782 mfont__set_property (font, MFONT_ADSTYLE, msymbol (field[XLFD_ADSTYLE]));
783 font->property[MFONT_RESY] = resy;
785 if (field[XLFD_SPACING])
787 = ((field[XLFD_SPACING][0] == 'p' || field[XLFD_SPACING][0] == 'P')
788 ? MFONT_SPACING_PROPORTIONAL
789 : (field[XLFD_SPACING][0] == 'm' || field[XLFD_SPACING][0] == 'M')
790 ? MFONT_SPACING_MONO : MFONT_SPACING_CHARCELL);
791 if (field[XLFD_REGISTRY])
792 mfont__set_property (font, MFONT_REGISTRY, msymbol (field[XLFD_REGISTRY]));
793 font->type = MFONT_TYPE_SPEC;
794 font->source = MFONT_SOURCE_X;
799 xlfd_unparse_name (MFont *font, int full_xlfd)
809 prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry);
810 prop[1] = (MSymbol) mfont_get_prop (font, Mfamily);
811 prop[2] = (MSymbol) mfont_get_prop (font, Mweight);
812 prop[3] = (MSymbol) mfont_get_prop (font, Mstyle);
813 prop[4] = (MSymbol) mfont_get_prop (font, Mstretch);
814 prop[5] = (MSymbol) mfont_get_prop (font, Madstyle);
815 prop[6] = (MSymbol) mfont_get_prop (font, Mregistry);
816 for (len = 0, i = 0; i < 7; i++)
820 str[i] = msymbol_name (prop[i]);
821 len += strlen (str[i]);
830 spacing = (font->spacing == MFONT_SPACING_UNDECIDED ? '*'
831 : font->spacing == MFONT_SPACING_PROPORTIONAL ? 'p'
832 : font->spacing == MFONT_SPACING_MONO ? 'm'
837 + 2 /* 2 asterisks */
838 + 30 /* 3 integers (each 10 digits) */
839 + 1 /* 1 spacing char */
840 + 1) /* '\0' terminal */
844 resy = (int) mfont_get_prop (font, Mresolution);
848 if (font->multiple_sizes)
850 for (size = 0; size < 24; size++)
851 if (font->size & (1 << size))
855 else if ((size % 10) < 5)
858 size = size / 10 + 1;
866 sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-%c-*-%s",
867 str[0], str[1], str[2], str[3], str[4], str[5],
868 size, resy, resy, spacing, str[6]);
870 sprintf (name, "-%s-%s-%s-%s-%s-%s-*-%d-%d-%d-%c-*-%s",
871 str[0], str[1], str[2], str[3], str[4], str[5],
872 size, resy, resy, spacing, str[6]);
874 else if (all_nil && size == 0)
880 p += sprintf (p, "-%s", str[0]);
881 for (i = 1; i < 6; i++)
882 if (p[-1] != '*' || str[i][0] != '*')
883 p += sprintf (p, "-%s", str[i]);
884 if (p[-1] != '*' || font->size > 0)
887 p += sprintf (p, "-%d-*", size);
889 p += sprintf (p, "-*");
891 if (str[6][0] != '*')
892 sprintf (p, "-%s", str[6]);
895 return strdup (name);
898 /* Compare FONT with REQUEST and return how much they differs. */
901 font_score (MFont *font, MFont *request)
904 int i = FONT_SCORE_PRIORITY_SIZE;
908 enum MFontProperty prop = font_score_priority[i];
911 if (prop == MFONT_SIZE)
913 if (font->size && request->size)
915 if (font->multiple_sizes)
919 for (j = 23; j >= 0; j--)
920 if (font->size & (1 << j))
923 if (request->size >= (j + 6) * 10)
926 val = request->size - (closest + 6) * 10;
929 val = font->size - request->size;
936 score |= (val << font_score_shift_bits[MFONT_SIZE]);
940 else if (font->property[prop] && request->property[prop]
941 && font->property[prop] != request->property[prop])
943 if (prop <= MFONT_FAMILY)
945 else if (prop == MFONT_WEIGHT)
947 unsigned short v1 = font->property[prop];
948 unsigned short v2 = request->property[prop];
950 if (v1 == font_weight_regular || v1 == font_weight_normal)
951 v1 = font_weight_medium;
952 if (v2 == font_weight_regular || v2 == font_weight_normal)
953 v2 = font_weight_medium;
954 val = v1 > v2 ? v1 - v2 : v2 - v1;
958 val = font->property[prop] - request->property[prop];
964 score |= val << font_score_shift_bits[prop];
967 if (request->file != Mnil && request->file != font->file)
973 merge_capability (MSymbol capability, MSymbol key, MSymbol val, int overwrite)
975 MFontCapability *cap = NULL;
976 char *lang = NULL, *script = NULL, *otf = NULL, *buf, *p;
977 int lang_len = 0, script_len = 0, otf_len = 0;
979 if (key == Mlanguage)
980 lang = MSYMBOL_NAME (val), lang_len = MSYMBOL_NAMELEN (val) + 6;
981 else if (key == Mscript)
982 script = MSYMBOL_NAME (val), script_len = MSYMBOL_NAMELEN (val) + 7;
983 else if (key == Motf)
984 otf = MSYMBOL_NAME (val), otf_len = MSYMBOL_NAMELEN (val) + 5;
988 if (capability != Mnil)
990 cap = mfont__get_capability (capability);
999 if (! lang && !script && !otf)
1004 if (! lang && cap && cap->language)
1006 lang_len = MSYMBOL_NAMELEN (cap->language);
1007 lang = MSYMBOL_NAME (cap->language);
1009 if (! script && cap && cap->script != Mnil)
1011 script_len = MSYMBOL_NAMELEN (cap->script);
1012 script = MSYMBOL_NAME (cap->script);
1014 if (! otf && cap && cap->script_tag)
1018 otf_len = 4; /* for script_tag */
1019 if (cap->langsys_tag)
1020 otf_len += 5; /* for "/XXXX */
1021 for (i = 0; i < MFONT_OTT_MAX; i++)
1022 if (cap->features[i].str)
1023 otf_len += strlen (cap->features[i].str) + 1; /* for "[=+]..." */
1024 otf = p = alloca (otf_len + 1);
1025 OTF_tag_name (cap->script_tag, otf);
1027 if (cap->langsys_tag)
1030 OTF_tag_name (cap->langsys_tag, p);
1033 if (cap->features[MFONT_OTT_GSUB].str)
1034 p += sprintf (p, "=%s", cap->features[MFONT_OTT_GSUB].str);
1035 if (cap->features[MFONT_OTT_GPOS].str)
1036 p += sprintf (p, "=%s", cap->features[MFONT_OTT_GSUB].str);
1038 buf = p = alloca (lang_len + script_len + otf_len + 1);
1040 p += sprintf (p, ":lang=%s", lang);
1042 p += sprintf (p, ":script=%s", script);
1044 p += sprintf (p, ":otf=%s", otf);
1045 return msymbol (buf);
1051 MSymbol Miso8859_1, Miso10646_1, Municode_bmp, Municode_full, Mapple_roman;
1057 MSymbol regular = msymbol ("regular");
1058 MSymbol normal = msymbol ("normal");
1059 MSymbol medium = msymbol ("medium");
1061 M_font_capability = msymbol_as_managing_key (" font-capability");
1062 M_font_list = msymbol_as_managing_key (" font-list");
1063 M_font_list_len = msymbol (" font-list-len");
1065 Mfoundry = msymbol ("foundry");
1066 mfont__property_table[MFONT_FOUNDRY].property = Mfoundry;
1067 Mfamily = msymbol ("family");
1068 mfont__property_table[MFONT_FAMILY].property = Mfamily;
1069 Mweight = msymbol ("weight");
1070 mfont__property_table[MFONT_WEIGHT].property = Mweight;
1071 Mstyle = msymbol ("style");
1072 mfont__property_table[MFONT_STYLE].property = Mstyle;
1073 Mstretch = msymbol ("stretch");
1074 mfont__property_table[MFONT_STRETCH].property = Mstretch;
1075 Madstyle = msymbol ("adstyle");
1076 mfont__property_table[MFONT_ADSTYLE].property = Madstyle;
1077 Mregistry = msymbol ("registry");
1078 mfont__property_table[MFONT_REGISTRY].property = Mregistry;
1080 Mspacing = msymbol ("spacing");
1081 Msize = msymbol ("size");
1082 Mresolution = msymbol ("resolution");
1083 Mmax_advance = msymbol ("max-advance");
1084 Mfontfile = msymbol ("fontfile");
1086 Mfontconfig = msymbol ("fontconfig");
1089 Mfreetype = msymbol ("freetype");
1090 Mxft = msymbol ("xft");
1092 Miso8859_1 = msymbol ("iso8859-1");
1093 Miso10646_1 = msymbol ("iso10646-1");
1094 Municode_bmp = msymbol ("unicode-bmp");
1095 Municode_full = msymbol ("unicode-full");
1096 Mapple_roman = msymbol ("apple-roman");
1098 Motf = msymbol ("otf");
1100 /* The first entry of each mfont__property_table must be Mnil so
1101 that actual properties get positive numeric numbers. */
1102 for (i = 0; i <= MFONT_REGISTRY; i++)
1104 MLIST_INIT1 (&mfont__property_table[i], names, 8);
1105 MLIST_APPEND1 (&mfont__property_table[i], names, Mnil, MERROR_FONT);
1108 /* Register predefined font property names. */
1109 for (i = 0; i <= MFONT_REGISTRY; i++)
1113 for (j = 0; j < font_common_names[i].num; j++)
1115 MSymbol sym = msymbol (font_common_names[i].names[j]);
1119 if (msymbol_put (sym, mfont__property_table[i].property,
1120 (void *) (j + 1)) < 0)
1122 MLIST_APPEND1 (&mfont__property_table[i], names, sym,
1124 if (i == MFONT_WEIGHT)
1127 font_weight_regular = j + 1;
1128 else if (sym == normal)
1129 font_weight_normal = j + 1;
1130 else if (sym == medium)
1131 font_weight_medium = j + 1;
1136 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
1137 of a score is a flag for a scalable font (see the documentation
1139 i = FONT_SCORE_PRIORITY_SIZE - 1;
1140 for (shift = 1; i >= 0; i--)
1142 font_score_shift_bits[font_score_priority[i]] = shift;
1143 if (font_score_priority[i] == MFONT_SIZE)
1145 else if (font_score_priority[i] <= MFONT_FAMILY)
1151 MFONT_INIT (&default_encoding.spec);
1152 default_encoding.encoding_name = Municode_full;
1153 default_encoding.encoding_charset = mcharset__unicode;
1154 default_encoding.repertory_name = Mnil;
1155 default_encoding.repertory_charset = NULL;
1161 mfont_freetype_path = mplist ();
1162 bufsize = strlen (M17NDIR) + 7;
1163 SAFE_ALLOCA (buf, bufsize);
1164 sprintf (buf, "%s/fonts", M17NDIR);
1165 mplist_add (mfont_freetype_path, Mstring, strdup (buf));
1166 path = getenv ("M17NDIR");
1169 bufsize = strlen (path) + 7;
1170 SAFE_ALLOCA (buf, bufsize);
1171 sprintf (buf, "%s/fonts", path);
1172 mplist_push (mfont_freetype_path, Mstring, strdup (buf));
1177 #ifdef HAVE_FREETYPE
1178 if (mfont__ft_init () < 0)
1180 #endif /* HAVE_FREETYPE */
1191 #ifdef HAVE_FREETYPE
1193 #endif /* HAVE_FREETYPE */
1195 MPLIST_DO (plist, mfont_freetype_path)
1196 free (MPLIST_VAL (plist));
1197 M17N_OBJECT_UNREF (mfont_freetype_path);
1199 if (font_resize_list)
1201 MPLIST_DO (plist, font_resize_list)
1202 free (MPLIST_VAL (plist));
1203 M17N_OBJECT_UNREF (font_resize_list);
1204 font_resize_list = NULL;
1206 if (font_encoding_list)
1208 MPLIST_DO (plist, font_encoding_list)
1209 free (MPLIST_VAL (plist));
1210 M17N_OBJECT_UNREF (font_encoding_list);
1211 font_encoding_list = NULL;
1214 for (i = 0; i <= MFONT_REGISTRY; i++)
1215 MLIST_FREE1 (&mfont__property_table[i], names);
1220 mfont__id (MFont *font)
1224 int file_len = (font->file == Mnil ? 0 : MSYMBOL_NAMELEN (font->file));
1225 int capability_len = (font->capability == Mnil ? 0
1226 : MSYMBOL_NAMELEN (font->capability));
1227 int total_len = MFONT_PROPERTY_MAX * 5 + 9 + file_len + capability_len;
1231 SAFE_ALLOCA (buf, total_len);
1233 if (font->property[0])
1234 p += sprintf (p, "%X", font->property[0]);
1235 for (i = 1; i < MFONT_PROPERTY_MAX; i++)
1237 if (font->property[i])
1238 p += sprintf (p, "-%X", font->property[i]);
1243 p += sprintf (p, "-%X", font->size);
1245 p += sprintf (p, "-%X", font->spacing);
1246 if (capability_len > 0)
1249 memcpy (p, MSYMBOL_NAME (font->capability), capability_len);
1250 p += capability_len;
1255 memcpy (p, MSYMBOL_NAME (font->file), file_len);
1258 id = msymbol__with_len (buf, p - buf);
1263 /** Return 1 iff FONT matches SPEC. */
1266 mfont__match_p (MFont *font, MFont *spec, int prop)
1268 if (spec->capability != font->capability
1269 && spec->capability != Mnil)
1271 MRealizedFont *rfont;
1273 if (font->type != MFONT_TYPE_REALIZED)
1274 return (font->capability == Mnil);
1275 rfont = (MRealizedFont *) font;
1276 return (rfont->driver->check_capability
1277 && (rfont->driver->check_capability (rfont, spec->capability)
1280 if (spec->file != font->file
1281 && spec->file != Mnil && font->file != Mnil)
1283 for (; prop >= 0; prop--)
1284 if (spec->property[prop] && font->property[prop]
1285 && font->property[prop] != spec->property[prop])
1290 /* Merge SRC into DST. If error_on_conflict is nonzero and a font
1291 property differs in SRC and DST, return -1. */
1294 mfont__merge (MFont *dst, MFont *src, int error_on_conflict)
1298 for (i = 0; i < MFONT_PROPERTY_MAX; i++)
1300 if (! dst->property[i])
1301 dst->property[i] = src->property[i];
1302 else if (error_on_conflict
1304 && dst->property[i] != src->property[i])
1308 dst->spacing = src->spacing;
1309 else if (error_on_conflict
1311 && dst->spacing != src->spacing)
1314 dst->size = src->size;
1315 else if (error_on_conflict
1317 && dst->size != src->size)
1319 if (dst->capability == Mnil)
1320 dst->capability = src->capability;
1321 else if (error_on_conflict
1323 && dst->capability != src->capability)
1325 if (dst->file == Mnil)
1326 dst->file = src->file;
1327 else if (error_on_conflict
1329 && dst->file != src->file)
1335 mfont__set_spec_from_face (MFont *spec, MFace *face)
1339 for (i = 0; i <= MFONT_ADSTYLE; i++)
1340 mfont__set_property (spec, i, face->property[i]);
1341 spec->property[MFONT_REGISTRY] = 0;
1342 spec->property[MFONT_RESY] = 0;
1343 spec->multiple_sizes = 0;
1344 spec->size = (int) (face->property[MFACE_SIZE]);
1345 spec->type = MFONT_TYPE_SPEC;
1346 spec->source = MFONT_SOURCE_UNDECIDED;
1347 spec->file = spec->capability = Mnil;
1348 spec->encoding = NULL;
1353 mfont__set_spec_from_plist (MFont *spec, MPlist *plist)
1356 MSymbol spec_list[MFONT_REGISTRY + 1];
1361 memset (spec_list, 0, sizeof spec_list);
1362 for (i = 0; ! MPLIST_TAIL_P (plist); i++, plist = MPLIST_NEXT (plist))
1364 if (! MPLIST_SYMBOL_P (plist))
1365 MERROR (MERROR_FONT, Mnil);
1366 spec_list[i] = MPLIST_SYMBOL (plist);
1368 registry = spec_list[i - 1];
1369 if (i > 1 && registry != Mnil)
1371 reg = MSYMBOL_NAME (registry);
1374 mfont__get_capability (registry);
1375 spec->capability = registry;
1376 registry = spec_list[i - 2];
1380 mfont__set_property (spec, MFONT_REGISTRY, registry);
1381 for (i -= 2; i >= 0; i--)
1382 mfont__set_property (spec, i, spec_list[i]);
1383 spec->type = MFONT_TYPE_SPEC;
1390 mfont__select (MFrame *frame, MFont *font, int max_size)
1392 MFontDriver *driver;
1394 if (font->type == MFONT_TYPE_FAILURE)
1396 if (font->type != MFONT_TYPE_SPEC)
1398 if (font->source == MFONT_SOURCE_UNDECIDED)
1400 if (font->file != Mnil || font->capability != Mnil)
1401 font->source = MFONT_SOURCE_FT;
1402 else if (font->property[MFONT_REGISTRY])
1404 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
1405 char *reg = MSYMBOL_NAME (registry);
1407 if (strncmp (reg, "unicode-", 8) == 0
1408 || strncmp (reg, "apple-roman", 11) == 0
1409 || (reg[0] >= '0' && reg[0] <= '9' && reg[1] == '-'))
1410 font->source = MFONT_SOURCE_FT;
1413 if (font->source != MFONT_SOURCE_FT)
1415 driver = mplist_get (frame->font_driver_list, Mx);
1417 return (driver->select) (frame, font, max_size);
1419 driver = mplist_get (frame->font_driver_list, Mfreetype);
1422 return (driver->select) (frame, font, max_size);
1427 mfont__available (MFrame *frame, MFont *font)
1433 compare_font_score (const void *e1, const void *e2)
1435 MFontScore *s1 = (MFontScore *) e1, *s2 = (MFontScore *) e2;
1437 return (s1->font->for_full_width == s2->font->for_full_width
1438 ? s1->score > s2->score
1439 : s1->font->for_full_width);
1443 mdebug_dump_font_list (MFontList *font_list)
1447 for (i = 0; i < font_list->nfonts; i++)
1449 fprintf (stderr, "%04X - ", font_list->fonts[i].score);
1450 mdebug_dump_font (font_list->fonts[i].font);
1451 fprintf (stderr, "\n");
1456 mfont__free_realized (MRealizedFont *rfont)
1458 MRealizedFont *next;
1460 for (; rfont; rfont = next)
1463 M17N_OBJECT_UNREF (rfont->info);
1470 mfont__list (MFrame *frame, MFont *spec, MFont *request, int max_size)
1473 MSymbol id = mfont__id (spec);
1477 pl = msymbol_get (id, M_font_list);
1479 num = (int) msymbol_get (id, M_font_list_len);
1484 MPLIST_DO (p, frame->font_driver_list)
1486 if (spec->source == MFONT_SOURCE_X ? MPLIST_KEY (p) == Mx
1487 : spec->source == MFONT_SOURCE_FT ? MPLIST_KEY (p) == Mfreetype
1490 MFontDriver *driver = MPLIST_VAL (p);
1491 num += (driver->list) (frame, pl, spec, 0);
1494 msymbol_put (id, M_font_list, pl);
1495 M17N_OBJECT_UNREF (pl);
1496 msymbol_put (id, M_font_list_len, (void *) num);
1502 MSTRUCT_MALLOC (list, MERROR_FONT);
1503 MTABLE_MALLOC (list->fonts, num, MERROR_FONT);
1504 for (i = 0; num > 0; num--, pl = MPLIST_NEXT (pl))
1506 MFont *font = MPLIST_VAL (pl), *adjusted = font;
1510 || font->size < max_size)
1512 list->fonts[i].font = font;
1513 if (spec == request)
1514 list->fonts[i].score = 0;
1521 && (resize_ratio = mfont_resize_ratio (font)) != 100)
1524 resized.size = font->size * 100 / resize_ratio;
1525 adjusted = &resized;
1527 list->fonts[i].score = font_score (adjusted, request);
1539 if (spec != request)
1540 qsort (list->fonts, i, sizeof (MFontScore), compare_font_score);
1541 list->object = *spec;
1542 mfont__merge (&list->object, request, 0);
1543 list->object.type = MFONT_TYPE_OBJECT;
1547 /** Open a font specified in FONT. */
1550 mfont__open (MFrame *frame, MFont *font, MFont *spec)
1552 MFontDriver *driver;
1553 MRealizedFont *rfont;
1555 if (font->source == MFONT_SOURCE_UNDECIDED)
1556 MFATAL (MERROR_FONT);
1557 if (font->type != MFONT_TYPE_OBJECT)
1558 MFATAL (MERROR_FONT);
1559 for (rfont = MPLIST_VAL (frame->realized_font_list); rfont;
1560 rfont = rfont->next)
1562 driver = rfont->driver;
1563 if (rfont->font == font
1564 && mplist_find_by_value (frame->font_driver_list, driver))
1570 driver = mplist_get (frame->font_driver_list,
1571 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1573 MFATAL (MERROR_FONT);
1575 return (driver->open) (frame, font, spec, rfont);
1579 mfont__has_char (MFrame *frame, MFont *font, MFont *spec, int c)
1581 MFontEncoding *encoding;
1583 MFontDriver *driver;
1585 if (font->source == MFONT_SOURCE_UNDECIDED)
1586 MFATAL (MERROR_FONT);
1587 encoding = (font->encoding ? font->encoding : find_encoding (font));
1588 if (! encoding->encoding_charset)
1590 if (encoding->repertory_charset)
1592 code = ENCODE_CHAR (encoding->repertory_charset, c);
1593 return (code != MCHAR_INVALID_CODE);
1595 code = ENCODE_CHAR (encoding->encoding_charset, c);
1596 if (code == MCHAR_INVALID_CODE)
1598 if (font->type == MFONT_TYPE_REALIZED)
1599 driver = ((MRealizedFont *) font)->driver;
1602 driver = mplist_get (frame->font_driver_list,
1603 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1605 MFATAL (MERROR_FONT);
1607 return (driver->has_char) (frame, font, spec, c, code);
1611 mfont__encode_char (MFrame *frame, MFont *font, MFont *spec, int c)
1613 MFontEncoding *encoding;
1615 MFontDriver *driver;
1617 if (font->source == MFONT_SOURCE_UNDECIDED)
1618 MFATAL (MERROR_FONT);
1619 encoding = (font->encoding ? font->encoding : find_encoding (font));
1620 if (! encoding->encoding_charset)
1621 return MCHAR_INVALID_CODE;
1622 if (font->source == MFONT_SOURCE_X && encoding->repertory_charset)
1623 return (ENCODE_CHAR (encoding->repertory_charset, c));
1624 code = ENCODE_CHAR (encoding->encoding_charset, c);
1625 if (code == MCHAR_INVALID_CODE)
1626 return MCHAR_INVALID_CODE;
1627 if (font->type == MFONT_TYPE_REALIZED)
1628 driver = ((MRealizedFont *) font)->driver;
1631 driver = mplist_get (frame->font_driver_list,
1632 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1634 MFATAL (MERROR_FONT);
1636 return (driver->encode_char) (frame, font, spec, code);
1640 mfont__get_metric (MGlyphString *gstring, int from, int to)
1642 MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
1643 MRealizedFont *rfont = from_g->rface->rfont;
1645 for (g = from_g; ; g++)
1646 if (g == to_g || g->rface->rfont != rfont)
1648 int idx = GLYPH_INDEX (g);
1650 (rfont->driver->find_metric) (rfont, gstring, from, idx);
1653 from_g->g.xadv >>= 6;
1654 from_g->g.yadv >>= 6;
1655 from_g->g.xoff >>= 6;
1656 from_g->g.yoff >>= 6;
1657 from_g->g.ascent >>= 6;
1658 from_g->g.descent >>= 6;
1659 from_g->g.lbearing >>= 6;
1660 from_g->g.rbearing >>= 6;
1665 rfont = g->rface->rfont;
1671 mfont__get_glyph_id (MFLTFont *font, MFLTGlyphString *gstring,
1674 MFont *mfont = (MFont *) ((MFLTFontForRealized *) font)->rfont;
1675 MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
1676 MFontEncoding *encoding;
1677 MFontDriver *driver = NULL;
1678 MGlyph *glyphs = (MGlyph *) gstring->glyphs;
1680 encoding = mfont->encoding ? mfont->encoding : find_encoding (mfont);
1681 for (; from < to; from++)
1683 MGlyph *g = glyphs + from;
1687 if (! encoding->encoding_charset)
1688 g->g.code = MCHAR_INVALID_CODE;
1689 else if (mfont->source == MFONT_SOURCE_X && encoding->repertory_charset)
1690 g->g.code = ENCODE_CHAR (encoding->repertory_charset, g->g.c);
1693 g->g.code = ENCODE_CHAR (encoding->encoding_charset, g->g.c);
1694 if (g->g.code != MCHAR_INVALID_CODE)
1698 if (mfont->type == MFONT_TYPE_REALIZED)
1699 driver = rfont->driver;
1702 driver = mplist_get (rfont->frame->font_driver_list,
1703 mfont->source == MFONT_SOURCE_X
1706 MFATAL (MERROR_FONT);
1710 = (driver->encode_char) (rfont->frame, rfont->font, mfont,
1720 mfont__get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
1723 MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
1726 gstr.glyphs = (MGlyph *) gstring->glyphs;
1727 (rfont->driver->find_metric) (rfont, &gstr, from, to);
1731 /* KEY <= MFONT_REGISTRY */
1734 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1742 numeric = FONT_PROPERTY_NUMERIC (val, key);
1745 numeric = mfont__property_table[key].used;
1746 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1747 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1750 font->property[key] = numeric;
1754 mfont__parse_name_into_font (const char *name, MSymbol format, MFont *font)
1758 if (format == Mx || format == Mnil)
1759 result = xlfd_parse_name (name, font);
1760 #ifdef HAVE_FONTCONFIG
1761 if (format == Mfontconfig || (result < 0 && format == Mnil))
1762 result = mfont__ft_parse_name (name, font);
1763 #endif /* HAVE_FONTCONFIG */
1768 mfont__encoding_list (void)
1770 if (! font_encoding_list)
1771 load_font_encoding_table ();
1772 return font_encoding_list;
1776 free_font_capability (void *object)
1778 MFontCapability *cap = object;
1780 if (cap->script_tag)
1783 for (i = 0; i < MFONT_OTT_MAX; i++)
1785 if (cap->features[i].str)
1786 free (cap->features[i].str);
1787 if (cap->features[i].tags)
1788 free (cap->features[i].tags);
1795 mfont__get_capability (MSymbol sym)
1797 MFontCapability *cap = msymbol_get (sym, M_font_capability);
1798 char *str, *p, *endp;
1802 str = MSYMBOL_NAME (sym);
1805 M17N_OBJECT (cap, free_font_capability, MERROR_FONT);
1806 msymbol_put (sym, M_font_capability, cap);
1807 M17N_OBJECT_UNREF (cap);
1808 endp = str + MSYMBOL_NAMELEN (sym);
1813 if (str[0] == 'o' && strncmp (str + 1, "tf=", 3) == 0)
1821 for (i = 0, p = str; i < 4 && p < endp; i++, p++);
1824 sym = msymbol__with_len (str, 4);
1825 cap->script = mscript__from_otf_tag (sym);
1826 if (cap->script == Mnil)
1828 cap->script_tag = OTF_tag (str);
1831 for (i = 0, str = ++p; i < 4 && p < endp; i++, p++);
1835 cap->script_tag = 0;
1838 cap->langsys_tag = OTF_tag (str);
1841 cap->langsys_tag = 0;
1843 for (i = 0; i < MFONT_OTT_MAX; i++)
1844 cap->features[i].nfeatures = -1;
1846 while (*p == '=' || *p == '+')
1848 int idx = *p == '=' ? MFONT_OTT_GSUB : MFONT_OTT_GPOS;
1851 while (p < endp && *p != '+') p++;
1855 /* We never have more than (p - str) tags. */
1856 OTF_Tag *tags = alloca (sizeof (OTF_Tag) * (p - str));
1859 cap->features[idx].str = malloc (p - str + 1);
1860 for (i = n = 0, p0 = str; str + i < p; i++)
1862 cap->features[idx].str[i] = str[i];
1863 if (str[i] == ',' || str + i + 1 == p)
1867 else if (*p0 == '~')
1868 tags[n] = OTF_tag (p0 + 1) | 0x80000000;
1870 tags[n] = OTF_tag (p0);
1875 cap->features[idx].str[i] = '\0';
1876 cap->features[idx].nfeatures = n;
1879 int size = sizeof (OTF_Tag) * n;
1881 cap->features[idx].tags = malloc (size);
1882 memcpy (cap->features[idx].tags, tags, size);
1887 cap->features[idx].str = NULL;
1888 cap->features[idx].nfeatures = 0;
1892 for (i = 0; i < MFONT_OTT_MAX; i++)
1893 if (cap->features[i].nfeatures < 0)
1895 cap->features[i].str = strdup ("*");
1896 cap->features[i].nfeatures = 1;
1897 cap->features[i].tags = malloc (sizeof (OTF_Tag));
1898 cap->features[i].tags[0] = 0;
1900 cap->otf = msymbol__with_len (beg, p - beg);
1903 else if (str[0] == 'l' && strncmp (str + 1, "ang=", 4) == 0)
1906 for (p = str; p < endp && *p != ':'; p++);
1908 cap->language = msymbol__with_len (str, p - str);
1911 else if (str[0] == 's' && strncmp (str + 1, "cript=", 6) == 0)
1914 for (p = str; p < endp && *p != ':'; p++);
1916 cap->script = msymbol__with_len (str, p - str);
1924 mfont__check_capability (MRealizedFont *rfont, MSymbol capability)
1926 return (rfont->driver->check_capability (rfont, capability));
1931 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1937 /*** @addtogroup m17nFont */
1941 /***en @name Variables: Keys of font property. */
1942 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1947 @brief Key of font property specifying foundry.
1949 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1950 is used as a key of font property and face property. The property
1951 value must be a symbol whose name is a foundry name of a font. */
1953 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1955 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt>
1956 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1957 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1962 @brief Key of font property specifying family.
1964 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1965 used as a key of font property and face property. The property
1966 value must be a symbol whose name is a family name of a font. */
1968 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1970 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt>
1971 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1972 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1977 @brief Key of font property specifying weight.
1979 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1980 used as a key of font property and face property. The property
1981 value must be a symbol whose name is a weight name of a font (e.g
1982 "medium", "bold"). */
1984 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1986 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt>
1987 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1988 Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1993 @brief Key of font property specifying style.
1995 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
1996 used as a key of font property and face property. The property
1997 value must be a symbol whose name is a style name of a font (e.g
2000 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2002 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt>
2003 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2004 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2009 @brief Key of font property specifying stretch.
2011 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
2012 is used as a key of font property and face property. The property
2013 value must be a symbol whose name is a stretch name of a font (e.g
2014 "normal", "condensed"). */
2016 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2018 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt>
2019 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2020 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2025 @brief Key of font property specifying additional style.
2027 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
2028 is used as a key of font property and face property. The property
2029 value must be a symbol whose name is an additional style name of a
2030 font (e.g "serif", "", "sans"). */
2032 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2034 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt>
2035 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2036 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2041 @brief Key of font property specifying spacing.
2043 The variable #Madstyle is a symbol of name <tt>"spacing"</tt> and
2044 is used as a key of font property. The property value must be a
2045 symbol whose name specifies the spacing of a font (e.g "p" for
2046 proportional, "m" for monospaced). */
2048 @brief spacing ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2050 ÊÑ¿ô #Mspacing ¤Ï <tt>"spacing"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
2051 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î spacing
2052 ÆÃÀ¤ò¼¨¤¹Ì¾Á° ("p", "m" Åù)¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2057 @brief Key of font property specifying registry.
2059 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
2060 and is used as a key of font property. The property value must be
2061 a symbol whose name is a registry name a font registry
2062 (e.g. "iso8859-1", "jisx0208.1983-0"). */
2064 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2066 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt>
2067 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2068 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0"
2069 Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2074 @brief Key of font property specifying size.
2076 The variable #Msize is a symbol of name <tt>"size"</tt> and is
2077 used as a key of font property and face property. The property
2078 value must be an integer specifying a font design size in the unit
2079 of 1/10 point (on 100 dpi display). */
2081 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2083 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt>
2084 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
2085 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10
2086 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
2092 @brief Key of font property specifying file name.
2094 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2095 and is used as a key of font property. The property value must be
2096 a symbol whose name is a font file name. */
2100 @brief Key of font property specifying file name.
2102 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2103 and is used as a key of font property. The property value must be
2104 a symbol whose name is a font file name. */
2106 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2108 ÊÑ¿ô #Mfontfile ¤Ï <tt>"fontfile"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
2109 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤
2110 ¥ë̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2115 @brief Key of font property specifying resolution.
2117 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
2118 is used as a key of font property and face property. The property
2119 value must be an integer to specifying a font resolution in the
2120 unit of dots per inch (dpi). */
2122 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2124 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt>
2125 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2126 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */
2128 MSymbol Mresolution;
2131 @brief Key of font property specifying max advance width.
2133 The variable #Mmax_advance is a symbol of name
2134 <tt>"max-advance"</tt> and is used as a key of font property. The
2135 property value must be an integer specifying a font's max advance
2138 MSymbol Mmax_advance;
2142 @brief Symbol of name "fontconfig".
2144 The variable #Mfontconfig is to be used as an argument of the
2145 functions mfont_parse_name () and mfont_unparse_name (). */
2147 @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2149 ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name ()
2150 ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
2152 MSymbol Mfontconfig;
2155 @brief Symbol of name "x".
2157 The variable #Mx is to be used for a value of <type> member of the
2158 structure #MDrawGlyph to specify the type of <fontp> member is
2159 actually (XFontStruct *). */
2161 @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2163 ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2164 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
2169 @brief Symbol of name "freetype".
2171 The variable #Mfreetype is to be used for a value of <type> member
2172 of the structure #MDrawGlyph to specify the type of <fontp> member
2173 is actually FT_Face. */
2175 @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2177 ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2178 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2183 @brief Symbol of name "xft".
2185 The variable #Mxft is to be used for a value of <type> member of the
2186 structure #MDrawGlyph to specify the type of <fontp> member
2187 is actually (XftFont *). */
2189 @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2191 ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2192 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2201 @brief List of font files and directories that contain font files.
2203 The variable @c mfont_freetype_path is a plist of FreeType font
2204 files and directories that contain FreeType font files. Key of
2205 the element is @c Mstring, and the value is a string that
2206 represents a font file or a directory.
2208 The macro M17N_INIT () sets up this variable to contain the
2209 sub-directory "fonts" of the m17n database and the environment
2210 variable "M17NDIR". The first call of mframe () creates the
2211 internal list of the actually available fonts from this variable.
2212 Thus, an application program, if necessary, must modify the
2213 variable before calling mframe (). If it is going to add a new
2214 element, value must be a string that can be safely freed.
2216 If the m17n library is not configured to use the FreeType library,
2217 this variable is not used. */
2219 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
2221 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î
2222 plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring
2223 ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
2225 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ¿ô
2226 "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
2227 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£
2228 ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe ()
2229 ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2230 ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2232 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
2234 MPlist *mfont_freetype_path;
2239 @brief Create a new font.
2241 The mfont () function creates a new font object that has no
2245 This function returns a pointer to the created font object. */
2247 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
2249 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2252 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
2259 MSTRUCT_CALLOC (font, MERROR_FONT);
2266 @brief Create a font by parsing a fontname.
2268 The mfont_parse_name () function creates a new font object. The
2269 properties are extracted fontname $NAME.
2271 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
2272 is parsed as XLFD (X Logical Font Description). If $FORMAT is
2273 #Mfontconfig, $NAME is parsed as Fontconfig's textual
2274 representation of font. If $FORMAT is #Mnil, $NAME is at first
2275 parsed as XLFD, and it it fails, parsed as Fontconfig's
2279 If the operation was successful, this function returns a pointer
2280 to the created font. Otherwise it returns @c NULL. */
2283 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2285 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾
2286 $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2288 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
2289 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2290 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig
2291 ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD
2292 ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2295 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name ()
2296 ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
2299 mfont_parse_name (const char *name, MSymbol format)
2301 MFont template, *font;
2303 MFONT_INIT (&template);
2304 if (mfont__parse_name_into_font (name, format, &template) < 0)
2305 MERROR (MERROR_FONT, NULL);
2306 MSTRUCT_CALLOC (font, MERROR_FONT);
2314 @brief Create a fontname from a font.
2316 The mfont_unparse_name () function creates a fontname string
2317 from font $FONT according to $FORMAT.
2319 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
2320 is in XLFD (X Logical Font Description) format. If it is
2321 #Mfontconfig, the fontname is in the style of Fontconfig's text
2325 This function returns a newly allocated fontname string, which is
2326 not freed unless the user explicitly does so by free (). */
2329 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2331 ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT
2332 ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£
2334 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£
2335 #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£
2336 #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
2339 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬
2340 free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
2343 mfont_unparse_name (MFont *font, MSymbol format)
2348 name = xlfd_unparse_name (font, 1);
2349 #ifdef HAVE_FONTCONFIG
2350 else if (format == Mfontconfig)
2351 name = mfont__ft_unparse_name (font);
2353 #endif /* HAVE_FONTCONFIG */
2355 MERROR (MERROR_FONT, NULL);
2362 @brief Make a copy of a font.
2364 The mfont_copy () function returns a new copy of font $FONT. */
2366 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
2368 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
2371 mfont_copy (MFont *font)
2375 MSTRUCT_MALLOC (copy, MERROR_FONT);
2383 @brief Get a property value of a font.
2385 The mfont_get_prop () function gets the value of $KEY property of
2386 font $FONT. $KEY must be one of the following symbols:
2388 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2389 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2391 If $FONT is a return value of mfont_find (), $KEY can also be one
2392 of the following symbols:
2394 #Mfont_ascent, #Mfont_descent, #Mmax_advance.
2396 @return If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
2397 @c Mstretch, @c Madstyle, @c Mregistry, or @c Mspacing, this
2398 function returns the corresponding value as a symbol. If the font
2399 does not have $KEY property, it returns @c Mnil. If $KEY is @c
2400 Msize, @c Mresolution, #Mfont_ascent, Mfont_descent, or
2401 #Mmax_advance, this function returns the corresponding value as an
2402 integer. If the font does not have $KEY property, it returns 0.
2403 If $KEY is something else, it returns @c NULL and assigns an error
2404 code to the external variable #merror_code. */
2407 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
2409 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
2410 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
2413 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2414 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2416 @return $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
2417 Mstretch, @c Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢
2418 ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
2419 ¾ì¹ç¤Ë¤Ï@c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î
2420 ¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£
2421 ¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c
2422 NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2425 mfont_get_prop (MFont *font, MSymbol key)
2427 MRealizedFont *rfont = NULL;
2429 if (font->type == MFONT_TYPE_REALIZED)
2430 rfont = (MRealizedFont *) font;
2432 if (key == Mfoundry)
2433 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
2435 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
2437 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
2439 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
2440 if (key == Mstretch)
2441 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
2442 if (key == Madstyle)
2443 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
2444 if (key == Mregistry)
2445 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
2448 int size = font->size;
2449 return (void *) size;
2451 if (key == Mresolution)
2453 int resy = font->property[MFONT_RESY];
2454 return (void *) resy;
2456 if (key == Mlanguage || key == Mscript || key == Motf)
2458 MFontCapability *cap;
2460 if (! font->capability)
2462 cap = mfont__get_capability (font->capability);
2463 if (key == Mlanguage)
2464 return cap->language;
2470 if (key == Mfontfile)
2471 return (void *) font->file;
2472 if (key == Mspacing)
2473 return (font->spacing == MFONT_SPACING_UNDECIDED ? Mnil
2474 : msymbol (font->spacing == MFONT_SPACING_PROPORTIONAL ? "p"
2475 : font->spacing == MFONT_SPACING_MONO ? "m" : "c"));
2478 if (key == Mfont_ascent)
2479 return (void *) rfont->ascent;
2480 if (key == Mfont_descent)
2481 return (void *) rfont->descent;
2482 if (key == Mmax_advance)
2483 return (void *) rfont->max_advance;
2485 MERROR (MERROR_FONT, NULL);
2491 @brief Put a property value to a font.
2493 The mfont_put_prop () function puts a font property whose key is
2494 $KEY and value is $VAL to font $FONT. $KEY must be one of the
2497 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2498 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2500 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
2501 Otherwise, $VAL must be a symbol of a property value name. But,
2502 if the name is "nil", a symbol of name "Nil" must be
2505 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
2507 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í¥Ñ
2508 ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
2510 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2511 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2513 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï
2514 ¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥×¥í¥Ñ¥Æ¥£ÃͤÎ̾Á°¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ
2515 ¤Ï¤Ê¤é¤Ê¤¤¡£¤¿¤À¤·¤â¤·¤½¤Î̾Á°¤¬ "nil" ¤Î¾ì¹ç¤Ï¡¢Ì¾Á°¤¬ "Nil" ¤Î¥·
2516 ¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
2519 mfont_put_prop (MFont *font, MSymbol key, void *val)
2521 if (key == Mfoundry)
2522 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
2523 else if (key == Mfamily)
2524 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
2525 else if (key == Mweight)
2526 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
2527 else if (key == Mstyle)
2528 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
2529 else if (key == Mstretch)
2530 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
2531 else if (key == Madstyle)
2532 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
2533 else if (key == Mregistry)
2534 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
2535 else if (key == Msize)
2537 int size = (int) val;
2540 else if (key == Mresolution)
2542 unsigned resy = (unsigned) val;
2543 font->property[MFONT_RESY] = resy;
2545 else if (key == Mlanguage || key == Mscript || key == Motf)
2547 font->capability = merge_capability (font->capability,
2548 key, (MSymbol) val, 1);
2550 else if (key == Mfontfile)
2552 font->file = (MSymbol) val;
2555 MERROR (MERROR_FONT, -1);
2562 @brief Return the font selection priority.
2564 The mfont_selection_priority () function returns a newly created
2565 array of six symbols. The elements are the following
2566 keys of font properties ordered by priority.
2568 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2569 @c Madstyle, @c Msize.
2571 The m17n library selects the best matching font according to the
2572 order of this array. A font that has a different value for a
2573 property of lower priority is preferred to a font that has a
2574 different value for a property of higher priority. */
2576 @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹.
2578 ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£
2579 ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2581 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2582 @c Madstyle, @c Msize.
2584 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
2585 ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£
2590 mfont_selection_priority ()
2595 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
2596 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2598 enum MFontProperty prop = font_score_priority[i];
2600 if (prop == MFONT_SIZE)
2602 else if (prop == MFONT_ADSTYLE)
2604 else if (prop == MFONT_FAMILY)
2606 else if (prop == MFONT_WEIGHT)
2608 else if (prop == MFONT_STYLE)
2610 else if (prop == MFONT_STRETCH)
2621 @brief Set the font selection priority.
2623 The mfont_set_selection_priority () function sets font selection
2624 priority according to $KEYS, which is an array of six symbols.
2625 Each element must be one of the below. No two elements must be
2628 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2629 @c Madstyle, @c Msize.
2631 See the documentation of the function mfont_selection_priority ()
2634 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
2636 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
2637 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ
2638 ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2640 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2641 @c Madstyle, @c Msize.
2643 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
2647 mfont_set_selection_priority (MSymbol *keys)
2649 int priority[FONT_SCORE_PRIORITY_SIZE];
2652 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
2654 enum MFontProperty prop;
2658 else if (*keys == Madstyle)
2659 prop = MFONT_ADSTYLE;
2660 else if (*keys == Mfamily)
2661 prop = MFONT_FAMILY;
2662 else if (*keys == Mweight)
2663 prop = MFONT_WEIGHT;
2664 else if (*keys == Mstyle)
2666 else if (*keys == Mstretch)
2667 prop = MFONT_STRETCH;
2668 else if (*keys == Mfoundry)
2669 prop = MFONT_FOUNDRY;
2671 /* Invalid element. */
2673 for (j = 0; j < i; j++)
2674 if (priority[j] == prop)
2675 /* Duplicated element. */
2679 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2680 font_score_priority[i] = priority[i];
2681 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
2682 of a score is a flag for a scalable font (see the documentation
2684 i = FONT_SCORE_PRIORITY_SIZE - 1;
2685 for (shift = 1; i >= 0; i--)
2687 font_score_shift_bits[font_score_priority[i]] = shift;
2688 if (font_score_priority[i] == MFONT_SIZE)
2690 else if (font_score_priority[i] <= MFONT_FAMILY)
2703 The mfont_find () function returns a pointer to the available font
2704 that matches best the specification $SPEC on frame $FRAME.
2706 $SCORE, if not NULL, must point to a place to store the score
2707 value that indicates how well the found font matches to $SPEC. The
2708 smaller score means a better match. */
2710 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
2712 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC
2713 ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
2715 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC
2716 ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
2717 ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
2721 mfont_find (MFrame *frame, MFont *spec, int *score, int max_size)
2726 MRealizedFont *rfont;
2731 double pt = - spec->size;
2734 adjusted.size = pt * frame->dpi / 72.27 + 0.5;
2737 MFONT_INIT (&spec_copy);
2738 spec_copy.property[MFONT_FAMILY] = spec->property[MFONT_FAMILY];
2739 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
2740 spec_copy.capability = spec->capability;
2741 spec_copy.file = spec->file;
2743 list = mfont__list (frame, &spec_copy, spec, max_size);
2747 best = list->fonts[0].font;
2749 *score = list->fonts[0].score;
2753 mfont__merge (&spec_copy, spec, 0);
2754 rfont = mfont__open (frame, best, spec);
2757 return (MFont *) rfont;
2762 @brief Set encoding of a font.
2764 The mfont_set_encoding () function sets the encoding information
2767 $ENCODING_NAME is a symbol representing a charset that has the
2768 same encoding as the font.
2770 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
2771 has the same repertory as the font. If it is @c Mnil, whether a
2772 specific character is supported by the font is asked to each font
2776 If the operation was successful, this function returns 0.
2777 Otherwise it returns -1 and assigns an error code to the external
2778 variable #merror_code. */
2780 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
2782 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£
2784 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2786 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2787 @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£
2790 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
2791 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2795 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
2797 MCharset *encoding_charset = MCHARSET (encoding_name);
2798 MCharset *repertory_charset;
2800 MFontEncoding *encoding;
2803 if (! encoding_charset)
2804 MERROR (MERROR_FONT, -1);
2805 if (repertory_name != Mnil)
2807 repertory_charset = MCHARSET (repertory_name);
2808 if (! repertory_charset)
2809 MERROR (MERROR_FONT, -1);
2812 repertory_charset = NULL;
2814 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2815 encoding->spec = *font;
2816 encoding->encoding_name = encoding_name;
2817 encoding->encoding_charset = encoding_charset;
2818 encoding->repertory_name = repertory_name;
2819 encoding->repertory_charset = repertory_charset;
2820 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2821 if (registry == Mnil)
2823 if (! font_encoding_list)
2824 load_font_encoding_table ();
2825 mplist_push (font_encoding_list, registry, encoding);
2826 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2827 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2839 @brief Create a fontname from a font.
2841 This function is obsolete. Use mfont_unparse_name instead. */
2843 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2845 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2848 mfont_name (MFont *font)
2850 return mfont_unparse_name (font, Mx);
2856 @brief Create a new font from fontname.
2858 This function is obsolete. Use mfont_parse_name () instead. */
2861 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2863 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2866 mfont_from_name (const char *name)
2868 return mfont_parse_name (name, Mx);
2874 @brief Get resize information of a font.
2876 The mfont_resize_ratio () function lookups the m17n database
2877 \<font, reisize\> and returns a resizing ratio (in percentage) of
2878 FONT. For instance, if the return value is 150, that means that
2879 the m17n library uses an 1.5 time bigger font than a specified
2883 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2885 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\>
2886 ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë
2887 ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5
2888 ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2891 mfont_resize_ratio (MFont *font)
2893 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2894 MFontResize *resize;
2897 if (! font_resize_list)
2898 load_font_resize_table ();
2899 if (! MPLIST_TAIL_P (font_resize_list))
2902 plist = font_resize_list;
2903 while (registry ? (plist = mplist_find_by_key (plist, registry))
2906 resize = (MFontResize *) MPLIST_VAL (plist);
2907 if (mfont__match_p (font, &resize->spec, MFONT_ADSTYLE))
2908 return resize->resize;
2909 plist = MPLIST_NEXT (plist);
2921 @brief Get a list of fonts.
2923 The mfont_list () functions returns a list of fonts available on
2924 frame $FRAME. $FONT, if not NULL, limits fonts to ones
2925 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2926 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2927 the number of fonts.
2929 $LANGUAGE argument exists just for backward compatibility, and the
2930 use is deprecated. Use #Mlanguage font property instead. If
2931 $FONT already has #Mlanguage property, $LANGUAGE is ignored.
2934 This function returns a plist whose keys are family names and
2935 values are pointers to the object MFont. The plist must be freed
2936 by m17n_object_unref (). If no font is found, it returns
2940 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2942 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤ò
2943 ÊÖ¤¹¡£$FONT ¤¬ NULL ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È
2944 ¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼
2945 ¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$MAXNUM ¤Ï¡¢0 ¤è¤êÂ礤¤¾ì
2946 ¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2948 ¤¿¤À¤·¡¢°ú¿ô $LANGUAGE ¤ÏµìÈǤȤÎÀ°¹çÀ¤Î¤¿¤á¤À¤±¤Ë¤¢¤ê¡¢¤½¤Î»ÈÍѤÏ
2949 ´«¤á¤é¤ì¤Ê¤¤¡£¥Õ¥©¥ó¥È¤Î #Mlanguage ¥×¥í¥Ñ¥Æ¥£¤ò»È¤¦¤Ù¤¤Ç¤¢¤ë¡£¤â
2950 ¤· $FONT ¤¬¤¹¤Ç¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤¤¤¿¤é¡¢°ú¿ô $LANGUAGE ¤Ï̵
2954 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
2955 ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Êplist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref () ¤Ç
2956 ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */
2959 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2962 MFontList *font_list;
2973 double pt = - spec.size;
2975 spec.size = pt * frame->dpi / 72.27 + 0.5;
2978 if (language != Mnil)
2979 spec.capability = merge_capability (spec.capability, Mlanguage, language,
2982 font_list = mfont__list (frame, &spec, &spec, 0);
2985 if (font_list->nfonts == 0)
2991 plist = pl = mplist ();
2992 for (i = 0; i < font_list->nfonts; i++)
2994 MSymbol family = FONT_PROPERTY (font_list->fonts[i].font, MFONT_FAMILY);
2997 pl = mplist_add (pl, family, font_list->fonts[i].font);
3004 @brief Get a list of font famiy names.
3006 The mfont_list_family_names () functions returns a list of font
3007 family names available on frame $FRAME.
3011 This function returns a plist whose keys are #Msymbol and values
3012 are symbols representing font family names. The elements are
3013 sorted by alphabetical order. The plist must be freed by
3014 m17n_object_unref (). If not font is found, it returns NULL. */
3017 mfont_list_family_names (MFrame *frame)
3019 MPlist *plist = mplist (), *p;
3021 MPLIST_DO (p, frame->font_driver_list)
3023 MFontDriver *driver = MPLIST_VAL (p);
3025 (driver->list_family_names) (frame, plist);
3034 @brief Check the usability of a font.
3036 The mfont_check () function checkes if $FONT can be used for
3037 $SCRIPT and $LANGUAGE in $FONTSET on $FRAME.
3039 @return If the font is usable, return 1. Otherwise return 0.
3043 mfont_check (MFrame *frame, MFontset *fontset,
3044 MSymbol script, MSymbol language, MFont *font)
3046 MRealizedFont *rfont;
3050 fontset = frame->face->property[MFACE_FONTSET];
3051 rfont = mfontset__get_font (frame, fontset, script, language, font, &best);
3052 if (! rfont || ! best)
3054 score = font_score (&rfont->spec, font);
3055 return (score == 0 ? 2 : 1);
3061 @brief Check is a font matches with a font spec.
3063 The mfont_match_p () function checks if $FONT matches with the
3067 If the font matches, 1 is returned. Otherwise 0 is returned. */
3070 mfont_match_p (MFont *font, MFont *spec)
3072 return mfont__match_p (font, spec, MFONT_REGISTRY);
3079 The mfont_open () function opens $FONT on $FRAME, and returns a
3083 If the font was successfully opened, a realized font is returned.
3084 Otherwize NULL is returned.
3091 mfont_open (MFrame *frame, MFont *font)
3093 enum MFontType font_type = font->type;
3095 if (font_type == MFONT_TYPE_SPEC)
3096 return mfont_find (frame, font, NULL, 0);
3097 if (font_type == MFONT_TYPE_OBJECT)
3098 return (MFont *) mfont__open (frame, font, font);
3099 if (font_type == MFONT_TYPE_REALIZED)
3101 MERROR (MERROR_FONT, NULL);
3106 @brief Encapusulate a font.
3108 The mfont_encapsulate () functions realizes a font by
3109 encapusulating data $DATA or type $DATA_TYPE on #FRAME. Currently
3110 $DATA_TAPE is #Mfontconfig or #Mfreetype, and $DATA points to an
3111 object of FcPattern or FT_Face respectively.
3114 If the operation was successful, a realized font is returned.
3115 Otherwise NULL is return.
3122 mfont_encapsulate (MFrame *frame, MSymbol data_type, void *data)
3126 MPLIST_DO (p, frame->font_driver_list)
3128 MFontDriver *driver = MPLIST_VAL (p);
3129 MRealizedFont *rfont;
3131 if (driver->encapsulate
3132 && (rfont = driver->encapsulate (frame, data_type, data)))
3133 return (MFont *) rfont;
3141 @brief Close a font.
3143 The mfont_close () function close a realized font $FONT. $FONT
3144 must be opened previously by mfont_open () or mfont_encapsulate
3148 If the operation was successful, 0 is returned. Otherwise, -1 is
3152 mfont_open (), mfont_encapsulate (). */
3155 mfont_close (MFont *font)
3157 enum MFontType font_type = font->type;
3158 MRealizedFont *rfont;
3160 if (font_type != MFONT_TYPE_REALIZED)
3161 MERROR (MERROR_FONT, -1);
3162 rfont = (MRealizedFont *) font;
3163 if (rfont->encapsulating
3164 && rfont->driver->close)
3165 rfont->driver->close (rfont);
3171 /*** @addtogroup m17nDebug */
3178 The mdebug_dump_font () function prints font $FONT in a human readable
3182 This function returns $FONT. */
3184 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
3186 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr
3187 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£
3190 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
3193 mdebug_dump_font (MFont *font)
3197 name = xlfd_unparse_name (font, 0);
3200 fprintf (stderr, "%s", name);
3203 if (font->file != Mnil)
3205 char *file = MSYMBOL_NAME (font->file);
3206 char *lastslash = file, *p;
3208 for (p = file; *p; p++)
3212 fprintf (stderr, ",");
3213 fprintf (stderr, "%s", lastslash + 1);
3215 if (font->capability != Mnil)
3216 fprintf (stderr, "%s", MSYMBOL_NAME (font->capability));