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 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.code);
1694 if (encoding->encoding_charset)
1695 code = ENCODE_CHAR (encoding->encoding_charset, g->g.code);
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);
1715 = (driver->encode_char) (rfont->frame, rfont->font, mfont,
1720 if (g->g.code == MCHAR_INVALID_CODE)
1727 mfont__get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
1730 MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
1733 gstr.glyphs = (MGlyph *) gstring->glyphs;
1734 (rfont->driver->find_metric) (rfont, &gstr, from, to);
1738 /* KEY <= MFONT_REGISTRY */
1741 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1749 numeric = FONT_PROPERTY_NUMERIC (val, key);
1752 numeric = mfont__property_table[key].used;
1753 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1754 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1757 font->property[key] = numeric;
1761 mfont__parse_name_into_font (const char *name, MSymbol format, MFont *font)
1765 if (format == Mx || format == Mnil)
1766 result = xlfd_parse_name (name, font);
1767 #ifdef HAVE_FONTCONFIG
1768 if (format == Mfontconfig || (result < 0 && format == Mnil))
1769 result = mfont__ft_parse_name (name, font);
1770 #endif /* HAVE_FONTCONFIG */
1775 mfont__encoding_list (void)
1777 if (! font_encoding_list)
1778 load_font_encoding_table ();
1779 return font_encoding_list;
1783 free_font_capability (void *object)
1785 MFontCapability *cap = object;
1787 if (cap->script_tag)
1790 for (i = 0; i < MFONT_OTT_MAX; i++)
1792 if (cap->features[i].str)
1793 free (cap->features[i].str);
1794 if (cap->features[i].tags)
1795 free (cap->features[i].tags);
1802 mfont__get_capability (MSymbol sym)
1804 MFontCapability *cap = msymbol_get (sym, M_font_capability);
1805 char *str, *p, *endp;
1809 str = MSYMBOL_NAME (sym);
1812 M17N_OBJECT (cap, free_font_capability, MERROR_FONT);
1813 msymbol_put (sym, M_font_capability, cap);
1814 M17N_OBJECT_UNREF (cap);
1815 endp = str + MSYMBOL_NAMELEN (sym);
1820 if (str[0] == 'o' && strncmp (str + 1, "tf=", 3) == 0)
1828 for (i = 0, p = str; i < 4 && p < endp; i++, p++);
1831 sym = msymbol__with_len (str, 4);
1832 cap->script = mscript__from_otf_tag (sym);
1833 if (cap->script == Mnil)
1835 cap->script_tag = OTF_tag (str);
1838 for (i = 0, str = ++p; i < 4 && p < endp; i++, p++);
1842 cap->script_tag = 0;
1845 cap->langsys_tag = OTF_tag (str);
1848 cap->langsys_tag = 0;
1850 for (i = 0; i < MFONT_OTT_MAX; i++)
1851 cap->features[i].nfeatures = -1;
1853 while (*p == '=' || *p == '+')
1855 int idx = *p == '=' ? MFONT_OTT_GSUB : MFONT_OTT_GPOS;
1858 while (p < endp && *p != '+') p++;
1862 /* We never have more than (p - str) tags. */
1863 OTF_Tag *tags = alloca (sizeof (OTF_Tag) * (p - str));
1866 cap->features[idx].str = malloc (p - str + 1);
1867 for (i = n = 0, p0 = str; str + i < p; i++)
1869 cap->features[idx].str[i] = str[i];
1870 if (str[i] == ',' || str + i + 1 == p)
1874 else if (*p0 == '~')
1875 tags[n] = OTF_tag (p0 + 1) | 0x80000000;
1877 tags[n] = OTF_tag (p0);
1882 cap->features[idx].str[i] = '\0';
1883 cap->features[idx].nfeatures = n;
1886 int size = sizeof (OTF_Tag) * n;
1888 cap->features[idx].tags = malloc (size);
1889 memcpy (cap->features[idx].tags, tags, size);
1894 cap->features[idx].str = NULL;
1895 cap->features[idx].nfeatures = 0;
1899 for (i = 0; i < MFONT_OTT_MAX; i++)
1900 if (cap->features[i].nfeatures < 0)
1902 cap->features[i].str = strdup ("*");
1903 cap->features[i].nfeatures = 1;
1904 cap->features[i].tags = malloc (sizeof (OTF_Tag));
1905 cap->features[i].tags[0] = 0;
1907 cap->otf = msymbol__with_len (beg, p - beg);
1910 else if (str[0] == 'l' && strncmp (str + 1, "ang=", 4) == 0)
1913 for (p = str; p < endp && *p != ':'; p++);
1915 cap->language = msymbol__with_len (str, p - str);
1918 else if (str[0] == 's' && strncmp (str + 1, "cript=", 6) == 0)
1921 for (p = str; p < endp && *p != ':'; p++);
1923 cap->script = msymbol__with_len (str, p - str);
1931 mfont__check_capability (MRealizedFont *rfont, MSymbol capability)
1933 return (rfont->driver->check_capability (rfont, capability));
1938 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1944 /*** @addtogroup m17nFont */
1948 /***en @name Variables: Keys of font property. */
1949 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1954 @brief Key of font property specifying foundry.
1956 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1957 is used as a key of font property and face property. The property
1958 value must be a symbol whose name is a foundry name of a font. */
1960 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1962 ÊÑ¿ô #Mfoundry ¤Ï <tt>"foundry"</tt>
1963 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1964 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1969 @brief Key of font property specifying family.
1971 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1972 used as a key of font property and face property. The property
1973 value must be a symbol whose name is a family name of a font. */
1975 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1977 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt>
1978 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1979 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1984 @brief Key of font property specifying weight.
1986 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1987 used as a key of font property and face property. The property
1988 value must be a symbol whose name is a weight name of a font (e.g
1989 "medium", "bold"). */
1991 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1993 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt>
1994 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1995 Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2000 @brief Key of font property specifying style.
2002 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
2003 used as a key of font property and face property. The property
2004 value must be a symbol whose name is a style name of a font (e.g
2007 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2009 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt>
2010 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2011 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2016 @brief Key of font property specifying stretch.
2018 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
2019 is used as a key of font property and face property. The property
2020 value must be a symbol whose name is a stretch name of a font (e.g
2021 "normal", "condensed"). */
2023 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2025 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt>
2026 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2027 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2032 @brief Key of font property specifying additional style.
2034 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
2035 is used as a key of font property and face property. The property
2036 value must be a symbol whose name is an additional style name of a
2037 font (e.g "serif", "", "sans"). */
2039 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2041 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt>
2042 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2043 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2048 @brief Key of font property specifying spacing.
2050 The variable #Madstyle is a symbol of name <tt>"spacing"</tt> and
2051 is used as a key of font property. The property value must be a
2052 symbol whose name specifies the spacing of a font (e.g "p" for
2053 proportional, "m" for monospaced). */
2055 @brief spacing ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2057 ÊÑ¿ô #Mspacing ¤Ï <tt>"spacing"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
2058 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î spacing
2059 ÆÃÀ¤ò¼¨¤¹Ì¾Á° ("p", "m" Åù)¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2064 @brief Key of font property specifying registry.
2066 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
2067 and is used as a key of font property. The property value must be
2068 a symbol whose name is a registry name a font registry
2069 (e.g. "iso8859-1", "jisx0208.1983-0"). */
2071 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2073 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt>
2074 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2075 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0"
2076 Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2081 @brief Key of font property specifying size.
2083 The variable #Msize is a symbol of name <tt>"size"</tt> and is
2084 used as a key of font property and face property. The property
2085 value must be an integer specifying a font design size in the unit
2086 of 1/10 point (on 100 dpi display). */
2088 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2090 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt>
2091 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
2092 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10
2093 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
2099 @brief Key of font property specifying file name.
2101 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2102 and is used as a key of font property. The property value must be
2103 a symbol whose name is a font file name. */
2107 @brief Key of font property specifying file name.
2109 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2110 and is used as a key of font property. The property value must be
2111 a symbol whose name is a font file name. */
2113 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2115 ÊÑ¿ô #Mfontfile ¤Ï <tt>"fontfile"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
2116 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤
2117 ¥ë̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2122 @brief Key of font property specifying resolution.
2124 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
2125 is used as a key of font property and face property. The property
2126 value must be an integer to specifying a font resolution in the
2127 unit of dots per inch (dpi). */
2129 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2131 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt>
2132 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2133 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */
2135 MSymbol Mresolution;
2138 @brief Key of font property specifying max advance width.
2140 The variable #Mmax_advance is a symbol of name
2141 <tt>"max-advance"</tt> and is used as a key of font property. The
2142 property value must be an integer specifying a font's max advance
2145 MSymbol Mmax_advance;
2149 @brief Symbol of name "fontconfig".
2151 The variable #Mfontconfig is to be used as an argument of the
2152 functions mfont_parse_name () and mfont_unparse_name (). */
2154 @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2156 ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name ()
2157 ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
2159 MSymbol Mfontconfig;
2162 @brief Symbol of name "x".
2164 The variable #Mx is to be used for a value of \<type\> member of the
2165 structure #MDrawGlyph to specify the type of \<fontp\> member is
2166 actually (XFontStruct *). */
2168 @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2170 ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
2171 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
2176 @brief Symbol of name "freetype".
2178 The variable #Mfreetype is to be used for a value of \<type\> member
2179 of the structure #MDrawGlyph to specify the type of \<fontp\> member
2180 is actually FT_Face. */
2182 @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2184 ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
2185 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2190 @brief Symbol of name "xft".
2192 The variable #Mxft is to be used for a value of \<type\> member of the
2193 structure #MDrawGlyph to specify the type of \<fontp\> member
2194 is actually (XftFont *). */
2196 @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2198 ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
2199 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2208 @brief List of font files and directories that contain font files.
2210 The variable @c mfont_freetype_path is a plist of FreeType font
2211 files and directories that contain FreeType font files. Key of
2212 the element is @c Mstring, and the value is a string that
2213 represents a font file or a directory.
2215 The macro M17N_INIT () sets up this variable to contain the
2216 sub-directory "fonts" of the m17n database and the environment
2217 variable "M17NDIR". The first call of mframe () creates the
2218 internal list of the actually available fonts from this variable.
2219 Thus, an application program, if necessary, must modify the
2220 variable before calling mframe (). If it is going to add a new
2221 element, value must be a string that can be safely freed.
2223 If the m17n library is not configured to use the FreeType library,
2224 this variable is not used. */
2226 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
2228 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î
2229 plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring
2230 ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
2232 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ¿ô
2233 "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
2234 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£
2235 ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe ()
2236 ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2237 ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2239 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
2241 MPlist *mfont_freetype_path;
2246 @brief Create a new font.
2248 The mfont () function creates a new font object that has no
2252 This function returns a pointer to the created font object. */
2254 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
2256 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2259 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
2266 MSTRUCT_CALLOC (font, MERROR_FONT);
2273 @brief Create a font by parsing a fontname.
2275 The mfont_parse_name () function creates a new font object. The
2276 properties are extracted fontname $NAME.
2278 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
2279 is parsed as XLFD (X Logical Font Description). If $FORMAT is
2280 #Mfontconfig, $NAME is parsed as Fontconfig's textual
2281 representation of font. If $FORMAT is #Mnil, $NAME is at first
2282 parsed as XLFD, and it it fails, parsed as Fontconfig's
2286 If the operation was successful, this function returns a pointer
2287 to the created font. Otherwise it returns @c NULL. */
2290 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2292 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾
2293 $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2295 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
2296 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2297 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig
2298 ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD
2299 ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2302 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name ()
2303 ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
2306 mfont_parse_name (const char *name, MSymbol format)
2308 MFont template, *font;
2310 MFONT_INIT (&template);
2311 if (mfont__parse_name_into_font (name, format, &template) < 0)
2312 MERROR (MERROR_FONT, NULL);
2313 MSTRUCT_CALLOC (font, MERROR_FONT);
2321 @brief Create a fontname from a font.
2323 The mfont_unparse_name () function creates a fontname string
2324 from font $FONT according to $FORMAT.
2326 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
2327 is in XLFD (X Logical Font Description) format. If it is
2328 #Mfontconfig, the fontname is in the style of Fontconfig's text
2332 This function returns a newly allocated fontname string, which is
2333 not freed unless the user explicitly does so by free (). */
2336 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2338 ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT
2339 ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£
2341 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£
2342 #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£
2343 #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
2346 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬
2347 free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
2350 mfont_unparse_name (MFont *font, MSymbol format)
2355 name = xlfd_unparse_name (font, 1);
2356 #ifdef HAVE_FONTCONFIG
2357 else if (format == Mfontconfig)
2358 name = mfont__ft_unparse_name (font);
2360 #endif /* HAVE_FONTCONFIG */
2362 MERROR (MERROR_FONT, NULL);
2369 @brief Make a copy of a font.
2371 The mfont_copy () function returns a new copy of font $FONT. */
2373 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
2375 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
2378 mfont_copy (MFont *font)
2382 MSTRUCT_MALLOC (copy, MERROR_FONT);
2390 @brief Get a property value of a font.
2392 The mfont_get_prop () function gets the value of $KEY property of
2393 font $FONT. $KEY must be one of the following symbols:
2395 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2396 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2398 If $FONT is a return value of mfont_find (), $KEY can also be one
2399 of the following symbols:
2401 @b Mfont_ascent, @b Mfont_descent, #Mmax_advance.
2404 If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
2405 @c Mstretch, @c Madstyle, @c Mregistry, or @c Mspacing, this
2406 function returns the corresponding value as a symbol. If the font
2407 does not have $KEY property, it returns @c Mnil. If $KEY is @c
2408 Msize, @c Mresolution, @b Mfont_ascent, Mfont_descent, or
2409 #Mmax_advance, this function returns the corresponding value as an
2410 integer. If the font does not have $KEY property, it returns 0.
2411 If $KEY is something else, it returns @c NULL and assigns an error
2412 code to the external variable #merror_code. */
2415 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
2417 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
2418 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
2421 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2422 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2425 $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
2426 Mstretch, @c Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢
2427 ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
2428 ¾ì¹ç¤Ë¤Ï@c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î
2429 ¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£
2430 ¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c
2431 NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2434 mfont_get_prop (MFont *font, MSymbol key)
2436 MRealizedFont *rfont = NULL;
2438 if (font->type == MFONT_TYPE_REALIZED)
2439 rfont = (MRealizedFont *) font;
2441 if (key == Mfoundry)
2442 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
2444 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
2446 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
2448 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
2449 if (key == Mstretch)
2450 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
2451 if (key == Madstyle)
2452 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
2453 if (key == Mregistry)
2454 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
2457 int size = font->size;
2458 return (void *) size;
2460 if (key == Mresolution)
2462 int resy = font->property[MFONT_RESY];
2463 return (void *) resy;
2465 if (key == Mlanguage || key == Mscript || key == Motf)
2467 MFontCapability *cap;
2469 if (! font->capability)
2471 cap = mfont__get_capability (font->capability);
2472 if (key == Mlanguage)
2473 return cap->language;
2479 if (key == Mfontfile)
2480 return (void *) font->file;
2481 if (key == Mspacing)
2482 return (font->spacing == MFONT_SPACING_UNDECIDED ? Mnil
2483 : msymbol (font->spacing == MFONT_SPACING_PROPORTIONAL ? "p"
2484 : font->spacing == MFONT_SPACING_MONO ? "m" : "c"));
2487 if (key == Mfont_ascent)
2488 return (void *) rfont->ascent;
2489 if (key == Mfont_descent)
2490 return (void *) rfont->descent;
2491 if (key == Mmax_advance)
2492 return (void *) rfont->max_advance;
2494 MERROR (MERROR_FONT, NULL);
2500 @brief Put a property value to a font.
2502 The mfont_put_prop () function puts a font property whose key is
2503 $KEY and value is $VAL to font $FONT. $KEY must be one of the
2506 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2507 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2509 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
2510 Otherwise, $VAL must be a symbol of a property value name. But,
2511 if the name is "nil", a symbol of name "Nil" must be
2514 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
2516 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í¥Ñ
2517 ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
2519 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2520 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2522 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï
2523 ¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥×¥í¥Ñ¥Æ¥£ÃͤÎ̾Á°¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ
2524 ¤Ï¤Ê¤é¤Ê¤¤¡£¤¿¤À¤·¤â¤·¤½¤Î̾Á°¤¬ "nil" ¤Î¾ì¹ç¤Ï¡¢Ì¾Á°¤¬ "Nil" ¤Î¥·
2525 ¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
2528 mfont_put_prop (MFont *font, MSymbol key, void *val)
2530 if (key == Mfoundry)
2531 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
2532 else if (key == Mfamily)
2533 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
2534 else if (key == Mweight)
2535 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
2536 else if (key == Mstyle)
2537 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
2538 else if (key == Mstretch)
2539 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
2540 else if (key == Madstyle)
2541 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
2542 else if (key == Mregistry)
2543 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
2544 else if (key == Msize)
2546 int size = (int) val;
2549 else if (key == Mresolution)
2551 unsigned resy = (unsigned) val;
2552 font->property[MFONT_RESY] = resy;
2554 else if (key == Mlanguage || key == Mscript || key == Motf)
2556 font->capability = merge_capability (font->capability,
2557 key, (MSymbol) val, 1);
2559 else if (key == Mfontfile)
2561 font->file = (MSymbol) val;
2564 MERROR (MERROR_FONT, -1);
2571 @brief Return the font selection priority.
2573 The mfont_selection_priority () function returns a newly created
2574 array of six symbols. The elements are the following
2575 keys of font properties ordered by priority.
2577 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2578 @c Madstyle, @c Msize.
2580 The m17n library selects the best matching font according to the
2581 order of this array. A font that has a different value for a
2582 property of lower priority is preferred to a font that has a
2583 different value for a property of higher priority. */
2585 @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹.
2587 ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£
2588 ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2590 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2591 @c Madstyle, @c Msize.
2593 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
2594 ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£
2599 mfont_selection_priority ()
2604 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
2605 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2607 enum MFontProperty prop = font_score_priority[i];
2609 if (prop == MFONT_SIZE)
2611 else if (prop == MFONT_ADSTYLE)
2613 else if (prop == MFONT_FAMILY)
2615 else if (prop == MFONT_WEIGHT)
2617 else if (prop == MFONT_STYLE)
2619 else if (prop == MFONT_STRETCH)
2630 @brief Set the font selection priority.
2632 The mfont_set_selection_priority () function sets font selection
2633 priority according to $KEYS, which is an array of six symbols.
2634 Each element must be one of the below. No two elements must be
2637 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2638 @c Madstyle, @c Msize.
2640 See the documentation of the function mfont_selection_priority ()
2643 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
2645 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
2646 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ
2647 ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2649 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2650 @c Madstyle, @c Msize.
2652 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
2656 mfont_set_selection_priority (MSymbol *keys)
2658 int priority[FONT_SCORE_PRIORITY_SIZE];
2661 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
2663 enum MFontProperty prop;
2667 else if (*keys == Madstyle)
2668 prop = MFONT_ADSTYLE;
2669 else if (*keys == Mfamily)
2670 prop = MFONT_FAMILY;
2671 else if (*keys == Mweight)
2672 prop = MFONT_WEIGHT;
2673 else if (*keys == Mstyle)
2675 else if (*keys == Mstretch)
2676 prop = MFONT_STRETCH;
2677 else if (*keys == Mfoundry)
2678 prop = MFONT_FOUNDRY;
2680 /* Invalid element. */
2682 for (j = 0; j < i; j++)
2683 if (priority[j] == prop)
2684 /* Duplicated element. */
2688 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2689 font_score_priority[i] = priority[i];
2690 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
2691 of a score is a flag for a scalable font (see the documentation
2693 i = FONT_SCORE_PRIORITY_SIZE - 1;
2694 for (shift = 1; i >= 0; i--)
2696 font_score_shift_bits[font_score_priority[i]] = shift;
2697 if (font_score_priority[i] == MFONT_SIZE)
2699 else if (font_score_priority[i] <= MFONT_FAMILY)
2712 The mfont_find () function returns a pointer to the available font
2713 that matches best the specification $SPEC on frame $FRAME.
2715 $SCORE, if not NULL, must point to a place to store the score
2716 value that indicates how well the found font matches to $SPEC. The
2717 smaller score means a better match. */
2719 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
2721 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC
2722 ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
2724 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC
2725 ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
2726 ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
2730 mfont_find (MFrame *frame, MFont *spec, int *score, int max_size)
2735 MRealizedFont *rfont;
2740 double pt = - spec->size;
2743 adjusted.size = pt * frame->dpi / 72.27 + 0.5;
2746 MFONT_INIT (&spec_copy);
2747 spec_copy.property[MFONT_FAMILY] = spec->property[MFONT_FAMILY];
2748 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
2749 spec_copy.capability = spec->capability;
2750 spec_copy.file = spec->file;
2752 list = mfont__list (frame, &spec_copy, spec, max_size);
2756 best = list->fonts[0].font;
2758 *score = list->fonts[0].score;
2762 mfont__merge (&spec_copy, spec, 0);
2763 rfont = mfont__open (frame, best, spec);
2766 return (MFont *) rfont;
2771 @brief Set encoding of a font.
2773 The mfont_set_encoding () function sets the encoding information
2776 $ENCODING_NAME is a symbol representing a charset that has the
2777 same encoding as the font.
2779 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
2780 has the same repertory as the font. If it is @c Mnil, whether a
2781 specific character is supported by the font is asked to each font
2785 If the operation was successful, this function returns 0.
2786 Otherwise it returns -1 and assigns an error code to the external
2787 variable #merror_code. */
2789 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
2791 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£
2793 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2795 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2796 @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£
2799 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
2800 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2804 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
2806 MCharset *encoding_charset = MCHARSET (encoding_name);
2807 MCharset *repertory_charset;
2809 MFontEncoding *encoding;
2812 if (! encoding_charset)
2813 MERROR (MERROR_FONT, -1);
2814 if (repertory_name != Mnil)
2816 repertory_charset = MCHARSET (repertory_name);
2817 if (! repertory_charset)
2818 MERROR (MERROR_FONT, -1);
2821 repertory_charset = NULL;
2823 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2824 encoding->spec = *font;
2825 encoding->encoding_name = encoding_name;
2826 encoding->encoding_charset = encoding_charset;
2827 encoding->repertory_name = repertory_name;
2828 encoding->repertory_charset = repertory_charset;
2829 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2830 if (registry == Mnil)
2832 if (! font_encoding_list)
2833 load_font_encoding_table ();
2834 mplist_push (font_encoding_list, registry, encoding);
2835 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2836 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2848 @brief Create a fontname from a font.
2850 This function is obsolete. Use mfont_unparse_name instead. */
2852 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2854 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2857 mfont_name (MFont *font)
2859 return mfont_unparse_name (font, Mx);
2865 @brief Create a new font from fontname.
2867 This function is obsolete. Use mfont_parse_name () instead. */
2870 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2872 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2875 mfont_from_name (const char *name)
2877 return mfont_parse_name (name, Mx);
2883 @brief Get resize information of a font.
2885 The mfont_resize_ratio () function lookups the m17n database
2886 \<font, reisize\> and returns a resizing ratio (in percentage) of
2887 FONT. For instance, if the return value is 150, that means that
2888 the m17n library uses an 1.5 time bigger font than a specified
2892 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2894 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\>
2895 ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë
2896 ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5
2897 ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2900 mfont_resize_ratio (MFont *font)
2902 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2903 MFontResize *resize;
2906 if (! font_resize_list)
2907 load_font_resize_table ();
2908 if (! MPLIST_TAIL_P (font_resize_list))
2911 plist = font_resize_list;
2912 while (registry ? (plist = mplist_find_by_key (plist, registry))
2915 resize = (MFontResize *) MPLIST_VAL (plist);
2916 if (mfont__match_p (font, &resize->spec, MFONT_ADSTYLE))
2917 return resize->resize;
2918 plist = MPLIST_NEXT (plist);
2930 @brief Get a list of fonts.
2932 The mfont_list () functions returns a list of fonts available on
2933 frame $FRAME. $FONT, if not NULL, limits fonts to ones
2934 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2935 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2936 the number of fonts.
2938 $LANGUAGE argument exists just for backward compatibility, and the
2939 use is deprecated. Use #Mlanguage font property instead. If
2940 $FONT already has #Mlanguage property, $LANGUAGE is ignored.
2943 This function returns a plist whose keys are family names and
2944 values are pointers to the object MFont. The plist must be freed
2945 by m17n_object_unref (). If no font is found, it returns
2949 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2951 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤ò
2952 ÊÖ¤¹¡£$FONT ¤¬ NULL ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È
2953 ¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼
2954 ¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$MAXNUM ¤Ï¡¢0 ¤è¤êÂ礤¤¾ì
2955 ¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2957 ¤¿¤À¤·¡¢°ú¿ô $LANGUAGE ¤ÏµìÈǤȤÎÀ°¹çÀ¤Î¤¿¤á¤À¤±¤Ë¤¢¤ê¡¢¤½¤Î»ÈÍѤÏ
2958 ´«¤á¤é¤ì¤Ê¤¤¡£¥Õ¥©¥ó¥È¤Î #Mlanguage ¥×¥í¥Ñ¥Æ¥£¤ò»È¤¦¤Ù¤¤Ç¤¢¤ë¡£¤â
2959 ¤· $FONT ¤¬¤¹¤Ç¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤¤¤¿¤é¡¢°ú¿ô $LANGUAGE ¤Ï̵
2963 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
2964 ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Êplist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref () ¤Ç
2965 ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */
2968 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2971 MFontList *font_list;
2982 double pt = - spec.size;
2984 spec.size = pt * frame->dpi / 72.27 + 0.5;
2987 if (language != Mnil)
2988 spec.capability = merge_capability (spec.capability, Mlanguage, language,
2991 font_list = mfont__list (frame, &spec, &spec, 0);
2994 if (font_list->nfonts == 0)
3000 plist = pl = mplist ();
3001 for (i = 0; i < font_list->nfonts; i++)
3003 MSymbol family = FONT_PROPERTY (font_list->fonts[i].font, MFONT_FAMILY);
3006 pl = mplist_add (pl, family, font_list->fonts[i].font);
3013 @brief Get a list of font famiy names.
3015 The mfont_list_family_names () functions returns a list of font
3016 family names available on frame $FRAME.
3020 This function returns a plist whose keys are #Msymbol and values
3021 are symbols representing font family names. The elements are
3022 sorted by alphabetical order. The plist must be freed by
3023 m17n_object_unref (). If not font is found, it returns NULL. */
3026 mfont_list_family_names (MFrame *frame)
3028 MPlist *plist = mplist (), *p;
3030 MPLIST_DO (p, frame->font_driver_list)
3032 MFontDriver *driver = MPLIST_VAL (p);
3034 (driver->list_family_names) (frame, plist);
3043 @brief Check the usability of a font.
3045 The mfont_check () function checkes if $FONT can be used for
3046 $SCRIPT and $LANGUAGE in $FONTSET on $FRAME.
3049 If the font is usable, return 1. Otherwise return 0.
3053 mfont_check (MFrame *frame, MFontset *fontset,
3054 MSymbol script, MSymbol language, MFont *font)
3056 MRealizedFont *rfont;
3060 fontset = frame->face->property[MFACE_FONTSET];
3061 rfont = mfontset__get_font (frame, fontset, script, language, font, &best);
3062 if (! rfont || ! best)
3064 score = font_score (&rfont->spec, font);
3065 return (score == 0 ? 2 : 1);
3071 @brief Check is a font matches with a font spec.
3073 The mfont_match_p () function checks if $FONT matches with the
3077 If the font matches, 1 is returned. Otherwise 0 is returned. */
3080 mfont_match_p (MFont *font, MFont *spec)
3082 return mfont__match_p (font, spec, MFONT_REGISTRY);
3089 The mfont_open () function opens $FONT on $FRAME, and returns a
3093 If the font was successfully opened, a realized font is returned.
3094 Otherwize NULL is returned.
3101 mfont_open (MFrame *frame, MFont *font)
3103 enum MFontType font_type = font->type;
3105 if (font_type == MFONT_TYPE_SPEC)
3106 return mfont_find (frame, font, NULL, 0);
3107 if (font_type == MFONT_TYPE_OBJECT)
3108 return (MFont *) mfont__open (frame, font, font);
3109 if (font_type == MFONT_TYPE_REALIZED)
3111 MERROR (MERROR_FONT, NULL);
3116 @brief Encapusulate a font.
3118 The mfont_encapsulate () functions realizes a font by
3119 encapusulating data $DATA or type $DATA_TYPE on $FRAME. Currently
3120 $DATA_TAPE is #Mfontconfig or #Mfreetype, and $DATA points to an
3121 object of FcPattern or FT_Face respectively.
3124 If the operation was successful, a realized font is returned.
3125 Otherwise NULL is return.
3132 mfont_encapsulate (MFrame *frame, MSymbol data_type, void *data)
3136 MPLIST_DO (p, frame->font_driver_list)
3138 MFontDriver *driver = MPLIST_VAL (p);
3139 MRealizedFont *rfont;
3141 if (driver->encapsulate
3142 && (rfont = driver->encapsulate (frame, data_type, data)))
3143 return (MFont *) rfont;
3151 @brief Close a font.
3153 The mfont_close () function close a realized font $FONT. $FONT
3154 must be opened previously by mfont_open () or mfont_encapsulate
3158 If the operation was successful, 0 is returned. Otherwise, -1 is
3162 mfont_open (), mfont_encapsulate (). */
3165 mfont_close (MFont *font)
3167 enum MFontType font_type = font->type;
3168 MRealizedFont *rfont;
3170 if (font_type != MFONT_TYPE_REALIZED)
3171 MERROR (MERROR_FONT, -1);
3172 rfont = (MRealizedFont *) font;
3173 if (rfont->encapsulating
3174 && rfont->driver->close)
3175 rfont->driver->close (rfont);
3181 /*** @addtogroup m17nDebug */
3188 The mdebug_dump_font () function prints font $FONT in a human readable
3192 This function returns $FONT. */
3194 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
3196 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr
3197 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£
3200 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
3203 mdebug_dump_font (MFont *font)
3207 name = xlfd_unparse_name (font, 0);
3210 fprintf (stderr, "%s", name);
3213 if (font->file != Mnil)
3215 char *file = MSYMBOL_NAME (font->file);
3216 char *lastslash = file, *p;
3218 for (p = file; *p; p++)
3222 fprintf (stderr, ",");
3223 fprintf (stderr, "%s", lastslash + 1);
3225 if (font->capability != Mnil)
3226 fprintf (stderr, "%s", MSYMBOL_NAME (font->capability));