1 /* font.c -- font module.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 The m17n GUI API represents a font by an object of the type @c
28 MFont. A font can have @e font @e properties. Like other types
29 of properties, a font property consists of a key and a value. The
30 key of a font property must be one of the following symbols:
32 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
33 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
35 When the key of a font property is @c Msize or @c Mresolution, its
36 value is an integer. Otherwise the value is a symbol.
38 "The font property that belongs to font F and whose key is @c
39 Mxxx" may be shortened to "the xxx property of F".
41 The value of a foundry property is a symbol representing font
42 foundry information, e.g. adobe, misc, etc.
44 The value of a family property is a symbol representing font family
45 information, e.g. times, helvetica, etc.
47 The value of a weight property is a symbol representing weight
48 information, e.g. normal, bold, etc.
50 The value of a style property is a symbol representing slant
51 information, e.g. normal, italic, etc.
53 The value of a stretch property is a symbol representing width
54 information, e.g. normal, semicondensed, etc.
56 The value of an adstyle property is a symbol representing abstract
57 font family information, e.g. serif, sans-serif, etc.
59 The value of a registry property is a symbol representing registry
60 information, e.g. iso10646-1, iso8895-1, etc.
62 The value of a size property is an integer representing design
63 size in the unit of 1/10 point.
65 The value of a resolution property is an integer representing
66 assumed device resolution in the unit of dots per inch (dpi).
68 The value of a type property is a symbol indicating a font driver;
69 currently Mx or Mfreetype.
71 The m17n library uses font objects for two purposes: to receive
72 font specification from an application program, and to present
73 available fonts to an application program. When the m17n library
74 presents an available font to an application program, all font
75 properties have a concrete value.
77 The m17n library supports three kinds of fonts: Window system fonts,
78 FreeType fonts, and OpenType fonts.
82 <li> Window system fonts
84 The m17n-X library supports all fonts handled by an X server and
85 an X font server. The correspondence between XLFD fields and font
86 properties are shown below.
90 --------------- --------
96 ADD_STYLE_NAME adstyle
98 RESOLUTION_Y resolution
99 CHARSET_REGISTRY-CHARSET_ENCODING registry
102 XLFD fields not listed in the above table are ignored.
106 The m17n library, if configured to use the FreeType library,
107 supports all fonts that can be handled by the FreeType library.
108 The variable #mfont_freetype_path is initialized properly according
109 to the configuration of the m17n library and the environment
110 variable @c M17NDIR. See the documentation of the variable for
113 If the m17n library is configured to use the fontconfig library,
114 in addition to #mfont_freetype_path, all fonts available via
115 fontconfig are supported.
117 The family name of a FreeType font corresponds to the family
118 property. Style names of FreeType fonts correspond to the weight,
119 style, and stretch properties as below.
122 style name weight style stretch
123 ---------- ------ ----- -------
124 Regular medium r normal
125 Italic medium i normal
127 Bold Italic bold i normal
128 Narrow medium r condensed
129 Narrow Italic medium i condensed
130 Narrow Bold bold r condensed
131 Narrow Bold Italic bold i condensed
133 Black Italic black i normal
134 Oblique medium o normal
135 BoldOblique bold o normal
138 Style names not listed in the above table are treated as
141 Combination of a platform ID and an encoding ID corresponds to the
142 registry property. For example, if a font has the combination (1
143 1), the registry property is 1-1. Some frequent combinations have
144 a predefined registry property as below.
147 platform ID encoding ID registry property
148 ----------- ----------- -----------------
156 Thus, a font that has two combinations (1 0) and (3 1) corresponds
157 to four font objects whose registries are 1-0, apple-roman, 3-1,
162 The m17n library, if configured to use both the FreeType library
163 and the OTF library, supports any OpenType fonts. The list of
164 actually available fonts is created in the same way as in the case
165 of FreeType fonts. If a fontset instructs to use an OpenType font
166 via an FLT (Font Layout Table), and the FLT has an OTF-related
167 command (e.g. otf:deva), the OTF library converts a character
168 sequence to a glyph code sequence according to the OpenType layout
169 tables of the font, and the FreeType library gives a bitmap image
178 @brief ¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È.
180 m17n GUI API ¤Ï¥Õ¥©¥ó¥È¤ò @c MFont ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æɽ¸½¤¹¤ë¡£
181 ¥Õ¥©¥ó¥È¤Ï @e ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¤ë¡£Â¾¤Î¥¿¥¤¥×¤Î¥×
182 ¥í¥Ñ¥Æ¥£Æ±ÍÍ¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¥¡¼¤ÈÃͤ«¤é¤Ê¤ê¡¢¥¡¼¤Ï°Ê²¼¤Î¥·
183 ¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
185 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
186 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing
188 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution
189 ¤Î¾ì¹ç¡¢ÃͤÏÀ°¿ôÃͤǤ¢¤ê¡¢¥¡¼¤¬¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Ãͤϥ·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
191 ¡Ö¥Õ¥©¥ó¥È F ¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥¡¼¤¬ @c Mxxx
192 ¤Ç¤¢¤ë¤â¤Î¡×¤Î¤³¤È¤ò´Êñ¤Ë¡ÖF ¤Î xxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£
194 foundry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢adobe, misc
195 Åù¤Î¥Õ¥©¥ó¥È¤Î³«È¯¸µ¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
197 family ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢times, helvetica
198 Åù¤Î¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
200 weight ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, bold Åù¤ÎÂÀ¤µ¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
202 style ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, italic
203 Åù¤Î¥¹¥¿¥¤¥ë¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
205 stretch ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, semicondensed
206 Åù¤Îʸ»úÉý¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
208 adstyle ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢serif, sans-serif
209 Åù¤ÎÃê¾ÝŪ¤Ê¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
211 registry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢iso10646, iso8895-1
212 Åù¤Î¥ì¥¸¥¹¥È¥ê¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
214 size ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤òɽ¤ï¤¹À°¿ôÃͤǤ¢¤ê¡¢
215 ñ°Ì¤Ï1/10 ¥Ý¥¤¥ó¥È¤Ç¤¢¤ë¡£
217 resolution ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢ÁÛÄꤵ¤ì¤Æ¤¤¤ë¥Ç¥Ð¥¤¥¹¤Î²òÁüÅÙ¤òɽ¤ï¤¹
218 À°¿ôÃͤǤ¢¤ê¡¢Ã±°Ì¤Ïdots per inch (dpi) ¤Ç¤¢¤ë¡£
220 type ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ò»Ø¼¨¤·¡¢¸½ºß Mx ¤â¤·¤¯¤Ï
223 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò£²¤Ä¤ÎÌÜŪ¤ÇÍѤ¤¤Æ¤¤¤ë¡£¥¢¥×
224 ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¥Õ¥©¥ó¥È¤Î»ØÄê¤ò¼õ¤±¼è¤ëÌÜŪ¤È¡¢¥¢¥×¥ê¥±¡¼
225 ¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤òÄ󼨤¹¤ëÌÜŪ¤Ç¤¢¤ë¡£¥¢¥×¥ê¥±¡¼
226 ¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÂФ·¤ÆÄ󼨤ò¹Ô¤¦ºÝ¤Ë¤Ï¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¤¹¤Ù
229 m17n ¥é¥¤¥Ö¥é¥ê¤Ï Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È¡¢FreeType¥Õ¥©¥ó¥È¡¢
230 OpenType¥Õ¥©¥ó¥È¤Î£³¼ïÎà¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
234 <li> Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È
236 m17n X ¥é¥¤¥Ö¥é¥ê¤Ï¡¢X ¥µ¡¼¥Ð¤È X ¥Õ¥©¥ó¥È¥µ¡¼¥Ð¤¬¼è¤ê°·¤¦Á´¤Æ¤Î¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£
237 XLFD ¤Î³Æ¥Õ¥£¡¼¥ë¥É¤È¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ÎÂбþ¤Ï°Ê²¼¤ÎÄ̤ꡣ¤³¤Îɽ¤Ë¤Ê¤¤¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤ë¡£
240 XLFD ¥Õ¥£¡¼¥ë¥É ¥×¥í¥Ñ¥Æ¥£
241 --------------- --------
246 SETWIDTH_NAME stretch
247 ADD_STYLE_NAME adstyle
249 RESOLUTION_Y resolution
250 CHARSET_REGISTRY-CHARSET_ENCODING registry
255 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢
256 FreeType ¤¬°·¤¦¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£ÊÑ¿ô
257 #mfont_freetype_path ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ÎÀßÄê¤È´Ä¶ÊÑ¿ô @c M17NDIR
258 ¤Ë±þ¤¸¤Æ½é´ü²½¤µ¤ì¤ë¡£¾ÜºÙ¤ÏÊÑ¿ô¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
260 ¤â¤· m17n ¥é¥¤¥Ö¥é¥ê¤¬ fontconfig ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢
261 #mfont_freetype_path ¤Ë²Ã¤¨¤Æ¡¢ fontconfig ¤Ç»ÈÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤â¤¹¤Ù¤Æ¥µ¥Ý¡¼¥È¤µ¤ì¤ë¡£
263 FreeType ¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤Ï family ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£
264 FreeType ¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾¤Ï¡¢²¼¤Îɽ¤Î¤è¤¦¤Ë weight, style,
265 stretch ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£
268 ¥¹¥¿¥¤¥ë̾ weight style stretch
269 ---------- ------ ----- -------
270 Regular medium r normal
271 Italic medium i normal
273 Bold Italic bold i normal
274 Narrow medium r condensed
275 Narrow Italic medium i condensed
276 Narrow Bold bold r condensed
277 Narrow Bold Italic bold i condensed
279 Black Italic black i normal
280 Oblique medium o normal
281 BoldOblique bold o normal
284 ¾å¤Îɽ¤Ë¸½¤ï¤ì¤Ê¤¤¥¹¥¿¥¤¥ë̾¤Ï "Regular" ¤È¤·¤Æ°·¤ï¤ì¤ë¡£
286 platform ID ¤È encoding ID ¤ÎÁȤ߹ç¤ï¤»¤¬ registry
287 ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£¤¿¤È¤¨¤Ð¤¢¤ë¥Õ¥©¥ó¥È¤¬ (1 1) ¤È¤¤¤¦ ID ¤ÎÁȹ礻¤ò»ý¤Æ¤Ð¡¢
288 registry ¥×¥í¥Ñ¥Æ¥£¤Ï 1-1 ¤È¤Ê¤ë¡£ÉÑÈˤˤ¢¤é¤ï¤ì¤ëÁȹ礻¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤ÊÄêµÁºÑ¤ß
289 registry ¥×¥í¥Ñ¥Æ¥£ ¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ë¡£
292 platform ID encoding ID registry ¥×¥í¥Ñ¥Æ¥£
293 ----------- ----------- -----------------
301 ¤·¤¿¤¬¤Ã¤Æ¡¢Æó¤Ä¤ÎÁȹ礻 (1 0) ¡¢(3 1) ¤ò»ý¤Ä¥Õ¥©¥ó¥È¤Ï¡¢¤½¤ì¤¾¤ì
302 registry ¥×¥í¥Ñ¥Æ¥£¤¬ 1-0, apple-roman, 3-1, unicode-bmp
303 ¤Ç¤¢¤ë£´¤Ä¤Î¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ËÂбþ¤¹¤ë¡£
305 <li> OpenType ¥Õ¥©¥ó¥È
307 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢FreeType ¥é¥¤¥Ö¥é¥ê¤È OTF
308 ¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤹ¤ì¤Ð¡¢¤¹¤Ù¤Æ¤Î OpenType
309 ¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£¼ÂºÝ¤ËÍøÍѤǤ¤ë¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤Ï FreeType
310 ¥Õ¥©¥ó¥È¤Î¾ì¹ç¤ÈƱÍͤ˺î¤é¤ì¤ë¡£OpenType ¥Õ¥©¥ó¥È¤ò FLT (Font Layout Table)
311 ·Ðͳ¤Ç»ÈÍѤ¹¤ë¤è¤¦¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ë»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢FLT ¤Ë OTF
312 ´ØÏ¢¤Î¥³¥Þ¥ó¥É (¤¿¤È¤¨¤Ð otf:deva) ¤¬¤¢¤ì¤Ð¡¢OTF ¥é¥¤¥Ö¥é¥ê¤¬¥Õ¥©¥ó¥È¤Î OpenType
313 ¥ì¥¤¥¢¥¦¥È¥Æ¡¼¥Ö¥ë¤Ë½¾¤Ã¤Æʸ»úÎó¤ò¥°¥ê¥Õ¥³¡¼¥ÉÎó¤ËÊÑ´¹¤·¡¢FreeType
314 ¥é¥¤¥Ö¥é¥ê¤¬³Æ¥°¥ê¥Õ¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¥¤¥á¡¼¥¸¤òÄ󶡤¹¤ë¡£
322 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
323 /*** @addtogroup m17nInternal
332 #include "m17n-gui.h"
333 #include "m17n-misc.h"
334 #include "internal.h"
339 #include "internal-gui.h"
344 MPlist *mfont__driver_list;
346 static MSymbol M_font_capability, M_font_list, M_font_list_len;
348 /** Indices to font properties sorted by their priority. */
349 static int font_score_priority[] =
359 #define FONT_SCORE_PRIORITY_SIZE \
360 (sizeof font_score_priority / sizeof font_score_priority[0])
362 /* Indexed by a font property MFONT_XXX, and the value is how many
363 bits to shift the difference of property values. */
364 static int font_score_shift_bits[MFONT_SIZE + 1];
366 /** Predefined symbols for each font property. The order is important
367 because the function font_score () decides how well a font matches
368 with a spec by checking how close the index is. */
370 static char *common_foundry[] =
373 static char *common_family[] =
378 static char *common_weight[] =
395 static char *common_style[] =
403 static char *common_stretch[] =
414 static char *common_adstyle[] =
418 static char *common_registry[] =
421 static unsigned short font_weight_regular;
422 static unsigned short font_weight_normal;
423 static unsigned short font_weight_medium;
425 /* Table containing all the data above. */
427 struct MFontCommonNames
433 static struct MFontCommonNames font_common_names[] =
435 { sizeof (common_foundry) / sizeof (char *), common_foundry},
436 { sizeof (common_family) / sizeof (char *), common_family},
437 { sizeof (common_weight) / sizeof (char *), common_weight},
438 { sizeof (common_style) / sizeof (char *), common_style},
439 { sizeof (common_stretch) / sizeof (char *), common_stretch},
440 { sizeof (common_adstyle) / sizeof (char *), common_adstyle},
441 { sizeof (common_registry) / sizeof (char *), common_registry}
445 /** Table of available font property names. */
447 MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
450 /** Return the numeric value of SYMBOL as the Nth font property. */
452 #define FONT_PROPERTY_NUMERIC(symbol, n) \
455 : ((int) msymbol_get ((symbol), mfont__property_table[(n)].property)))
458 /** Set the numeric value of SYMBOL as the Nth font property to NUMERIC. */
460 #define SET_FONT_PROPERTY_NUMERIC(symbol, n, numeric) \
461 msymbol_put((symbol), mfont__property_table[(n)].property, \
467 struct MFontEncoding {
469 MSymbol encoding_name;
470 MCharset *encoding_charset;
471 MSymbol repertory_name;
472 MCharset *repertory_charset;
475 static MPlist *font_encoding_list;
476 static MFontEncoding default_encoding;
478 /** Load font encoding table from the data <font encoding>.
479 The data has this form:
480 (FONT-SPEC ENCODING) ...
481 where FONT-SPEC has this form:
482 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
483 All elements are symbols. */
486 load_font_encoding_table ()
489 MPlist *encoding_list, *plist, *pl, *elt;
491 font_encoding_list = pl = mplist ();
493 mdb = mdatabase_find (Mfont, msymbol ("encoding"), Mnil, Mnil);
495 || ! (encoding_list = (MPlist *) mdatabase_load (mdb)))
496 MERROR (MERROR_FONT, -1);
498 MPLIST_DO (plist, encoding_list)
500 MFontEncoding *encoding;
503 MSTRUCT_CALLOC (encoding, MERROR_FONT);
505 if (! MPLIST_PLIST_P (plist)
506 || (elt = MPLIST_PLIST (plist), mplist_length (elt) < 2)
507 || ! MPLIST_PLIST_P (elt))
508 MWARNING (MERROR_FONT);
509 registry = mfont__set_spec_from_plist (&encoding->spec,
511 elt = MPLIST_NEXT (elt);
512 if (! MPLIST_SYMBOL_P (elt))
513 MWARNING (MERROR_FONT);
514 encoding->encoding_name = MPLIST_SYMBOL (elt);
515 elt = MPLIST_NEXT (elt);
516 if (MPLIST_TAIL_P (elt))
517 encoding->repertory_name = encoding->encoding_name;
518 else if (! MPLIST_SYMBOL_P (elt))
519 MWARNING (MERROR_FONT);
521 encoding->repertory_name = MPLIST_SYMBOL (elt);
523 if (registry == Mnil)
524 mplist_push (font_encoding_list, Mt, encoding);
526 pl = mplist_add (pl, registry, encoding);
533 M17N_OBJECT_UNREF (encoding_list);
542 static MPlist *font_resize_list;
544 /** Load font size table from the data <font size>.
545 The data has this form:
546 (FONT-SPEC RESIZE-FACTOR) ...
547 where FONT-SPEC has this form:
548 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
549 All elements of FONT-SPEC are symbols. */
552 load_font_resize_table ()
555 MPlist *size_adjust_list, *plist, *pl, *elt;
557 font_resize_list = pl = mplist ();
559 mdb = mdatabase_find (Mfont, msymbol ("resize"), Mnil, Mnil);
562 if (! (size_adjust_list = (MPlist *) mdatabase_load (mdb)))
563 MERROR (MERROR_FONT, -1);
565 MPLIST_DO (plist, size_adjust_list)
570 MSTRUCT_CALLOC (resize, MERROR_FONT);
572 if (! MPLIST_PLIST_P (plist)
573 || (elt = MPLIST_PLIST (plist), mplist_length (elt) != 2)
574 || ! MPLIST_PLIST_P (elt))
575 MWARNING (MERROR_FONT);
576 registry = mfont__set_spec_from_plist (&resize->spec,
578 elt = MPLIST_NEXT (elt);
579 if (! MPLIST_INTEGER_P (elt))
580 MWARNING (MERROR_FONT);
581 resize->resize = MPLIST_INTEGER (elt);
583 if (registry == Mnil)
585 pl = mplist_add (pl, registry, resize);
592 M17N_OBJECT_UNREF (size_adjust_list);
596 /** Return a font encoding (and repertory) of FONT. */
598 static MFontEncoding *
599 find_encoding (MFont *font)
601 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
602 MFontEncoding *encoding = NULL;
605 if (! font_encoding_list)
606 load_font_encoding_table ();
607 plist = font_encoding_list;
608 while (! MPLIST_TAIL_P (plist))
610 encoding = (MFontEncoding *) MPLIST_VAL (plist);
611 if (mfont__match_p (font, &encoding->spec, MFONT_REGISTRY))
613 if (encoding->encoding_name != Mnil
614 && ! encoding->encoding_charset)
616 encoding->encoding_charset = MCHARSET (encoding->encoding_name);
617 if (! encoding->encoding_charset)
623 if (encoding->repertory_name == encoding->encoding_name)
624 encoding->repertory_charset = encoding->encoding_charset;
625 else if (encoding->repertory_name != Mnil)
627 encoding->repertory_charset
628 = MCHARSET (encoding->repertory_name);
629 if (! encoding->repertory_charset)
635 font->encoding = encoding;
639 if (registry && MPLIST_KEY (plist) != Mt)
641 plist = mplist_find_by_key (plist, registry);
646 plist = MPLIST_NEXT (plist);
648 font->encoding = &default_encoding;
649 return &default_encoding;
653 static MPlist *otf_script_list;
656 load_otf_script_list ()
661 otf_script_list = mplist ();
662 mdb = mdatabase_find (msymbol ("standard"), Mscript, msymbol ("otf"), Mnil);
664 || ! (plist = mdatabase_load (mdb)))
665 MERROR (MERROR_FONT, -1);
666 MPLIST_DO (pl, plist)
669 MSymbol script, otf_script;
672 if (! MPLIST_PLIST_P (pl))
674 p = MPLIST_PLIST (pl);
675 if (! MPLIST_SYMBOL_P (p))
677 script = MPLIST_SYMBOL (p);
679 if (! MPLIST_SYMBOL_P (p))
681 otf_script = MPLIST_SYMBOL (p);
682 tag = OTF_tag (MSYMBOL_NAME (otf_script));
683 mplist_push (otf_script_list, script, (void *) tag);
685 M17N_OBJECT_UNREF (plist);
690 find_script_from_otf_tag (OTF_Tag tag)
694 if (! otf_script_list)
695 load_otf_script_list ();
696 plist = mplist_find_by_value (otf_script_list, (void *) tag);
697 return (plist ? MPLIST_KEY (plist) : Mnil);
699 #endif /* HAVE_OTF */
701 /* XLFD parser/generator */
703 /** Indices to each field of split font name. */
719 XLFD_REGISTRY, /* This contains ENCODING. */
725 xlfd_parse_name (const char *name, MFont *font)
727 char *field[XLFD_FIELD_MAX];
728 unsigned short resy, avgwidth;
738 for (i = 1, p = copy, name++; *name; p++, name++)
743 && i < XLFD_FIELD_MAX)
746 if (field[i - 1][0] == '*')
751 *p = tolower (*name);
754 if (field[i - 1][0] == '*')
756 while (i < XLFD_FIELD_MAX)
759 resy = field[XLFD_RESY] ? atoi (field[XLFD_RESY]) : 0;
760 avgwidth = ((field[XLFD_AVGWIDTH] && isdigit (field[XLFD_AVGWIDTH][0]))
761 ? atoi (field[XLFD_AVGWIDTH]) : 1);
764 else if (! field[XLFD_PIXEL])
765 size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0;
766 else if (field[XLFD_PIXEL][0] == '[')
768 /* The pixel size field specifies a transformation matrix of the
769 form "[A B C D]". The XLFD spec says that the scalar value N
770 for the pixel size is equivalent to D. */
771 char *p0 = field[XLFD_PIXEL] + 1, *p1;
774 for (i = 0; i < 4; i++, p0 = p1)
775 d = strtod (p0, &p1);
779 size = atoi (field[XLFD_PIXEL]) * 10;
781 if (field[XLFD_FOUNDRY])
782 mfont__set_property (font, MFONT_FOUNDRY, msymbol (field[XLFD_FOUNDRY]));
783 if (field[XLFD_FAMILY])
784 mfont__set_property (font, MFONT_FAMILY, msymbol (field[XLFD_FAMILY]));
785 if (field[XLFD_WEIGHT])
786 mfont__set_property (font, MFONT_WEIGHT, msymbol (field[XLFD_WEIGHT]));
787 if (field[XLFD_SLANT])
788 mfont__set_property (font, MFONT_STYLE, msymbol (field[XLFD_SLANT]));
789 if (field[XLFD_SWIDTH])
790 mfont__set_property (font, MFONT_STRETCH, msymbol (field[XLFD_SWIDTH]));
791 if (field[XLFD_ADSTYLE])
792 mfont__set_property (font, MFONT_ADSTYLE, msymbol (field[XLFD_ADSTYLE]));
793 font->property[MFONT_RESY] = resy;
795 if (field[XLFD_SPACING])
797 = ((field[XLFD_SPACING][0] == 'p' || field[XLFD_SPACING][0] == 'P')
798 ? MFONT_SPACING_PROPORTIONAL
799 : (field[XLFD_SPACING][0] == 'm' || field[XLFD_SPACING][0] == 'M')
800 ? MFONT_SPACING_MONO : MFONT_SPACING_CHARCELL);
801 if (field[XLFD_REGISTRY])
802 mfont__set_property (font, MFONT_REGISTRY, msymbol (field[XLFD_REGISTRY]));
803 font->type = MFONT_TYPE_SPEC;
804 font->source = MFONT_SOURCE_X;
809 xlfd_unparse_name (MFont *font, int full_xlfd)
818 prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry);
819 prop[1] = (MSymbol) mfont_get_prop (font, Mfamily);
820 prop[2] = (MSymbol) mfont_get_prop (font, Mweight);
821 prop[3] = (MSymbol) mfont_get_prop (font, Mstyle);
822 prop[4] = (MSymbol) mfont_get_prop (font, Mstretch);
823 prop[5] = (MSymbol) mfont_get_prop (font, Madstyle);
824 prop[6] = (MSymbol) mfont_get_prop (font, Mregistry);
825 for (len = 0, i = 0; i < 7; i++)
829 str[i] = msymbol_name (prop[i]);
830 len += strlen (str[i]);
838 spacing = (font->spacing == MFONT_SPACING_UNDECIDED ? '*'
839 : font->spacing == MFONT_SPACING_PROPORTIONAL ? 'p'
840 : font->spacing == MFONT_SPACING_MONO ? 'm'
845 + 2 /* 2 asterisks */
846 + 30 /* 3 integers (each 10 digits) */
847 + 1 /* 1 spacing char */
848 + 1) /* '\0' terminal */
852 resy = (int) mfont_get_prop (font, Mresolution);
859 size = size / 10 + 1;
867 sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-%c-*-%s",
868 str[0], str[1], str[2], str[3], str[4], str[5],
869 size, resy, resy, spacing, str[6]);
871 sprintf (name, "-%s-%s-%s-%s-%s-%s-*-%d-%d-%d-%c-*-%s",
872 str[0], str[1], str[2], str[3], str[4], str[5],
873 size, resy, resy, spacing, str[6]);
879 p += sprintf (p, "-%s", str[0]);
880 for (i = 1; i < 6; i++)
881 if (p[-1] != '*' || str[i][0] != '*')
882 p += sprintf (p, "-%s", str[i]);
883 if (p[-1] != '*' || font->size > 0)
886 p += sprintf (p, "-%d-*", size);
888 p += sprintf (p, "-*");
890 if (str[6][0] != '*')
891 sprintf (p, "-%s", str[6]);
894 return strdup (name);
897 /* Compare FONT with REQUEST and return how much they differs. */
900 font_score (MFont *font, MFont *request)
903 int i = FONT_SCORE_PRIORITY_SIZE;
907 enum MFontProperty prop = font_score_priority[i];
910 if (prop == MFONT_SIZE)
912 if (font->size && request->size)
914 val = font->size - request->size;
921 score |= (val << font_score_shift_bits[MFONT_SIZE]);
925 else if (font->property[prop] && request->property[prop]
926 && font->property[prop] != request->property[prop])
928 if (prop <= MFONT_FAMILY)
930 else if (prop == MFONT_WEIGHT)
932 unsigned short v1 = font->property[prop];
933 unsigned short v2 = request->property[prop];
935 if (v1 == font_weight_regular || v1 == font_weight_normal)
936 v1 = font_weight_medium;
937 if (v2 == font_weight_regular || v2 == font_weight_normal)
938 v2 = font_weight_medium;
939 val = v1 > v2 ? v1 - v2 : v2 - v1;
943 val = font->property[prop] - request->property[prop];
949 score |= val << font_score_shift_bits[prop];
952 if (request->file != Mnil && request->file != font->file)
960 MSymbol Miso8859_1, Miso10646_1, Municode_bmp, Municode_full, Mapple_roman;
966 MSymbol regular = msymbol ("regular");
967 MSymbol normal = msymbol ("normal");
968 MSymbol medium = msymbol ("medium");
970 M_font_capability = msymbol_as_managing_key (" font-capability");
971 M_font_list = msymbol_as_managing_key (" font-list");
972 M_font_list_len = msymbol (" font-list-len");
974 Mfoundry = msymbol ("foundry");
975 mfont__property_table[MFONT_FOUNDRY].property = Mfoundry;
976 Mfamily = msymbol ("family");
977 mfont__property_table[MFONT_FAMILY].property = Mfamily;
978 Mweight = msymbol ("weight");
979 mfont__property_table[MFONT_WEIGHT].property = Mweight;
980 Mstyle = msymbol ("style");
981 mfont__property_table[MFONT_STYLE].property = Mstyle;
982 Mstretch = msymbol ("stretch");
983 mfont__property_table[MFONT_STRETCH].property = Mstretch;
984 Madstyle = msymbol ("adstyle");
985 mfont__property_table[MFONT_ADSTYLE].property = Madstyle;
986 Mregistry = msymbol ("registry");
987 mfont__property_table[MFONT_REGISTRY].property = Mregistry;
989 Mspacing = msymbol ("spacing");
990 Msize = msymbol ("size");
991 Mresolution = msymbol ("resolution");
992 Mmax_advance = msymbol ("max-advance");
993 Mfontfile = msymbol ("fontfile");
995 Mfontconfig = msymbol ("fontconfig");
998 Mfreetype = msymbol ("freetype");
999 Mxft = msymbol ("xft");
1001 Miso8859_1 = msymbol ("iso8859-1");
1002 Miso10646_1 = msymbol ("iso10646-1");
1003 Municode_bmp = msymbol ("unicode-bmp");
1004 Municode_full = msymbol ("unicode-full");
1005 Mapple_roman = msymbol ("apple-roman");
1007 /* The first entry of each mfont__property_table must be Mnil so
1008 that actual properties get positive numeric numbers. */
1009 for (i = 0; i <= MFONT_REGISTRY; i++)
1011 MLIST_INIT1 (&mfont__property_table[i], names, 8);
1012 MLIST_APPEND1 (&mfont__property_table[i], names, Mnil, MERROR_FONT);
1015 /* Register predefined font property names. */
1016 for (i = 0; i <= MFONT_REGISTRY; i++)
1020 for (j = 0; j < font_common_names[i].num; j++)
1022 MSymbol sym = msymbol (font_common_names[i].names[j]);
1026 if (msymbol_put (sym, mfont__property_table[i].property,
1027 (void *) (j + 1)) < 0)
1029 MLIST_APPEND1 (&mfont__property_table[i], names, sym,
1031 if (i == MFONT_WEIGHT)
1034 font_weight_regular = j + 1;
1035 else if (sym == normal)
1036 font_weight_normal = j + 1;
1037 else if (sym == medium)
1038 font_weight_medium = j + 1;
1043 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
1044 of a score is a flag for a scalable font (see the documentation
1046 i = FONT_SCORE_PRIORITY_SIZE - 1;
1047 for (shift = 1; i >= 0; i--)
1049 font_score_shift_bits[font_score_priority[i]] = shift;
1050 if (font_score_priority[i] == MFONT_SIZE)
1052 else if (font_score_priority[i] <= MFONT_FAMILY)
1058 MFONT_INIT (&default_encoding.spec);
1059 default_encoding.encoding_name = Municode_full;
1060 default_encoding.encoding_charset = mcharset__unicode;
1061 default_encoding.repertory_name = Mnil;
1062 default_encoding.repertory_charset = NULL;
1068 mfont_freetype_path = mplist ();
1069 bufsize = strlen (M17NDIR) + 7;
1070 SAFE_ALLOCA (buf, bufsize);
1071 sprintf (buf, "%s/fonts", M17NDIR);
1072 mplist_add (mfont_freetype_path, Mstring, strdup (buf));
1073 path = getenv ("M17NDIR");
1076 bufsize = strlen (path) + 7;
1077 SAFE_ALLOCA (buf, bufsize);
1078 sprintf (buf, "%s/fonts", path);
1079 mplist_push (mfont_freetype_path, Mstring, strdup (buf));
1084 #ifdef HAVE_FREETYPE
1085 if (mfont__ft_init () < 0)
1087 #endif /* HAVE_FREETYPE */
1088 if (mfont__flt_init () < 0)
1101 #ifdef HAVE_FREETYPE
1103 #endif /* HAVE_FREETYPE */
1105 MPLIST_DO (plist, mfont_freetype_path)
1106 free (MPLIST_VAL (plist));
1107 M17N_OBJECT_UNREF (mfont_freetype_path);
1109 if (font_resize_list)
1111 MPLIST_DO (plist, font_resize_list)
1112 free (MPLIST_VAL (plist));
1113 M17N_OBJECT_UNREF (font_resize_list);
1114 font_resize_list = NULL;
1116 if (font_encoding_list)
1118 MPLIST_DO (plist, font_encoding_list)
1119 free (MPLIST_VAL (plist));
1120 M17N_OBJECT_UNREF (font_encoding_list);
1121 font_encoding_list = NULL;
1124 if (otf_script_list)
1126 M17N_OBJECT_UNREF (otf_script_list);
1127 otf_script_list = NULL;
1129 #endif /* HAVE_OTF */
1131 for (i = 0; i <= MFONT_REGISTRY; i++)
1132 MLIST_FREE1 (&mfont__property_table[i], names);
1137 mfont__id (MFont *font)
1141 int file_len = (font->file == Mnil ? 0 : MSYMBOL_NAMELEN (font->file));
1142 int capability_len = (font->capability == Mnil ? 0
1143 : MSYMBOL_NAMELEN (font->capability));
1144 int total_len = MFONT_PROPERTY_MAX * 5 + 9 + file_len + capability_len;
1148 SAFE_ALLOCA (buf, total_len);
1150 if (font->property[0])
1151 p += sprintf (p, "%X", font->property[0]);
1152 for (i = 1; i < MFONT_PROPERTY_MAX; i++)
1154 if (font->property[i])
1155 p += sprintf (p, "-%X", font->property[i]);
1160 p += sprintf (p, "-%X", font->size);
1162 p += sprintf (p, "-%X", font->spacing);
1163 if (capability_len > 0)
1166 memcpy (p, MSYMBOL_NAME (font->capability), capability_len);
1167 p += capability_len;
1172 memcpy (p, MSYMBOL_NAME (font->file), file_len);
1175 id = msymbol__with_len (buf, p - buf);
1180 /** Return 1 iff FONT matches SPEC. */
1183 mfont__match_p (MFont *font, MFont *spec, int prop)
1185 if (spec->capability != font->capability
1186 && spec->capability != Mnil && font->capability != Mnil)
1188 if (spec->file != font->file
1189 && spec->file != Mnil && font->file != Mnil)
1191 for (; prop >= 0; prop--)
1192 if (spec->property[prop] && font->property[prop]
1193 && font->property[prop] != spec->property[prop])
1198 /* Merge SRC into DST. If error_on_conflict is nonzero and a font
1199 property differs in SRC and DST, return -1. */
1202 mfont__merge (MFont *dst, MFont *src, int error_on_conflict)
1206 for (i = 0; i < MFONT_PROPERTY_MAX; i++)
1208 if (! dst->property[i])
1209 dst->property[i] = src->property[i];
1210 else if (error_on_conflict
1212 && dst->property[i] != src->property[i])
1216 dst->spacing = src->spacing;
1217 else if (error_on_conflict
1219 && dst->spacing != src->spacing)
1222 dst->size = src->size;
1223 else if (error_on_conflict
1225 && dst->size != src->size)
1227 if (dst->capability == Mnil)
1228 dst->capability = src->capability;
1229 else if (error_on_conflict
1231 && dst->capability != src->capability)
1233 if (dst->file == Mnil)
1234 dst->file = src->file;
1235 else if (error_on_conflict
1237 && dst->file != src->file)
1243 mfont__set_spec_from_face (MFont *spec, MFace *face)
1247 for (i = 0; i <= MFONT_ADSTYLE; i++)
1248 mfont__set_property (spec, i, face->property[i]);
1249 spec->property[MFONT_REGISTRY] = 0;
1250 spec->property[MFONT_RESY] = 0;
1251 spec->size = (int) (face->property[MFACE_SIZE]);
1252 spec->type = MFONT_TYPE_SPEC;
1253 spec->source = MFONT_SOURCE_UNDECIDED;
1254 spec->file = spec->capability = Mnil;
1255 spec->encoding = NULL;
1260 mfont__set_spec_from_plist (MFont *spec, MPlist *plist)
1263 MSymbol spec_list[MFONT_REGISTRY + 1];
1268 memset (spec_list, 0, sizeof spec_list);
1269 for (i = 0; ! MPLIST_TAIL_P (plist); i++, plist = MPLIST_NEXT (plist))
1271 if (! MPLIST_SYMBOL_P (plist))
1272 MERROR (MERROR_FONT, Mnil);
1273 spec_list[i] = MPLIST_SYMBOL (plist);
1275 registry = spec_list[i - 1];
1276 if (i > 1 && registry != Mnil)
1278 reg = MSYMBOL_NAME (registry);
1281 mfont__get_capability (registry);
1282 spec->capability = registry;
1283 registry = spec_list[i - 2];
1287 mfont__set_property (spec, MFONT_REGISTRY, registry);
1288 for (i -= 2; i >= 0; i--)
1289 mfont__set_property (spec, i, spec_list[i]);
1290 spec->type = MFONT_TYPE_SPEC;
1297 mfont__select (MFrame *frame, MFont *font, int max_size)
1299 MFontDriver *driver;
1301 if (font->type == MFONT_TYPE_FAILURE)
1303 if (font->type != MFONT_TYPE_SPEC)
1305 if (font->source == MFONT_SOURCE_UNDECIDED)
1307 if (font->file != Mnil || font->capability != Mnil)
1308 font->source = MFONT_SOURCE_FT;
1309 else if (font->property[MFONT_REGISTRY])
1311 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
1312 char *reg = MSYMBOL_NAME (registry);
1314 if (strncmp (reg, "unicode-", 8) == 0
1315 || strncmp (reg, "apple-roman", 11) == 0
1316 || (reg[0] >= '0' && reg[0] <= '9' && reg[1] == '-'))
1317 font->source = MFONT_SOURCE_FT;
1320 if (font->source != MFONT_SOURCE_FT)
1322 driver = mplist_get (frame->font_driver_list, Mx);
1324 return (driver->select) (frame, font, max_size);
1326 driver = mplist_get (frame->font_driver_list, Mfreetype);
1329 return (driver->select) (frame, font, max_size);
1334 mfont__available (MFrame *frame, MFont *font)
1340 compare_font_score (const void *e1, const void *e2)
1342 MFontScore *s1 = (MFontScore *) e1, *s2 = (MFontScore *) e2;
1344 return (s1->font->for_full_width == s2->font->for_full_width
1345 ? s1->score > s2->score
1346 : s1->font->for_full_width);
1350 mdebug_dump_font_list (MFontList *font_list)
1354 for (i = 0; i < font_list->nfonts; i++)
1356 fprintf (stderr, "%04X - ", font_list->fonts[i].score);
1357 mdebug_dump_font (font_list->fonts[i].font);
1358 fprintf (stderr, "\n");
1363 mfont__free_realized (MRealizedFont *rfont)
1365 MRealizedFont *next;
1367 for (; rfont; rfont = next)
1370 M17N_OBJECT_UNREF (rfont->info);
1377 mfont__list (MFrame *frame, MFont *spec, MFont *request, int max_size)
1380 MSymbol id = mfont__id (spec);
1384 pl = msymbol_get (id, M_font_list);
1386 num = (int) msymbol_get (id, M_font_list_len);
1391 MPLIST_DO (p, frame->font_driver_list)
1393 if (spec->source == MFONT_SOURCE_X ? MPLIST_KEY (p) == Mx
1394 : spec->source == MFONT_SOURCE_FT ? MPLIST_KEY (p) == Mfreetype
1397 MFontDriver *driver = MPLIST_VAL (p);
1398 num += (driver->list) (frame, pl, spec, 0);
1401 msymbol_put (id, M_font_list, pl);
1402 M17N_OBJECT_UNREF (pl);
1403 msymbol_put (id, M_font_list_len, (void *) num);
1409 MSTRUCT_MALLOC (list, MERROR_FONT);
1410 MTABLE_MALLOC (list->fonts, num, MERROR_FONT);
1411 for (i = 0; num > 0; num--, pl = MPLIST_NEXT (pl))
1413 MFont *font = MPLIST_VAL (pl);
1417 || font->size < max_size)
1419 list->fonts[i].font = font;
1420 list->fonts[i].score
1421 = spec == request ? 0 : font_score (font, request);
1432 if (spec != request)
1433 qsort (list->fonts, i, sizeof (MFontScore), compare_font_score);
1434 list->object = *spec;
1435 mfont__merge (&list->object, request, 0);
1436 list->object.type = MFONT_TYPE_OBJECT;
1440 /** Open a font specified in FONT. */
1443 mfont__open (MFrame *frame, MFont *font, MFont *spec)
1445 MFontDriver *driver;
1446 MRealizedFont *rfont;
1448 if (font->source == MFONT_SOURCE_UNDECIDED)
1449 MFATAL (MERROR_FONT);
1450 if (font->type != MFONT_TYPE_OBJECT)
1451 MFATAL (MERROR_FONT);
1452 for (rfont = MPLIST_VAL (frame->realized_font_list); rfont;
1453 rfont = rfont->next)
1455 driver = rfont->driver;
1456 if (rfont->font == font
1457 && mplist_find_by_value (frame->font_driver_list, driver))
1463 driver = mplist_get (frame->font_driver_list,
1464 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1466 MFATAL (MERROR_FONT);
1468 return (driver->open) (frame, font, spec, rfont);
1472 mfont__resize (MFont *spec, MFont *request)
1474 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1475 MFontResize *resize;
1478 if (! font_resize_list)
1479 load_font_resize_table ();
1480 if (! MPLIST_TAIL_P (font_resize_list))
1483 plist = font_resize_list;
1484 while (registry ? (plist = mplist_find_by_key (plist, registry))
1487 resize = (MFontResize *) MPLIST_VAL (plist);
1488 if (mfont__match_p (spec, &resize->spec, MFONT_ADSTYLE))
1490 request->size = request->size * resize->resize / 100;
1493 plist = MPLIST_NEXT (plist);
1503 mfont__has_char (MFrame *frame, MFont *font, MFont *spec, int c)
1505 MFontEncoding *encoding;
1507 MFontDriver *driver;
1509 if (font->source == MFONT_SOURCE_UNDECIDED)
1510 MFATAL (MERROR_FONT);
1511 encoding = (font->encoding ? font->encoding : find_encoding (font));
1512 if (! encoding->encoding_charset)
1514 if (encoding->repertory_charset)
1516 code = ENCODE_CHAR (encoding->repertory_charset, c);
1517 return (code != MCHAR_INVALID_CODE);
1519 code = ENCODE_CHAR (encoding->encoding_charset, c);
1520 if (code == MCHAR_INVALID_CODE)
1522 if (font->type == MFONT_TYPE_REALIZED)
1523 driver = ((MRealizedFont *) font)->driver;
1526 driver = mplist_get (frame->font_driver_list,
1527 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1529 MFATAL (MERROR_FONT);
1531 return (driver->has_char) (frame, font, spec, c, code);
1535 mfont__encode_char (MFrame *frame, MFont *font, MFont *spec, int c)
1537 MFontEncoding *encoding;
1539 MFontDriver *driver;
1541 if (font->source == MFONT_SOURCE_UNDECIDED)
1542 MFATAL (MERROR_FONT);
1543 encoding = (font->encoding ? font->encoding : find_encoding (font));
1544 if (! encoding->encoding_charset)
1545 return MCHAR_INVALID_CODE;
1546 if (font->source == MFONT_SOURCE_X && encoding->repertory_charset)
1547 return (ENCODE_CHAR (encoding->repertory_charset, c));
1548 code = ENCODE_CHAR (encoding->encoding_charset, c);
1549 if (code == MCHAR_INVALID_CODE)
1550 return MCHAR_INVALID_CODE;
1551 if (font->type == MFONT_TYPE_REALIZED)
1552 driver = ((MRealizedFont *) font)->driver;
1555 driver = mplist_get (frame->font_driver_list,
1556 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1558 MFATAL (MERROR_FONT);
1560 return (driver->encode_char) (frame, font, spec, code);
1564 mfont__get_metric (MGlyphString *gstring, int from, int to)
1566 MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
1567 MRealizedFont *rfont = from_g->rface->rfont;
1569 for (g = from_g; g != to_g; g++)
1570 if (g->rface->rfont != rfont)
1572 int idx = GLYPH_INDEX (g);
1574 (rfont->driver->find_metric) (rfont, gstring, from, idx);
1576 rfont = g->rface->rfont;
1579 (rfont->driver->find_metric) (rfont, gstring, from, GLYPH_INDEX (g));
1583 /* KEY <= MFONT_REGISTRY */
1586 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1594 numeric = FONT_PROPERTY_NUMERIC (val, key);
1597 numeric = mfont__property_table[key].used;
1598 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1599 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1602 font->property[key] = numeric;
1606 mfont__parse_name_into_font (const char *name, MSymbol format, MFont *font)
1610 if (format == Mx || format == Mnil)
1611 result = xlfd_parse_name (name, font);
1612 #ifdef HAVE_FONTCONFIG
1613 if (format == Mfontconfig || (result < 0 && format == Mnil))
1614 result = mfont__ft_parse_name (name, font);
1615 #endif /* HAVE_FONTCONFIG */
1620 mfont__encoding_list (void)
1622 if (! font_encoding_list)
1623 load_font_encoding_table ();
1624 return font_encoding_list;
1628 free_font_capability (void *object)
1630 MFontCapability *cap = object;
1638 for (i = 0; i < MFONT_OTT_MAX; i++)
1640 if (cap->features[i].str)
1641 free (cap->features[i].str);
1642 if (cap->features[i].tags)
1643 free (cap->features[i].tags);
1646 #endif /* HAVE_OTF */
1651 mfont__get_capability (MSymbol sym)
1653 MFontCapability *cap = msymbol_get (sym, M_font_capability);
1654 char *str, *p, *endp;
1658 str = MSYMBOL_NAME (sym);
1661 M17N_OBJECT (cap, free_font_capability, MERROR_FONT);
1662 msymbol_put (sym, M_font_capability, cap);
1663 M17N_OBJECT_UNREF (cap);
1664 endp = str + MSYMBOL_NAMELEN (sym);
1670 if (str[0] == 'o' && str[1] == 't' && str[2] == 'f' && str[3] == '=')
1675 for (i = 0, p = str; i < 4 && p < endp; i++, p++);
1678 cap->script_tag = OTF_tag (str);
1679 cap->script = find_script_from_otf_tag (cap->script_tag);
1682 for (i = 0, str = ++p; i < 4 && p < endp; i++, p++);
1688 cap->langsys_tag = OTF_tag (str);
1691 cap->langsys_tag = 0;
1693 for (i = 0; i < MFONT_OTT_MAX; i++)
1694 cap->features[i].nfeatures = -1;
1696 while (*p == '=' || *p == '+')
1698 int idx = *p == '=' ? MFONT_OTT_GSUB : MFONT_OTT_GPOS;
1701 while (p < endp && *p != '+') p++;
1705 /* We never have more than (p - str) tags. */
1706 OTF_Tag *tags = alloca (sizeof (OTF_Tag) * (p - str));
1709 cap->features[idx].str = malloc (p - str + 1);
1710 for (i = n = 0, p0 = str; str + i < p; i++)
1712 cap->features[idx].str[i] = str[i];
1713 if (str[i] == ',' || str + i + 1 == p)
1717 else if (*p0 == '~')
1718 tags[n] = OTF_tag (p0 + 1) | 0x80000000;
1720 tags[n] = OTF_tag (p0);
1725 cap->features[idx].str[i] = '\0';
1726 cap->features[idx].nfeatures = n;
1729 int size = sizeof (OTF_Tag) * n;
1731 cap->features[idx].tags = malloc (size);
1732 memcpy (cap->features[idx].tags, tags, size);
1737 cap->features[idx].str = NULL;
1738 cap->features[idx].nfeatures = 0;
1742 for (i = 0; i < MFONT_OTT_MAX; i++)
1743 if (cap->features[i].nfeatures < 0)
1745 cap->features[i].str = strdup ("*");
1746 cap->features[i].nfeatures = 1;
1747 cap->features[i].tags = malloc (sizeof (OTF_Tag));
1748 cap->features[i].tags[0] = 0;
1753 #endif /* HAVE_OTF */
1754 if (str[0] == 'l' && str[1] == 'a' && str[2] == 'n' && str[3] == 'g'
1760 for (p = str, count = 2; p < endp && *p != ':'; p++)
1763 MTABLE_MALLOC (cap->lang, count, MERROR_FONT);
1764 for (p = str, count = 0; p < endp && *p != ':'; p++)
1767 MSymbol lang = msymbol__with_len (str, p - str), sym;
1769 if (msymbol_get (lang, Miso639_2))
1770 cap->lang[count++] = lang;
1771 else if ((sym = msymbol_get (lang, Miso639_1)) != Mnil)
1772 cap->lang[count++] = sym;
1773 else if (msymbol_get (lang, Mlanguage))
1774 cap->lang[count++] = lang;
1778 cap->lang[count++] = msymbol__with_len (str, p - str);
1779 cap->lang[count] = Mnil;
1782 else if (str[0] == 's' && str[1] == 'c' && str[2] == 'r' && str[3] == 'i'
1783 && str[4] == 'p' && str[5] == 't' && str[6] == '=')
1786 for (p = str; p < endp && *p != ':'; p++);
1788 cap->script = msymbol__with_len (str, p - str);
1796 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1802 /*** @addtogroup m17nFont */
1806 /***en @name Variables: Keys of font property. */
1807 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1812 @brief Key of font property specifying foundry.
1814 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1815 is used as a key of font property and face property. The property
1816 value must be a symbol whose name is a foundry name of a font. */
1818 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1820 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt>
1821 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1822 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1827 @brief Key of font property specifying family.
1829 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1830 used as a key of font property and face property. The property
1831 value must be a symbol whose name is a family name of a font. */
1833 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1835 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt>
1836 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1837 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1842 @brief Key of font property specifying weight.
1844 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1845 used as a key of font property and face property. The property
1846 value must be a symbol whose name is a weight name of a font (e.g
1847 "medium", "bold"). */
1849 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1851 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt>
1852 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1853 Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1858 @brief Key of font property specifying style.
1860 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
1861 used as a key of font property and face property. The property
1862 value must be a symbol whose name is a style name of a font (e.g
1865 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1867 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt>
1868 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1869 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1874 @brief Key of font property specifying stretch.
1876 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
1877 is used as a key of font property and face property. The property
1878 value must be a symbol whose name is a stretch name of a font (e.g
1879 "normal", "condensed"). */
1881 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1883 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt>
1884 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1885 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1890 @brief Key of font property specifying additional style.
1892 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
1893 is used as a key of font property and face property. The property
1894 value must be a symbol whose name is an additional style name of a
1895 font (e.g "serif", "", "sans"). */
1897 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1899 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt>
1900 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1901 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1906 @brief Key of font property specifying spacing.
1908 The variable #Madstyle is a symbol of name <tt>"spacing"</tt> and
1909 is used as a key of font property. The property value must be a
1910 symbol whose name specifies the spacing of a font (e.g "p" for
1911 proportional, "m" for monospaced). */
1913 @brief spacing ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1915 ÊÑ¿ô #Mspacing ¤Ï <tt>"spacing"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1916 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î spacing
1917 ÆÃÀ¤ò¼¨¤¹Ì¾Á° ("p", "m" Åù)¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1922 @brief Key of font property specifying registry.
1924 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
1925 and is used as a key of font property. The property value must be
1926 a symbol whose name is a registry name a font registry
1927 (e.g. "iso8859-1", "jisx0208.1983-0"). */
1929 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1931 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt>
1932 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1933 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0"
1934 Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1939 @brief Key of font property specifying size.
1941 The variable #Msize is a symbol of name <tt>"size"</tt> and is
1942 used as a key of font property and face property. The property
1943 value must be an integer specifying a font design size in the unit
1944 of 1/10 point (on 100 dpi display). */
1946 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1948 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt>
1949 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1950 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10
1951 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
1957 @brief Key of font property specifying file name.
1959 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
1960 and is used as a key of font property. The property value must be
1961 a symbol whose name is a font file name. */
1963 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1965 ÊÑ¿ô #Mfontfile ¤Ï <tt>"fontfile"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1966 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤
1967 ¥ë̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1972 @brief Key of font property specifying resolution.
1974 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
1975 is used as a key of font property and face property. The property
1976 value must be an integer to specifying a font resolution in the
1977 unit of dots per inch (dpi). */
1979 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1981 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt>
1982 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1983 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */
1985 MSymbol Mresolution;
1988 @brief Key of font property specifying max advance width.
1990 The variable #Mmax_advance is a symbol of name
1991 <tt>"max-advance"</tt> and is used as a key of font property. The
1992 property value must be an integer specifying a font's max advance
1995 MSymbol Mmax_advance;
1999 @brief Symbol of name "fontconfig".
2001 The variable #Mfontconfig is to be used as an argument of the
2002 functions mfont_parse_name () and mfont_unparse_name (). */
2004 @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2006 ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name ()
2007 ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
2009 MSymbol Mfontconfig;
2012 @brief Symbol of name "x".
2014 The variable #Mx is to be used for a value of <type> member of the
2015 structure #MDrawGlyph to specify the type of <fontp> member is
2016 actually (XFontStruct *). */
2018 @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2020 ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2021 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
2026 @brief Symbol of name "freetype".
2028 The variable #Mfreetype is to be used for a value of <type> member
2029 of the structure #MDrawGlyph to specify the type of <fontp> member
2030 is actually FT_Face. */
2032 @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2034 ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2035 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2040 @brief Symbol of name "xft".
2042 The variable #Mxft is to be used for a value of <type> member of the
2043 structure #MDrawGlyph to specify the type of <fontp> member
2044 is actually (XftFont *). */
2046 @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2048 ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2049 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2058 @brief List of font files and directories that contain font files.
2060 The variable @c mfont_freetype_path is a plist of FreeType font
2061 files and directories that contain FreeType font files. Key of
2062 the element is @c Mstring, and the value is a string that
2063 represents a font file or a directory.
2065 The macro M17N_INIT () sets up this variable to contain the
2066 sub-directory "fonts" of the m17n database and the environment
2067 variable "M17NDIR". The first call of mframe () creates the
2068 internal list of the actually available fonts from this variable.
2069 Thus, an application program, if necessary, must modify the
2070 variable before calling mframe (). If it is going to add a new
2071 element, value must be a string that can be safely freed.
2073 If the m17n library is not configured to use the FreeType library,
2074 this variable is not used. */
2076 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
2078 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î
2079 plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring
2080 ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
2082 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ¿ô
2083 "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
2084 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£
2085 ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe ()
2086 ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2087 ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2089 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
2091 MPlist *mfont_freetype_path;
2096 @brief Create a new font.
2098 The mfont () function creates a new font object that has no
2102 This function returns a pointer to the created font object. */
2104 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
2106 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2109 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
2116 MSTRUCT_CALLOC (font, MERROR_FONT);
2123 @brief Create a font by parsing a fontname.
2125 The mfont_parse_name () function creates a new font object. The
2126 properties are extracted fontname $NAME.
2128 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
2129 is parsed as XLFD (X Logical Font Description). If $FORMAT is
2130 #Mfontconfig, $NAME is parsed as Fontconfig's textual
2131 representation of font. If $FORMAT is #Mnil, $NAME is at first
2132 parsed as XLFD, and it it fails, parsed as Fontconfig's
2136 If the operation was successful, this function returns a pointer
2137 to the created font. Otherwise it returns @c NULL. */
2140 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2142 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾
2143 $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2145 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
2146 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2147 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig
2148 ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD
2149 ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2152 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name ()
2153 ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
2156 mfont_parse_name (const char *name, MSymbol format)
2158 MFont template, *font;
2160 MFONT_INIT (&template);
2161 if (mfont__parse_name_into_font (name, format, &template) < 0)
2162 MERROR (MERROR_FONT, NULL);
2163 MSTRUCT_CALLOC (font, MERROR_FONT);
2171 @brief Create a fontname from a font.
2173 The mfont_unparse_name () function creates a fontname string
2174 from font $FONT according to $FORMAT.
2176 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
2177 is in XLFD (X Logical Font Description) format. If it is
2178 #Mfontconfig, the fontname is in the style of Fontconfig's text
2182 This function returns a newly allocated fontname string, which is
2183 not freed unless the user explicitly does so by free (). */
2186 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2188 ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT
2189 ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£
2191 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£
2192 #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£
2193 #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
2196 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬
2197 free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
2200 mfont_unparse_name (MFont *font, MSymbol format)
2205 name = xlfd_unparse_name (font, 1);
2206 #ifdef HAVE_FONTCONFIG
2207 else if (format == Mfontconfig)
2208 name = mfont__ft_unparse_name (font);
2210 #endif /* HAVE_FONTCONFIG */
2212 MERROR (MERROR_FONT, NULL);
2219 @brief Make a copy of a font.
2221 The mfont_copy () function returns a new copy of font $FONT. */
2223 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
2225 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
2228 mfont_copy (MFont *font)
2232 MSTRUCT_MALLOC (copy, MERROR_FONT);
2240 @brief Get a property value of a font.
2242 The mfont_get_prop () function gets the value of $KEY property of
2243 font $FONT. $KEY must be one of the following symbols:
2245 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c Madstyle,
2246 @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2248 If $FONT is a return value of mfont_find (), $KEY can also be one
2249 of the following symbols:
2251 #Mfont_ascent, #Mfont_descent, #Mmax_advance.
2253 @return If $KEY is @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2254 @c Madstyle, @c Mregistry, or @c Mspacing, this function returns
2255 the corresponding value as a symbol. If the font does not have
2256 $KEY property, it returns @c Mnil. If $KEY is @c Msize, @c
2257 Mresolution, #Mfont_ascent, Mfont_descent, or #Mmax_advance, this
2258 function returns the corresponding value as an integer. If the
2259 font does not have $KEY property, it returns 0. If $KEY is
2260 something else, it returns @c NULL and assigns an error code to
2261 the external variable #merror_code. */
2264 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
2266 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
2267 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
2270 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2271 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2273 @return $KEY ¤¬ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
2274 Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢ÁêÅö¤¹¤ëÃÍ
2275 ¤ò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï
2276 @c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¤Ë¤Ï¡¢
2277 ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
2278 ¾ì¹ç¤Ë¤Ï 0 ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c NULL ¤òÊÖ¤·¡¢
2279 ³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2282 mfont_get_prop (MFont *font, MSymbol key)
2284 MRealizedFont *rfont = NULL;
2286 if (font->type == MFONT_TYPE_REALIZED)
2287 rfont = (MRealizedFont *) font;
2289 if (key == Mfoundry)
2290 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
2292 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
2294 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
2296 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
2297 if (key == Mstretch)
2298 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
2299 if (key == Madstyle)
2300 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
2301 if (key == Mregistry)
2302 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
2305 int size = font->size;
2306 return (void *) size;
2308 if (key == Mresolution)
2310 int resy = font->property[MFONT_RESY];
2311 return (void *) resy;
2313 if (key == Mfontfile)
2314 return (void *) font->file;
2315 if (key == Mspacing)
2316 return (font->spacing == MFONT_SPACING_UNDECIDED ? Mnil
2317 : msymbol (font->spacing == MFONT_SPACING_PROPORTIONAL ? "p"
2318 : font->spacing == MFONT_SPACING_MONO ? "m" : "c"));
2321 if (key == Mfont_ascent)
2322 return (void *) rfont->ascent;
2323 if (key == Mfont_descent)
2324 return (void *) rfont->descent;
2325 if (key == Mmax_advance)
2326 return (void *) rfont->max_advance;
2328 MERROR (MERROR_FONT, NULL);
2334 @brief Put a property value to a font.
2336 The mfont_put_prop () function puts a font property whose key is
2337 $KEY and value is $VAL to font $FONT. $KEY must be one of the
2340 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2341 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2343 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
2344 Otherwise, $VAL must be a symbol. */
2346 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
2348 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY
2349 ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
2351 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2352 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2354 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL
2355 ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
2358 mfont_put_prop (MFont *font, MSymbol key, void *val)
2360 if (key == Mfoundry)
2361 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
2362 else if (key == Mfamily)
2363 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
2364 else if (key == Mweight)
2365 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
2366 else if (key == Mstyle)
2367 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
2368 else if (key == Mstretch)
2369 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
2370 else if (key == Madstyle)
2371 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
2372 else if (key == Mregistry)
2373 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
2374 else if (key == Msize)
2376 int size = (int) val;
2379 else if (key == Mresolution)
2381 unsigned resy = (unsigned) val;
2382 font->property[MFONT_RESY] = resy;
2384 else if (key == Mlanguage)
2386 char *langname = MSYMBOL_NAME ((MSymbol) val);
2387 int len = MSYMBOL_NAMELEN ((MSymbol) val);
2393 sprintf (buf, ":lang=%s", langname);
2394 font->capability = msymbol (buf);
2397 else if (key == Mfontfile)
2399 font->file = (MSymbol) val;
2402 MERROR (MERROR_FONT, -1);
2409 @brief Return the font selection priority.
2411 The mfont_selection_priority () function returns a newly created
2412 array of six symbols. The elements are the following
2413 keys of font properties ordered by priority.
2415 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2416 @c Madstyle, @c Msize.
2418 The m17n library selects the best matching font according to the
2419 order of this array. A font that has a different value for a
2420 property of lower priority is preferred to a font that has a
2421 different value for a property of higher priority. */
2423 @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹.
2425 ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£
2426 ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2428 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2429 @c Madstyle, @c Msize.
2431 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
2432 ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£
2437 mfont_selection_priority ()
2442 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
2443 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2445 enum MFontProperty prop = font_score_priority[i];
2447 if (prop == MFONT_SIZE)
2449 else if (prop == MFONT_ADSTYLE)
2451 else if (prop == MFONT_FAMILY)
2453 else if (prop == MFONT_WEIGHT)
2455 else if (prop == MFONT_STYLE)
2457 else if (prop == MFONT_STRETCH)
2468 @brief Set the font selection priority.
2470 The mfont_set_selection_priority () function sets font selection
2471 priority according to $KEYS, which is an array of six symbols.
2472 Each element must be one of the below. No two elements must be
2475 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2476 @c Madstyle, @c Msize.
2478 See the documentation of the function mfont_selection_priority ()
2481 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
2483 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
2484 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ
2485 ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2487 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2488 @c Madstyle, @c Msize.
2490 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
2494 mfont_set_selection_priority (MSymbol *keys)
2496 int priority[FONT_SCORE_PRIORITY_SIZE];
2499 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
2501 enum MFontProperty prop;
2505 else if (*keys == Madstyle)
2506 prop = MFONT_ADSTYLE;
2507 else if (*keys == Mfamily)
2508 prop = MFONT_FAMILY;
2509 else if (*keys == Mweight)
2510 prop = MFONT_WEIGHT;
2511 else if (*keys == Mstyle)
2513 else if (*keys == Mstretch)
2514 prop = MFONT_STRETCH;
2515 else if (*keys == Mfoundry)
2516 prop = MFONT_FOUNDRY;
2518 /* Invalid element. */
2520 for (j = 0; j < i; j++)
2521 if (priority[j] == prop)
2522 /* Duplicated element. */
2526 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2527 font_score_priority[i] = priority[i];
2528 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
2529 of a score is a flag for a scalable font (see the documentation
2531 i = FONT_SCORE_PRIORITY_SIZE - 1;
2532 for (shift = 1; i >= 0; i--)
2534 font_score_shift_bits[font_score_priority[i]] = shift;
2535 if (font_score_priority[i] == MFONT_SIZE)
2537 else if (font_score_priority[i] <= MFONT_FAMILY)
2550 The mfont_find () function returns a pointer to the available font
2551 that matches best the specification $SPEC on frame $FRAME.
2553 $SCORE, if not NULL, must point to a place to store the score
2554 value that indicates how well the found font matches to $SPEC. The
2555 smaller score means a better match. */
2557 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
2559 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC
2560 ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
2562 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC
2563 ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
2564 ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
2568 mfont_find (MFrame *frame, MFont *spec, int *score, int max_size)
2573 MRealizedFont *rfont;
2578 double pt = - spec->size;
2581 adjusted.size = pt * frame->dpi / 72.27 + 0.5;
2584 MFONT_INIT (&spec_copy);
2585 spec_copy.property[MFONT_FAMILY] = spec->property[MFONT_FAMILY];
2586 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
2587 spec_copy.capability = spec->capability;
2588 spec_copy.file = spec->file;
2590 list = mfont__list (frame, &spec_copy, spec, max_size);
2594 best = list->fonts[0].font;
2596 *score = list->fonts[0].score;
2600 mfont__merge (&spec_copy, spec, 0);
2601 rfont = mfont__open (frame, best, spec);
2604 return (MFont *) rfont;
2609 @brief Set encoding of a font.
2611 The mfont_set_encoding () function sets the encoding information
2614 $ENCODING_NAME is a symbol representing a charset that has the
2615 same encoding as the font.
2617 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
2618 has the same repertory as the font. If it is @c Mnil, whether a
2619 specific character is supported by the font is asked to each font
2623 If the operation was successful, this function returns 0.
2624 Otherwise it returns -1 and assigns an error code to the external
2625 variable #merror_code. */
2627 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
2629 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£
2631 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2633 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2634 @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£
2637 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
2638 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2642 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
2644 MCharset *encoding_charset = MCHARSET (encoding_name);
2645 MCharset *repertory_charset;
2647 MFontEncoding *encoding;
2650 if (! encoding_charset)
2651 MERROR (MERROR_FONT, -1);
2652 if (repertory_name != Mnil)
2654 repertory_charset = MCHARSET (repertory_name);
2655 if (! repertory_charset)
2656 MERROR (MERROR_FONT, -1);
2659 repertory_charset = NULL;
2661 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2662 encoding->spec = *font;
2663 encoding->encoding_name = encoding_name;
2664 encoding->encoding_charset = encoding_charset;
2665 encoding->repertory_name = repertory_name;
2666 encoding->repertory_charset = repertory_charset;
2667 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2668 if (registry == Mnil)
2670 if (! font_encoding_list)
2671 load_font_encoding_table ();
2672 mplist_push (font_encoding_list, registry, encoding);
2673 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2674 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2686 @brief Create a fontname from a font.
2688 This function is obsolete. Use mfont_unparse_name instead. */
2690 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2692 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2695 mfont_name (MFont *font)
2697 return mfont_unparse_name (font, Mx);
2703 @brief Create a new font from fontname.
2705 This function is obsolete. Use mfont_parse_name () instead. */
2708 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2710 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2713 mfont_from_name (const char *name)
2715 return mfont_parse_name (name, Mx);
2721 @brief Get resize information of a font.
2723 The mfont_resize_ratio () function lookups the m17n database
2724 \<font, reisize\> and returns a resizing ratio (in percentage) of
2725 FONT. For instance, if the return value is 150, that means that
2726 the m17n library uses an 1.5 time bigger font than a specified
2730 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2732 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\>
2733 ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë
2734 ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5
2735 ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2738 mfont_resize_ratio (MFont *font)
2740 MFont request = *font;
2742 mfont__resize (font, &request);
2743 return (font->size * 100 / request.size);
2749 @brief Get a list of fonts.
2751 The mfont_list () functions returns a list of fonts available on
2752 frame $FRAME. $FONT, if not NULL, limits fonts to ones
2753 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2754 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2755 the number of fonts.
2758 This function returns a plist whose keys are family names and
2759 values are pointers to the object MFont. The plist must be freed
2760 by m17n_object_unref (). If no font is found, it returns
2764 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2766 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
2767 $FONT ¤¬ NULL ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
2768 $LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
2769 $MAXNUM ¤Ï¡¢0 ¤è¤êÂ礤¤¾ì¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2772 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Ê
2773 plist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref ()
2774 ¤Ç²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */
2777 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2780 MFontList *font_list;
2791 double pt = - spec.size;
2793 spec.size = pt * frame->dpi / 72.27 + 0.5;
2796 if (language != Mnil)
2799 char *buf = alloca (MSYMBOL_NAMELEN (language) + 7);
2801 sprintf (buf, ":lang=%s", MSYMBOL_NAME (language));
2802 spec.capability = msymbol (buf);
2805 font_list = mfont__list (frame, &spec, &spec, 0);
2808 if (font_list->nfonts == 0)
2814 plist = pl = mplist ();
2815 for (i = 0; i < font_list->nfonts; i++)
2817 MSymbol family = FONT_PROPERTY (font_list->fonts[i].font, MFONT_FAMILY);
2820 pl = mplist_add (pl, family, font_list->fonts[i].font);
2830 @brief Check the usability of a font.
2832 The function mfont_check () checkes if $FONT can be used for
2833 $SCRIPT and RLANGUAGE in $FONTSET on $FRAME.
2835 @return If the font is usable, return 1. Otherwise return 0.
2839 mfont_check (MFrame *frame, MFontset *fontset, MFont *font,
2840 MSymbol script, MSymbol language)
2848 fontset = frame->face->property[MFACE_FONTSET];
2850 plist = mfontset_lookup (fontset, script, Mt, Mnil);
2853 if (language == Mnil)
2855 if (! mplist_find_by_key (plist, Mt))
2856 /* No fallback fonts. */
2857 language = MPLIST_KEY (plist);
2859 else if (! mplist_find_by_key (plist, language))
2861 /* Try fallback fonts. */
2862 if (mplist_find_by_key (plist, Mt))
2865 /* No fallback fonts. */
2866 language = MPLIST_KEY (plist);
2869 M17N_OBJECT_UNREF (plist);
2870 plist = mfontset_lookup (fontset, script, language, Mnil);
2872 orig_size = font->size;
2875 double pt = - orig_size;
2877 font->size = pt * frame->dpi / 72.27 + 0.5;
2879 MPLIST_DO (pl, plist)
2881 spec = *(MFont *) MPLIST_VAL (pl);
2882 if (mfont__merge (&spec, font, 1) >= 0
2883 && mfont__select (frame, &spec, 0))
2889 font->size = orig_size;
2890 M17N_OBJECT_UNREF (plist);
2896 /*** @addtogroup m17nDebug */
2903 The mdebug_dump_font () function prints font $FONT in a human readable
2907 This function returns $FONT. */
2909 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
2911 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr
2912 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£
2915 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
2918 mdebug_dump_font (MFont *font)
2922 name = xlfd_unparse_name (font, 0);
2925 fprintf (stderr, "%s", name);
2928 if (font->file != Mnil)
2930 char *file = MSYMBOL_NAME (font->file);
2931 char *lastslash = file, *p;
2933 for (p = file; *p; p++)
2937 fprintf (stderr, ",");
2938 fprintf (stderr, "%s", lastslash + 1);
2940 if (font->capability != Mnil)
2941 fprintf (stderr, "%s", MSYMBOL_NAME (font->capability));