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;
1681 encoding = mfont->encoding ? mfont->encoding : find_encoding (mfont);
1682 for (; from < to; from++)
1684 MGlyph *g = glyphs + from;
1688 if (! encoding->encoding_charset)
1689 g->g.code = MCHAR_INVALID_CODE;
1690 else if (mfont->source == MFONT_SOURCE_X && encoding->repertory_charset)
1691 g->g.code = ENCODE_CHAR (encoding->repertory_charset, g->g.code);
1694 unsigned code = ENCODE_CHAR (encoding->encoding_charset, g->g.code);
1696 if (code != MCHAR_INVALID_CODE)
1700 if (mfont->type == MFONT_TYPE_REALIZED)
1701 driver = rfont->driver;
1704 driver = mplist_get (rfont->frame->font_driver_list,
1705 mfont->source == MFONT_SOURCE_X
1708 MFATAL (MERROR_FONT);
1712 = (driver->encode_char) (rfont->frame, rfont->font, mfont,
1717 if (g->g.code == MCHAR_INVALID_CODE)
1724 mfont__get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
1727 MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
1730 gstr.glyphs = (MGlyph *) gstring->glyphs;
1731 (rfont->driver->find_metric) (rfont, &gstr, from, to);
1735 /* KEY <= MFONT_REGISTRY */
1738 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1746 numeric = FONT_PROPERTY_NUMERIC (val, key);
1749 numeric = mfont__property_table[key].used;
1750 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1751 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1754 font->property[key] = numeric;
1758 mfont__parse_name_into_font (const char *name, MSymbol format, MFont *font)
1762 if (format == Mx || format == Mnil)
1763 result = xlfd_parse_name (name, font);
1764 #ifdef HAVE_FONTCONFIG
1765 if (format == Mfontconfig || (result < 0 && format == Mnil))
1766 result = mfont__ft_parse_name (name, font);
1767 #endif /* HAVE_FONTCONFIG */
1772 mfont__encoding_list (void)
1774 if (! font_encoding_list)
1775 load_font_encoding_table ();
1776 return font_encoding_list;
1780 free_font_capability (void *object)
1782 MFontCapability *cap = object;
1784 if (cap->script_tag)
1787 for (i = 0; i < MFONT_OTT_MAX; i++)
1789 if (cap->features[i].str)
1790 free (cap->features[i].str);
1791 if (cap->features[i].tags)
1792 free (cap->features[i].tags);
1799 mfont__get_capability (MSymbol sym)
1801 MFontCapability *cap = msymbol_get (sym, M_font_capability);
1802 char *str, *p, *endp;
1806 str = MSYMBOL_NAME (sym);
1809 M17N_OBJECT (cap, free_font_capability, MERROR_FONT);
1810 msymbol_put (sym, M_font_capability, cap);
1811 M17N_OBJECT_UNREF (cap);
1812 endp = str + MSYMBOL_NAMELEN (sym);
1817 if (str[0] == 'o' && strncmp (str + 1, "tf=", 3) == 0)
1825 for (i = 0, p = str; i < 4 && p < endp; i++, p++);
1828 sym = msymbol__with_len (str, 4);
1829 cap->script = mscript__from_otf_tag (sym);
1830 if (cap->script == Mnil)
1832 cap->script_tag = OTF_tag (str);
1835 for (i = 0, str = ++p; i < 4 && p < endp; i++, p++);
1839 cap->script_tag = 0;
1842 cap->langsys_tag = OTF_tag (str);
1845 cap->langsys_tag = 0;
1847 for (i = 0; i < MFONT_OTT_MAX; i++)
1848 cap->features[i].nfeatures = -1;
1850 while (*p == '=' || *p == '+')
1852 int idx = *p == '=' ? MFONT_OTT_GSUB : MFONT_OTT_GPOS;
1855 while (p < endp && *p != '+') p++;
1859 /* We never have more than (p - str) tags. */
1860 OTF_Tag *tags = alloca (sizeof (OTF_Tag) * (p - str));
1863 cap->features[idx].str = malloc (p - str + 1);
1864 for (i = n = 0, p0 = str; str + i < p; i++)
1866 cap->features[idx].str[i] = str[i];
1867 if (str[i] == ',' || str + i + 1 == p)
1871 else if (*p0 == '~')
1872 tags[n] = OTF_tag (p0 + 1) | 0x80000000;
1874 tags[n] = OTF_tag (p0);
1879 cap->features[idx].str[i] = '\0';
1880 cap->features[idx].nfeatures = n;
1883 int size = sizeof (OTF_Tag) * n;
1885 cap->features[idx].tags = malloc (size);
1886 memcpy (cap->features[idx].tags, tags, size);
1891 cap->features[idx].str = NULL;
1892 cap->features[idx].nfeatures = 0;
1896 for (i = 0; i < MFONT_OTT_MAX; i++)
1897 if (cap->features[i].nfeatures < 0)
1899 cap->features[i].str = strdup ("*");
1900 cap->features[i].nfeatures = 1;
1901 cap->features[i].tags = malloc (sizeof (OTF_Tag));
1902 cap->features[i].tags[0] = 0;
1904 cap->otf = msymbol__with_len (beg, p - beg);
1907 else if (str[0] == 'l' && strncmp (str + 1, "ang=", 4) == 0)
1910 for (p = str; p < endp && *p != ':'; p++);
1912 cap->language = msymbol__with_len (str, p - str);
1915 else if (str[0] == 's' && strncmp (str + 1, "cript=", 6) == 0)
1918 for (p = str; p < endp && *p != ':'; p++);
1920 cap->script = msymbol__with_len (str, p - str);
1928 mfont__check_capability (MRealizedFont *rfont, MSymbol capability)
1930 return (rfont->driver->check_capability (rfont, capability));
1935 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1941 /*** @addtogroup m17nFont */
1945 /***en @name Variables: Keys of font property. */
1946 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1951 @brief Key of font property specifying foundry.
1953 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1954 is used as a key of font property and face property. The property
1955 value must be a symbol whose name is a foundry name of a font. */
1957 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1959 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt>
1960 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1961 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1966 @brief Key of font property specifying family.
1968 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1969 used as a key of font property and face property. The property
1970 value must be a symbol whose name is a family name of a font. */
1972 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1974 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt>
1975 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1976 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1981 @brief Key of font property specifying weight.
1983 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1984 used as a key of font property and face property. The property
1985 value must be a symbol whose name is a weight name of a font (e.g
1986 "medium", "bold"). */
1988 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1990 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt>
1991 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1992 Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1997 @brief Key of font property specifying style.
1999 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
2000 used as a key of font property and face property. The property
2001 value must be a symbol whose name is a style name of a font (e.g
2004 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2006 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt>
2007 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2008 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2013 @brief Key of font property specifying stretch.
2015 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
2016 is used as a key of font property and face property. The property
2017 value must be a symbol whose name is a stretch name of a font (e.g
2018 "normal", "condensed"). */
2020 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2022 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt>
2023 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2024 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2029 @brief Key of font property specifying additional style.
2031 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
2032 is used as a key of font property and face property. The property
2033 value must be a symbol whose name is an additional style name of a
2034 font (e.g "serif", "", "sans"). */
2036 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2038 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt>
2039 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2040 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2045 @brief Key of font property specifying spacing.
2047 The variable #Madstyle is a symbol of name <tt>"spacing"</tt> and
2048 is used as a key of font property. The property value must be a
2049 symbol whose name specifies the spacing of a font (e.g "p" for
2050 proportional, "m" for monospaced). */
2052 @brief spacing ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2054 ÊÑ¿ô #Mspacing ¤Ï <tt>"spacing"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
2055 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î spacing
2056 ÆÃÀ¤ò¼¨¤¹Ì¾Á° ("p", "m" Åù)¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2061 @brief Key of font property specifying registry.
2063 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
2064 and is used as a key of font property. The property value must be
2065 a symbol whose name is a registry name a font registry
2066 (e.g. "iso8859-1", "jisx0208.1983-0"). */
2068 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2070 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt>
2071 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2072 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0"
2073 Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2078 @brief Key of font property specifying size.
2080 The variable #Msize is a symbol of name <tt>"size"</tt> and is
2081 used as a key of font property and face property. The property
2082 value must be an integer specifying a font design size in the unit
2083 of 1/10 point (on 100 dpi display). */
2085 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2087 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt>
2088 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
2089 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10
2090 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
2096 @brief Key of font property specifying file name.
2098 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2099 and is used as a key of font property. The property value must be
2100 a symbol whose name is a font file name. */
2104 @brief Key of font property specifying file name.
2106 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2107 and is used as a key of font property. The property value must be
2108 a symbol whose name is a font file name. */
2110 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2112 ÊÑ¿ô #Mfontfile ¤Ï <tt>"fontfile"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
2113 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤
2114 ¥ë̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2119 @brief Key of font property specifying resolution.
2121 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
2122 is used as a key of font property and face property. The property
2123 value must be an integer to specifying a font resolution in the
2124 unit of dots per inch (dpi). */
2126 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2128 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt>
2129 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2130 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */
2132 MSymbol Mresolution;
2135 @brief Key of font property specifying max advance width.
2137 The variable #Mmax_advance is a symbol of name
2138 <tt>"max-advance"</tt> and is used as a key of font property. The
2139 property value must be an integer specifying a font's max advance
2142 MSymbol Mmax_advance;
2146 @brief Symbol of name "fontconfig".
2148 The variable #Mfontconfig is to be used as an argument of the
2149 functions mfont_parse_name () and mfont_unparse_name (). */
2151 @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2153 ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name ()
2154 ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
2156 MSymbol Mfontconfig;
2159 @brief Symbol of name "x".
2161 The variable #Mx is to be used for a value of <type> member of the
2162 structure #MDrawGlyph to specify the type of <fontp> member is
2163 actually (XFontStruct *). */
2165 @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2167 ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2168 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
2173 @brief Symbol of name "freetype".
2175 The variable #Mfreetype is to be used for a value of <type> member
2176 of the structure #MDrawGlyph to specify the type of <fontp> member
2177 is actually FT_Face. */
2179 @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2181 ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2182 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2187 @brief Symbol of name "xft".
2189 The variable #Mxft is to be used for a value of <type> member of the
2190 structure #MDrawGlyph to specify the type of <fontp> member
2191 is actually (XftFont *). */
2193 @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2195 ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2196 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2205 @brief List of font files and directories that contain font files.
2207 The variable @c mfont_freetype_path is a plist of FreeType font
2208 files and directories that contain FreeType font files. Key of
2209 the element is @c Mstring, and the value is a string that
2210 represents a font file or a directory.
2212 The macro M17N_INIT () sets up this variable to contain the
2213 sub-directory "fonts" of the m17n database and the environment
2214 variable "M17NDIR". The first call of mframe () creates the
2215 internal list of the actually available fonts from this variable.
2216 Thus, an application program, if necessary, must modify the
2217 variable before calling mframe (). If it is going to add a new
2218 element, value must be a string that can be safely freed.
2220 If the m17n library is not configured to use the FreeType library,
2221 this variable is not used. */
2223 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
2225 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î
2226 plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring
2227 ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
2229 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ¿ô
2230 "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
2231 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£
2232 ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe ()
2233 ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2234 ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2236 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
2238 MPlist *mfont_freetype_path;
2243 @brief Create a new font.
2245 The mfont () function creates a new font object that has no
2249 This function returns a pointer to the created font object. */
2251 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
2253 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2256 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
2263 MSTRUCT_CALLOC (font, MERROR_FONT);
2270 @brief Create a font by parsing a fontname.
2272 The mfont_parse_name () function creates a new font object. The
2273 properties are extracted fontname $NAME.
2275 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
2276 is parsed as XLFD (X Logical Font Description). If $FORMAT is
2277 #Mfontconfig, $NAME is parsed as Fontconfig's textual
2278 representation of font. If $FORMAT is #Mnil, $NAME is at first
2279 parsed as XLFD, and it it fails, parsed as Fontconfig's
2283 If the operation was successful, this function returns a pointer
2284 to the created font. Otherwise it returns @c NULL. */
2287 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2289 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾
2290 $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2292 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
2293 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2294 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig
2295 ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD
2296 ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2299 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name ()
2300 ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
2303 mfont_parse_name (const char *name, MSymbol format)
2305 MFont template, *font;
2307 MFONT_INIT (&template);
2308 if (mfont__parse_name_into_font (name, format, &template) < 0)
2309 MERROR (MERROR_FONT, NULL);
2310 MSTRUCT_CALLOC (font, MERROR_FONT);
2318 @brief Create a fontname from a font.
2320 The mfont_unparse_name () function creates a fontname string
2321 from font $FONT according to $FORMAT.
2323 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
2324 is in XLFD (X Logical Font Description) format. If it is
2325 #Mfontconfig, the fontname is in the style of Fontconfig's text
2329 This function returns a newly allocated fontname string, which is
2330 not freed unless the user explicitly does so by free (). */
2333 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2335 ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT
2336 ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£
2338 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£
2339 #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£
2340 #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
2343 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬
2344 free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
2347 mfont_unparse_name (MFont *font, MSymbol format)
2352 name = xlfd_unparse_name (font, 1);
2353 #ifdef HAVE_FONTCONFIG
2354 else if (format == Mfontconfig)
2355 name = mfont__ft_unparse_name (font);
2357 #endif /* HAVE_FONTCONFIG */
2359 MERROR (MERROR_FONT, NULL);
2366 @brief Make a copy of a font.
2368 The mfont_copy () function returns a new copy of font $FONT. */
2370 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
2372 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
2375 mfont_copy (MFont *font)
2379 MSTRUCT_MALLOC (copy, MERROR_FONT);
2387 @brief Get a property value of a font.
2389 The mfont_get_prop () function gets the value of $KEY property of
2390 font $FONT. $KEY must be one of the following symbols:
2392 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2393 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2395 If $FONT is a return value of mfont_find (), $KEY can also be one
2396 of the following symbols:
2398 #Mfont_ascent, #Mfont_descent, #Mmax_advance.
2400 @return If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
2401 @c Mstretch, @c Madstyle, @c Mregistry, or @c Mspacing, this
2402 function returns the corresponding value as a symbol. If the font
2403 does not have $KEY property, it returns @c Mnil. If $KEY is @c
2404 Msize, @c Mresolution, #Mfont_ascent, Mfont_descent, or
2405 #Mmax_advance, this function returns the corresponding value as an
2406 integer. If the font does not have $KEY property, it returns 0.
2407 If $KEY is something else, it returns @c NULL and assigns an error
2408 code to the external variable #merror_code. */
2411 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
2413 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
2414 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
2417 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2418 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2420 @return $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
2421 Mstretch, @c Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢
2422 ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
2423 ¾ì¹ç¤Ë¤Ï@c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î
2424 ¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£
2425 ¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c
2426 NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2429 mfont_get_prop (MFont *font, MSymbol key)
2431 MRealizedFont *rfont = NULL;
2433 if (font->type == MFONT_TYPE_REALIZED)
2434 rfont = (MRealizedFont *) font;
2436 if (key == Mfoundry)
2437 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
2439 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
2441 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
2443 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
2444 if (key == Mstretch)
2445 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
2446 if (key == Madstyle)
2447 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
2448 if (key == Mregistry)
2449 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
2452 int size = font->size;
2453 return (void *) size;
2455 if (key == Mresolution)
2457 int resy = font->property[MFONT_RESY];
2458 return (void *) resy;
2460 if (key == Mlanguage || key == Mscript || key == Motf)
2462 MFontCapability *cap;
2464 if (! font->capability)
2466 cap = mfont__get_capability (font->capability);
2467 if (key == Mlanguage)
2468 return cap->language;
2474 if (key == Mfontfile)
2475 return (void *) font->file;
2476 if (key == Mspacing)
2477 return (font->spacing == MFONT_SPACING_UNDECIDED ? Mnil
2478 : msymbol (font->spacing == MFONT_SPACING_PROPORTIONAL ? "p"
2479 : font->spacing == MFONT_SPACING_MONO ? "m" : "c"));
2482 if (key == Mfont_ascent)
2483 return (void *) rfont->ascent;
2484 if (key == Mfont_descent)
2485 return (void *) rfont->descent;
2486 if (key == Mmax_advance)
2487 return (void *) rfont->max_advance;
2489 MERROR (MERROR_FONT, NULL);
2495 @brief Put a property value to a font.
2497 The mfont_put_prop () function puts a font property whose key is
2498 $KEY and value is $VAL to font $FONT. $KEY must be one of the
2501 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2502 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2504 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
2505 Otherwise, $VAL must be a symbol of a property value name. But,
2506 if the name is "nil", a symbol of name "Nil" must be
2509 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
2511 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í¥Ñ
2512 ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
2514 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2515 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2517 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï
2518 ¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥×¥í¥Ñ¥Æ¥£ÃͤÎ̾Á°¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ
2519 ¤Ï¤Ê¤é¤Ê¤¤¡£¤¿¤À¤·¤â¤·¤½¤Î̾Á°¤¬ "nil" ¤Î¾ì¹ç¤Ï¡¢Ì¾Á°¤¬ "Nil" ¤Î¥·
2520 ¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
2523 mfont_put_prop (MFont *font, MSymbol key, void *val)
2525 if (key == Mfoundry)
2526 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
2527 else if (key == Mfamily)
2528 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
2529 else if (key == Mweight)
2530 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
2531 else if (key == Mstyle)
2532 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
2533 else if (key == Mstretch)
2534 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
2535 else if (key == Madstyle)
2536 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
2537 else if (key == Mregistry)
2538 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
2539 else if (key == Msize)
2541 int size = (int) val;
2544 else if (key == Mresolution)
2546 unsigned resy = (unsigned) val;
2547 font->property[MFONT_RESY] = resy;
2549 else if (key == Mlanguage || key == Mscript || key == Motf)
2551 font->capability = merge_capability (font->capability,
2552 key, (MSymbol) val, 1);
2554 else if (key == Mfontfile)
2556 font->file = (MSymbol) val;
2559 MERROR (MERROR_FONT, -1);
2566 @brief Return the font selection priority.
2568 The mfont_selection_priority () function returns a newly created
2569 array of six symbols. The elements are the following
2570 keys of font properties ordered by priority.
2572 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2573 @c Madstyle, @c Msize.
2575 The m17n library selects the best matching font according to the
2576 order of this array. A font that has a different value for a
2577 property of lower priority is preferred to a font that has a
2578 different value for a property of higher priority. */
2580 @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹.
2582 ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£
2583 ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2585 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2586 @c Madstyle, @c Msize.
2588 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
2589 ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£
2594 mfont_selection_priority ()
2599 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
2600 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2602 enum MFontProperty prop = font_score_priority[i];
2604 if (prop == MFONT_SIZE)
2606 else if (prop == MFONT_ADSTYLE)
2608 else if (prop == MFONT_FAMILY)
2610 else if (prop == MFONT_WEIGHT)
2612 else if (prop == MFONT_STYLE)
2614 else if (prop == MFONT_STRETCH)
2625 @brief Set the font selection priority.
2627 The mfont_set_selection_priority () function sets font selection
2628 priority according to $KEYS, which is an array of six symbols.
2629 Each element must be one of the below. No two elements must be
2632 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2633 @c Madstyle, @c Msize.
2635 See the documentation of the function mfont_selection_priority ()
2638 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
2640 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
2641 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ
2642 ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2644 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2645 @c Madstyle, @c Msize.
2647 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
2651 mfont_set_selection_priority (MSymbol *keys)
2653 int priority[FONT_SCORE_PRIORITY_SIZE];
2656 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
2658 enum MFontProperty prop;
2662 else if (*keys == Madstyle)
2663 prop = MFONT_ADSTYLE;
2664 else if (*keys == Mfamily)
2665 prop = MFONT_FAMILY;
2666 else if (*keys == Mweight)
2667 prop = MFONT_WEIGHT;
2668 else if (*keys == Mstyle)
2670 else if (*keys == Mstretch)
2671 prop = MFONT_STRETCH;
2672 else if (*keys == Mfoundry)
2673 prop = MFONT_FOUNDRY;
2675 /* Invalid element. */
2677 for (j = 0; j < i; j++)
2678 if (priority[j] == prop)
2679 /* Duplicated element. */
2683 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2684 font_score_priority[i] = priority[i];
2685 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
2686 of a score is a flag for a scalable font (see the documentation
2688 i = FONT_SCORE_PRIORITY_SIZE - 1;
2689 for (shift = 1; i >= 0; i--)
2691 font_score_shift_bits[font_score_priority[i]] = shift;
2692 if (font_score_priority[i] == MFONT_SIZE)
2694 else if (font_score_priority[i] <= MFONT_FAMILY)
2707 The mfont_find () function returns a pointer to the available font
2708 that matches best the specification $SPEC on frame $FRAME.
2710 $SCORE, if not NULL, must point to a place to store the score
2711 value that indicates how well the found font matches to $SPEC. The
2712 smaller score means a better match. */
2714 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
2716 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC
2717 ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
2719 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC
2720 ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
2721 ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
2725 mfont_find (MFrame *frame, MFont *spec, int *score, int max_size)
2730 MRealizedFont *rfont;
2735 double pt = - spec->size;
2738 adjusted.size = pt * frame->dpi / 72.27 + 0.5;
2741 MFONT_INIT (&spec_copy);
2742 spec_copy.property[MFONT_FAMILY] = spec->property[MFONT_FAMILY];
2743 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
2744 spec_copy.capability = spec->capability;
2745 spec_copy.file = spec->file;
2747 list = mfont__list (frame, &spec_copy, spec, max_size);
2751 best = list->fonts[0].font;
2753 *score = list->fonts[0].score;
2757 mfont__merge (&spec_copy, spec, 0);
2758 rfont = mfont__open (frame, best, spec);
2761 return (MFont *) rfont;
2766 @brief Set encoding of a font.
2768 The mfont_set_encoding () function sets the encoding information
2771 $ENCODING_NAME is a symbol representing a charset that has the
2772 same encoding as the font.
2774 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
2775 has the same repertory as the font. If it is @c Mnil, whether a
2776 specific character is supported by the font is asked to each font
2780 If the operation was successful, this function returns 0.
2781 Otherwise it returns -1 and assigns an error code to the external
2782 variable #merror_code. */
2784 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
2786 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£
2788 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2790 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2791 @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£
2794 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
2795 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2799 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
2801 MCharset *encoding_charset = MCHARSET (encoding_name);
2802 MCharset *repertory_charset;
2804 MFontEncoding *encoding;
2807 if (! encoding_charset)
2808 MERROR (MERROR_FONT, -1);
2809 if (repertory_name != Mnil)
2811 repertory_charset = MCHARSET (repertory_name);
2812 if (! repertory_charset)
2813 MERROR (MERROR_FONT, -1);
2816 repertory_charset = NULL;
2818 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2819 encoding->spec = *font;
2820 encoding->encoding_name = encoding_name;
2821 encoding->encoding_charset = encoding_charset;
2822 encoding->repertory_name = repertory_name;
2823 encoding->repertory_charset = repertory_charset;
2824 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2825 if (registry == Mnil)
2827 if (! font_encoding_list)
2828 load_font_encoding_table ();
2829 mplist_push (font_encoding_list, registry, encoding);
2830 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2831 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2843 @brief Create a fontname from a font.
2845 This function is obsolete. Use mfont_unparse_name instead. */
2847 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2849 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2852 mfont_name (MFont *font)
2854 return mfont_unparse_name (font, Mx);
2860 @brief Create a new font from fontname.
2862 This function is obsolete. Use mfont_parse_name () instead. */
2865 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2867 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2870 mfont_from_name (const char *name)
2872 return mfont_parse_name (name, Mx);
2878 @brief Get resize information of a font.
2880 The mfont_resize_ratio () function lookups the m17n database
2881 \<font, reisize\> and returns a resizing ratio (in percentage) of
2882 FONT. For instance, if the return value is 150, that means that
2883 the m17n library uses an 1.5 time bigger font than a specified
2887 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2889 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\>
2890 ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë
2891 ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5
2892 ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2895 mfont_resize_ratio (MFont *font)
2897 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2898 MFontResize *resize;
2901 if (! font_resize_list)
2902 load_font_resize_table ();
2903 if (! MPLIST_TAIL_P (font_resize_list))
2906 plist = font_resize_list;
2907 while (registry ? (plist = mplist_find_by_key (plist, registry))
2910 resize = (MFontResize *) MPLIST_VAL (plist);
2911 if (mfont__match_p (font, &resize->spec, MFONT_ADSTYLE))
2912 return resize->resize;
2913 plist = MPLIST_NEXT (plist);
2925 @brief Get a list of fonts.
2927 The mfont_list () functions returns a list of fonts available on
2928 frame $FRAME. $FONT, if not NULL, limits fonts to ones
2929 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2930 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2931 the number of fonts.
2933 $LANGUAGE argument exists just for backward compatibility, and the
2934 use is deprecated. Use #Mlanguage font property instead. If
2935 $FONT already has #Mlanguage property, $LANGUAGE is ignored.
2938 This function returns a plist whose keys are family names and
2939 values are pointers to the object MFont. The plist must be freed
2940 by m17n_object_unref (). If no font is found, it returns
2944 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2946 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤ò
2947 ÊÖ¤¹¡£$FONT ¤¬ NULL ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È
2948 ¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼
2949 ¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$MAXNUM ¤Ï¡¢0 ¤è¤êÂ礤¤¾ì
2950 ¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2952 ¤¿¤À¤·¡¢°ú¿ô $LANGUAGE ¤ÏµìÈǤȤÎÀ°¹çÀ¤Î¤¿¤á¤À¤±¤Ë¤¢¤ê¡¢¤½¤Î»ÈÍѤÏ
2953 ´«¤á¤é¤ì¤Ê¤¤¡£¥Õ¥©¥ó¥È¤Î #Mlanguage ¥×¥í¥Ñ¥Æ¥£¤ò»È¤¦¤Ù¤¤Ç¤¢¤ë¡£¤â
2954 ¤· $FONT ¤¬¤¹¤Ç¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤¤¤¿¤é¡¢°ú¿ô $LANGUAGE ¤Ï̵
2958 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
2959 ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Êplist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref () ¤Ç
2960 ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */
2963 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2966 MFontList *font_list;
2977 double pt = - spec.size;
2979 spec.size = pt * frame->dpi / 72.27 + 0.5;
2982 if (language != Mnil)
2983 spec.capability = merge_capability (spec.capability, Mlanguage, language,
2986 font_list = mfont__list (frame, &spec, &spec, 0);
2989 if (font_list->nfonts == 0)
2995 plist = pl = mplist ();
2996 for (i = 0; i < font_list->nfonts; i++)
2998 MSymbol family = FONT_PROPERTY (font_list->fonts[i].font, MFONT_FAMILY);
3001 pl = mplist_add (pl, family, font_list->fonts[i].font);
3008 @brief Get a list of font famiy names.
3010 The mfont_list_family_names () functions returns a list of font
3011 family names available on frame $FRAME.
3015 This function returns a plist whose keys are #Msymbol and values
3016 are symbols representing font family names. The elements are
3017 sorted by alphabetical order. The plist must be freed by
3018 m17n_object_unref (). If not font is found, it returns NULL. */
3021 mfont_list_family_names (MFrame *frame)
3023 MPlist *plist = mplist (), *p;
3025 MPLIST_DO (p, frame->font_driver_list)
3027 MFontDriver *driver = MPLIST_VAL (p);
3029 (driver->list_family_names) (frame, plist);
3038 @brief Check the usability of a font.
3040 The mfont_check () function checkes if $FONT can be used for
3041 $SCRIPT and $LANGUAGE in $FONTSET on $FRAME.
3043 @return If the font is usable, return 1. Otherwise return 0.
3047 mfont_check (MFrame *frame, MFontset *fontset,
3048 MSymbol script, MSymbol language, MFont *font)
3050 MRealizedFont *rfont;
3054 fontset = frame->face->property[MFACE_FONTSET];
3055 rfont = mfontset__get_font (frame, fontset, script, language, font, &best);
3056 if (! rfont || ! best)
3058 score = font_score (&rfont->spec, font);
3059 return (score == 0 ? 2 : 1);
3065 @brief Check is a font matches with a font spec.
3067 The mfont_match_p () function checks if $FONT matches with the
3071 If the font matches, 1 is returned. Otherwise 0 is returned. */
3074 mfont_match_p (MFont *font, MFont *spec)
3076 return mfont__match_p (font, spec, MFONT_REGISTRY);
3083 The mfont_open () function opens $FONT on $FRAME, and returns a
3087 If the font was successfully opened, a realized font is returned.
3088 Otherwize NULL is returned.
3095 mfont_open (MFrame *frame, MFont *font)
3097 enum MFontType font_type = font->type;
3099 if (font_type == MFONT_TYPE_SPEC)
3100 return mfont_find (frame, font, NULL, 0);
3101 if (font_type == MFONT_TYPE_OBJECT)
3102 return (MFont *) mfont__open (frame, font, font);
3103 if (font_type == MFONT_TYPE_REALIZED)
3105 MERROR (MERROR_FONT, NULL);
3110 @brief Encapusulate a font.
3112 The mfont_encapsulate () functions realizes a font by
3113 encapusulating data $DATA or type $DATA_TYPE on #FRAME. Currently
3114 $DATA_TAPE is #Mfontconfig or #Mfreetype, and $DATA points to an
3115 object of FcPattern or FT_Face respectively.
3118 If the operation was successful, a realized font is returned.
3119 Otherwise NULL is return.
3126 mfont_encapsulate (MFrame *frame, MSymbol data_type, void *data)
3130 MPLIST_DO (p, frame->font_driver_list)
3132 MFontDriver *driver = MPLIST_VAL (p);
3133 MRealizedFont *rfont;
3135 if (driver->encapsulate
3136 && (rfont = driver->encapsulate (frame, data_type, data)))
3137 return (MFont *) rfont;
3145 @brief Close a font.
3147 The mfont_close () function close a realized font $FONT. $FONT
3148 must be opened previously by mfont_open () or mfont_encapsulate
3152 If the operation was successful, 0 is returned. Otherwise, -1 is
3156 mfont_open (), mfont_encapsulate (). */
3159 mfont_close (MFont *font)
3161 enum MFontType font_type = font->type;
3162 MRealizedFont *rfont;
3164 if (font_type != MFONT_TYPE_REALIZED)
3165 MERROR (MERROR_FONT, -1);
3166 rfont = (MRealizedFont *) font;
3167 if (rfont->encapsulating
3168 && rfont->driver->close)
3169 rfont->driver->close (rfont);
3175 /*** @addtogroup m17nDebug */
3182 The mdebug_dump_font () function prints font $FONT in a human readable
3186 This function returns $FONT. */
3188 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
3190 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr
3191 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£
3194 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
3197 mdebug_dump_font (MFont *font)
3201 name = xlfd_unparse_name (font, 0);
3204 fprintf (stderr, "%s", name);
3207 if (font->file != Mnil)
3209 char *file = MSYMBOL_NAME (font->file);
3210 char *lastslash = file, *p;
3212 for (p = file; *p; p++)
3216 fprintf (stderr, ",");
3217 fprintf (stderr, "%s", lastslash + 1);
3219 if (font->capability != Mnil)
3220 fprintf (stderr, "%s", MSYMBOL_NAME (font->capability));