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., 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 "language.h"
340 #include "internal-gui.h"
345 MPlist *mfont__driver_list;
347 static MSymbol M_font_capability, M_font_list, M_font_list_len;
349 /** Indices to font properties sorted by their priority. */
350 static int font_score_priority[] =
360 #define FONT_SCORE_PRIORITY_SIZE \
361 (sizeof font_score_priority / sizeof font_score_priority[0])
363 /* Indexed by a font property MFONT_XXX, and the value is how many
364 bits to shift the difference of property values. */
365 static int font_score_shift_bits[MFONT_SIZE + 1];
367 /** Predefined symbols for each font property. The order is important
368 because the function font_score () decides how well a font matches
369 with a spec by checking how close the index is. */
371 static char *common_foundry[] =
374 static char *common_family[] =
379 static char *common_weight[] =
396 static char *common_style[] =
404 static char *common_stretch[] =
415 static char *common_adstyle[] =
419 static char *common_registry[] =
422 static unsigned short font_weight_regular;
423 static unsigned short font_weight_normal;
424 static unsigned short font_weight_medium;
426 /* Table containing all the data above. */
428 struct MFontCommonNames
434 static struct MFontCommonNames font_common_names[] =
436 { sizeof (common_foundry) / sizeof (char *), common_foundry},
437 { sizeof (common_family) / sizeof (char *), common_family},
438 { sizeof (common_weight) / sizeof (char *), common_weight},
439 { sizeof (common_style) / sizeof (char *), common_style},
440 { sizeof (common_stretch) / sizeof (char *), common_stretch},
441 { sizeof (common_adstyle) / sizeof (char *), common_adstyle},
442 { sizeof (common_registry) / sizeof (char *), common_registry}
446 /** Table of available font property names. */
448 MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
451 /** Return the numeric value of SYMBOL as the Nth font property. */
453 #define FONT_PROPERTY_NUMERIC(symbol, n) \
456 : ((int) msymbol_get ((symbol), mfont__property_table[(n)].property)))
459 /** Set the numeric value of SYMBOL as the Nth font property to NUMERIC. */
461 #define SET_FONT_PROPERTY_NUMERIC(symbol, n, numeric) \
462 msymbol_put((symbol), mfont__property_table[(n)].property, \
468 struct MFontEncoding {
470 MSymbol encoding_name;
471 MCharset *encoding_charset;
472 MSymbol repertory_name;
473 MCharset *repertory_charset;
476 static MPlist *font_encoding_list;
477 static MFontEncoding default_encoding;
479 /** Load font encoding table from the data <font encoding>.
480 The data has this form:
481 (FONT-SPEC ENCODING) ...
482 where FONT-SPEC has this form:
483 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
484 All elements are symbols. */
487 load_font_encoding_table ()
490 MPlist *encoding_list, *plist, *pl, *elt;
492 font_encoding_list = pl = mplist ();
494 mdb = mdatabase_find (Mfont, msymbol ("encoding"), Mnil, Mnil);
496 || ! (encoding_list = (MPlist *) mdatabase_load (mdb)))
497 MERROR (MERROR_FONT, -1);
499 MPLIST_DO (plist, encoding_list)
501 MFontEncoding *encoding;
504 MSTRUCT_CALLOC (encoding, MERROR_FONT);
506 if (! MPLIST_PLIST_P (plist)
507 || (elt = MPLIST_PLIST (plist), mplist_length (elt) < 2)
508 || ! MPLIST_PLIST_P (elt))
509 MWARNING (MERROR_FONT);
510 registry = mfont__set_spec_from_plist (&encoding->spec,
512 elt = MPLIST_NEXT (elt);
513 if (! MPLIST_SYMBOL_P (elt))
514 MWARNING (MERROR_FONT);
515 encoding->encoding_name = MPLIST_SYMBOL (elt);
516 elt = MPLIST_NEXT (elt);
517 if (MPLIST_TAIL_P (elt))
518 encoding->repertory_name = encoding->encoding_name;
519 else if (! MPLIST_SYMBOL_P (elt))
520 MWARNING (MERROR_FONT);
522 encoding->repertory_name = MPLIST_SYMBOL (elt);
524 if (registry == Mnil)
525 mplist_push (font_encoding_list, Mt, encoding);
527 pl = mplist_add (pl, registry, encoding);
534 M17N_OBJECT_UNREF (encoding_list);
543 static MPlist *font_resize_list;
545 /** Load font size table from the data <font size>.
546 The data has this form:
547 (FONT-SPEC RESIZE-FACTOR) ...
548 where FONT-SPEC has this form:
549 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
550 All elements of FONT-SPEC are symbols. */
553 load_font_resize_table ()
556 MPlist *size_adjust_list, *plist, *pl, *elt;
558 font_resize_list = pl = mplist ();
560 mdb = mdatabase_find (Mfont, msymbol ("resize"), Mnil, Mnil);
563 if (! (size_adjust_list = (MPlist *) mdatabase_load (mdb)))
564 MERROR (MERROR_FONT, -1);
566 MPLIST_DO (plist, size_adjust_list)
571 MSTRUCT_CALLOC (resize, MERROR_FONT);
573 if (! MPLIST_PLIST_P (plist)
574 || (elt = MPLIST_PLIST (plist), mplist_length (elt) != 2)
575 || ! MPLIST_PLIST_P (elt))
576 MWARNING (MERROR_FONT);
577 registry = mfont__set_spec_from_plist (&resize->spec,
579 elt = MPLIST_NEXT (elt);
580 if (! MPLIST_INTEGER_P (elt))
581 MWARNING (MERROR_FONT);
582 resize->resize = MPLIST_INTEGER (elt);
584 if (registry == Mnil)
586 pl = mplist_add (pl, registry, resize);
593 M17N_OBJECT_UNREF (size_adjust_list);
597 /** Return a font encoding (and repertory) of FONT. */
599 static MFontEncoding *
600 find_encoding (MFont *font)
602 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
603 MFontEncoding *encoding = NULL;
606 if (! font_encoding_list)
607 load_font_encoding_table ();
608 plist = font_encoding_list;
609 while (! MPLIST_TAIL_P (plist))
611 encoding = (MFontEncoding *) MPLIST_VAL (plist);
612 if (mfont__match_p (font, &encoding->spec, MFONT_REGISTRY))
614 if (encoding->encoding_name != Mnil
615 && ! encoding->encoding_charset)
617 encoding->encoding_charset = MCHARSET (encoding->encoding_name);
618 if (! encoding->encoding_charset)
624 if (encoding->repertory_name == encoding->encoding_name)
625 encoding->repertory_charset = encoding->encoding_charset;
626 else if (encoding->repertory_name != Mnil)
628 encoding->repertory_charset
629 = MCHARSET (encoding->repertory_name);
630 if (! encoding->repertory_charset)
636 font->encoding = encoding;
640 if (registry && MPLIST_KEY (plist) != Mt)
642 plist = mplist_find_by_key (plist, registry);
647 plist = MPLIST_NEXT (plist);
649 font->encoding = &default_encoding;
650 return &default_encoding;
657 unsigned char *p = (unsigned char *) name;
661 return (OTF_Tag) ((p[0] << 24)
665 : (p[2] << 8) | p[3]))));
669 OTF_tag_name (OTF_Tag tag, char *name)
671 name[0] = (char) (tag >> 24);
672 name[1] = (char) ((tag >> 16) & 0xFF);
673 name[2] = (char) ((tag >> 8) & 0xFF);
674 name[3] = (char) (tag & 0xFF);
677 #endif /* not HAVE_OTF */
679 /* XLFD parser/generator */
681 /** Indices to each field of split font name. */
697 XLFD_REGISTRY, /* This contains ENCODING. */
703 xlfd_parse_name (const char *name, MFont *font)
705 char *field[XLFD_FIELD_MAX];
706 unsigned short resy, avgwidth;
717 for (i = 1, p = copy, name++; *name; p++, name++)
722 && i < XLFD_FIELD_MAX)
725 if (field[i - 1][0] == '*')
730 *p = tolower (*name);
733 if (field[i - 1][0] == '*')
735 while (i < XLFD_FIELD_MAX)
738 resy = field[XLFD_RESY] ? atoi (field[XLFD_RESY]) : 0;
739 avgwidth = ((field[XLFD_AVGWIDTH] && isdigit (field[XLFD_AVGWIDTH][0]))
740 ? atoi (field[XLFD_AVGWIDTH]) : 1);
743 else if (! field[XLFD_PIXEL])
744 size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0;
745 else if (field[XLFD_PIXEL][0] == '[')
747 /* The pixel size field specifies a transformation matrix of the
748 form "[A B C D]". The XLFD spec says that the scalar value N
749 for the pixel size is equivalent to D. */
750 char *p0 = field[XLFD_PIXEL] + 1, *p1;
753 for (i = 0; i < 4; i++, p0 = p1)
754 d = strtod (p0, &p1);
758 size = atoi (field[XLFD_PIXEL]) * 10;
760 if (field[XLFD_FOUNDRY])
762 sym = msymbol (field[XLFD_FOUNDRY]);
764 sym = msymbol ("Nil");
765 mfont__set_property (font, MFONT_FOUNDRY, sym);
767 if (field[XLFD_FAMILY])
769 sym = msymbol (field[XLFD_FAMILY]);
771 sym = msymbol ("Nil");
772 mfont__set_property (font, MFONT_FAMILY, sym);
774 if (field[XLFD_WEIGHT])
775 mfont__set_property (font, MFONT_WEIGHT, msymbol (field[XLFD_WEIGHT]));
776 if (field[XLFD_SLANT])
777 mfont__set_property (font, MFONT_STYLE, msymbol (field[XLFD_SLANT]));
778 if (field[XLFD_SWIDTH])
779 mfont__set_property (font, MFONT_STRETCH, msymbol (field[XLFD_SWIDTH]));
780 if (field[XLFD_ADSTYLE])
781 mfont__set_property (font, MFONT_ADSTYLE, msymbol (field[XLFD_ADSTYLE]));
782 font->property[MFONT_RESY] = resy;
784 if (field[XLFD_SPACING])
786 = ((field[XLFD_SPACING][0] == 'p' || field[XLFD_SPACING][0] == 'P')
787 ? MFONT_SPACING_PROPORTIONAL
788 : (field[XLFD_SPACING][0] == 'm' || field[XLFD_SPACING][0] == 'M')
789 ? MFONT_SPACING_MONO : MFONT_SPACING_CHARCELL);
790 if (field[XLFD_REGISTRY])
791 mfont__set_property (font, MFONT_REGISTRY, msymbol (field[XLFD_REGISTRY]));
792 font->type = MFONT_TYPE_SPEC;
793 font->source = MFONT_SOURCE_X;
798 xlfd_unparse_name (MFont *font, int full_xlfd)
808 prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry);
809 prop[1] = (MSymbol) mfont_get_prop (font, Mfamily);
810 prop[2] = (MSymbol) mfont_get_prop (font, Mweight);
811 prop[3] = (MSymbol) mfont_get_prop (font, Mstyle);
812 prop[4] = (MSymbol) mfont_get_prop (font, Mstretch);
813 prop[5] = (MSymbol) mfont_get_prop (font, Madstyle);
814 prop[6] = (MSymbol) mfont_get_prop (font, Mregistry);
815 for (len = 0, i = 0; i < 7; i++)
819 str[i] = msymbol_name (prop[i]);
820 len += strlen (str[i]);
829 spacing = (font->spacing == MFONT_SPACING_UNDECIDED ? '*'
830 : font->spacing == MFONT_SPACING_PROPORTIONAL ? 'p'
831 : font->spacing == MFONT_SPACING_MONO ? 'm'
836 + 2 /* 2 asterisks */
837 + 30 /* 3 integers (each 10 digits) */
838 + 1 /* 1 spacing char */
839 + 1) /* '\0' terminal */
843 resy = (int) mfont_get_prop (font, Mresolution);
850 size = size / 10 + 1;
858 sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-%c-*-%s",
859 str[0], str[1], str[2], str[3], str[4], str[5],
860 size, resy, resy, spacing, str[6]);
862 sprintf (name, "-%s-%s-%s-%s-%s-%s-*-%d-%d-%d-%c-*-%s",
863 str[0], str[1], str[2], str[3], str[4], str[5],
864 size, resy, resy, spacing, str[6]);
866 else if (all_nil && size == 0)
872 p += sprintf (p, "-%s", str[0]);
873 for (i = 1; i < 6; i++)
874 if (p[-1] != '*' || str[i][0] != '*')
875 p += sprintf (p, "-%s", str[i]);
876 if (p[-1] != '*' || font->size > 0)
879 p += sprintf (p, "-%d-*", size);
881 p += sprintf (p, "-*");
883 if (str[6][0] != '*')
884 sprintf (p, "-%s", str[6]);
887 return strdup (name);
890 /* Compare FONT with REQUEST and return how much they differs. */
893 font_score (MFont *font, MFont *request)
896 int i = FONT_SCORE_PRIORITY_SIZE;
900 enum MFontProperty prop = font_score_priority[i];
903 if (prop == MFONT_SIZE)
905 if (font->size && request->size)
907 val = font->size - request->size;
914 score |= (val << font_score_shift_bits[MFONT_SIZE]);
918 else if (font->property[prop] && request->property[prop]
919 && font->property[prop] != request->property[prop])
921 if (prop <= MFONT_FAMILY)
923 else if (prop == MFONT_WEIGHT)
925 unsigned short v1 = font->property[prop];
926 unsigned short v2 = request->property[prop];
928 if (v1 == font_weight_regular || v1 == font_weight_normal)
929 v1 = font_weight_medium;
930 if (v2 == font_weight_regular || v2 == font_weight_normal)
931 v2 = font_weight_medium;
932 val = v1 > v2 ? v1 - v2 : v2 - v1;
936 val = font->property[prop] - request->property[prop];
942 score |= val << font_score_shift_bits[prop];
945 if (request->file != Mnil && request->file != font->file)
951 merge_capability (MSymbol capability, MSymbol key, MSymbol val, int overwrite)
953 MFontCapability *cap = NULL;
954 char *lang = NULL, *script = NULL, *otf = NULL, *buf, *p;
955 int lang_len = 0, script_len = 0, otf_len = 0;
957 if (key == Mlanguage)
958 lang = MSYMBOL_NAME (val), lang_len = MSYMBOL_NAMELEN (val) + 6;
959 else if (key == Mscript)
960 script = MSYMBOL_NAME (val), script_len = MSYMBOL_NAMELEN (val) + 7;
961 else if (key == Motf)
962 otf = MSYMBOL_NAME (val), otf_len = MSYMBOL_NAMELEN (val) + 5;
966 if (capability != Mnil)
968 cap = mfont__get_capability (capability);
977 if (! lang && !script && !otf)
982 if (! lang && cap && cap->language)
984 lang_len = MSYMBOL_NAMELEN (cap->language);
985 lang = MSYMBOL_NAME (cap->language);
987 if (! script && cap && cap->script != Mnil)
989 script_len = MSYMBOL_NAMELEN (cap->script);
990 script = MSYMBOL_NAME (cap->script);
992 if (! otf && cap && cap->script_tag)
996 otf_len = 4; /* for script_tag */
997 if (cap->langsys_tag)
998 otf_len += 5; /* for "/XXXX */
999 for (i = 0; i < MFONT_OTT_MAX; i++)
1000 if (cap->features[i].str)
1001 otf_len += strlen (cap->features[i].str) + 1; /* for "[=+]..." */
1002 otf = p = alloca (otf_len + 1);
1003 OTF_tag_name (cap->script_tag, otf);
1005 if (cap->langsys_tag)
1008 OTF_tag_name (cap->langsys_tag, p);
1011 if (cap->features[MFONT_OTT_GSUB].str)
1012 p += sprintf (p, "=%s", cap->features[MFONT_OTT_GSUB].str);
1013 if (cap->features[MFONT_OTT_GPOS].str)
1014 p += sprintf (p, "=%s", cap->features[MFONT_OTT_GSUB].str);
1016 buf = p = alloca (lang_len + script_len + otf_len + 1);
1018 p += sprintf (p, ":lang=%s", lang);
1020 p += sprintf (p, ":script=%s", script);
1022 p += sprintf (p, ":otf=%s", otf);
1023 return msymbol (buf);
1029 MSymbol Miso8859_1, Miso10646_1, Municode_bmp, Municode_full, Mapple_roman;
1035 MSymbol regular = msymbol ("regular");
1036 MSymbol normal = msymbol ("normal");
1037 MSymbol medium = msymbol ("medium");
1039 M_font_capability = msymbol_as_managing_key (" font-capability");
1040 M_font_list = msymbol_as_managing_key (" font-list");
1041 M_font_list_len = msymbol (" font-list-len");
1043 Mfoundry = msymbol ("foundry");
1044 mfont__property_table[MFONT_FOUNDRY].property = Mfoundry;
1045 Mfamily = msymbol ("family");
1046 mfont__property_table[MFONT_FAMILY].property = Mfamily;
1047 Mweight = msymbol ("weight");
1048 mfont__property_table[MFONT_WEIGHT].property = Mweight;
1049 Mstyle = msymbol ("style");
1050 mfont__property_table[MFONT_STYLE].property = Mstyle;
1051 Mstretch = msymbol ("stretch");
1052 mfont__property_table[MFONT_STRETCH].property = Mstretch;
1053 Madstyle = msymbol ("adstyle");
1054 mfont__property_table[MFONT_ADSTYLE].property = Madstyle;
1055 Mregistry = msymbol ("registry");
1056 mfont__property_table[MFONT_REGISTRY].property = Mregistry;
1058 Mspacing = msymbol ("spacing");
1059 Msize = msymbol ("size");
1060 Mresolution = msymbol ("resolution");
1061 Mmax_advance = msymbol ("max-advance");
1062 Mfontfile = msymbol ("fontfile");
1064 Mfontconfig = msymbol ("fontconfig");
1067 Mfreetype = msymbol ("freetype");
1068 Mxft = msymbol ("xft");
1070 Miso8859_1 = msymbol ("iso8859-1");
1071 Miso10646_1 = msymbol ("iso10646-1");
1072 Municode_bmp = msymbol ("unicode-bmp");
1073 Municode_full = msymbol ("unicode-full");
1074 Mapple_roman = msymbol ("apple-roman");
1076 Motf = msymbol ("otf");
1078 /* The first entry of each mfont__property_table must be Mnil so
1079 that actual properties get positive numeric numbers. */
1080 for (i = 0; i <= MFONT_REGISTRY; i++)
1082 MLIST_INIT1 (&mfont__property_table[i], names, 8);
1083 MLIST_APPEND1 (&mfont__property_table[i], names, Mnil, MERROR_FONT);
1086 /* Register predefined font property names. */
1087 for (i = 0; i <= MFONT_REGISTRY; i++)
1091 for (j = 0; j < font_common_names[i].num; j++)
1093 MSymbol sym = msymbol (font_common_names[i].names[j]);
1097 if (msymbol_put (sym, mfont__property_table[i].property,
1098 (void *) (j + 1)) < 0)
1100 MLIST_APPEND1 (&mfont__property_table[i], names, sym,
1102 if (i == MFONT_WEIGHT)
1105 font_weight_regular = j + 1;
1106 else if (sym == normal)
1107 font_weight_normal = j + 1;
1108 else if (sym == medium)
1109 font_weight_medium = j + 1;
1114 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
1115 of a score is a flag for a scalable font (see the documentation
1117 i = FONT_SCORE_PRIORITY_SIZE - 1;
1118 for (shift = 1; i >= 0; i--)
1120 font_score_shift_bits[font_score_priority[i]] = shift;
1121 if (font_score_priority[i] == MFONT_SIZE)
1123 else if (font_score_priority[i] <= MFONT_FAMILY)
1129 MFONT_INIT (&default_encoding.spec);
1130 default_encoding.encoding_name = Municode_full;
1131 default_encoding.encoding_charset = mcharset__unicode;
1132 default_encoding.repertory_name = Mnil;
1133 default_encoding.repertory_charset = NULL;
1139 mfont_freetype_path = mplist ();
1140 bufsize = strlen (M17NDIR) + 7;
1141 SAFE_ALLOCA (buf, bufsize);
1142 sprintf (buf, "%s/fonts", M17NDIR);
1143 mplist_add (mfont_freetype_path, Mstring, strdup (buf));
1144 path = getenv ("M17NDIR");
1147 bufsize = strlen (path) + 7;
1148 SAFE_ALLOCA (buf, bufsize);
1149 sprintf (buf, "%s/fonts", path);
1150 mplist_push (mfont_freetype_path, Mstring, strdup (buf));
1155 #ifdef HAVE_FREETYPE
1156 if (mfont__ft_init () < 0)
1158 #endif /* HAVE_FREETYPE */
1159 if (mfont__flt_init () < 0)
1172 #ifdef HAVE_FREETYPE
1174 #endif /* HAVE_FREETYPE */
1176 MPLIST_DO (plist, mfont_freetype_path)
1177 free (MPLIST_VAL (plist));
1178 M17N_OBJECT_UNREF (mfont_freetype_path);
1180 if (font_resize_list)
1182 MPLIST_DO (plist, font_resize_list)
1183 free (MPLIST_VAL (plist));
1184 M17N_OBJECT_UNREF (font_resize_list);
1185 font_resize_list = NULL;
1187 if (font_encoding_list)
1189 MPLIST_DO (plist, font_encoding_list)
1190 free (MPLIST_VAL (plist));
1191 M17N_OBJECT_UNREF (font_encoding_list);
1192 font_encoding_list = NULL;
1195 for (i = 0; i <= MFONT_REGISTRY; i++)
1196 MLIST_FREE1 (&mfont__property_table[i], names);
1201 mfont__id (MFont *font)
1205 int file_len = (font->file == Mnil ? 0 : MSYMBOL_NAMELEN (font->file));
1206 int capability_len = (font->capability == Mnil ? 0
1207 : MSYMBOL_NAMELEN (font->capability));
1208 int total_len = MFONT_PROPERTY_MAX * 5 + 9 + file_len + capability_len;
1212 SAFE_ALLOCA (buf, total_len);
1214 if (font->property[0])
1215 p += sprintf (p, "%X", font->property[0]);
1216 for (i = 1; i < MFONT_PROPERTY_MAX; i++)
1218 if (font->property[i])
1219 p += sprintf (p, "-%X", font->property[i]);
1224 p += sprintf (p, "-%X", font->size);
1226 p += sprintf (p, "-%X", font->spacing);
1227 if (capability_len > 0)
1230 memcpy (p, MSYMBOL_NAME (font->capability), capability_len);
1231 p += capability_len;
1236 memcpy (p, MSYMBOL_NAME (font->file), file_len);
1239 id = msymbol__with_len (buf, p - buf);
1244 /** Return 1 iff FONT matches SPEC. */
1247 mfont__match_p (MFont *font, MFont *spec, int prop)
1249 if (spec->capability != font->capability
1250 && spec->capability != Mnil)
1252 MRealizedFont *rfont;
1254 if (font->type != MFONT_TYPE_REALIZED)
1255 return (font->capability == Mnil);
1256 rfont = (MRealizedFont *) font;
1257 return (rfont->driver->check_capability
1258 && (rfont->driver->check_capability (rfont, spec->capability)
1261 if (spec->file != font->file
1262 && spec->file != Mnil && font->file != Mnil)
1264 for (; prop >= 0; prop--)
1265 if (spec->property[prop] && font->property[prop]
1266 && font->property[prop] != spec->property[prop])
1271 /* Merge SRC into DST. If error_on_conflict is nonzero and a font
1272 property differs in SRC and DST, return -1. */
1275 mfont__merge (MFont *dst, MFont *src, int error_on_conflict)
1279 for (i = 0; i < MFONT_PROPERTY_MAX; i++)
1281 if (! dst->property[i])
1282 dst->property[i] = src->property[i];
1283 else if (error_on_conflict
1285 && dst->property[i] != src->property[i])
1289 dst->spacing = src->spacing;
1290 else if (error_on_conflict
1292 && dst->spacing != src->spacing)
1295 dst->size = src->size;
1296 else if (error_on_conflict
1298 && dst->size != src->size)
1300 if (dst->capability == Mnil)
1301 dst->capability = src->capability;
1302 else if (error_on_conflict
1304 && dst->capability != src->capability)
1306 if (dst->file == Mnil)
1307 dst->file = src->file;
1308 else if (error_on_conflict
1310 && dst->file != src->file)
1316 mfont__set_spec_from_face (MFont *spec, MFace *face)
1320 for (i = 0; i <= MFONT_ADSTYLE; i++)
1321 mfont__set_property (spec, i, face->property[i]);
1322 spec->property[MFONT_REGISTRY] = 0;
1323 spec->property[MFONT_RESY] = 0;
1324 spec->size = (int) (face->property[MFACE_SIZE]);
1325 spec->type = MFONT_TYPE_SPEC;
1326 spec->source = MFONT_SOURCE_UNDECIDED;
1327 spec->file = spec->capability = Mnil;
1328 spec->encoding = NULL;
1333 mfont__set_spec_from_plist (MFont *spec, MPlist *plist)
1336 MSymbol spec_list[MFONT_REGISTRY + 1];
1341 memset (spec_list, 0, sizeof spec_list);
1342 for (i = 0; ! MPLIST_TAIL_P (plist); i++, plist = MPLIST_NEXT (plist))
1344 if (! MPLIST_SYMBOL_P (plist))
1345 MERROR (MERROR_FONT, Mnil);
1346 spec_list[i] = MPLIST_SYMBOL (plist);
1348 registry = spec_list[i - 1];
1349 if (i > 1 && registry != Mnil)
1351 reg = MSYMBOL_NAME (registry);
1354 mfont__get_capability (registry);
1355 spec->capability = registry;
1356 registry = spec_list[i - 2];
1360 mfont__set_property (spec, MFONT_REGISTRY, registry);
1361 for (i -= 2; i >= 0; i--)
1362 mfont__set_property (spec, i, spec_list[i]);
1363 spec->type = MFONT_TYPE_SPEC;
1370 mfont__select (MFrame *frame, MFont *font, int max_size)
1372 MFontDriver *driver;
1374 if (font->type == MFONT_TYPE_FAILURE)
1376 if (font->type != MFONT_TYPE_SPEC)
1378 if (font->source == MFONT_SOURCE_UNDECIDED)
1380 if (font->file != Mnil || font->capability != Mnil)
1381 font->source = MFONT_SOURCE_FT;
1382 else if (font->property[MFONT_REGISTRY])
1384 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
1385 char *reg = MSYMBOL_NAME (registry);
1387 if (strncmp (reg, "unicode-", 8) == 0
1388 || strncmp (reg, "apple-roman", 11) == 0
1389 || (reg[0] >= '0' && reg[0] <= '9' && reg[1] == '-'))
1390 font->source = MFONT_SOURCE_FT;
1393 if (font->source != MFONT_SOURCE_FT)
1395 driver = mplist_get (frame->font_driver_list, Mx);
1397 return (driver->select) (frame, font, max_size);
1399 driver = mplist_get (frame->font_driver_list, Mfreetype);
1402 return (driver->select) (frame, font, max_size);
1407 mfont__available (MFrame *frame, MFont *font)
1413 compare_font_score (const void *e1, const void *e2)
1415 MFontScore *s1 = (MFontScore *) e1, *s2 = (MFontScore *) e2;
1417 return (s1->font->for_full_width == s2->font->for_full_width
1418 ? s1->score > s2->score
1419 : s1->font->for_full_width);
1423 mdebug_dump_font_list (MFontList *font_list)
1427 for (i = 0; i < font_list->nfonts; i++)
1429 fprintf (stderr, "%04X - ", font_list->fonts[i].score);
1430 mdebug_dump_font (font_list->fonts[i].font);
1431 fprintf (stderr, "\n");
1436 mfont__free_realized (MRealizedFont *rfont)
1438 MRealizedFont *next;
1440 for (; rfont; rfont = next)
1443 M17N_OBJECT_UNREF (rfont->info);
1450 mfont__list (MFrame *frame, MFont *spec, MFont *request, int max_size)
1453 MSymbol id = mfont__id (spec);
1457 pl = msymbol_get (id, M_font_list);
1459 num = (int) msymbol_get (id, M_font_list_len);
1464 MPLIST_DO (p, frame->font_driver_list)
1466 if (spec->source == MFONT_SOURCE_X ? MPLIST_KEY (p) == Mx
1467 : spec->source == MFONT_SOURCE_FT ? MPLIST_KEY (p) == Mfreetype
1470 MFontDriver *driver = MPLIST_VAL (p);
1471 num += (driver->list) (frame, pl, spec, 0);
1474 msymbol_put (id, M_font_list, pl);
1475 M17N_OBJECT_UNREF (pl);
1476 msymbol_put (id, M_font_list_len, (void *) num);
1482 MSTRUCT_MALLOC (list, MERROR_FONT);
1483 MTABLE_MALLOC (list->fonts, num, MERROR_FONT);
1484 for (i = 0; num > 0; num--, pl = MPLIST_NEXT (pl))
1486 MFont *font = MPLIST_VAL (pl), *adjusted = font;
1490 || font->size < max_size)
1492 list->fonts[i].font = font;
1493 if (spec == request)
1494 list->fonts[i].score = 0;
1501 && (resize_ratio = mfont_resize_ratio (font)) != 100)
1504 resized.size = font->size * 100 / resize_ratio;
1505 adjusted = &resized;
1507 list->fonts[i].score = font_score (adjusted, request);
1519 if (spec != request)
1520 qsort (list->fonts, i, sizeof (MFontScore), compare_font_score);
1521 list->object = *spec;
1522 mfont__merge (&list->object, request, 0);
1523 list->object.type = MFONT_TYPE_OBJECT;
1527 /** Open a font specified in FONT. */
1530 mfont__open (MFrame *frame, MFont *font, MFont *spec)
1532 MFontDriver *driver;
1533 MRealizedFont *rfont;
1535 if (font->source == MFONT_SOURCE_UNDECIDED)
1536 MFATAL (MERROR_FONT);
1537 if (font->type != MFONT_TYPE_OBJECT)
1538 MFATAL (MERROR_FONT);
1539 for (rfont = MPLIST_VAL (frame->realized_font_list); rfont;
1540 rfont = rfont->next)
1542 driver = rfont->driver;
1543 if (rfont->font == font
1544 && mplist_find_by_value (frame->font_driver_list, driver))
1550 driver = mplist_get (frame->font_driver_list,
1551 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1553 MFATAL (MERROR_FONT);
1555 return (driver->open) (frame, font, spec, rfont);
1559 mfont__has_char (MFrame *frame, MFont *font, MFont *spec, int c)
1561 MFontEncoding *encoding;
1563 MFontDriver *driver;
1565 if (font->source == MFONT_SOURCE_UNDECIDED)
1566 MFATAL (MERROR_FONT);
1567 encoding = (font->encoding ? font->encoding : find_encoding (font));
1568 if (! encoding->encoding_charset)
1570 if (encoding->repertory_charset)
1572 code = ENCODE_CHAR (encoding->repertory_charset, c);
1573 return (code != MCHAR_INVALID_CODE);
1575 code = ENCODE_CHAR (encoding->encoding_charset, c);
1576 if (code == MCHAR_INVALID_CODE)
1578 if (font->type == MFONT_TYPE_REALIZED)
1579 driver = ((MRealizedFont *) font)->driver;
1582 driver = mplist_get (frame->font_driver_list,
1583 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1585 MFATAL (MERROR_FONT);
1587 return (driver->has_char) (frame, font, spec, c, code);
1591 mfont__encode_char (MFrame *frame, MFont *font, MFont *spec, int c)
1593 MFontEncoding *encoding;
1595 MFontDriver *driver;
1597 if (font->source == MFONT_SOURCE_UNDECIDED)
1598 MFATAL (MERROR_FONT);
1599 encoding = (font->encoding ? font->encoding : find_encoding (font));
1600 if (! encoding->encoding_charset)
1601 return MCHAR_INVALID_CODE;
1602 if (font->source == MFONT_SOURCE_X && encoding->repertory_charset)
1603 return (ENCODE_CHAR (encoding->repertory_charset, c));
1604 code = ENCODE_CHAR (encoding->encoding_charset, c);
1605 if (code == MCHAR_INVALID_CODE)
1606 return MCHAR_INVALID_CODE;
1607 if (font->type == MFONT_TYPE_REALIZED)
1608 driver = ((MRealizedFont *) font)->driver;
1611 driver = mplist_get (frame->font_driver_list,
1612 font->source == MFONT_SOURCE_X ? Mx : Mfreetype);
1614 MFATAL (MERROR_FONT);
1616 return (driver->encode_char) (frame, font, spec, code);
1620 mfont__get_metric (MGlyphString *gstring, int from, int to)
1622 MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
1623 MRealizedFont *rfont = from_g->rface->rfont;
1625 for (g = from_g; g != to_g; g++)
1626 if (g->rface->rfont != rfont)
1628 int idx = GLYPH_INDEX (g);
1630 (rfont->driver->find_metric) (rfont, gstring, from, idx);
1632 rfont = g->rface->rfont;
1635 (rfont->driver->find_metric) (rfont, gstring, from, GLYPH_INDEX (g));
1639 /* KEY <= MFONT_REGISTRY */
1642 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1650 numeric = FONT_PROPERTY_NUMERIC (val, key);
1653 numeric = mfont__property_table[key].used;
1654 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1655 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1658 font->property[key] = numeric;
1662 mfont__parse_name_into_font (const char *name, MSymbol format, MFont *font)
1666 if (format == Mx || format == Mnil)
1667 result = xlfd_parse_name (name, font);
1668 #ifdef HAVE_FONTCONFIG
1669 if (format == Mfontconfig || (result < 0 && format == Mnil))
1670 result = mfont__ft_parse_name (name, font);
1671 #endif /* HAVE_FONTCONFIG */
1676 mfont__encoding_list (void)
1678 if (! font_encoding_list)
1679 load_font_encoding_table ();
1680 return font_encoding_list;
1684 free_font_capability (void *object)
1686 MFontCapability *cap = object;
1688 if (cap->script_tag)
1691 for (i = 0; i < MFONT_OTT_MAX; i++)
1693 if (cap->features[i].str)
1694 free (cap->features[i].str);
1695 if (cap->features[i].tags)
1696 free (cap->features[i].tags);
1703 mfont__get_capability (MSymbol sym)
1705 MFontCapability *cap = msymbol_get (sym, M_font_capability);
1706 char *str, *p, *endp;
1710 str = MSYMBOL_NAME (sym);
1713 M17N_OBJECT (cap, free_font_capability, MERROR_FONT);
1714 msymbol_put (sym, M_font_capability, cap);
1715 M17N_OBJECT_UNREF (cap);
1716 endp = str + MSYMBOL_NAMELEN (sym);
1721 if (str[0] == 'o' && strncmp (str + 1, "tf=", 3) == 0)
1729 for (i = 0, p = str; i < 4 && p < endp; i++, p++);
1732 sym = msymbol__with_len (str, 4);
1733 cap->script = mscript__from_otf_tag (sym);
1734 if (cap->script == Mnil)
1736 cap->script_tag = OTF_tag (str);
1739 for (i = 0, str = ++p; i < 4 && p < endp; i++, p++);
1743 cap->script_tag = 0;
1746 cap->langsys_tag = OTF_tag (str);
1749 cap->langsys_tag = 0;
1751 for (i = 0; i < MFONT_OTT_MAX; i++)
1752 cap->features[i].nfeatures = -1;
1754 while (*p == '=' || *p == '+')
1756 int idx = *p == '=' ? MFONT_OTT_GSUB : MFONT_OTT_GPOS;
1759 while (p < endp && *p != '+') p++;
1763 /* We never have more than (p - str) tags. */
1764 OTF_Tag *tags = alloca (sizeof (OTF_Tag) * (p - str));
1767 cap->features[idx].str = malloc (p - str + 1);
1768 for (i = n = 0, p0 = str; str + i < p; i++)
1770 cap->features[idx].str[i] = str[i];
1771 if (str[i] == ',' || str + i + 1 == p)
1775 else if (*p0 == '~')
1776 tags[n] = OTF_tag (p0 + 1) | 0x80000000;
1778 tags[n] = OTF_tag (p0);
1783 cap->features[idx].str[i] = '\0';
1784 cap->features[idx].nfeatures = n;
1787 int size = sizeof (OTF_Tag) * n;
1789 cap->features[idx].tags = malloc (size);
1790 memcpy (cap->features[idx].tags, tags, size);
1795 cap->features[idx].str = NULL;
1796 cap->features[idx].nfeatures = 0;
1800 for (i = 0; i < MFONT_OTT_MAX; i++)
1801 if (cap->features[i].nfeatures < 0)
1803 cap->features[i].str = strdup ("*");
1804 cap->features[i].nfeatures = 1;
1805 cap->features[i].tags = malloc (sizeof (OTF_Tag));
1806 cap->features[i].tags[0] = 0;
1808 cap->otf = msymbol__with_len (beg, p - beg);
1811 else if (str[0] == 'l' && strncmp (str + 1, "ang=", 4) == 0)
1814 for (p = str; p < endp && *p != ':'; p++);
1816 cap->language = msymbol__with_len (str, p - str);
1819 else if (str[0] == 's' && strncmp (str + 1, "cript=", 6) == 0)
1822 for (p = str; p < endp && *p != ':'; p++);
1824 cap->script = msymbol__with_len (str, p - str);
1832 mfont__check_capability (MRealizedFont *rfont, MSymbol capability)
1834 return (rfont->driver->check_capability (rfont, capability));
1839 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1845 /*** @addtogroup m17nFont */
1849 /***en @name Variables: Keys of font property. */
1850 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1855 @brief Key of font property specifying foundry.
1857 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1858 is used as a key of font property and face property. The property
1859 value must be a symbol whose name is a foundry name of a font. */
1861 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1863 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt>
1864 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1865 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1870 @brief Key of font property specifying family.
1872 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1873 used as a key of font property and face property. The property
1874 value must be a symbol whose name is a family name of a font. */
1876 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1878 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt>
1879 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1880 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1885 @brief Key of font property specifying weight.
1887 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1888 used as a key of font property and face property. The property
1889 value must be a symbol whose name is a weight name of a font (e.g
1890 "medium", "bold"). */
1892 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1894 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt>
1895 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1896 Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1901 @brief Key of font property specifying style.
1903 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
1904 used as a key of font property and face property. The property
1905 value must be a symbol whose name is a style name of a font (e.g
1908 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1910 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt>
1911 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1912 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1917 @brief Key of font property specifying stretch.
1919 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
1920 is used as a key of font property and face property. The property
1921 value must be a symbol whose name is a stretch name of a font (e.g
1922 "normal", "condensed"). */
1924 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1926 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt>
1927 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1928 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1933 @brief Key of font property specifying additional style.
1935 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
1936 is used as a key of font property and face property. The property
1937 value must be a symbol whose name is an additional style name of a
1938 font (e.g "serif", "", "sans"). */
1940 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1942 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt>
1943 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1944 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1949 @brief Key of font property specifying spacing.
1951 The variable #Madstyle is a symbol of name <tt>"spacing"</tt> and
1952 is used as a key of font property. The property value must be a
1953 symbol whose name specifies the spacing of a font (e.g "p" for
1954 proportional, "m" for monospaced). */
1956 @brief spacing ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1958 ÊÑ¿ô #Mspacing ¤Ï <tt>"spacing"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1959 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î spacing
1960 ÆÃÀ¤ò¼¨¤¹Ì¾Á° ("p", "m" Åù)¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1965 @brief Key of font property specifying registry.
1967 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
1968 and is used as a key of font property. The property value must be
1969 a symbol whose name is a registry name a font registry
1970 (e.g. "iso8859-1", "jisx0208.1983-0"). */
1972 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1974 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt>
1975 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1976 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0"
1977 Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
1982 @brief Key of font property specifying size.
1984 The variable #Msize is a symbol of name <tt>"size"</tt> and is
1985 used as a key of font property and face property. The property
1986 value must be an integer specifying a font design size in the unit
1987 of 1/10 point (on 100 dpi display). */
1989 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1991 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt>
1992 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1993 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10
1994 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
2000 @brief Key of font property specifying file name.
2002 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2003 and is used as a key of font property. The property value must be
2004 a symbol whose name is a font file name. */
2008 @brief Key of font property specifying file name.
2010 The variable #Mfontfile is a symbol of name <tt>"fontfile"</tt>
2011 and is used as a key of font property. The property value must be
2012 a symbol whose name is a font file name. */
2014 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2016 ÊÑ¿ô #Mfontfile ¤Ï <tt>"fontfile"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
2017 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤
2018 ¥ë̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
2023 @brief Key of font property specifying resolution.
2025 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
2026 is used as a key of font property and face property. The property
2027 value must be an integer to specifying a font resolution in the
2028 unit of dots per inch (dpi). */
2030 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
2032 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt>
2033 ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
2034 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */
2036 MSymbol Mresolution;
2039 @brief Key of font property specifying max advance width.
2041 The variable #Mmax_advance is a symbol of name
2042 <tt>"max-advance"</tt> and is used as a key of font property. The
2043 property value must be an integer specifying a font's max advance
2046 MSymbol Mmax_advance;
2050 @brief Symbol of name "fontconfig".
2052 The variable #Mfontconfig is to be used as an argument of the
2053 functions mfont_parse_name () and mfont_unparse_name (). */
2055 @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2057 ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name ()
2058 ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */
2060 MSymbol Mfontconfig;
2063 @brief Symbol of name "x".
2065 The variable #Mx is to be used for a value of <type> member of the
2066 structure #MDrawGlyph to specify the type of <fontp> member is
2067 actually (XFontStruct *). */
2069 @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2071 ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2072 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
2077 @brief Symbol of name "freetype".
2079 The variable #Mfreetype is to be used for a value of <type> member
2080 of the structure #MDrawGlyph to specify the type of <fontp> member
2081 is actually FT_Face. */
2083 @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2085 ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2086 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2091 @brief Symbol of name "xft".
2093 The variable #Mxft is to be used for a value of <type> member of the
2094 structure #MDrawGlyph to specify the type of <fontp> member
2095 is actually (XftFont *). */
2097 @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
2099 ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
2100 ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
2109 @brief List of font files and directories that contain font files.
2111 The variable @c mfont_freetype_path is a plist of FreeType font
2112 files and directories that contain FreeType font files. Key of
2113 the element is @c Mstring, and the value is a string that
2114 represents a font file or a directory.
2116 The macro M17N_INIT () sets up this variable to contain the
2117 sub-directory "fonts" of the m17n database and the environment
2118 variable "M17NDIR". The first call of mframe () creates the
2119 internal list of the actually available fonts from this variable.
2120 Thus, an application program, if necessary, must modify the
2121 variable before calling mframe (). If it is going to add a new
2122 element, value must be a string that can be safely freed.
2124 If the m17n library is not configured to use the FreeType library,
2125 this variable is not used. */
2127 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
2129 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î
2130 plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring
2131 ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
2133 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ¿ô
2134 "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
2135 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£
2136 ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe ()
2137 ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2138 ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
2140 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
2142 MPlist *mfont_freetype_path;
2147 @brief Create a new font.
2149 The mfont () function creates a new font object that has no
2153 This function returns a pointer to the created font object. */
2155 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
2157 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2160 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
2167 MSTRUCT_CALLOC (font, MERROR_FONT);
2174 @brief Create a font by parsing a fontname.
2176 The mfont_parse_name () function creates a new font object. The
2177 properties are extracted fontname $NAME.
2179 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
2180 is parsed as XLFD (X Logical Font Description). If $FORMAT is
2181 #Mfontconfig, $NAME is parsed as Fontconfig's textual
2182 representation of font. If $FORMAT is #Mnil, $NAME is at first
2183 parsed as XLFD, and it it fails, parsed as Fontconfig's
2187 If the operation was successful, this function returns a pointer
2188 to the created font. Otherwise it returns @c NULL. */
2191 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2193 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾
2194 $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
2196 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
2197 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2198 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig
2199 ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD
2200 ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
2203 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name ()
2204 ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
2207 mfont_parse_name (const char *name, MSymbol format)
2209 MFont template, *font;
2211 MFONT_INIT (&template);
2212 if (mfont__parse_name_into_font (name, format, &template) < 0)
2213 MERROR (MERROR_FONT, NULL);
2214 MSTRUCT_CALLOC (font, MERROR_FONT);
2222 @brief Create a fontname from a font.
2224 The mfont_unparse_name () function creates a fontname string
2225 from font $FONT according to $FORMAT.
2227 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
2228 is in XLFD (X Logical Font Description) format. If it is
2229 #Mfontconfig, the fontname is in the style of Fontconfig's text
2233 This function returns a newly allocated fontname string, which is
2234 not freed unless the user explicitly does so by free (). */
2237 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2239 ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT
2240 ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£
2242 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£
2243 #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£
2244 #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
2247 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬
2248 free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
2251 mfont_unparse_name (MFont *font, MSymbol format)
2256 name = xlfd_unparse_name (font, 1);
2257 #ifdef HAVE_FONTCONFIG
2258 else if (format == Mfontconfig)
2259 name = mfont__ft_unparse_name (font);
2261 #endif /* HAVE_FONTCONFIG */
2263 MERROR (MERROR_FONT, NULL);
2270 @brief Make a copy of a font.
2272 The mfont_copy () function returns a new copy of font $FONT. */
2274 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
2276 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
2279 mfont_copy (MFont *font)
2283 MSTRUCT_MALLOC (copy, MERROR_FONT);
2291 @brief Get a property value of a font.
2293 The mfont_get_prop () function gets the value of $KEY property of
2294 font $FONT. $KEY must be one of the following symbols:
2296 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2297 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2299 If $FONT is a return value of mfont_find (), $KEY can also be one
2300 of the following symbols:
2302 #Mfont_ascent, #Mfont_descent, #Mmax_advance.
2304 @return If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
2305 @c Mstretch, @c Madstyle, @c Mregistry, or @c Mspacing, this
2306 function returns the corresponding value as a symbol. If the font
2307 does not have $KEY property, it returns @c Mnil. If $KEY is @c
2308 Msize, @c Mresolution, #Mfont_ascent, Mfont_descent, or
2309 #Mmax_advance, this function returns the corresponding value as an
2310 integer. If the font does not have $KEY property, it returns 0.
2311 If $KEY is something else, it returns @c NULL and assigns an error
2312 code to the external variable #merror_code. */
2315 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
2317 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
2318 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
2321 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2322 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
2324 @return $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
2325 Mstretch, @c Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢
2326 ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
2327 ¾ì¹ç¤Ë¤Ï@c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î
2328 ¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£
2329 ¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c
2330 NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2333 mfont_get_prop (MFont *font, MSymbol key)
2335 MRealizedFont *rfont = NULL;
2337 if (font->type == MFONT_TYPE_REALIZED)
2338 rfont = (MRealizedFont *) font;
2340 if (key == Mfoundry)
2341 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
2343 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
2345 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
2347 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
2348 if (key == Mstretch)
2349 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
2350 if (key == Madstyle)
2351 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
2352 if (key == Mregistry)
2353 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
2356 int size = font->size;
2357 return (void *) size;
2359 if (key == Mresolution)
2361 int resy = font->property[MFONT_RESY];
2362 return (void *) resy;
2364 if (key == Mlanguage || key == Mscript || key == Motf)
2366 MFontCapability *cap;
2368 if (! font->capability)
2370 cap = mfont__get_capability (font->capability);
2371 if (key == Mlanguage)
2372 return cap->language;
2378 if (key == Mfontfile)
2379 return (void *) font->file;
2380 if (key == Mspacing)
2381 return (font->spacing == MFONT_SPACING_UNDECIDED ? Mnil
2382 : msymbol (font->spacing == MFONT_SPACING_PROPORTIONAL ? "p"
2383 : font->spacing == MFONT_SPACING_MONO ? "m" : "c"));
2386 if (key == Mfont_ascent)
2387 return (void *) rfont->ascent;
2388 if (key == Mfont_descent)
2389 return (void *) rfont->descent;
2390 if (key == Mmax_advance)
2391 return (void *) rfont->max_advance;
2393 MERROR (MERROR_FONT, NULL);
2399 @brief Put a property value to a font.
2401 The mfont_put_prop () function puts a font property whose key is
2402 $KEY and value is $VAL to font $FONT. $KEY must be one of the
2405 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2406 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2408 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
2409 Otherwise, $VAL must be a symbol of a property value name. But,
2410 if the name is "nil", a symbol of name "Nil" must be
2413 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
2415 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í¥Ñ
2416 ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
2418 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2419 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
2421 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï
2422 ¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥×¥í¥Ñ¥Æ¥£ÃͤÎ̾Á°¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ
2423 ¤Ï¤Ê¤é¤Ê¤¤¡£¤¿¤À¤·¤â¤·¤½¤Î̾Á°¤¬ "nil" ¤Î¾ì¹ç¤Ï¡¢Ì¾Á°¤¬ "Nil" ¤Î¥·
2424 ¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
2427 mfont_put_prop (MFont *font, MSymbol key, void *val)
2429 if (key == Mfoundry)
2430 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
2431 else if (key == Mfamily)
2432 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
2433 else if (key == Mweight)
2434 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
2435 else if (key == Mstyle)
2436 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
2437 else if (key == Mstretch)
2438 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
2439 else if (key == Madstyle)
2440 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
2441 else if (key == Mregistry)
2442 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
2443 else if (key == Msize)
2445 int size = (int) val;
2448 else if (key == Mresolution)
2450 unsigned resy = (unsigned) val;
2451 font->property[MFONT_RESY] = resy;
2453 else if (key == Mlanguage || key == Mscript || key == Motf)
2455 font->capability = merge_capability (font->capability,
2456 key, (MSymbol) val, 1);
2458 else if (key == Mfontfile)
2460 font->file = (MSymbol) val;
2463 MERROR (MERROR_FONT, -1);
2470 @brief Return the font selection priority.
2472 The mfont_selection_priority () function returns a newly created
2473 array of six symbols. The elements are the following
2474 keys of font properties ordered by priority.
2476 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2477 @c Madstyle, @c Msize.
2479 The m17n library selects the best matching font according to the
2480 order of this array. A font that has a different value for a
2481 property of lower priority is preferred to a font that has a
2482 different value for a property of higher priority. */
2484 @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹.
2486 ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£
2487 ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2489 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2490 @c Madstyle, @c Msize.
2492 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
2493 ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£
2498 mfont_selection_priority ()
2503 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
2504 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2506 enum MFontProperty prop = font_score_priority[i];
2508 if (prop == MFONT_SIZE)
2510 else if (prop == MFONT_ADSTYLE)
2512 else if (prop == MFONT_FAMILY)
2514 else if (prop == MFONT_WEIGHT)
2516 else if (prop == MFONT_STYLE)
2518 else if (prop == MFONT_STRETCH)
2529 @brief Set the font selection priority.
2531 The mfont_set_selection_priority () function sets font selection
2532 priority according to $KEYS, which is an array of six symbols.
2533 Each element must be one of the below. No two elements must be
2536 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2537 @c Madstyle, @c Msize.
2539 See the documentation of the function mfont_selection_priority ()
2542 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
2544 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
2545 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ
2546 ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£
2548 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
2549 @c Madstyle, @c Msize.
2551 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
2555 mfont_set_selection_priority (MSymbol *keys)
2557 int priority[FONT_SCORE_PRIORITY_SIZE];
2560 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
2562 enum MFontProperty prop;
2566 else if (*keys == Madstyle)
2567 prop = MFONT_ADSTYLE;
2568 else if (*keys == Mfamily)
2569 prop = MFONT_FAMILY;
2570 else if (*keys == Mweight)
2571 prop = MFONT_WEIGHT;
2572 else if (*keys == Mstyle)
2574 else if (*keys == Mstretch)
2575 prop = MFONT_STRETCH;
2576 else if (*keys == Mfoundry)
2577 prop = MFONT_FOUNDRY;
2579 /* Invalid element. */
2581 for (j = 0; j < i; j++)
2582 if (priority[j] == prop)
2583 /* Duplicated element. */
2587 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
2588 font_score_priority[i] = priority[i];
2589 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
2590 of a score is a flag for a scalable font (see the documentation
2592 i = FONT_SCORE_PRIORITY_SIZE - 1;
2593 for (shift = 1; i >= 0; i--)
2595 font_score_shift_bits[font_score_priority[i]] = shift;
2596 if (font_score_priority[i] == MFONT_SIZE)
2598 else if (font_score_priority[i] <= MFONT_FAMILY)
2611 The mfont_find () function returns a pointer to the available font
2612 that matches best the specification $SPEC on frame $FRAME.
2614 $SCORE, if not NULL, must point to a place to store the score
2615 value that indicates how well the found font matches to $SPEC. The
2616 smaller score means a better match. */
2618 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
2620 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC
2621 ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
2623 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC
2624 ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
2625 ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
2629 mfont_find (MFrame *frame, MFont *spec, int *score, int max_size)
2634 MRealizedFont *rfont;
2639 double pt = - spec->size;
2642 adjusted.size = pt * frame->dpi / 72.27 + 0.5;
2645 MFONT_INIT (&spec_copy);
2646 spec_copy.property[MFONT_FAMILY] = spec->property[MFONT_FAMILY];
2647 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
2648 spec_copy.capability = spec->capability;
2649 spec_copy.file = spec->file;
2651 list = mfont__list (frame, &spec_copy, spec, max_size);
2655 best = list->fonts[0].font;
2657 *score = list->fonts[0].score;
2661 mfont__merge (&spec_copy, spec, 0);
2662 rfont = mfont__open (frame, best, spec);
2665 return (MFont *) rfont;
2670 @brief Set encoding of a font.
2672 The mfont_set_encoding () function sets the encoding information
2675 $ENCODING_NAME is a symbol representing a charset that has the
2676 same encoding as the font.
2678 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
2679 has the same repertory as the font. If it is @c Mnil, whether a
2680 specific character is supported by the font is asked to each font
2684 If the operation was successful, this function returns 0.
2685 Otherwise it returns -1 and assigns an error code to the external
2686 variable #merror_code. */
2688 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
2690 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£
2692 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2694 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
2695 @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£
2698 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
2699 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
2703 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
2705 MCharset *encoding_charset = MCHARSET (encoding_name);
2706 MCharset *repertory_charset;
2708 MFontEncoding *encoding;
2711 if (! encoding_charset)
2712 MERROR (MERROR_FONT, -1);
2713 if (repertory_name != Mnil)
2715 repertory_charset = MCHARSET (repertory_name);
2716 if (! repertory_charset)
2717 MERROR (MERROR_FONT, -1);
2720 repertory_charset = NULL;
2722 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2723 encoding->spec = *font;
2724 encoding->encoding_name = encoding_name;
2725 encoding->encoding_charset = encoding_charset;
2726 encoding->repertory_name = repertory_name;
2727 encoding->repertory_charset = repertory_charset;
2728 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2729 if (registry == Mnil)
2731 if (! font_encoding_list)
2732 load_font_encoding_table ();
2733 mplist_push (font_encoding_list, registry, encoding);
2734 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2735 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2747 @brief Create a fontname from a font.
2749 This function is obsolete. Use mfont_unparse_name instead. */
2751 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2753 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2756 mfont_name (MFont *font)
2758 return mfont_unparse_name (font, Mx);
2764 @brief Create a new font from fontname.
2766 This function is obsolete. Use mfont_parse_name () instead. */
2769 @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë.
2771 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2774 mfont_from_name (const char *name)
2776 return mfont_parse_name (name, Mx);
2782 @brief Get resize information of a font.
2784 The mfont_resize_ratio () function lookups the m17n database
2785 \<font, reisize\> and returns a resizing ratio (in percentage) of
2786 FONT. For instance, if the return value is 150, that means that
2787 the m17n library uses an 1.5 time bigger font than a specified
2791 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2793 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\>
2794 ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë
2795 ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5
2796 ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2799 mfont_resize_ratio (MFont *font)
2801 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2802 MFontResize *resize;
2805 if (! font_resize_list)
2806 load_font_resize_table ();
2807 if (! MPLIST_TAIL_P (font_resize_list))
2810 plist = font_resize_list;
2811 while (registry ? (plist = mplist_find_by_key (plist, registry))
2814 resize = (MFontResize *) MPLIST_VAL (plist);
2815 if (mfont__match_p (font, &resize->spec, MFONT_ADSTYLE))
2816 return resize->resize;
2817 plist = MPLIST_NEXT (plist);
2829 @brief Get a list of fonts.
2831 The mfont_list () functions returns a list of fonts available on
2832 frame $FRAME. $FONT, if not NULL, limits fonts to ones
2833 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2834 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2835 the number of fonts.
2837 $LANGUAGE argument exists just for backward compatibility, and the
2838 use is deprecated. Use #Mlanguage font property instead. If
2839 $FONT already has #Mlanguage property, $LANGUAGE is ignored.
2842 This function returns a plist whose keys are family names and
2843 values are pointers to the object MFont. The plist must be freed
2844 by m17n_object_unref (). If no font is found, it returns
2848 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2850 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤ò
2851 ÊÖ¤¹¡£$FONT ¤¬ NULL ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È
2852 ¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼
2853 ¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$MAXNUM ¤Ï¡¢0 ¤è¤êÂ礤¤¾ì
2854 ¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2856 ¤¿¤À¤·¡¢°ú¿ô $LANGUAGE ¤ÏµìÈǤȤÎÀ°¹çÀ¤Î¤¿¤á¤À¤±¤Ë¤¢¤ê¡¢¤½¤Î»ÈÍѤÏ
2857 ´«¤á¤é¤ì¤Ê¤¤¡£¥Õ¥©¥ó¥È¤Î #Mlanguage ¥×¥í¥Ñ¥Æ¥£¤ò»È¤¦¤Ù¤¤Ç¤¢¤ë¡£¤â
2858 ¤· $FONT ¤¬¤¹¤Ç¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤¤¤¿¤é¡¢°ú¿ô $LANGUAGE ¤Ï̵
2862 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
2863 ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Êplist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref () ¤Ç
2864 ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */
2867 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2870 MFontList *font_list;
2881 double pt = - spec.size;
2883 spec.size = pt * frame->dpi / 72.27 + 0.5;
2886 if (language != Mnil)
2887 spec.capability = merge_capability (spec.capability, Mlanguage, language,
2890 font_list = mfont__list (frame, &spec, &spec, 0);
2893 if (font_list->nfonts == 0)
2899 plist = pl = mplist ();
2900 for (i = 0; i < font_list->nfonts; i++)
2902 MSymbol family = FONT_PROPERTY (font_list->fonts[i].font, MFONT_FAMILY);
2905 pl = mplist_add (pl, family, font_list->fonts[i].font);
2912 @brief Get a list of font famiy names.
2914 The mfont_list_family_names () functions returns a list of font
2915 family names available on frame $FRAME.
2919 This function returns a plist whose keys are #Msymbol and values
2920 are symbols representing font family names. The elements are
2921 sorted by alphabetical order. The plist must be freed by
2922 m17n_object_unref (). If not font is found, it returns NULL. */
2925 mfont_list_family_names (MFrame *frame)
2927 MPlist *plist = mplist (), *p;
2929 MPLIST_DO (p, frame->font_driver_list)
2931 MFontDriver *driver = MPLIST_VAL (p);
2933 (driver->list_family_names) (frame, plist);
2942 @brief Check the usability of a font.
2944 The function mfont_check () checkes if $FONT can be used for
2945 $SCRIPT and $LANGUAGE in $FONTSET on $FRAME.
2947 @return If the font is usable, return 1. Otherwise return 0.
2951 mfont_check (MFrame *frame, MFontset *fontset,
2952 MSymbol script, MSymbol language, MFont *font)
2954 MRealizedFont *rfont;
2958 fontset = frame->face->property[MFACE_FONTSET];
2959 rfont = mfontset__get_font (frame, fontset, script, language, font, &best);
2960 if (! rfont || ! best)
2962 score = font_score (&rfont->spec, font);
2963 return (score == 0 ? 2 : 1);
2967 mfont_match_p (MFont *font, MFont *spec)
2969 return mfont__match_p (font, spec, MFONT_REGISTRY);
2973 mfont_open (MFrame *frame, MFont *font)
2975 enum MFontType font_type = font->type;
2977 if (font_type == MFONT_TYPE_SPEC)
2978 return mfont_find (frame, font, NULL, 0);
2979 if (font_type == MFONT_TYPE_OBJECT)
2980 return (MFont *) mfont__open (frame, font, font);
2981 if (font_type == MFONT_TYPE_REALIZED)
2983 MERROR (MERROR_FONT, NULL);
2987 mfont_encapsulate (MFrame *frame, MSymbol data_type, void *data)
2991 MPLIST_DO (p, frame->font_driver_list)
2993 MFontDriver *driver = MPLIST_VAL (p);
2994 MRealizedFont *rfont;
2996 if (driver->encapsulate
2997 && (rfont = driver->encapsulate (frame, data_type, data)))
2998 return (MFont *) rfont;
3005 mfont_close (MFont *font)
3007 enum MFontType font_type = font->type;
3008 MRealizedFont *rfont;
3010 if (font_type != MFONT_TYPE_REALIZED)
3011 MERROR (MERROR_FONT, -1);
3012 rfont = (MRealizedFont *) font;
3013 if (rfont->encapsulating
3014 && rfont->driver->close)
3015 rfont->driver->close (rfont);
3021 /*** @addtogroup m17nDebug */
3028 The mdebug_dump_font () function prints font $FONT in a human readable
3032 This function returns $FONT. */
3034 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
3036 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr
3037 ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£
3040 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
3043 mdebug_dump_font (MFont *font)
3047 name = xlfd_unparse_name (font, 0);
3050 fprintf (stderr, "%s", name);
3053 if (font->file != Mnil)
3055 char *file = MSYMBOL_NAME (font->file);
3056 char *lastslash = file, *p;
3058 for (p = file; *p; p++)
3062 fprintf (stderr, ",");
3063 fprintf (stderr, "%s", lastslash + 1);
3065 if (font->capability != Mnil)
3066 fprintf (stderr, "%s", MSYMBOL_NAME (font->capability));