1 /* font.c -- font module.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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 notation "xxx property of F" means the font property that
39 belongs to font F and whose key is @c Mxxx.
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 (mfont->source == MFONT_SOURCE_X && encoding->repertory_charset)
1689 g->g.code = ENCODE_CHAR (encoding->repertory_charset, g->g.c);
1694 if (encoding->encoding_charset)
1695 code = ENCODE_CHAR (encoding->encoding_charset, g->g.c);
1699 if (code != MCHAR_INVALID_CODE)
1703 if (mfont->type == MFONT_TYPE_REALIZED)
1704 driver = rfont->driver;
1707 driver = mplist_get (rfont->frame->font_driver_list,
1708 mfont->source == MFONT_SOURCE_X
1711 MFATAL (MERROR_FONT);
1714 g->g.code = (driver->encode_char) (rfont->frame, rfont->font,
1719 if (g->g.code == MCHAR_INVALID_CODE)
1726 mfont__get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
1729 MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
1732 gstr.glyphs = (MGlyph *) gstring->glyphs;
1733 (rfont->driver->find_metric) (rfont, &gstr, from, to);
1737 /* KEY <= MFONT_REGISTRY */
1740 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1748 numeric = FONT_PROPERTY_NUMERIC (val, key);
1751 numeric = mfont__property_table[key].used;
1752 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1753 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1756 font->property[key] = numeric;
1760 mfont__parse_name_into_font (const char *name, MSymbol format, MFont *font)
1764 if (format == Mx || format == Mnil)
1765 result = xlfd_parse_name (name, font);
1766 #ifdef HAVE_FONTCONFIG
1767 if (format == Mfontconfig || (result < 0 && format == Mnil))
1768 result = mfont__ft_parse_name (name, font);
1769 #endif /* HAVE_FONTCONFIG */
1774 mfont__encoding_list (void)
1776 if (! font_encoding_list)
1777 load_font_encoding_table ();
1778 return font_encoding_list;
1782 free_font_capability (void *object)
1784 MFontCapability *cap = object;
1786 if (cap->script_tag)
1789 for (i = 0; i < MFONT_OTT_MAX; i++)
1791 if (cap->features[i].str)
1792 free (cap->features[i].str);
1793 if (cap->features[i].tags)
1794 free (cap->features[i].tags);
1801 mfont__get_capability (MSymbol sym)
1803 MFontCapability *cap = msymbol_get (sym, M_font_capability);
1804 char *str, *p, *endp;
1808 str = MSYMBOL_NAME (sym);
1811 M17N_OBJECT (cap, free_font_capability, MERROR_FONT);
1812 msymbol_put (sym, M_font_capability, cap);
1813 M17N_OBJECT_UNREF (cap);
1814 endp = str + MSYMBOL_NAMELEN (sym);
1819 if (str[0] == 'o' && strncmp (str + 1, "tf=", 3) == 0)
1827 for (i = 0, p = str; i < 4 && p < endp; i++, p++);
1830 sym = msymbol__with_len (str, 4);
1831 cap->script = mscript__from_otf_tag (sym);
1832 if (cap->script == Mnil)
1834 cap->script_tag = OTF_tag (str);
1837 for (i = 0, str = ++p; i < 4 && p < endp; i++, p++);
1841 cap->script_tag = 0;
1844 cap->langsys_tag = OTF_tag (str);
1847 cap->langsys_tag = 0;
1849 for (i = 0; i < MFONT_OTT_MAX; i++)
1850 cap->features[i].nfeatures = -1;
1852 while (*p == '=' || *p == '+')
1854 int idx = *p == '=' ? MFONT_OTT_GSUB : MFONT_OTT_GPOS;
1857 while (p < endp && *p != '+') p++;
1861 /* We never have more than (p - str) tags. */
1862 OTF_Tag *tags = alloca (sizeof (OTF_Tag) * (p - str));
1865 cap->features[idx].str = malloc (p - str + 1);
1866 for (i = n = 0, p0 = str; str + i < p; i++)
1868 cap->features[idx].str[i] = str[i];
1869 if (str[i] == ',' || str + i + 1 == p)
1873 else if (*p0 == '~')
1874 tags[n] = OTF_tag (p0 + 1) | 0x80000000;
1876 tags[n] = OTF_tag (p0);
1881 cap->features[idx].str[i] = '\0';
1882 cap->features[idx].nfeatures = n;
1885 int size = sizeof (OTF_Tag) * n;
1887 cap->features[idx].tags = malloc (size);
1888 memcpy (cap->features[idx].tags, tags, size);
1893 cap->features[idx].str = NULL;
1894 cap->features[idx].nfeatures = 0;
1898 for (i = 0; i < MFONT_OTT_MAX; i++)
1899 if (cap->features[i].nfeatures < 0)
1901 cap->features[i].str = strdup ("*");
1902 cap->features[i].nfeatures = 1;
1903 cap->features[i].tags = malloc (sizeof (OTF_Tag));
1904 cap->features[i].tags[0] = 0;
1906 cap->otf = msymbol__with_len (beg, p - beg);
1909 else if (str[0] == 'l' && strncmp (str + 1, "ang=", 4) == 0)
1912 for (p = str; p < endp && *p != ':'; p++);
1914 cap->language = msymbol__with_len (str, p - str);
1917 else if (str[0] == 's' && strncmp (str + 1, "cript=", 6) == 0)
1920 for (p = str; p < endp && *p != ':'; p++);
1922 cap->script = msymbol__with_len (str, p - str);
1930 mfont__check_capability (MRealizedFont *rfont, MSymbol capability)
1932 return (rfont->driver->check_capability (rfont, capability));
1937 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1943 /*** @addtogroup m17nFont */
1947 /***en @name Variables: Keys of font property. */
1948 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1953 @brief Key of font property specifying foundry.
1955 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1956 is used as a key of font property and face property. The property
1957 value must be a symbol whose name is a foundry name of a font. */
1959 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1961 ÊÑ¿ô #Mfoundry ¤Ï <tt>"foundry"</tt>
1962 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1963 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1968 @brief Key of font property specifying family.
1970 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1971 used as a key of font property and face property. The property
1972 value must be a symbol whose name is a family name of a font. */
1974 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1976 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt>
1977 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1978 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1983 @brief Key of font property specifying weight.
1985 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1986 used as a key of font property and face property. The property
1987 value must be a symbol whose name is a weight name of a font (e.g
1988 "medium", "bold"). */
1990 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1992 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt>
1993 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1994 Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1999 @brief Key of font property specifying style.
2001 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
2002 used as a key of font property and face property. The property
2003 value must be a symbol whose name is a style name of a font (e.g
2006 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2008 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt>
2009 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2010 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2015 @brief Key of font property specifying stretch.
2017 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
2018 is used as a key of font property and face property. The property
2019 value must be a symbol whose name is a stretch name of a font (e.g
2020 "normal", "condensed"). */
2022 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2024 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt>
2025 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2026 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2031 @brief Key of font property specifying additional style.
2033 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
2034 is used as a key of font property and face property. The property
2035 value must be a symbol whose name is an additional style name of a
2036 font (e.g "serif", "", "sans"). */
2038 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2040 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt>
2041 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2042 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2047 @brief Key of font property specifying spacing.
2049 The variable #Madstyle is a symbol of name <tt>"spacing"</tt> and
2050 is used as a key of font property. The property value must be a
2051 symbol whose name specifies the spacing of a font (e.g "p" for
2052 proportional, "m" for monospaced). */
2054 @brief spacing ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2056 ÊÑ¿ô #Mspacing ¤Ï <tt>"spacing"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
2057 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î spacing
2058 ÆÃÀ¤ò¼¨¤¹Ì¾Á° ("p", "m" Åù)¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2063 @brief Key of font property specifying registry.
2065 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
2066 and is used as a key of font property. The property value must be
2067 a symbol whose name is a registry name a font registry
2068 (e.g. "iso8859-1", "jisx0208.1983-0"). */
2070 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2072 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt>
2073 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2074 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0"
2075 Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2080 @brief Key of font property specifying size.
2082 The variable #Msize is a symbol of name <tt>"size"</tt> and is
2083 used as a key of font property and face property. The property
2084 value must be an integer specifying a font design size in the unit
2085 of 1/10 point (on 100 dpi display). */
2087 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2089 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt>
2090 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
2091 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10
2092 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
2098 @brief Key of font property specifying file name.
2100 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2101 and is used as a key of font property. The property value must be
2102 a symbol whose name is a font file name. */
2106 @brief Key of font property specifying file name.
2108 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2109 and is used as a key of font property. The property value must be
2110 a symbol whose name is a font file name. */
2112 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2114 ÊÑ¿ô #Mfontfile ¤Ï <tt>"fontfile"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
2115 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤
2116 ¥ë̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2121 @brief Key of font property specifying resolution.
2123 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
2124 is used as a key of font property and face property. The property
2125 value must be an integer to specifying a font resolution in the
2126 unit of dots per inch (dpi). */
2128 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2130 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt>
2131 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2132 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */
2134 MSymbol Mresolution;
2137 @brief Key of font property specifying max advance width.
2139 The variable #Mmax_advance is a symbol of name
2140 <tt>"max-advance"</tt> and is used as a key of font property. The
2141 property value must be an integer specifying a font's max advance
2144 MSymbol Mmax_advance;
2148 @brief Symbol of name "fontconfig".
2150 The variable #Mfontconfig is to be used as an argument of the
2151 functions mfont_parse_name () and mfont_unparse_name (). */
2153 @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2155 ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name ()
2156 ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
2158 MSymbol Mfontconfig;
2161 @brief Symbol of name "x".
2163 The variable #Mx is to be used for a value of \<type\> member of the
2164 structure #MDrawGlyph to specify the type of \<fontp\> member is
2165 actually (XFontStruct *). */
2167 @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2169 ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
2170 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
2175 @brief Symbol of name "freetype".
2177 The variable #Mfreetype is to be used for a value of \<type\> member
2178 of the structure #MDrawGlyph to specify the type of \<fontp\> member
2179 is actually FT_Face. */
2181 @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2183 ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
2184 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2189 @brief Symbol of name "xft".
2191 The variable #Mxft is to be used for a value of \<type\> member of the
2192 structure #MDrawGlyph to specify the type of \<fontp\> member
2193 is actually (XftFont *). */
2195 @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2197 ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
2198 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2207 @brief List of font files and directories that contain font files.
2209 The variable @c mfont_freetype_path is a plist of FreeType font
2210 files and directories that contain FreeType font files. Key of
2211 the element is @c Mstring, and the value is a string that
2212 represents a font file or a directory.
2214 The macro M17N_INIT () sets up this variable to contain the
2215 sub-directory "fonts" of the m17n database and the environment
2216 variable "M17NDIR". The first call of mframe () creates the
2217 internal list of the actually available fonts from this variable.
2218 Thus, an application program, if necessary, must modify the
2219 variable before calling mframe (). If it is going to add a new
2220 element, value must be a string that can be safely freed.
2222 If the m17n library is not configured to use the FreeType library,
2223 this variable is not used. */
2225 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
2227 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î
2228 plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring
2229 ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
2231 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ¿ô
2232 "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
2233 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£
2234 ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe ()
2235 ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2236 ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2238 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
2240 MPlist *mfont_freetype_path;
2245 @brief Create a new font.
2247 The mfont () function creates a new font object that has no
2251 This function returns a pointer to the created font object. */
2253 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
2255 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2258 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
2265 MSTRUCT_CALLOC (font, MERROR_FONT);
2272 @brief Create a font by parsing a fontname.
2274 The mfont_parse_name () function creates a new font object. The
2275 properties are extracted fontname $NAME.
2277 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
2278 is parsed as XLFD (X Logical Font Description). If $FORMAT is
2279 #Mfontconfig, $NAME is parsed as Fontconfig's textual
2280 representation of font. If $FORMAT is #Mnil, $NAME is at first
2281 parsed as XLFD, and it it fails, parsed as Fontconfig's
2285 If the operation was successful, this function returns a pointer
2286 to the created font. Otherwise it returns @c NULL. */
2289 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2291 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾
2292 $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2294 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
2295 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2296 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig
2297 ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD
2298 ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2301 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name ()
2302 ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
2305 mfont_parse_name (const char *name, MSymbol format)
2307 MFont template, *font;
2309 MFONT_INIT (&template);
2310 if (mfont__parse_name_into_font (name, format, &template) < 0)
2311 MERROR (MERROR_FONT, NULL);
2312 MSTRUCT_CALLOC (font, MERROR_FONT);
2320 @brief Create a fontname from a font.
2322 The mfont_unparse_name () function creates a fontname string
2323 from font $FONT according to $FORMAT.
2325 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
2326 is in XLFD (X Logical Font Description) format. If it is
2327 #Mfontconfig, the fontname is in the style of Fontconfig's text
2331 This function returns a newly allocated fontname string, which is
2332 not freed unless the user explicitly does so by free (). */
2335 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2337 ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT
2338 ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£
2340 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£
2341 #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£
2342 #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
2345 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬
2346 free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
2349 mfont_unparse_name (MFont *font, MSymbol format)
2354 name = xlfd_unparse_name (font, 1);
2355 #ifdef HAVE_FONTCONFIG
2356 else if (format == Mfontconfig)
2357 name = mfont__ft_unparse_name (font);
2359 #endif /* HAVE_FONTCONFIG */
2361 MERROR (MERROR_FONT, NULL);
2368 @brief Make a copy of a font.
2370 The mfont_copy () function returns a new copy of font $FONT. */
2372 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
2374 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
2377 mfont_copy (MFont *font)
2381 MSTRUCT_MALLOC (copy, MERROR_FONT);
2389 @brief Get a property value of a font.
2391 The mfont_get_prop () function gets the value of $KEY property of
2392 font $FONT. $KEY must be one of the following symbols:
2394 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2395 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2397 If $FONT is a return value of mfont_find (), $KEY can also be one
2398 of the following symbols:
2400 @b Mfont_ascent, @b Mfont_descent, #Mmax_advance.
2403 If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
2404 @c Mstretch, @c Madstyle, @c Mregistry, or @c Mspacing, this
2405 function returns the corresponding value as a symbol. If the font
2406 does not have $KEY property, it returns @c Mnil. If $KEY is @c
2407 Msize, @c Mresolution, @b Mfont_ascent, Mfont_descent, or
2408 #Mmax_advance, this function returns the corresponding value as an
2409 integer. If the font does not have $KEY property, it returns 0.
2410 If $KEY is something else, it returns @c NULL and assigns an error
2411 code to the external variable #merror_code. */
2414 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
2416 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
2417 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
2420 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2421 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2424 $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
2425 Mstretch, @c Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢
2426 ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
2427 ¾ì¹ç¤Ë¤Ï@c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î
2428 ¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£
2429 ¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c
2430 NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2433 mfont_get_prop (MFont *font, MSymbol key)
2435 MRealizedFont *rfont = NULL;
2437 if (font->type == MFONT_TYPE_REALIZED)
2438 rfont = (MRealizedFont *) font;
2440 if (key == Mfoundry)
2441 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
2443 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
2445 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
2447 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
2448 if (key == Mstretch)
2449 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
2450 if (key == Madstyle)
2451 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
2452 if (key == Mregistry)
2453 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
2456 int size = font->size;
2457 return (void *) size;
2459 if (key == Mresolution)
2461 int resy = font->property[MFONT_RESY];
2462 return (void *) resy;
2464 if (key == Mlanguage || key == Mscript || key == Motf)
2466 MFontCapability *cap;
2468 if (! font->capability)
2470 cap = mfont__get_capability (font->capability);
2471 if (key == Mlanguage)
2472 return cap->language;
2478 if (key == Mfontfile)
2479 return (void *) font->file;
2480 if (key == Mspacing)
2481 return (font->spacing == MFONT_SPACING_UNDECIDED ? Mnil
2482 : msymbol (font->spacing == MFONT_SPACING_PROPORTIONAL ? "p"
2483 : font->spacing == MFONT_SPACING_MONO ? "m" : "c"));
2486 if (key == Mfont_ascent)
2487 return (void *) rfont->ascent;
2488 if (key == Mfont_descent)
2489 return (void *) rfont->descent;
2490 if (key == Mmax_advance)
2491 return (void *) rfont->max_advance;
2493 MERROR (MERROR_FONT, NULL);
2499 @brief Put a property value to a font.
2501 The mfont_put_prop () function puts a font property whose key is
2502 $KEY and value is $VAL to font $FONT. $KEY must be one of the
2505 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2506 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2508 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
2509 Otherwise, $VAL must be a symbol of a property value name. But,
2510 if the name is "nil", a symbol of name "Nil" must be
2513 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
2515 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í¥Ñ
2516 ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
2518 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2519 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2521 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï
2522 ¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥×¥í¥Ñ¥Æ¥£ÃͤÎ̾Á°¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ
2523 ¤Ï¤Ê¤é¤Ê¤¤¡£¤¿¤À¤·¤â¤·¤½¤Î̾Á°¤¬ "nil" ¤Î¾ì¹ç¤Ï¡¢Ì¾Á°¤¬ "Nil" ¤Î¥·
2524 ¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
2527 mfont_put_prop (MFont *font, MSymbol key, void *val)
2529 if (key == Mfoundry)
2530 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
2531 else if (key == Mfamily)
2532 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
2533 else if (key == Mweight)
2534 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
2535 else if (key == Mstyle)
2536 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
2537 else if (key == Mstretch)
2538 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
2539 else if (key == Madstyle)
2540 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
2541 else if (key == Mregistry)
2542 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
2543 else if (key == Msize)
2545 int size = (int) val;
2548 else if (key == Mresolution)
2550 unsigned resy = (unsigned) val;
2551 font->property[MFONT_RESY] = resy;
2553 else if (key == Mlanguage || key == Mscript || key == Motf)
2555 font->capability = merge_capability (font->capability,
2556 key, (MSymbol) val, 1);
2558 else if (key == Mfontfile)
2560 font->file = (MSymbol) val;
2563 MERROR (MERROR_FONT, -1);
2570 @brief Return the font selection priority.
2572 The mfont_selection_priority () function returns a newly created
2573 array of six symbols. The elements are the following
2574 keys of font properties ordered by priority.
2576 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2577 @c Madstyle, @c Msize.
2579 The m17n library selects the best matching font according to the
2580 order of this array. A font that has a different value for a
2581 property of lower priority is preferred to a font that has a
2582 different value for a property of higher priority. */
2584 @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹.
2586 ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£
2587 ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2589 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2590 @c Madstyle, @c Msize.
2592 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
2593 ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£
2598 mfont_selection_priority ()
2603 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
2604 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2606 enum MFontProperty prop = font_score_priority[i];
2608 if (prop == MFONT_SIZE)
2610 else if (prop == MFONT_ADSTYLE)
2612 else if (prop == MFONT_FAMILY)
2614 else if (prop == MFONT_WEIGHT)
2616 else if (prop == MFONT_STYLE)
2618 else if (prop == MFONT_STRETCH)
2629 @brief Set the font selection priority.
2631 The mfont_set_selection_priority () function sets font selection
2632 priority according to $KEYS, which is an array of six symbols.
2633 Each element must be one of the below. No two elements must be
2636 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2637 @c Madstyle, @c Msize.
2639 See the documentation of the function mfont_selection_priority ()
2642 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
2644 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
2645 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ
2646 ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2648 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2649 @c Madstyle, @c Msize.
2651 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
2655 mfont_set_selection_priority (MSymbol *keys)
2657 int priority[FONT_SCORE_PRIORITY_SIZE];
2660 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
2662 enum MFontProperty prop;
2666 else if (*keys == Madstyle)
2667 prop = MFONT_ADSTYLE;
2668 else if (*keys == Mfamily)
2669 prop = MFONT_FAMILY;
2670 else if (*keys == Mweight)
2671 prop = MFONT_WEIGHT;
2672 else if (*keys == Mstyle)
2674 else if (*keys == Mstretch)
2675 prop = MFONT_STRETCH;
2676 else if (*keys == Mfoundry)
2677 prop = MFONT_FOUNDRY;
2679 /* Invalid element. */
2681 for (j = 0; j < i; j++)
2682 if (priority[j] == prop)
2683 /* Duplicated element. */
2687 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2688 font_score_priority[i] = priority[i];
2689 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
2690 of a score is a flag for a scalable font (see the documentation
2692 i = FONT_SCORE_PRIORITY_SIZE - 1;
2693 for (shift = 1; i >= 0; i--)
2695 font_score_shift_bits[font_score_priority[i]] = shift;
2696 if (font_score_priority[i] == MFONT_SIZE)
2698 else if (font_score_priority[i] <= MFONT_FAMILY)
2711 The mfont_find () function returns a pointer to the available font
2712 that matches best the specification $SPEC on frame $FRAME.
2714 $SCORE, if not NULL, must point to a place to store the score
2715 value that indicates how well the found font matches to $SPEC. The
2716 smaller score means a better match. */
2718 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
2720 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC
2721 ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
2723 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC
2724 ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
2725 ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
2729 mfont_find (MFrame *frame, MFont *spec, int *score, int max_size)
2734 MRealizedFont *rfont;
2739 double pt = - spec->size;
2742 adjusted.size = pt * frame->dpi / 72.27 + 0.5;
2745 MFONT_INIT (&spec_copy);
2746 spec_copy.property[MFONT_FAMILY] = spec->property[MFONT_FAMILY];
2747 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
2748 spec_copy.capability = spec->capability;
2749 spec_copy.file = spec->file;
2751 list = mfont__list (frame, &spec_copy, spec, max_size);
2755 best = list->fonts[0].font;
2757 *score = list->fonts[0].score;
2761 mfont__merge (&spec_copy, spec, 0);
2762 rfont = mfont__open (frame, best, spec);
2765 return (MFont *) rfont;
2770 @brief Set encoding of a font.
2772 The mfont_set_encoding () function sets the encoding information
2775 $ENCODING_NAME is a symbol representing a charset that has the
2776 same encoding as the font.
2778 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
2779 has the same repertory as the font. If it is @c Mnil, whether a
2780 specific character is supported by the font is asked to each font
2784 If the operation was successful, this function returns 0.
2785 Otherwise it returns -1 and assigns an error code to the external
2786 variable #merror_code. */
2788 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
2790 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£
2792 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2794 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2795 @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£
2798 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
2799 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2803 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
2805 MCharset *encoding_charset = MCHARSET (encoding_name);
2806 MCharset *repertory_charset;
2808 MFontEncoding *encoding;
2811 if (! encoding_charset)
2812 MERROR (MERROR_FONT, -1);
2813 if (repertory_name != Mnil)
2815 repertory_charset = MCHARSET (repertory_name);
2816 if (! repertory_charset)
2817 MERROR (MERROR_FONT, -1);
2820 repertory_charset = NULL;
2822 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2823 encoding->spec = *font;
2824 encoding->encoding_name = encoding_name;
2825 encoding->encoding_charset = encoding_charset;
2826 encoding->repertory_name = repertory_name;
2827 encoding->repertory_charset = repertory_charset;
2828 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2829 if (registry == Mnil)
2831 if (! font_encoding_list)
2832 load_font_encoding_table ();
2833 mplist_push (font_encoding_list, registry, encoding);
2834 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2835 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2847 @brief Create a fontname from a font.
2849 This function is obsolete. Use mfont_unparse_name instead. */
2851 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2853 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2856 mfont_name (MFont *font)
2858 return mfont_unparse_name (font, Mx);
2864 @brief Create a new font from fontname.
2866 This function is obsolete. Use mfont_parse_name () instead. */
2869 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2871 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2874 mfont_from_name (const char *name)
2876 return mfont_parse_name (name, Mx);
2882 @brief Get resize information of a font.
2884 The mfont_resize_ratio () function lookups the m17n database
2885 \<font, reisize\> and returns a resizing ratio (in percentage) of
2886 FONT. For instance, if the return value is 150, that means that
2887 the m17n library uses an 1.5 time bigger font than a specified
2891 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2893 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\>
2894 ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë
2895 ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5
2896 ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2899 mfont_resize_ratio (MFont *font)
2901 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2902 MFontResize *resize;
2905 if (! font_resize_list)
2906 load_font_resize_table ();
2907 if (! MPLIST_TAIL_P (font_resize_list))
2910 plist = font_resize_list;
2911 while (registry ? (plist = mplist_find_by_key (plist, registry))
2914 resize = (MFontResize *) MPLIST_VAL (plist);
2915 if (mfont__match_p (font, &resize->spec, MFONT_ADSTYLE))
2916 return resize->resize;
2917 plist = MPLIST_NEXT (plist);
2929 @brief Get a list of fonts.
2931 The mfont_list () functions returns a list of fonts available on
2932 frame $FRAME. $FONT, if not NULL, limits fonts to ones
2933 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2934 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2935 the number of fonts.
2937 $LANGUAGE argument exists just for backward compatibility, and the
2938 use is deprecated. Use #Mlanguage font property instead. If
2939 $FONT already has #Mlanguage property, $LANGUAGE is ignored.
2942 This function returns a plist whose keys are family names and
2943 values are pointers to the object MFont. The plist must be freed
2944 by m17n_object_unref (). If no font is found, it returns
2948 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2950 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤ò
2951 ÊÖ¤¹¡£$FONT ¤¬ NULL ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È
2952 ¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼
2953 ¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$MAXNUM ¤Ï¡¢0 ¤è¤êÂ礤¤¾ì
2954 ¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2956 ¤¿¤À¤·¡¢°ú¿ô $LANGUAGE ¤ÏµìÈǤȤÎÀ°¹çÀ¤Î¤¿¤á¤À¤±¤Ë¤¢¤ê¡¢¤½¤Î»ÈÍѤÏ
2957 ´«¤á¤é¤ì¤Ê¤¤¡£¥Õ¥©¥ó¥È¤Î #Mlanguage ¥×¥í¥Ñ¥Æ¥£¤ò»È¤¦¤Ù¤¤Ç¤¢¤ë¡£¤â
2958 ¤· $FONT ¤¬¤¹¤Ç¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤¤¤¿¤é¡¢°ú¿ô $LANGUAGE ¤Ï̵
2962 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
2963 ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Êplist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref () ¤Ç
2964 ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */
2967 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2970 MFontList *font_list;
2981 double pt = - spec.size;
2983 spec.size = pt * frame->dpi / 72.27 + 0.5;
2986 if (language != Mnil)
2987 spec.capability = merge_capability (spec.capability, Mlanguage, language,
2990 font_list = mfont__list (frame, &spec, &spec, 0);
2993 if (font_list->nfonts == 0)
2999 plist = pl = mplist ();
3000 for (i = 0; i < font_list->nfonts; i++)
3002 MSymbol family = FONT_PROPERTY (font_list->fonts[i].font, MFONT_FAMILY);
3005 pl = mplist_add (pl, family, font_list->fonts[i].font);
3012 @brief Get a list of font famiy names.
3014 The mfont_list_family_names () functions returns a list of font
3015 family names available on frame $FRAME.
3019 This function returns a plist whose keys are #Msymbol and values
3020 are symbols representing font family names. The elements are
3021 sorted by alphabetical order. The plist must be freed by
3022 m17n_object_unref (). If not font is found, it returns NULL. */
3025 mfont_list_family_names (MFrame *frame)
3027 MPlist *plist = mplist (), *p;
3029 MPLIST_DO (p, frame->font_driver_list)
3031 MFontDriver *driver = MPLIST_VAL (p);
3033 (driver->list_family_names) (frame, plist);
3042 @brief Check the usability of a font.
3044 The mfont_check () function checkes if $FONT can be used for
3045 $SCRIPT and $LANGUAGE in $FONTSET on $FRAME.
3048 If the font is usable, return 1. Otherwise return 0.
3052 mfont_check (MFrame *frame, MFontset *fontset,
3053 MSymbol script, MSymbol language, MFont *font)
3055 MRealizedFont *rfont;
3059 fontset = frame->face->property[MFACE_FONTSET];
3060 rfont = mfontset__get_font (frame, fontset, script, language, font, &best);
3061 if (! rfont || ! best)
3063 score = font_score (&rfont->spec, font);
3064 return (score == 0 ? 2 : 1);
3070 @brief Check is a font matches with a font spec.
3072 The mfont_match_p () function checks if $FONT matches with the
3076 If the font matches, 1 is returned. Otherwise 0 is returned. */
3079 mfont_match_p (MFont *font, MFont *spec)
3081 return mfont__match_p (font, spec, MFONT_REGISTRY);
3088 The mfont_open () function opens $FONT on $FRAME, and returns a
3092 If the font was successfully opened, a realized font is returned.
3093 Otherwize NULL is returned.
3100 mfont_open (MFrame *frame, MFont *font)
3102 enum MFontType font_type = font->type;
3104 if (font_type == MFONT_TYPE_SPEC)
3105 return mfont_find (frame, font, NULL, 0);
3106 if (font_type == MFONT_TYPE_OBJECT)
3107 return (MFont *) mfont__open (frame, font, font);
3108 if (font_type == MFONT_TYPE_REALIZED)
3110 MERROR (MERROR_FONT, NULL);
3115 @brief Encapusulate a font.
3117 The mfont_encapsulate () functions realizes a font by
3118 encapusulating data $DATA or type $DATA_TYPE on $FRAME. Currently
3119 $DATA_TAPE is #Mfontconfig or #Mfreetype, and $DATA points to an
3120 object of FcPattern or FT_Face respectively.
3123 If the operation was successful, a realized font is returned.
3124 Otherwise NULL is return.
3131 mfont_encapsulate (MFrame *frame, MSymbol data_type, void *data)
3135 MPLIST_DO (p, frame->font_driver_list)
3137 MFontDriver *driver = MPLIST_VAL (p);
3138 MRealizedFont *rfont;
3140 if (driver->encapsulate
3141 && (rfont = driver->encapsulate (frame, data_type, data)))
3142 return (MFont *) rfont;
3150 @brief Close a font.
3152 The mfont_close () function close a realized font $FONT. $FONT
3153 must be opened previously by mfont_open () or mfont_encapsulate
3157 If the operation was successful, 0 is returned. Otherwise, -1 is
3161 mfont_open (), mfont_encapsulate (). */
3164 mfont_close (MFont *font)
3166 enum MFontType font_type = font->type;
3167 MRealizedFont *rfont;
3169 if (font_type != MFONT_TYPE_REALIZED)
3170 MERROR (MERROR_FONT, -1);
3171 rfont = (MRealizedFont *) font;
3172 if (rfont->encapsulating
3173 && rfont->driver->close)
3174 rfont->driver->close (rfont);
3180 /*** @addtogroup m17nDebug */
3187 The mdebug_dump_font () function prints font $FONT in a human readable
3191 This function returns $FONT. */
3193 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
3195 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr
3196 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£
3199 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
3202 mdebug_dump_font (MFont *font)
3206 name = xlfd_unparse_name (font, 0);
3209 fprintf (stderr, "%s", name);
3212 if (font->file != Mnil)
3214 char *file = MSYMBOL_NAME (font->file);
3215 char *lastslash = file, *p;
3217 for (p = file; *p; p++)
3221 fprintf (stderr, ",");
3222 fprintf (stderr, "%s", lastslash + 1);
3224 if (font->capability != Mnil)
3225 fprintf (stderr, "%s", MSYMBOL_NAME (font->capability));