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.
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. "The font
37 property that belongs to font F and whose key is @c Mxxx" may be
38 shortened to "the xxx property of F".
40 The value of a foundry property is a symbol representing font
41 foundry information, e.g. adobe, misc, etc.
43 The value of a family property is a symbol representing font family
44 information, e.g. times, helvetica, etc.
46 The value of a weight property is a symbol representing weight
47 information, e.g. normal, bold, etc.
49 The value of a style property is a symbol representing slant
50 information, e.g. normal, italic, etc.
52 The value of a stretch property is a symbol representing width
53 information, e.g. normal, semicondensed, etc.
55 The value of an adstyle property is a symbol representing abstract
56 font family information, e.g. serif, sans-serif, etc.
58 The value of a registry property is a symbol representing registry
59 information, e.g. iso10646-1, iso8895-1, etc.
61 The value of a size property is an integer representing design
62 size in the unit of 1/10 point.
64 The value of a resolution property is an integer representing
65 assumed device resolution in the unit of dots per inch (dpi)
67 The m17n library uses font objects for two purposes: to receive
68 font specification from an application program, and to present
69 available fonts to an application program. When the m17n library
70 presents an available font to an application program, all font
71 properties have a concrete value.
73 The m17n library supports three kinds of fonts: Window system fonts,
74 FreeType fonts, and OpenType fonts.
78 <li> Window system fonts
80 The m17n-X library supports all fonts handled by an X server and
81 an X font server. The correspondence between XLFD fields and font
82 properties are shown below.
86 --------------- --------
92 ADD_STYLE_NAME adstyle
94 RESOLUTION_Y resolution
95 CHARSET_REGISTRY-CHARSET_ENCODING registry
98 XLFD fields not listed in the above table are ignored.
102 The m17n library, if configured to use the FreeType library,
103 supports all fonts that can be handled by the FreeType library.
104 The variable #mfont_freetype_path is initialized properly according
105 to the configuration of the m17n library and the environment
106 variable @c M17NDIR. See the documentation of the variable for
109 If the m17n library is configured to use the fontconfig librray,
110 in addition to #mfont_freetype_path, all fonts available via
111 fontconfig are supported.
113 The family name of a FreeType font corresponds to the family
114 property. Style names of FreeType fonts correspond to the weight,
115 style, and stretch properties as below.
118 style name weight style stretch
119 ---------- ------ ----- -------
120 Regular medium r normal
121 Italic medium i normal
123 Bold Italic bold i normal
124 Narrow medium r condensed
125 Narrow Italic medium i condensed
126 Narrow Bold bold r condensed
127 Narrow Bold Italic bold i condensed
129 Black Italic black i normal
130 Oblique medium o normal
131 BoldOblique bold o normal
134 Style names not listed in the above table are treated as
137 Combination of a platform ID and an encoding ID corresponds to the
138 registry property. For example, if a font has the combination (1
139 1), the registry property is 1-1. Some frequent combinations have
140 a predefined registry property as below.
143 platform ID encoding ID registry property
144 ----------- ----------- -----------------
152 Thus, a font that has two combinations (1 0) and (3 1) corresponds
153 to four font objects whose registries are 1-0, apple-roman, 3-1,
158 The m17n library, if configured to use both the FreeType library
159 and the OTF library, supports any OpenType fonts. The list of
160 actually available fonts is created in the same way as in the case
161 of FreeType fonts. If a fontset instructs to use an OpenType font
162 via an FLT (Font Layout Table), and the FLT has an OTF-related
163 command (e.g. otf:deva), the OTF library converts a character
164 sequence to a glyph code sequence according to the OpenType layout
165 tables of the font, and the FreeType library gives a bitmap image
174 @brief ¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È.
176 m17n GUI API ¤Ï¥Õ¥©¥ó¥È¤ò @c MFont ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æɽ¸½¤¹¤ë¡£
177 ¥Õ¥©¥ó¥È¤Ï @e ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¤ë¡£Â¾¤Î¥¿¥¤¥×¤Î
178 ¥×¥í¥Ñ¥Æ¥£Æ±ÍÍ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¥¡¼¤ÈÃͤ«¤é¤Ê¤ë¡£¥¡¼¤Ï°Ê²¼¤Î¥·
179 ¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
181 @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
182 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution
184 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¡¢
185 ÃͤÏÀ°¿ôÃͤǤ¢¤ê¡¢¥¡¼¤¬¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Ãͤϥ·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£¡Ö¥Õ¥©
186 ¥ó¥È F ¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥¡¼¤¬ @c Mxxx ¤Ç¤¢¤ë¤â¤Î¡×¤Î¤³¤È
187 ¤ò´Êñ¤Ë¡ÖF ¤Î xxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£
189 foundry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢adobe, misc Åù¤Î¥Õ¥©¥ó¥È¤Î³«È¯¸µ¾ðÊó¤ò¼¨
192 family ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢times, helvetica Åù¤Î¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤ò
195 weight ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, bold Åù¤ÎÂÀ¤µ¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·
198 style ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, italic Åù¤Î¥¹¥¿¥¤¥ë¤Ë´Ø¤¹¤ë¾ðÊó¤ò
201 stretch ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, semicondensed Åù¤Îʸ»úÉý¤Ë´Ø¤¹¤ë
202 ¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
204 adstyle ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢serif, sans-serif Åù¤ÎÃê¾ÝŪ¤Ê¥Õ¥©¥ó¥È¥Õ¥¡
205 ¥ß¥ê¡¼¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
207 registry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢iso10646, iso8895-1 Åù¤Î¥ì¥¸¥¹¥È¥ê¾ðÊó¤ò
210 size ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤òɽ¤ï¤¹À°¿ôÃͤǤ¢
211 ¤ê¡¢Ã±°Ì¤Ï 1/10 ¥Ý¥¤¥ó¥È¤Ç¤¢¤ë¡£
213 resolution ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢ÁÛÄꤵ¤ì¤Æ¤¤¤ë¥Ç¥Ð¥¤¥¹¤Î²òÁüÅÙ¤òɽ¤ï
214 ¤¹À°¿ôÃͤǤ¢¤ê¡¢Ã±°Ì¤Ï dots per inch (dpi) ¤Ç¤¢¤ë¡£
216 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò£²¤Ä¤ÎÌÜŪ¤ÇÍѤ¤¤Æ¤¤¤ë¡£¥¢
217 ¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¥Õ¥©¥ó¥È¤Î»ØÄê¤ò¼õ¤±¼è¤ëÌÜŪ¤È¡¢¥¢¥×¥ê
218 ¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤òÄ󼨤¹¤ëÌÜŪ¤Ç¤¢¤ë¡£¥¢¥×
219 ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÂФ·¤ÆÄ󼨤ò¹Ô¤¦ºÝ¤Ë¤Ï¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£
220 ¤Ï¤¹¤Ù¤Æ¶ñÂÎŪ¤ÊÃͤò»ý¤Ä¡£
222 m17n ¥é¥¤¥Ö¥é¥ê¤Ï Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È¡¢FreeType¥Õ¥©¥ó¥È¡¢
223 OpenType¥Õ¥©¥ó¥È¤Î£³¼ïÎà¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
227 <li> Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È
229 m17n X ¥é¥¤¥Ö¥é¥ê¤Ï¡¢X ¥µ¡¼¥Ð¤È X ¥Õ¥©¥ó¥È¥µ¡¼¥Ð¤¬¼è¤ê°·¤¦Á´¤Æ¤Î¥Õ¥©
230 ¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£XLFD ¤Î³Æ¥Õ¥£¡¼¥ë¥É¤È¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ÎÂбþ
231 ¤Ï°Ê²¼¤ÎÄ̤ꡣ¤³¤Îɽ¤Ë¤Ê¤¤¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤ë¡£
234 XLFD ¥Õ¥£¡¼¥ë¥É ¥×¥í¥Ñ¥Æ¥£
235 --------------- --------
240 SETWIDTH_NAME stretch
241 ADD_STYLE_NAME adstyle
243 RESOLUTION_Y resolution
244 CHARSET_REGISTRY-CHARSET_ENCODING registry
249 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¤Ë
250 ¤Ï¡¢FreeType ¤¬°·¤¦¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£ÊÑ¿ô
251 #mfont_freetype_path ¤Ï m17n ¥é¥¤¥Ö¥é¥ê¤ÎÀßÄê¤È´Ä¶ÊÑ¿ô @c M17NDIR
252 ¤Ë±þ¤¸¤Æ½é´ü²½¤µ¤ì¤ë¡£¾ÜºÙ¤ÏÊÑ¿ô¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
254 ¤â¤· m17n ¥é¥¤¥Ö¥é¥ê¤¬ fontconfig ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤¿
255 ¾ì¹ç¤Ë¤Ï¡¢#mfont_freetype_path ¤Ë²Ã¤¨¤Æ¡¢ fontconfig ¤Ç»ÈÍѲÄǽ¤Ê¥Õ¥©
256 ¥ó¥È¤â¤¹¤Ù¤Æ¥µ¥Ý¡¼¥È¤µ¤ì¤ë¡£
258 FreeType ¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤Ï family ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£
259 FreeType ¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾¤Ï¡¢²¼¤Îɽ¤Î¤è¤¦¤Ë weight, style,
260 stretch ¥×¥í¥Ñ¥Æ¥£¤ËÂбþ¤¹¤ë¡£
263 ¥¹¥¿¥¤¥ë̾ weight style stretch
264 ---------- ------ ----- -------
265 Regular medium r normal
266 Italic medium i normal
268 Bold Italic bold i normal
269 Narrow medium r condensed
270 Narrow Italic medium i condensed
271 Narrow Bold bold r condensed
272 Narrow Bold Italic bold i condensed
274 Black Italic black i normal
275 Oblique medium o normal
276 BoldOblique bold o normal
279 ¾å¤Îɽ¤Ë¸½¤ï¤ì¤Ê¤¤¥¹¥¿¥¤¥ë̾¤Ï "Regular" ¤È¤·¤Æ°·¤ï¤ì¤ë¡£
281 platform ID ¤È encoding ID ¤ÎÁȤ߹ç¤ï¤»¤Ï registry ¥×¥í¥Ñ¥Æ¥£¤ËÂÐ
282 ±þ¤¹¤ë¡£¤¿¤È¤¨¤Ð¤¢¤ë¥Õ¥©¥ó¥È¤¬ (1 1) ¤È¤¤¤¦ ID ¤ÎÁȹ礻¤ò»ý¤Æ¤Ð¡¢
283 registry ¥×¥í¥Ñ¥Æ¥£¤Ï 1-1 ¤È¤Ê¤ë¡£ÉÑÈˤˤ¢¤é¤ï¤ì¤ëÁȹ礻¤Ë¤Ï°Ê²¼¤Î
284 ¤è¤¦¤ÊÄêµÁºÑ¤ß registry ¥×¥í¥Ñ¥Æ¥£ ¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ë¡£
287 platform ID encoding ID registry ¥×¥í¥Ñ¥Æ¥£
288 ----------- ----------- -----------------
296 ¤·¤¿¤¬¤Ã¤Æ¡¢Æó¤Ä¤ÎÁȹ礻 (1 0) ¡¢(3 1) ¤ò»ý¤Ä¥Õ¥©¥ó¥È¤Ï¡¢¤½¤ì¤¾¤ì
297 registry ¥×¥í¥Ñ¥Æ¥£¤¬ 1-0, apple-roman, 3-1, unicode-bmp ¤Ç¤¢¤ë£´¤Ä
298 ¤Î¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ËÂбþ¤¹¤ë¡£
300 <li> OpenType ¥Õ¥©¥ó¥È
302 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¡¢FreeType ¥é¥¤¥Ö¥é¥ê¤È OTF ¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ¹¤ë¤è
303 ¤¦¤ËÀßÄꤹ¤ì¤Ð¡¢¤¹¤Ù¤Æ¤Î OpenType ¥Õ¥©¥ó¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ë¡£¼ÂºÝ¤ËÍø
304 ÍѤǤ¤ë¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤Ï FreeType ¥Õ¥©¥ó¥È¤Î¾ì¹ç¤ÈƱÍͤ˺î¤é¤ì¤ë¡£
305 OpenType ¥Õ¥©¥ó¥È¤ò FLT (Font Layout Table) ·Ðͳ¤Ç»ÈÍѤ¹¤ë¤è¤¦¥Õ¥©
306 ¥ó¥È¥»¥Ã¥È¤Ë»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢FLT ¤Ë OTF ´ØÏ¢¤Î¥³¥Þ¥ó¥É (¤¿¤È¤¨¤Ð
307 otf:deva) ¤¬¤¢¤ì¤Ð¡¢OTF ¥é¥¤¥Ö¥é¥ê¤¬¥Õ¥©¥ó¥È¤Î OpenType ¥ì¥¤¥¢¥¦¥È
308 ¥Æ¡¼¥Ö¥ë¤Ë½¾¤Ã¤Æʸ»úÎó¤ò¥°¥ê¥Õ¥³¡¼¥ÉÎó¤ËÊÑ´¹¤·¡¢FreeType ¥é¥¤¥Ö¥é¥ê
309 ¤¬³Æ¥°¥ê¥Õ¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¥¤¥á¡¼¥¸¤òÄ󶡤¹¤ë¡£
317 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
318 /*** @addtogroup m17nInternal
327 #include "m17n-gui.h"
328 #include "m17n-misc.h"
329 #include "internal.h"
334 #include "internal-gui.h"
338 MPlist *mfont__driver_list;
340 /** Indices to font properties sorted by their priority. */
341 static int font_score_priority[] =
351 #define FONT_SCORE_PRIORITY_SIZE \
352 (sizeof font_score_priority / sizeof font_score_priority[0])
354 /* Indexed by a font property MFONT_XXX, and the value is how many
355 bits to shift the difference of property values. */
356 static int font_score_shift_bits[MFONT_PROPERTY_MAX];
358 /** Predefined symbols for each font property. The order is important
359 because the function score_font () decides how well a font matches
360 with a spec by checking how close the index is. */
362 static char *common_foundry[] =
365 static char *common_family[] =
370 static char *common_weight[] =
384 static char *common_style[] =
390 static char *common_stretch[] =
397 static char *common_adstyle[] =
401 static char *common_registry[] =
404 /* Table containing all the data above. */
406 struct MFontCommonNames
412 static struct MFontCommonNames font_common_names[] =
414 { sizeof (common_foundry) / sizeof (char *), common_foundry},
415 { sizeof (common_family) / sizeof (char *), common_family},
416 { sizeof (common_weight) / sizeof (char *), common_weight},
417 { sizeof (common_style) / sizeof (char *), common_style},
418 { sizeof (common_stretch) / sizeof (char *), common_stretch},
419 { sizeof (common_adstyle) / sizeof (char *), common_adstyle},
420 { sizeof (common_registry) / sizeof (char *), common_registry}
424 /** Table of available font property names. */
426 MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
429 /** Return the numeric value of SYMBOL as the Nth font property. */
431 #define FONT_PROPERTY_NUMERIC(symbol, n) \
434 : ((int) msymbol_get ((symbol), mfont__property_table[(n)].property)))
437 /** Set the numeric value of SYMBOL as the Nth font property to NUMERIC. */
439 #define SET_FONT_PROPERTY_NUMERIC(symbol, n, numeric) \
440 msymbol_put((symbol), mfont__property_table[(n)].property, \
444 gen_font_name (char *buf, MFont *font)
450 for (i = 0; i <= MFONT_REGISTRY; i++)
451 if (FONT_PROPERTY (font, i) != Mnil)
453 char *name = msymbol_name (FONT_PROPERTY (font, i));
462 sprintf (size, ",%d", font->property[MFONT_SIZE] / 10);
471 struct MFontEncoding {
473 MSymbol encoding_name;
474 MCharset *encoding_charset;
475 MSymbol repertory_name;
476 MCharset *repertory_charset;
479 static MPlist *font_encoding_list;
480 static MFontEncoding default_encoding;
482 /** Load font encoding table from the data <font encoding>.
483 The data has this form:
484 (FONT-SPEC ENCODING) ...
485 where FONT-SPEC has this form:
486 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
487 All elements are symbols. */
490 load_font_encoding_table ()
493 MPlist *encoding_list, *plist, *pl, *elt;
495 font_encoding_list = pl = mplist ();
497 mdb = mdatabase_find (Mfont, msymbol ("encoding"), Mnil, Mnil);
499 || ! (encoding_list = (MPlist *) mdatabase_load (mdb)))
500 MERROR (MERROR_FONT, -1);
502 MPLIST_DO (plist, encoding_list)
504 MFontEncoding *encoding;
507 MSTRUCT_CALLOC (encoding, MERROR_FONT);
509 if (! MPLIST_PLIST_P (plist)
510 || (elt = MPLIST_PLIST (plist), mplist_length (elt) < 2)
511 || ! MPLIST_PLIST_P (elt))
512 MWARNING (MERROR_FONT);
513 registry = mfont__set_spec_from_plist (&encoding->spec,
515 elt = MPLIST_NEXT (elt);
516 if (! MPLIST_SYMBOL_P (elt))
517 MWARNING (MERROR_FONT);
518 encoding->encoding_name = MPLIST_SYMBOL (elt);
519 elt = MPLIST_NEXT (elt);
520 if (MPLIST_TAIL_P (elt))
521 encoding->repertory_name = encoding->encoding_name;
522 else if (! MPLIST_SYMBOL_P (elt))
523 MWARNING (MERROR_FONT);
525 encoding->repertory_name = MPLIST_SYMBOL (elt);
527 if (registry == Mnil)
528 mplist_push (font_encoding_list, Mt, encoding);
530 pl = mplist_add (pl, registry, encoding);
537 M17N_OBJECT_UNREF (encoding_list);
546 static MPlist *font_resize_list;
548 /** Load font size table from the data <font size>.
549 The data has this form:
550 (FONT-SPEC RESIZE-FACTOR) ...
551 where FONT-SPEC has this form:
552 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
553 All elements of FONT-SPEC are symbols. */
556 load_font_resize_table ()
559 MPlist *size_adjust_list, *plist, *pl, *elt;
561 font_resize_list = pl = mplist ();
563 mdb = mdatabase_find (Mfont, msymbol ("resize"), Mnil, Mnil);
566 if (! (size_adjust_list = (MPlist *) mdatabase_load (mdb)))
567 MERROR (MERROR_FONT, -1);
569 MPLIST_DO (plist, size_adjust_list)
574 MSTRUCT_CALLOC (resize, MERROR_FONT);
576 if (! MPLIST_PLIST_P (plist)
577 || (elt = MPLIST_PLIST (plist), mplist_length (elt) != 2)
578 || ! MPLIST_PLIST_P (elt))
579 MWARNING (MERROR_FONT);
580 registry = mfont__set_spec_from_plist (&resize->spec,
582 elt = MPLIST_NEXT (elt);
583 if (! MPLIST_INTEGER_P (elt))
584 MWARNING (MERROR_FONT);
585 resize->resize = MPLIST_INTEGER (elt);
587 if (registry == Mnil)
589 pl = mplist_add (pl, registry, resize);
596 M17N_OBJECT_UNREF (size_adjust_list);
600 /** Return a font encoding (and repertory) of FONT. */
602 static MFontEncoding *
603 find_encoding (MFont *font)
605 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
606 MFontEncoding *encoding = NULL;
609 if (! font_encoding_list)
610 load_font_encoding_table ();
611 plist = font_encoding_list;
612 while (! MPLIST_TAIL_P (plist))
614 encoding = (MFontEncoding *) MPLIST_VAL (plist);
615 if (mfont__match_p (font, &encoding->spec, MFONT_REGISTRY))
617 if (encoding->encoding_name != Mnil
618 && ! encoding->encoding_charset)
620 encoding->encoding_charset = MCHARSET (encoding->encoding_name);
621 if (! encoding->encoding_charset)
627 if (encoding->repertory_name == encoding->encoding_name)
628 encoding->repertory_charset = encoding->encoding_charset;
629 else if (encoding->repertory_name != Mnil)
631 encoding->repertory_charset
632 = MCHARSET (encoding->repertory_name);
633 if (! encoding->repertory_charset)
642 if (registry && MPLIST_KEY (plist) != Mt)
644 plist = mplist_find_by_key (plist, registry);
649 plist = MPLIST_NEXT (plist);
651 return &default_encoding;
654 /* XLFD parser/generator */
656 /** Indices to each field of split font name. */
672 XLFD_REGISTRY, /* This contains ENCODING. */
678 xlfd_parse_name (char *name, MFont *font)
680 char *field[XLFD_FIELD_MAX];
681 unsigned short size, resy, avgwidth;
682 MSymbol attrs[MFONT_PROPERTY_MAX];
691 for (i = 1, p = copy, name++; *name; p++, name++)
696 && i < XLFD_FIELD_MAX)
699 if (field[i - 1][0] == '*')
704 *p = tolower (*name);
707 if (field[i - 1][0] == '*')
709 while (i < XLFD_FIELD_MAX)
712 resy = field[XLFD_RESY] ? atoi (field[XLFD_RESY]) : 0;
713 avgwidth = field[XLFD_AVGWIDTH] ? atoi (field[XLFD_AVGWIDTH]) : 0;
716 else if (! field[XLFD_PIXEL])
717 size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0;
718 else if (field[XLFD_PIXEL][0] == '[')
720 /* The pixel size field specifies a transformation matrix of the
721 form "[A B C D]". The XLFD spec says that the scalar value N
722 for the pixel size is equivalent to D. */
723 char *p0 = field[XLFD_PIXEL] + 1, *p1;
726 for (i = 0; i < 4; i++, p0 = p1)
727 d = strtod (p0, &p1);
731 size = atoi (field[XLFD_PIXEL]) * 10;
734 = field[XLFD_FOUNDRY] ? msymbol (field[XLFD_FOUNDRY]) : Mnil;
736 = field[XLFD_FAMILY] ? msymbol (field[XLFD_FAMILY]) : Mnil;
738 = field[XLFD_WEIGHT] ? msymbol (field[XLFD_WEIGHT]) : Mnil;
740 = field[XLFD_SLANT] ? msymbol (field[XLFD_SLANT]) : Mnil;
742 = field[XLFD_SWIDTH] ? msymbol (field[XLFD_SWIDTH]) : Mnil;
744 = field[XLFD_ADSTYLE] ? msymbol (field[XLFD_ADSTYLE]) : Mnil;
745 attrs[MFONT_REGISTRY]
746 = field[XLFD_REGISTRY] ? msymbol (field[XLFD_REGISTRY]) : Mnil;
747 mfont__set_spec (font, attrs, size, resy);
752 xlfd_unparse_name (MFont *font)
758 unsigned short size, resy;
760 prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry);
761 prop[1] = (MSymbol) mfont_get_prop (font, Mfamily);
762 prop[2] = (MSymbol) mfont_get_prop (font, Mweight);
763 prop[3] = (MSymbol) mfont_get_prop (font, Mstyle);
764 prop[4] = (MSymbol) mfont_get_prop (font, Mstretch);
765 prop[5] = (MSymbol) mfont_get_prop (font, Madstyle);
766 prop[6] = (MSymbol) mfont_get_prop (font, Mregistry);
767 for (len = 0, i = 0; i < 7; i++)
771 str[i] = msymbol_name (prop[i]);
772 len += strlen (str[i]);
782 + 3 /* 3 asterisks */
783 + 30 /* 3 integers (each 10 digits) */
784 + 1) /* '\0' terminal */
788 size = (int) mfont_get_prop (font, Msize);
792 size = size / 10 + 1;
793 resy = (int) mfont_get_prop (font, Mresolution);
795 sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-*-*-%s",
796 str[0], str[1], str[2], str[3], str[4], str[5],
797 size, resy, resy, str[6]);
798 return strdup (name);
809 Mfoundry = msymbol ("foundry");
810 mfont__property_table[MFONT_FOUNDRY].property = Mfoundry;
811 Mfamily = msymbol ("family");
812 mfont__property_table[MFONT_FAMILY].property = Mfamily;
813 Mweight = msymbol ("weight");
814 mfont__property_table[MFONT_WEIGHT].property = Mweight;
815 Mstyle = msymbol ("style");
816 mfont__property_table[MFONT_STYLE].property = Mstyle;
817 Mstretch = msymbol ("stretch");
818 mfont__property_table[MFONT_STRETCH].property = Mstretch;
819 Madstyle = msymbol ("adstyle");
820 mfont__property_table[MFONT_ADSTYLE].property = Madstyle;
821 Mregistry = msymbol ("registry");
822 mfont__property_table[MFONT_REGISTRY].property = Mregistry;
824 Msize = msymbol ("size");
825 Mresolution = msymbol ("resolution");
827 Mfontconfig = msymbol ("fontconfig");
830 Mfreetype = msymbol ("freetype");
831 Mxft = msymbol ("xft");
833 /* The first entry of each mfont__property_table must be Mnil so
834 that actual properties get positive numeric numbers. */
835 for (i = 0; i <= MFONT_REGISTRY; i++)
837 MLIST_INIT1 (&mfont__property_table[i], names, 8);
838 MLIST_APPEND1 (&mfont__property_table[i], names, Mnil, MERROR_FONT);
841 /* Register predefined font property names. */
842 for (i = 0; i <= MFONT_REGISTRY; i++)
846 for (j = 0; j < font_common_names[i].num; j++)
848 MSymbol sym = msymbol (font_common_names[i].names[j]);
852 if (msymbol_put (sym, mfont__property_table[i].property,
853 (void *) (j + 1)) < 0)
855 MLIST_APPEND1 (&mfont__property_table[i], names, sym, MERROR_FONT);
859 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
860 of a score is a flag for a scalable font (see the documentation
862 i = FONT_SCORE_PRIORITY_SIZE - 1;
863 for (shift = 1; i >= 0; i--)
865 font_score_shift_bits[font_score_priority[i]] = shift;
866 if (font_score_priority[i] == MFONT_SIZE)
872 MFONT_INIT (&default_encoding.spec);
873 default_encoding.encoding_name = Mnil;
874 default_encoding.encoding_charset = NULL;
875 default_encoding.repertory_name = Mnil;
876 default_encoding.repertory_charset = NULL;
881 mfont_freetype_path = mplist ();
882 bufsize = strlen (M17NDIR) + 7;
883 buf = alloca (bufsize);
884 sprintf (buf, "%s/fonts", M17NDIR);
885 mplist_add (mfont_freetype_path, Mstring, strdup (buf));
886 path = getenv ("M17NDIR");
889 i = strlen (path) + 7;
892 sprintf (buf, "%s/fonts", path);
893 mplist_push (mfont_freetype_path, Mstring, strdup (buf));
898 if (mfont__ft_init () < 0)
900 #endif /* HAVE_FREETYPE */
901 if (mfont__flt_init () < 0)
916 #endif /* HAVE_FREETYPE */
918 MPLIST_DO (plist, mfont_freetype_path)
919 free (MPLIST_VAL (plist));
920 M17N_OBJECT_UNREF (mfont_freetype_path);
922 if (font_resize_list)
924 MPLIST_DO (plist, font_resize_list)
925 free (MPLIST_VAL (plist));
926 M17N_OBJECT_UNREF (font_resize_list);
927 font_resize_list = NULL;
929 if (font_encoding_list)
931 MPLIST_DO (plist, font_encoding_list)
932 free (MPLIST_VAL (plist));
933 M17N_OBJECT_UNREF (font_encoding_list);
934 font_encoding_list = NULL;
936 for (i = 0; i <= MFONT_REGISTRY; i++)
937 MLIST_FREE1 (&mfont__property_table[i], names);
941 mfont__free_realized (MRealizedFont *rfont)
943 M17N_OBJECT_UNREF (rfont->info);
948 /* Compare FONT with REQUEST and return how much they differs. If
949 FONT does not match with SPEC, return -1. */
952 mfont__score (MFont *font, MFont *spec, MFont *request, int limited_size)
955 int i = FONT_SCORE_PRIORITY_SIZE;
959 enum MFontProperty prop = font_score_priority[i];
961 if (request->property[prop] != 0)
965 if (spec->property[prop] && font->property[prop]
966 && font->property[prop] != spec->property[prop])
968 if (font->property[prop])
969 val = abs (font->property[prop] - request->property[prop]);
970 if (val && prop <= MFONT_FAMILY)
972 if (prop == MFONT_SIZE)
974 if (font->property[MFONT_RESY] == 0)
975 /* This is a scalable font. We prefer a bitmap font
976 if the size matches exactly. */
979 score |= (val << font_score_shift_bits[MFONT_SIZE]
980 | ((limited_size && val > 0) ? 0x400000 : 0));
983 score |= (val > 3 ? 3 : val) << font_score_shift_bits[prop];
990 /** Return 1 iff FONT matches SPEC. */
993 mfont__match_p (MFont *font, MFont *spec, int prop)
995 for (; prop >= 0; prop--)
996 if (spec->property[prop] && font->property[prop]
997 && font->property[prop] != spec->property[prop])
1004 mfont__set_spec_from_face (MFont *spec, MFace *face)
1008 for (i = 0; i <= MFONT_ADSTYLE; i++)
1009 mfont__set_property (spec, i, face->property[i]);
1010 /* The value 1 is "iso8859-1". */
1011 spec->property[MFONT_REGISTRY] = 1;
1012 spec->property[MFONT_SIZE] = (int) (face->property[MFACE_SIZE]);
1013 spec->property[MFONT_RESY] = 0;
1018 mfont__set_spec_from_plist (MFont *spec, MPlist *plist)
1021 MSymbol spec_list[MFONT_REGISTRY + 1];
1025 memset (spec_list, 0, sizeof spec_list);
1026 for (i = 0; ! MPLIST_TAIL_P (plist); i++, plist = MPLIST_NEXT (plist))
1028 if (! MPLIST_SYMBOL_P (plist))
1029 MERROR (MERROR_FONT, Mnil);
1030 spec_list[i] = MPLIST_SYMBOL (plist);
1032 registry = spec_list[i - 1];
1033 mfont__set_property (spec, MFONT_REGISTRY, registry);
1034 for (i -= 2; i >= 0; i--)
1035 mfont__set_property (spec, i, spec_list[i]);
1040 mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size,
1043 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1045 MRealizedFont *best;
1047 int mdebug_mask = MDEBUG_FONT;
1049 if (registry == Mnil)
1052 MPLIST_DO (plist, frame->realized_font_list)
1054 best = MPLIST_VAL (plist);
1055 if (MPLIST_KEY (plist) == registry
1056 && ! memcmp (&best->spec, spec, sizeof (MFont))
1057 && ! memcmp (&best->request, request, sizeof (MFont)))
1059 if (best->layouter != layouter)
1061 MRealizedFont *copy;
1063 MSTRUCT_MALLOC (copy, MERROR_FONT);
1065 copy->layouter = layouter;
1066 mplist_add (frame->realized_font_list, registry, copy);
1068 M17N_OBJECT_REF (copy->info);
1075 MDEBUG_PUSH_TIME ();
1077 MPLIST_DO (plist, frame->font_driver_list)
1079 MFontDriver *driver = MPLIST_VAL (plist);
1081 = (driver->select) (frame, spec, request, limited_size);
1085 this->driver = driver;
1087 || this->score < best->score)
1090 mfont__free_realized (best);
1092 if (this->score == 0)
1096 mfont__free_realized (this);
1100 if (mdebug__flag & mdebug_mask)
1102 char buf1[256], buf2[256];
1105 for (i = 0; i < MFONT_PROPERTY_MAX; i++)
1106 if (! font.property[i])
1107 font.property[i] = request->property[i];
1108 gen_font_name (buf2, &font);
1111 MDEBUG_PRINT_TIME ("FONT",
1112 (stderr, " to select <%s> (%x)from <%s>.",
1113 gen_font_name (buf1, &best->font),
1117 MDEBUG_PRINT_TIME ("FONT", (stderr, " to fail to find <%s>.", buf2));
1123 best->layouter = layouter;
1124 mplist_add (frame->realized_font_list, registry, best);
1129 /** Open a font specified in RFONT. Return 0 if successfully
1130 opened, otherwise return -1. */
1133 mfont__open (MRealizedFont *rfont)
1135 return (rfont->driver->open) (rfont);
1139 mfont__resize (MFont *spec, MFont *request)
1141 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1142 MFontResize *resize;
1145 if (! font_resize_list)
1146 load_font_resize_table ();
1147 if (! MPLIST_TAIL_P (font_resize_list))
1150 plist = font_resize_list;
1151 while (registry ? (plist = mplist_find_by_key (plist, registry))
1154 resize = (MFontResize *) MPLIST_VAL (plist);
1155 if (mfont__match_p (spec, &resize->spec, MFONT_ADSTYLE))
1157 request->property[MFONT_SIZE]
1158 = request->property[MFONT_SIZE] * resize->resize / 100;
1161 plist = MPLIST_NEXT (plist);
1171 mfont__encode_char (MRealizedFont *rfont, int c)
1173 MFontEncoding *encoding;
1176 if (rfont->layouter != Mnil)
1177 return mfont__flt_encode_char (rfont->layouter, c);
1178 if (! rfont->encoding)
1179 rfont->encoding = find_encoding (&rfont->font);
1180 encoding = rfont->encoding;
1181 if (! encoding->encoding_charset)
1182 return MCHAR_INVALID_CODE;
1183 if (encoding->repertory_charset
1184 && ENCODE_CHAR (encoding->repertory_charset, c) == MCHAR_INVALID_CODE)
1185 return MCHAR_INVALID_CODE;
1186 code = ENCODE_CHAR (encoding->encoding_charset, c);
1187 if (code == MCHAR_INVALID_CODE)
1188 return MCHAR_INVALID_CODE;
1189 return (rfont->driver->encode_char) (rfont, code);
1193 mfont__get_metric (MGlyphString *gstring, int from, int to)
1195 MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
1196 MRealizedFont *rfont = from_g->rface->rfont;
1198 for (g = from_g; g != to_g; g++)
1199 if (g->rface->rfont != rfont)
1201 int idx = GLYPH_INDEX (g);
1203 (rfont->driver->find_metric) (rfont, gstring, from, idx);
1205 rfont = g->rface->rfont;
1208 (rfont->driver->find_metric) (rfont, gstring, from, GLYPH_INDEX (g));
1213 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1221 numeric = FONT_PROPERTY_NUMERIC (val, key);
1224 numeric = mfont__property_table[key].used;
1225 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1226 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1229 font->property[key] = numeric;
1233 mfont__set_spec (MFont *font, MSymbol *attrs,
1234 unsigned short size, unsigned short resy)
1238 for (i = 0; i <= MFONT_REGISTRY; i++)
1239 mfont__set_property (font, i, attrs[i]);
1240 font->property[MFONT_SIZE] = size;
1241 font->property[MFONT_RESY] = resy;
1245 mfont__parse_name_into_font (char *name, MSymbol format, MFont *font)
1249 if (format == Mx || format == Mnil)
1250 result = xlfd_parse_name (name, font);
1251 #ifdef HAVE_FONTCONFIG
1252 if (format == Mfontconfig || (! result && format == Mnil))
1253 result = mfont__ft_parse_name (name, font);
1259 mfont__encoding_list (void)
1261 if (! font_encoding_list)
1262 load_font_encoding_table ();
1263 return font_encoding_list;
1267 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1273 /*** @addtogroup m17nFont */
1277 /***en @name Variables: Keys of font property. */
1278 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1283 @brief Key of font property specifying foundry.
1285 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1286 is used as a key of font property and face property. The property
1287 value must be a symbol whose name is a foundry name of a font. */
1289 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1291 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1292 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1293 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1299 @brief Key of font property specifying family.
1301 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1302 used as a key of font property and face property. The property
1303 value must be a symbol whose name is a family name of a font. */
1305 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1307 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1308 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1309 ¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1315 @brief Key of font property specifying weight.
1317 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1318 used as a key of font property and face property. The property
1319 value must be a symbol whose name is a weight name of a font (e.g
1320 "medium", "bold"). */
1322 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1324 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1325 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1326 ¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç
1333 @brief Key of font property specifying style.
1335 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
1336 used as a key of font property and face property. The property
1337 value must be a symbol whose name is a style name of a font (e.g
1340 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1342 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1343 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1344 ¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç
1351 @brief Key of font property specifying stretch.
1353 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
1354 is used as a key of font property and face property. The property
1355 value must be a symbol whose name is a stretch name of a font (e.g
1356 "normal", "condensed"). */
1358 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1360 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1361 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1362 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý
1363 ¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1369 @brief Key of font property specifying additional style.
1371 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
1372 is used as a key of font property and face property. The property
1373 value must be a symbol whose name is an additional style name of a
1374 font (e.g "serif", "", "sans"). */
1376 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1378 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1379 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1380 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý
1381 ¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1387 @brief Key of font property specifying registry.
1389 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
1390 and is used as a key of font property. The property value must be
1391 a symbol whose name is a registry name a font registry
1392 (e.g. "iso8859-1", "jisx0208.1983-0"). */
1394 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1396 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó
1397 ¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©
1398 ¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0" Åù) ¤ò̾Á°¤È¤·
1399 ¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1405 @brief Key of font property specifying size.
1407 The variable #Msize is a symbol of name <tt>"size"</tt> and is
1408 used as a key of font property and face property. The property
1409 value must be an integer specifying a font design size in the unit
1410 of 1/10 point (on 100 dpi display). */
1412 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1414 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©
1415 ¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1416 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10 ¥Ý¥¤¥ó
1417 ¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1423 @brief Key of font property specifying resolution.
1425 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
1426 is used as a key of font property and face property. The property
1427 value must be an integer to specifying a font resolution in the
1428 unit of dots per inch (dpi). */
1430 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1432 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü
1433 ¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é
1434 ¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ô
1435 ÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1438 MSymbol Mresolution;
1441 @brief Symobl of name "fontconfig".
1443 The variable #Mfontconfig is to be used as an argument of the
1444 functions mfont_parse_name () and mfont_unparse_name (). */
1446 MSymbol Mfontconfig;
1449 @brief Symbol of name "x".
1451 The variable #Mx is to be used for a value of <type> member of the
1452 structure #MDrawGlyph to specify the type of <fontp> member is
1453 actually (XFontStruct *). */
1458 @brief Symbol of name "freetype".
1460 The variable #Mfreetype is to be used for a value of <type> member
1461 of the structure #MDrawGlyph to specify the type of <fontp> member
1462 is actually FT_Face. */
1467 @brief Symbol of name "xft".
1469 The variable #Mxft is to be used for a value of <type> member of the
1470 structure #MDrawGlyph to specify the type of <fontp> member
1471 is actually (XftFont *). */
1480 @brief List of font files and directories that contain font files.
1482 The variable @c mfont_freetype_path is a plist of FreeType font
1483 files and directories that contain FreeType font files. Key of
1484 the element is @c Mstring, and the value is a string that
1485 represents a font file or a directory.
1487 The macro M17N_INIT () sets up this variable to contain the
1488 sub-directory "fonts" of the m17n database and the environment
1489 variable "M17NDIR". The first call of mframe () creates the
1490 internal list of the actually available fonts from this variable.
1491 Thus, an application program, if necessary, must modify the
1492 variable before calling mframe (). If it is going to add a new
1493 element, value must be a string that can be safely freed.
1495 If the m17n library is not configured to use the FreeType library,
1496 this variable is not used. */
1498 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
1500 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë
1501 ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring ¤Ç¤¢
1502 ¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
1504 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ
1505 ¿ô "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
1506 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©
1507 ¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢
1508 mframe () ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê
1509 ¤¤¡£¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó
1510 ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1512 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì
1513 ¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
1515 MPlist *mfont_freetype_path;
1520 @brief Create a new font.
1522 The mfont () function creates a new font object that has no
1526 This function returns a pointer to the created font object. */
1528 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
1530 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯
1534 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
1541 MSTRUCT_CALLOC (font, MERROR_FONT);
1548 @brief Create a font by parsing a fontname.
1550 The mfont_parse_name () function creates a new font object. The
1551 properties are extracted fontname $NAME.
1553 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
1554 is parsed as XLFD (X Logical Font Description). If $FORMAT is
1555 #Mfontconfig, $NAME is parsed as Fontconfig's textual
1556 representation of font. If $FORMAT is #Mnil, $NAME is at first
1557 parsed as XLFD, and it it fails, parsed as Fontconfig's
1561 If the operation was successful, this function returns a pointer
1562 to the created font. Otherwise it returns @c NULL. */
1565 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
1567 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾ $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ
1568 ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
1570 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
1571 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
1572 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig ¤Î¥Õ¥©¥ó¥È¥Æ¥
1573 ¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD ¤Ë
1574 ½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
1577 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name () ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î
1578 ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1581 mfont_parse_name (char *name, MSymbol format)
1583 MFont template, *font;
1585 MFONT_INIT (&template);
1586 if (mfont__parse_name_into_font (name, format, &template) < 0)
1587 MERROR (MERROR_FONT, NULL);
1588 MSTRUCT_CALLOC (font, MERROR_FONT);
1596 @brief Create a fontname from a font.
1598 The mfont_unparse_name () function creates a fontname string
1599 from font $FONT according to $FORMAT.
1601 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
1602 is in XLFD (X Logical Font Description) format. If it is
1603 #Mfontconfig, the fontname is in the style of Fontconfig's text
1607 This function returns a newly allocated fontname string, which is
1608 not freed unless the user explicitly does so by free (). */
1611 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
1613 ´Ø¿ô mfont_unparse_name () ¤Ï $FORMAT ¤Ë¤·¤¿¤¬¤Ã¤¿¥Õ¥©¥ó¥È̾¤Îʸ»ú
1614 Îó¤ò¥Õ¥©¥ó¥È$FONT ¤ò¸µ¤Ëºî¤ë¡£
1616 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£#Mx ¤Ê¤é¤Ð¥Õ¥©
1617 ¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£#Mfontconfig ¤Ê
1618 ¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
1621 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢
1622 ¥æ¡¼¥¶¤¬ free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
1625 mfont_unparse_name (MFont *font, MSymbol format)
1630 name = xlfd_unparse_name (font);
1631 #ifdef HAVE_FONTCONFIG
1632 else if (format == Mfontconfig)
1633 name = mfont__ft_unparse_name (font);
1636 MERROR (MERROR_FONT, NULL);
1643 @brief Make a copy of a font.
1645 The mfont_copy () function returns a new copy of font $FONT. */
1647 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
1649 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
1652 mfont_copy (MFont *font)
1656 MSTRUCT_MALLOC (copy, MERROR_FONT);
1664 @brief Get a property value of a font.
1666 The mfont_get_prop () function gets the value of $KEY property of
1667 font $FONT. $KEY must be one of the following symbols:
1669 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1670 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1673 If $KEY is @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
1674 Madstyle, or @c Mregistry, this function returns the
1675 corresponding value as a symbol. If the font does not have $KEY
1676 property, it returns @c Mnil.
1677 If $KEY is @c Msize or @c Mresolution, this function returns the
1678 corresponding value as an integer. If the font does not have $KEY
1679 property, it returns 0.
1680 If $KEY is something else, it returns @c NULL and assigns an error
1681 code to the external variable #merror_code. */
1684 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
1686 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
1687 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
1690 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1691 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1694 $KEY ¤¬ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
1695 Madstyle, @c Mregistry ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È
1696 ¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï @c Mnil ¤òÊÖ¤¹¡£
1697 $KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò
1698 ¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤ò
1700 $KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
1701 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
1704 mfont_get_prop (MFont *font, MSymbol key)
1706 if (key == Mfoundry)
1707 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
1709 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
1711 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
1713 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
1714 if (key == Mstretch)
1715 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
1716 if (key == Madstyle)
1717 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
1718 if (key == Mregistry)
1719 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
1722 int size = font->property[MFONT_SIZE];
1723 return (void *) size;
1725 if (key == Mresolution)
1727 int resy = font->property[MFONT_RESY];
1728 return (void *) resy;
1731 MERROR (MERROR_FONT, NULL);
1737 @brief Put a property value to a font.
1739 The mfont_put_prop () function puts a font property whose key is
1740 $KEY and value is $VAL to font $FONT. $KEY must be one of the
1743 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1744 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1746 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
1747 Otherwise, $VAL must be a symbol. */
1749 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
1751 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í
1752 ¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢
1755 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1756 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1758 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ
1759 ¤Ï¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
1762 mfont_put_prop (MFont *font, MSymbol key, void *val)
1764 if (key == Mfoundry)
1765 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
1766 else if (key == Mfamily)
1767 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
1768 else if (key == Mweight)
1769 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
1770 else if (key == Mstyle)
1771 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
1772 else if (key == Mstretch)
1773 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
1774 else if (key == Madstyle)
1775 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
1776 else if (key == Mregistry)
1777 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
1778 else if (key == Msize)
1780 unsigned size = (unsigned) val;
1781 font->property[MFONT_SIZE] = size;
1783 else if (key == Mresolution)
1785 unsigned resy = (unsigned) val;
1786 font->property[MFONT_RESY] = resy;
1789 MERROR (MERROR_FONT, -1);
1796 @brief Return the font selection priority.
1798 The mfont_selection_priority () function returns a newly created
1799 array of six symbols. The elements are the following
1800 keys of font properties ordered by priority.
1802 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1803 @c Madstyle, @c Msize.
1805 The m17n library selects the best matching font according to the
1806 order of this array. A font that has a different value for a
1807 property of lower priority is preferred to a font that has a
1808 different value for a property of higher priority. */
1810 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÊÖ¤¹.
1812 ´Ø¿ô mfont_selection_priority () ¤Ï6¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã
1813 ¤ÆÊÖ¤¹¡£ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤ËÊÂ
1816 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1817 @c Madstyle, @c Msize.
1819 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
1820 Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬°ã¤¦¥Õ¥©¥ó¥È¤ÈÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤Î
1821 Ãͤ¬°ã¤¦¥Õ¥©¥ó¥È¤¬¤¢¤ë¾ì¹ç¡¢Á°¼Ô¤¬ÁªÂò¤µ¤ì¤ë¡£
1825 mfont_selection_priority ()
1830 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
1831 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
1833 enum MFontProperty prop = font_score_priority[i];
1835 if (prop == MFONT_SIZE)
1837 else if (prop == MFONT_ADSTYLE)
1839 else if (prop == MFONT_FAMILY)
1841 else if (prop == MFONT_WEIGHT)
1843 else if (prop == MFONT_STYLE)
1845 else if (prop == MFONT_STRETCH)
1856 @brief Set the font selection priority.
1858 The mfont_set_selection_priority () function sets font selection
1859 priority according to $KEYS, which is an array of six symbols.
1860 Each element must be one of the below. No two elements must be
1863 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1864 @c Madstyle, @c Msize.
1866 See the documentation of the function mfont_selection_priority ()
1869 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
1871 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
1872 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£³ÆÍ×ÁǤϰʲ¼¤Î¤¦¤Á¤Î¤É¤ì
1873 ¤«¤Ç¤¢¤ê¡¢Á´¤Æ°Û¤Ê¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1875 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1876 @c Madstyle, @c Msize.
1878 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
1882 mfont_set_selection_priority (MSymbol *keys)
1884 int priority[FONT_SCORE_PRIORITY_SIZE];
1887 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
1889 enum MFontProperty prop;
1893 else if (*keys == Madstyle)
1894 prop = MFONT_ADSTYLE;
1895 else if (*keys == Mfamily)
1896 prop = MFONT_FAMILY;
1897 else if (*keys == Mweight)
1898 prop = MFONT_WEIGHT;
1899 else if (*keys == Mstyle)
1901 else if (*keys == Mstretch)
1902 prop = MFONT_STRETCH;
1903 else if (*keys == Mfoundry)
1904 prop = MFONT_FOUNDRY;
1906 /* Invalid element. */
1908 for (j = 0; j < i; j++)
1909 if (priority[j] == prop)
1910 /* Duplicated element. */
1914 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
1915 font_score_priority[i] = priority[i];
1924 The mfont_find () function returns a pointer to the available font
1925 that matches best the specification $SPEC on frame $FRAME.
1927 $SCORE, if not NULL, must point to a place to store the score
1928 value that indicates how well the found font matches to $SPEC. The
1929 smaller score means a better match. */
1931 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
1933 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC ¤Ë¤â¤Ã
1934 ¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
1936 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC ¤Ë¤É¤ì¤Û¤É¹ç¤Ã
1937 ¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¥¹¥³¥¢¤¬¾®¤µ
1938 ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
1942 mfont_find (MFrame *frame, MFont *spec, int *score, int limited_size)
1945 MRealizedFont *rfont;
1947 MFONT_INIT (&spec_copy);
1948 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
1950 rfont = mfont__select (frame, &spec_copy, spec, limited_size, Mnil);
1954 *score = rfont->score;
1955 return &rfont->font;
1960 @brief Set encoding of a font.
1962 The mfont_set_encoding () function sets the encoding information
1965 $ENCODING_NAME is a symbol representing a charset that has the
1966 same encoding as the font.
1968 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
1969 has the same repertory as the font. If it is @c Mnil, whether a
1970 specific character is supported by the font is asked to each font
1974 If the operation was successful, this function returns 0.
1975 Otherwise it returns -1 and assigns an error code to the external
1976 variable #merror_code. */
1978 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
1980 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó
1983 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò
1984 ¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
1986 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó
1987 ¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£@c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ
1988 »ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤Ë
1992 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°
1993 ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
1997 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
1999 MCharset *encoding_charset = MCHARSET (encoding_name);
2000 MCharset *repertory_charset;
2002 MFontEncoding *encoding;
2005 if (! encoding_charset)
2006 MERROR (MERROR_FONT, -1);
2007 if (repertory_name != Mnil)
2009 repertory_charset = MCHARSET (repertory_name);
2010 if (! repertory_charset)
2011 MERROR (MERROR_FONT, -1);
2014 repertory_charset = NULL;
2016 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2017 encoding->spec = *font;
2018 encoding->encoding_name = encoding_name;
2019 encoding->encoding_charset = encoding_charset;
2020 encoding->repertory_name = repertory_name;
2021 encoding->repertory_charset = repertory_charset;
2022 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2023 if (registry == Mnil)
2025 if (! font_encoding_list)
2026 load_font_encoding_table ();
2027 mplist_push (font_encoding_list, registry, encoding);
2028 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2029 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2041 @brief Create a fontname from a font.
2043 This function is obsolete. Use mfont_unparse_name instead. */
2045 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2047 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2050 mfont_name (MFont *font)
2052 return mfont_unparse_name (font, Mx);
2058 @brief Create a new font from fontname.
2060 This function is obsolete. Use mfont_parse_name () instead. */
2063 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2065 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2068 mfont_from_name (char *name)
2070 return mfont_parse_name (name, Mx);
2076 @brief Get resize information of a font.
2078 The mfont_resize_ratio () function lookups the m17n database
2079 \<font, reisize\> and returns a resizing ratio (in percentage) of
2080 FONT. For instance, if the return value is 150, that means that
2081 the m17n library uses an 1.5 time bigger font than a specified
2085 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2087 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\> ¤ò¸¡
2088 º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë¤òÊÖ¤¹¡£¤¿¤È¤¨
2089 ¤ÐÊÖÃͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5 ÇܤÎ
2090 ¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2093 mfont_resize_ratio (MFont *font)
2095 MFont request = *font;
2097 mfont__resize (font, &request);
2098 return (font->property[MFONT_SIZE] * 100 / request.property[MFONT_SIZE]);
2104 @brief Get a list of fonts.
2106 The mfont_list () functions returns a list of fonts available on
2107 frame $FRAME. $FONT, if not @c Mnil, limits fonts to ones
2108 that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2109 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2110 the number of fonts.
2113 This function returns a plist whose keys are family names and
2114 values are pointers to the object MFont. The plist must be freed
2115 by m17n_object_unref (). If no font is found, it returns
2119 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë
2121 ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È
2122 ¤òÊÖ¤¹¡£ $FONT ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©
2123 ¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£$LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò
2124 ¥µ¥Ý¡¼¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£ $MAXNUM ¤Ï¡¢0 ¤è¤êÂç
2125 ¤¤¾ì¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£
2128 ¤³¤Î´Ø¿ô¤Ï¥¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§
2129 ¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Ê plist ¤òÊÖ¤¹¡£plist ¤Ï
2130 m17n_object_unref () ¤Ç²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð
2134 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2136 MPlist *plist = mplist (), *p;
2139 MPLIST_DO (p, frame->font_driver_list)
2141 MFontDriver *driver = MPLIST_VAL (p);
2143 num += (driver->list) (frame, plist, font, language,
2144 maxnum > 0 ? maxnum - num : 0);
2145 if (maxnum > 0 && num >= maxnum)
2148 if (MPLIST_TAIL_P (plist))
2150 M17N_OBJECT_UNREF (plist);
2158 /*** @addtogroup m17nDebug */
2165 The mdebug_dump_font () function prints font $FONT in a human readable
2169 This function returns $FONT. */
2171 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
2173 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr ¤Ë¿Í´Ö¤Ë²ÄÆɤÊ
2177 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
2180 mdebug_dump_font (MFont *font)
2184 name = mfont_unparse_name (font, Mx);
2187 fprintf (stderr, "%s", name);
2194 mdebug_dump_font_list (MFrame *frame, MSymbol family, MSymbol lang)
2199 plist = mfont_list (frame, NULL, lang, 0);
2205 mfont__set_property (&font, MFONT_FAMILY, family);
2206 plist = mfont_list (frame, &font, lang, 0);
2208 MPLIST_DO (p, plist)
2210 mdebug_dump_font (MPLIST_VAL (p));
2211 fprintf (stderr, "\n");
2213 M17N_OBJECT_UNREF (plist);