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)
529 pl = mplist_add (pl, registry, encoding);
536 M17N_OBJECT_UNREF (encoding_list);
545 static MPlist *font_resize_list;
547 /** Load font size table from the data <font size>.
548 The data has this form:
549 (FONT-SPEC RESIZE-FACTOR) ...
550 where FONT-SPEC has this form:
551 ([FOUNDRY FAMILY [WEIGHT [STYLE [STRETCH [ADSTYLE]]]]] REGISTRY)
552 All elements of FONT-SPEC are symbols. */
555 load_font_resize_table ()
558 MPlist *size_adjust_list, *plist, *pl, *elt;
560 font_resize_list = pl = mplist ();
562 mdb = mdatabase_find (Mfont, msymbol ("resize"), Mnil, Mnil);
565 if (! (size_adjust_list = (MPlist *) mdatabase_load (mdb)))
566 MERROR (MERROR_FONT, -1);
568 MPLIST_DO (plist, size_adjust_list)
573 MSTRUCT_CALLOC (resize, MERROR_FONT);
575 if (! MPLIST_PLIST_P (plist)
576 || (elt = MPLIST_PLIST (plist), mplist_length (elt) != 2)
577 || ! MPLIST_PLIST_P (elt))
578 MWARNING (MERROR_FONT);
579 registry = mfont__set_spec_from_plist (&resize->spec,
581 elt = MPLIST_NEXT (elt);
582 if (! MPLIST_INTEGER_P (elt))
583 MWARNING (MERROR_FONT);
584 resize->resize = MPLIST_INTEGER (elt);
586 if (registry == Mnil)
588 pl = mplist_add (pl, registry, resize);
595 M17N_OBJECT_UNREF (size_adjust_list);
599 /** Return a font encoding (and repertory) of FONT. */
601 static MFontEncoding *
602 find_encoding (MFont *font)
604 MSymbol registry = FONT_PROPERTY (font, MFONT_REGISTRY);
605 MFontEncoding *encoding = NULL;
608 if (! font_encoding_list)
609 load_font_encoding_table ();
610 if (! MPLIST_TAIL_P (font_encoding_list))
613 plist = font_encoding_list;
614 while (registry ? (plist = mplist_find_by_key (plist, registry))
617 encoding = (MFontEncoding *) MPLIST_VAL (plist);
618 if (mfont__match_p (font, &encoding->spec, MFONT_ADSTYLE))
620 if (! encoding->encoding_charset)
621 encoding->encoding_charset
622 = MCHARSET (encoding->encoding_name);
623 if (! encoding->encoding_charset)
628 if (encoding->repertory_name == encoding->encoding_name)
629 encoding->repertory_charset = encoding->encoding_charset;
630 else if (encoding->repertory_name != Mnil)
632 encoding->repertory_charset
633 = MCHARSET (encoding->repertory_name);
634 if (! encoding->repertory_charset)
643 plist = MPLIST_NEXT (plist);
645 if (registry == Mnil || registry == Mt)
649 return &default_encoding;
652 /* XLFD parser/generator */
654 /** Indices to each field of split font name. */
670 XLFD_REGISTRY, /* This contains ENCODING. */
676 xlfd_parse_name (char *name, MFont *font)
678 char *field[XLFD_FIELD_MAX];
679 unsigned short size, resy;
680 MSymbol attrs[MFONT_PROPERTY_MAX];
689 for (i = 1, p = copy, name++; *name; p++, name++)
694 && i < XLFD_FIELD_MAX)
697 if (field[i - 1][0] == '*')
702 *p = tolower (*name);
705 if (field[i - 1][0] == '*')
707 while (i < XLFD_FIELD_MAX)
710 resy = field[XLFD_RESY] ? atoi (field[XLFD_RESY]) : 0;
711 if (! field[XLFD_PIXEL])
712 size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0;
713 else if (field[XLFD_PIXEL][0] == '[')
715 /* The pixel size field specifies a transformation matrix of the
716 form "[A B C D]". The XLFD spec says that the scalar value N
717 for the pixel size is equivalent to D. */
718 char *p0 = field[XLFD_PIXEL] + 1, *p1;
721 for (i = 0; i < 4; i++, p0 = p1)
722 d = strtod (p0, &p1);
726 size = atoi (field[XLFD_PIXEL]) * 10;
729 = field[XLFD_FOUNDRY] ? msymbol (field[XLFD_FOUNDRY]) : Mnil;
731 = field[XLFD_FAMILY] ? msymbol (field[XLFD_FAMILY]) : Mnil;
733 = field[XLFD_WEIGHT] ? msymbol (field[XLFD_WEIGHT]) : Mnil;
735 = field[XLFD_SLANT] ? msymbol (field[XLFD_SLANT]) : Mnil;
737 = field[XLFD_SWIDTH] ? msymbol (field[XLFD_SWIDTH]) : Mnil;
739 = field[XLFD_ADSTYLE] ? msymbol (field[XLFD_ADSTYLE]) : Mnil;
740 attrs[MFONT_REGISTRY]
741 = field[XLFD_REGISTRY] ? msymbol (field[XLFD_REGISTRY]) : Mnil;
742 mfont__set_spec (font, attrs, size, resy);
747 xlfd_unparse_name (MFont *font)
753 unsigned short size, resy;
755 prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry);
756 prop[1] = (MSymbol) mfont_get_prop (font, Mfamily);
757 prop[2] = (MSymbol) mfont_get_prop (font, Mweight);
758 prop[3] = (MSymbol) mfont_get_prop (font, Mstyle);
759 prop[4] = (MSymbol) mfont_get_prop (font, Mstretch);
760 prop[5] = (MSymbol) mfont_get_prop (font, Madstyle);
761 prop[6] = (MSymbol) mfont_get_prop (font, Mregistry);
762 for (len = 0, i = 0; i < 7; i++)
766 str[i] = msymbol_name (prop[i]);
767 len += strlen (str[i]);
777 + 3 /* 3 asterisks */
778 + 30 /* 3 integers (each 10 digits) */
779 + 1) /* '\0' terminal */
783 size = (int) mfont_get_prop (font, Msize);
787 size = size / 10 + 1;
788 resy = (int) mfont_get_prop (font, Mresolution);
790 sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-*-*-%s",
791 str[0], str[1], str[2], str[3], str[4], str[5],
792 size, resy, resy, str[6]);
793 return strdup (name);
804 Mfoundry = msymbol ("foundry");
805 mfont__property_table[MFONT_FOUNDRY].property = Mfoundry;
806 Mfamily = msymbol ("family");
807 mfont__property_table[MFONT_FAMILY].property = Mfamily;
808 Mweight = msymbol ("weight");
809 mfont__property_table[MFONT_WEIGHT].property = Mweight;
810 Mstyle = msymbol ("style");
811 mfont__property_table[MFONT_STYLE].property = Mstyle;
812 Mstretch = msymbol ("stretch");
813 mfont__property_table[MFONT_STRETCH].property = Mstretch;
814 Madstyle = msymbol ("adstyle");
815 mfont__property_table[MFONT_ADSTYLE].property = Madstyle;
816 Mregistry = msymbol ("registry");
817 mfont__property_table[MFONT_REGISTRY].property = Mregistry;
819 Msize = msymbol ("size");
820 Mresolution = msymbol ("resolution");
822 Mfontconfig = msymbol ("fontconfig");
825 Mfreetype = msymbol ("freetype");
826 Mxft = msymbol ("xft");
828 /* The first entry of each mfont__property_table must be Mnil so
829 that actual properties get positive numeric numbers. */
830 for (i = 0; i <= MFONT_REGISTRY; i++)
832 MLIST_INIT1 (&mfont__property_table[i], names, 8);
833 MLIST_APPEND1 (&mfont__property_table[i], names, Mnil, MERROR_FONT);
836 /* Register predefined font property names. */
837 for (i = 0; i <= MFONT_REGISTRY; i++)
841 for (j = 0; j < font_common_names[i].num; j++)
843 MSymbol sym = msymbol (font_common_names[i].names[j]);
847 if (msymbol_put (sym, mfont__property_table[i].property,
848 (void *) (j + 1)) < 0)
850 MLIST_APPEND1 (&mfont__property_table[i], names, sym, MERROR_FONT);
854 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
855 of a score is a flag for a scalable font (see the documentation
857 i = FONT_SCORE_PRIORITY_SIZE - 1;
858 for (shift = 1; i >= 0; i--)
860 font_score_shift_bits[font_score_priority[i]] = shift;
861 if (font_score_priority[i] == MFONT_SIZE)
867 MFONT_INIT (&default_encoding.spec);
868 default_encoding.encoding_name = Mnil;
869 default_encoding.encoding_charset = NULL;
870 default_encoding.repertory_name = Mnil;
871 default_encoding.repertory_charset = NULL;
876 mfont_freetype_path = mplist ();
877 bufsize = strlen (M17NDIR) + 7;
878 buf = alloca (bufsize);
879 sprintf (buf, "%s/fonts", M17NDIR);
880 mplist_add (mfont_freetype_path, Mstring, strdup (buf));
881 path = getenv ("M17NDIR");
884 i = strlen (path) + 7;
887 sprintf (buf, "%s/fonts", path);
888 mplist_push (mfont_freetype_path, Mstring, strdup (buf));
893 if (mfont__ft_init () < 0)
895 #endif /* HAVE_FREETYPE */
896 if (mfont__flt_init () < 0)
911 #endif /* HAVE_FREETYPE */
913 MPLIST_DO (plist, mfont_freetype_path)
914 free (MPLIST_VAL (plist));
915 M17N_OBJECT_UNREF (mfont_freetype_path);
917 if (font_resize_list)
919 MPLIST_DO (plist, font_resize_list)
920 free (MPLIST_VAL (plist));
921 M17N_OBJECT_UNREF (font_resize_list);
922 font_resize_list = NULL;
924 if (font_encoding_list)
926 MPLIST_DO (plist, font_encoding_list)
927 free (MPLIST_VAL (plist));
928 M17N_OBJECT_UNREF (font_encoding_list);
929 font_encoding_list = NULL;
931 for (i = 0; i <= MFONT_REGISTRY; i++)
932 MLIST_FREE1 (&mfont__property_table[i], names);
936 mfont__free_realized (MRealizedFont *rfont)
938 M17N_OBJECT_UNREF (rfont->info);
943 /* Compare FONT with REQUEST and return how much they differs. If
944 FONT does not match with SPEC, return -1. */
947 mfont__score (MFont *font, MFont *spec, MFont *request, int limited_size)
950 int i = FONT_SCORE_PRIORITY_SIZE;
954 enum MFontProperty prop = font_score_priority[i];
956 if (request->property[prop] != 0)
960 if (spec->property[prop] && font->property[prop]
961 && font->property[prop] != spec->property[prop])
963 if (font->property[prop])
964 val = abs (font->property[prop] - request->property[prop]);
965 if (val && prop <= MFONT_FAMILY)
967 if (prop == MFONT_SIZE)
969 if (font->property[MFONT_RESY] == 0)
970 /* This is a scalable font. We prefer a bitmap font
971 if the size matches exactly. */
974 score |= (val << font_score_shift_bits[MFONT_SIZE]
975 | ((limited_size && val > 0) ? 0x400000 : 0));
978 score |= (val > 3 ? 3 : val) << font_score_shift_bits[prop];
985 /** Return 1 iff FONT matches SPEC. */
988 mfont__match_p (MFont *font, MFont *spec, int prop)
990 for (; prop >= 0; prop--)
991 if (spec->property[prop] && font->property[prop]
992 && font->property[prop] != spec->property[prop])
999 mfont__set_spec_from_face (MFont *spec, MFace *face)
1003 for (i = 0; i <= MFONT_ADSTYLE; i++)
1004 mfont__set_property (spec, i, face->property[i]);
1005 /* The value 1 is "iso8859-1". */
1006 spec->property[MFONT_REGISTRY] = 1;
1007 spec->property[MFONT_SIZE] = (int) (face->property[MFACE_SIZE]);
1008 spec->property[MFONT_RESY] = 0;
1013 mfont__set_spec_from_plist (MFont *spec, MPlist *plist)
1016 MSymbol spec_list[MFONT_REGISTRY + 1];
1020 memset (spec_list, 0, sizeof spec_list);
1021 for (i = 0; ! MPLIST_TAIL_P (plist); i++, plist = MPLIST_NEXT (plist))
1023 if (! MPLIST_SYMBOL_P (plist))
1024 MERROR (MERROR_FONT, Mnil);
1025 spec_list[i] = MPLIST_SYMBOL (plist);
1027 registry = spec_list[i - 1];
1028 mfont__set_property (spec, MFONT_REGISTRY, registry);
1029 for (i -= 2; i >= 0; i--)
1030 mfont__set_property (spec, i, spec_list[i]);
1035 mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size,
1038 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1040 MRealizedFont *best;
1042 int mdebug_mask = MDEBUG_FONT;
1044 if (registry == Mnil)
1047 MPLIST_DO (plist, frame->realized_font_list)
1049 best = MPLIST_VAL (plist);
1050 if (MPLIST_KEY (plist) == registry
1051 && ! memcmp (&best->spec, spec, sizeof (MFont))
1052 && ! memcmp (&best->request, request, sizeof (MFont)))
1054 if (best->layouter != layouter)
1056 MRealizedFont *copy;
1058 MSTRUCT_MALLOC (copy, MERROR_FONT);
1060 copy->layouter = layouter;
1061 mplist_add (frame->realized_font_list, registry, copy);
1063 M17N_OBJECT_REF (copy->info);
1070 MDEBUG_PUSH_TIME ();
1072 MPLIST_DO (plist, frame->font_driver_list)
1074 MFontDriver *driver = MPLIST_VAL (plist);
1076 = (driver->select) (frame, spec, request, limited_size);
1080 this->driver = driver;
1082 || this->score < best->score)
1085 mfont__free_realized (best);
1087 if (this->score == 0)
1091 mfont__free_realized (this);
1095 if (mdebug__flag & mdebug_mask)
1097 char buf1[256], buf2[256];
1100 for (i = 0; i < MFONT_PROPERTY_MAX; i++)
1101 if (! font.property[i])
1102 font.property[i] = request->property[i];
1103 gen_font_name (buf2, &font);
1106 MDEBUG_PRINT_TIME ("FONT",
1107 (stderr, " to select <%s> (%x)from <%s>.",
1108 gen_font_name (buf1, &best->font),
1112 MDEBUG_PRINT_TIME ("FONT", (stderr, " to fail to find <%s>.", buf2));
1118 best->layouter = layouter;
1119 mplist_add (frame->realized_font_list, registry, best);
1124 /** Open a font specified in RFONT. Return 0 if successfully
1125 opened, otherwise return -1. */
1128 mfont__open (MRealizedFont *rfont)
1130 return (rfont->driver->open) (rfont);
1134 mfont__resize (MFont *spec, MFont *request)
1136 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1137 MFontResize *resize;
1140 if (! font_resize_list)
1141 load_font_resize_table ();
1142 if (! MPLIST_TAIL_P (font_resize_list))
1145 plist = font_resize_list;
1146 while (registry ? (plist = mplist_find_by_key (plist, registry))
1149 resize = (MFontResize *) MPLIST_VAL (plist);
1150 if (mfont__match_p (spec, &resize->spec, MFONT_ADSTYLE))
1152 request->property[MFONT_SIZE]
1153 = request->property[MFONT_SIZE] * resize->resize / 100;
1156 plist = MPLIST_NEXT (plist);
1166 mfont__encode_char (MRealizedFont *rfont, int c)
1168 MFontEncoding *encoding;
1171 if (rfont->layouter != Mnil)
1172 return mfont__flt_encode_char (rfont->layouter, c);
1173 if (! rfont->encoding)
1174 rfont->encoding = find_encoding (&rfont->font);
1175 encoding = rfont->encoding;
1176 if (! encoding->encoding_charset)
1177 return MCHAR_INVALID_CODE;
1178 if (encoding->repertory_charset
1179 && ENCODE_CHAR (encoding->repertory_charset, c) == MCHAR_INVALID_CODE)
1180 return MCHAR_INVALID_CODE;
1181 code = ENCODE_CHAR (encoding->encoding_charset, c);
1182 if (code == MCHAR_INVALID_CODE)
1183 return MCHAR_INVALID_CODE;
1184 return (rfont->driver->encode_char) (rfont, code);
1188 mfont__get_metric (MGlyphString *gstring, int from, int to)
1190 MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
1191 MRealizedFont *rfont = from_g->rface->rfont;
1193 for (g = from_g; g != to_g; g++)
1194 if (g->rface->rfont != rfont)
1196 int idx = GLYPH_INDEX (g);
1198 (rfont->driver->find_metric) (rfont, gstring, from, idx);
1200 rfont = g->rface->rfont;
1203 (rfont->driver->find_metric) (rfont, gstring, from, GLYPH_INDEX (g));
1208 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1216 numeric = FONT_PROPERTY_NUMERIC (val, key);
1219 numeric = mfont__property_table[key].used;
1220 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1221 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1224 font->property[key] = numeric;
1228 mfont__set_spec (MFont *font, MSymbol *attrs,
1229 unsigned short size, unsigned short resy)
1233 for (i = 0; i <= MFONT_REGISTRY; i++)
1234 mfont__set_property (font, i, attrs[i]);
1235 font->property[MFONT_SIZE] = size;
1236 font->property[MFONT_RESY] = resy;
1240 mfont__parse_name_into_font (char *name, MSymbol format, MFont *font)
1244 if (format == Mx || format == Mnil)
1245 result = xlfd_parse_name (name, font);
1246 #ifdef HAVE_FONTCONFIG
1247 if (format == Mfontconfig || (! result && format == Mnil))
1248 result = mfont__ft_parse_name (name, font);
1254 mfont__encoding_list (void)
1256 if (! font_encoding_list)
1257 load_font_encoding_table ();
1258 return font_encoding_list;
1262 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1268 /*** @addtogroup m17nFont */
1272 /***en @name Variables: Keys of font property. */
1273 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1278 @brief Key of font property specifying foundry.
1280 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1281 is used as a key of font property and face property. The property
1282 value must be a symbol whose name is a foundry name of a font. */
1284 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1286 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1287 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1288 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1294 @brief Key of font property specifying family.
1296 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1297 used as a key of font property and face property. The property
1298 value must be a symbol whose name is a family name of a font. */
1300 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1302 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1303 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1304 ¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1310 @brief Key of font property specifying weight.
1312 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1313 used as a key of font property and face property. The property
1314 value must be a symbol whose name is a weight name of a font (e.g
1315 "medium", "bold"). */
1317 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1319 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1320 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1321 ¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç
1328 @brief Key of font property specifying style.
1330 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
1331 used as a key of font property and face property. The property
1332 value must be a symbol whose name is a style name of a font (e.g
1335 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1337 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1338 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1339 ¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç
1346 @brief Key of font property specifying stretch.
1348 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
1349 is used as a key of font property and face property. The property
1350 value must be a symbol whose name is a stretch name of a font (e.g
1351 "normal", "condensed"). */
1353 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1355 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1356 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1357 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý
1358 ¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1364 @brief Key of font property specifying additional style.
1366 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
1367 is used as a key of font property and face property. The property
1368 value must be a symbol whose name is an additional style name of a
1369 font (e.g "serif", "", "sans"). */
1371 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1373 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1374 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1375 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý
1376 ¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1382 @brief Key of font property specifying registry.
1384 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
1385 and is used as a key of font property. The property value must be
1386 a symbol whose name is a registry name a font registry
1387 (e.g. "iso8859-1", "jisx0208.1983-0"). */
1389 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1391 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó
1392 ¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©
1393 ¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0" Åù) ¤ò̾Á°¤È¤·
1394 ¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1400 @brief Key of font property specifying size.
1402 The variable #Msize is a symbol of name <tt>"size"</tt> and is
1403 used as a key of font property and face property. The property
1404 value must be an integer specifying a font design size in the unit
1405 of 1/10 point (on 100 dpi display). */
1407 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1409 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©
1410 ¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1411 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10 ¥Ý¥¤¥ó
1412 ¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1418 @brief Key of font property specifying resolution.
1420 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
1421 is used as a key of font property and face property. The property
1422 value must be an integer to specifying a font resolution in the
1423 unit of dots per inch (dpi). */
1425 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1427 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü
1428 ¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é
1429 ¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ô
1430 ÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1433 MSymbol Mresolution;
1436 @brief Symobl of name "fontconfig".
1438 The variable #Mfontconfig is to be used as an argument of the
1439 functions mfont_parse_name () and mfont_unparse_name (). */
1441 MSymbol Mfontconfig;
1444 @brief Symbol of name "x".
1446 The variable #Mx is to be used for a value of <type> member of the
1447 structure #MDrawGlyph to specify the type of <fontp> member is
1448 actually (XFontStruct *). */
1453 @brief Symbol of name "freetype".
1455 The variable #Mfreetype is to be used for a value of <type> member
1456 of the structure #MDrawGlyph to specify the type of <fontp> member
1457 is actually FT_Face. */
1462 @brief Symbol of name "xft".
1464 The variable #Mxft is to be used for a value of <type> member of the
1465 structure #MDrawGlyph to specify the type of <fontp> member
1466 is actually (XftFont *). */
1475 @brief List of font files and directories that contain font files.
1477 The variable @c mfont_freetype_path is a plist of FreeType font
1478 files and directories that contain FreeType font files. Key of
1479 the element is @c Mstring, and the value is a string that
1480 represents a font file or a directory.
1482 The macro M17N_INIT () sets up this variable to contain the
1483 sub-directory "fonts" of the m17n database and the environment
1484 variable "M17NDIR". The first call of mframe () creates the
1485 internal list of the actually available fonts from this variable.
1486 Thus, an application program, if necessary, must modify the
1487 variable before calling mframe (). If it is going to add a new
1488 element, value must be a string that can be safely freed.
1490 If the m17n library is not configured to use the FreeType library,
1491 this variable is not used. */
1493 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
1495 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë
1496 ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring ¤Ç¤¢
1497 ¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
1499 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ
1500 ¿ô "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
1501 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©
1502 ¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢
1503 mframe () ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê
1504 ¤¤¡£¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó
1505 ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1507 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì
1508 ¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
1510 MPlist *mfont_freetype_path;
1515 @brief Create a new font.
1517 The mfont () function creates a new font object that has no
1521 This function returns a pointer to the created font object. */
1523 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
1525 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯
1529 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
1536 MSTRUCT_CALLOC (font, MERROR_FONT);
1543 @brief Create a font by parsing a fontname.
1545 The mfont_parse_name () function creates a new font object. The
1546 properties are extracted fontname $NAME.
1548 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
1549 is parsed as XLFD (X Logical Font Description). If $FORMAT is
1550 #Mfontconfig, $NAME is parsed as Fontconfig's textual
1551 representation of font. If $FORMAT is #Mnil, $NAME is at first
1552 parsed as XLFD, and it it fails, parsed as Fontconfig's
1556 If the operation was successful, this function returns a pointer
1557 to the created font. Otherwise it returns @c NULL. */
1560 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
1562 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾ $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ
1563 ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
1565 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
1566 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
1567 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig ¤Î¥Õ¥©¥ó¥È¥Æ¥
1568 ¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD ¤Ë
1569 ½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
1572 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name () ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î
1573 ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1576 mfont_parse_name (char *name, MSymbol format)
1578 MFont template, *font;
1580 MFONT_INIT (&template);
1581 if (mfont__parse_name_into_font (name, format, &template) < 0)
1582 MERROR (MERROR_FONT, NULL);
1583 MSTRUCT_CALLOC (font, MERROR_FONT);
1591 @brief Create a fontname from a font.
1593 The mfont_unparse_name () function creates a fontname string
1594 from font $FONT according to $FORMAT.
1596 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
1597 is in XLFD (X Logical Font Description) format. If it is
1598 #Mfontconfig, the fontname is in the style of Fontconfig's text
1602 This function returns a newly allocated fontname string, which is
1603 not freed unless the user explicitly does so by free (). */
1606 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
1608 ´Ø¿ô mfont_unparse_name () ¤Ï $FORMAT ¤Ë¤·¤¿¤¬¤Ã¤¿¥Õ¥©¥ó¥È̾¤Îʸ»ú
1609 Îó¤ò¥Õ¥©¥ó¥È$FONT ¤ò¸µ¤Ëºî¤ë¡£
1611 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£#Mx ¤Ê¤é¤Ð¥Õ¥©
1612 ¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£#Mfontconfig ¤Ê
1613 ¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
1616 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢
1617 ¥æ¡¼¥¶¤¬ free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
1620 mfont_unparse_name (MFont *font, MSymbol format)
1625 name = xlfd_unparse_name (font);
1626 #ifdef HAVE_FONTCONFIG
1627 else if (format == Mfontconfig)
1628 name = mfont__ft_unparse_name (font);
1631 MERROR (MERROR_FONT, NULL);
1638 @brief Make a copy of a font.
1640 The mfont_copy () function returns a new copy of font $FONT. */
1642 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
1644 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
1647 mfont_copy (MFont *font)
1651 MSTRUCT_MALLOC (copy, MERROR_FONT);
1659 @brief Get a property value of a font.
1661 The mfont_get_prop () function gets the value of $KEY property of
1662 font $FONT. $KEY must be one of the following symbols:
1664 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1665 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1668 If $KEY is @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
1669 Madstyle, or @c Mregistry, this function returns the
1670 corresponding value as a symbol. If the font does not have $KEY
1671 property, it returns @c Mnil.
1672 If $KEY is @c Msize or @c Mresolution, this function returns the
1673 corresponding value as an integer. If the font does not have $KEY
1674 property, it returns 0.
1675 If $KEY is something else, it returns @c NULL and assigns an error
1676 code to the external variable #merror_code. */
1679 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
1681 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
1682 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
1685 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1686 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1689 $KEY ¤¬ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
1690 Madstyle, @c Mregistry ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È
1691 ¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï @c Mnil ¤òÊÖ¤¹¡£
1692 $KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò
1693 ¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤ò
1695 $KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
1696 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
1699 mfont_get_prop (MFont *font, MSymbol key)
1701 if (key == Mfoundry)
1702 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
1704 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
1706 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
1708 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
1709 if (key == Mstretch)
1710 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
1711 if (key == Madstyle)
1712 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
1713 if (key == Mregistry)
1714 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
1717 int size = font->property[MFONT_SIZE];
1718 return (void *) size;
1720 if (key == Mresolution)
1722 int resy = font->property[MFONT_RESY];
1723 return (void *) resy;
1726 MERROR (MERROR_FONT, NULL);
1732 @brief Put a property value to a font.
1734 The mfont_put_prop () function puts a font property whose key is
1735 $KEY and value is $VAL to font $FONT. $KEY must be one of the
1738 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1739 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1741 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
1742 Otherwise, $VAL must be a symbol. */
1744 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
1746 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í
1747 ¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢
1750 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1751 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1753 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ
1754 ¤Ï¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
1757 mfont_put_prop (MFont *font, MSymbol key, void *val)
1759 if (key == Mfoundry)
1760 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
1761 else if (key == Mfamily)
1762 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
1763 else if (key == Mweight)
1764 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
1765 else if (key == Mstyle)
1766 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
1767 else if (key == Mstretch)
1768 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
1769 else if (key == Madstyle)
1770 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
1771 else if (key == Mregistry)
1772 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
1773 else if (key == Msize)
1775 unsigned size = (unsigned) val;
1776 font->property[MFONT_SIZE] = size;
1778 else if (key == Mresolution)
1780 unsigned resy = (unsigned) val;
1781 font->property[MFONT_RESY] = resy;
1784 MERROR (MERROR_FONT, -1);
1791 @brief Return the font selection priority.
1793 The mfont_selection_priority () function returns a newly created
1794 array of six symbols. The elements are the following
1795 keys of font properties ordered by priority.
1797 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1798 @c Madstyle, @c Msize.
1800 The m17n library selects the best matching font according to the
1801 order of this array. A font that has a different value for a
1802 property of lower priority is preferred to a font that has a
1803 different value for a property of higher priority. */
1805 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÊÖ¤¹.
1807 ´Ø¿ô mfont_selection_priority () ¤Ï6¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã
1808 ¤ÆÊÖ¤¹¡£ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤ËÊÂ
1811 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1812 @c Madstyle, @c Msize.
1814 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
1815 Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬°ã¤¦¥Õ¥©¥ó¥È¤ÈÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤Î
1816 Ãͤ¬°ã¤¦¥Õ¥©¥ó¥È¤¬¤¢¤ë¾ì¹ç¡¢Á°¼Ô¤¬ÁªÂò¤µ¤ì¤ë¡£
1820 mfont_selection_priority ()
1825 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
1826 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
1828 enum MFontProperty prop = font_score_priority[i];
1830 if (prop == MFONT_SIZE)
1832 else if (prop == MFONT_ADSTYLE)
1834 else if (prop == MFONT_FAMILY)
1836 else if (prop == MFONT_WEIGHT)
1838 else if (prop == MFONT_STYLE)
1840 else if (prop == MFONT_STRETCH)
1851 @brief Set the font selection priority.
1853 The mfont_set_selection_priority () function sets font selection
1854 priority according to $KEYS, which is an array of six symbols.
1855 Each element must be one of the below. No two elements must be
1858 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1859 @c Madstyle, @c Msize.
1861 See the documentation of the function mfont_selection_priority ()
1864 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
1866 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
1867 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£³ÆÍ×ÁǤϰʲ¼¤Î¤¦¤Á¤Î¤É¤ì
1868 ¤«¤Ç¤¢¤ê¡¢Á´¤Æ°Û¤Ê¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1870 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1871 @c Madstyle, @c Msize.
1873 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
1877 mfont_set_selection_priority (MSymbol *keys)
1879 int priority[FONT_SCORE_PRIORITY_SIZE];
1882 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
1884 enum MFontProperty prop;
1888 else if (*keys == Madstyle)
1889 prop = MFONT_ADSTYLE;
1890 else if (*keys == Mfamily)
1891 prop = MFONT_FAMILY;
1892 else if (*keys == Mweight)
1893 prop = MFONT_WEIGHT;
1894 else if (*keys == Mstyle)
1896 else if (*keys == Mstretch)
1897 prop = MFONT_STRETCH;
1898 else if (*keys == Mfoundry)
1899 prop = MFONT_FOUNDRY;
1901 /* Invalid element. */
1903 for (j = 0; j < i; j++)
1904 if (priority[j] == prop)
1905 /* Duplicated element. */
1909 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
1910 font_score_priority[i] = priority[i];
1919 The mfont_find () function returns a pointer to the available font
1920 that matches best the specification $SPEC on frame $FRAME.
1922 $SCORE, if not NULL, must point to a place to store the score
1923 value that indicates how well the found font matches to $SPEC. The
1924 smaller score means a better match. */
1926 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
1928 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC ¤Ë¤â¤Ã
1929 ¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
1931 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC ¤Ë¤É¤ì¤Û¤É¹ç¤Ã
1932 ¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¥¹¥³¥¢¤¬¾®¤µ
1933 ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
1937 mfont_find (MFrame *frame, MFont *spec, int *score, int limited_size)
1940 MRealizedFont *rfont;
1942 MFONT_INIT (&spec_copy);
1943 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
1945 rfont = mfont__select (frame, &spec_copy, spec, limited_size, Mnil);
1949 *score = rfont->score;
1950 return &rfont->font;
1955 @brief Set encoding of a font.
1957 The mfont_set_encoding () function sets the encoding information
1960 $ENCODING_NAME is a symbol representing a charset that has the
1961 same encoding as the font.
1963 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
1964 has the same repertory as the font. If it is @c Mnil, whether a
1965 specific character is supported by the font is asked to each font
1969 If the operation was successful, this function returns 0.
1970 Otherwise it returns -1 and assigns an error code to the external
1971 variable #merror_code. */
1973 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
1975 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó
1978 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò
1979 ¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
1981 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó
1982 ¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£@c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ
1983 »ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤Ë
1987 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°
1988 ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
1992 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
1994 MCharset *encoding_charset = MCHARSET (encoding_name);
1995 MCharset *repertory_charset;
1997 MFontEncoding *encoding;
2000 if (! encoding_charset)
2001 MERROR (MERROR_FONT, -1);
2002 if (repertory_name != Mnil)
2004 repertory_charset = MCHARSET (repertory_name);
2005 if (! repertory_charset)
2006 MERROR (MERROR_FONT, -1);
2009 repertory_charset = NULL;
2011 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2012 encoding->spec = *font;
2013 encoding->encoding_name = encoding_name;
2014 encoding->encoding_charset = encoding_charset;
2015 encoding->repertory_name = repertory_name;
2016 encoding->repertory_charset = repertory_charset;
2017 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2018 if (registry == Mnil)
2020 if (! font_encoding_list)
2021 load_font_encoding_table ();
2022 mplist_push (font_encoding_list, registry, encoding);
2023 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2024 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2036 @brief Create a fontname from a font.
2038 This function is obsolete. Use mfont_unparse_name instead. */
2040 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2042 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2045 mfont_name (MFont *font)
2047 return mfont_unparse_name (font, Mx);
2053 @brief Create a new font from fontname.
2055 This function is obsolete. Use mfont_parse_name () instead. */
2058 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2060 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2063 mfont_from_name (char *name)
2065 return mfont_parse_name (name, Mx);
2071 @brief Get resize information of a font.
2073 The mfont_resize_ratio () function lookups the m17n database
2074 \<font, reisize\> and returns a resizing ratio (in percentage) of
2075 FONT. For instance, if the return value is 150, that means that
2076 the m17n library uses an 1.5 time bigger font than a specified
2080 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2082 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\> ¤ò¸¡
2083 º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë¤òÊÖ¤¹¡£Î㤨
2084 ¤ÐÊÖÃͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5 ÇܤÎ
2085 ¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2088 mfont_resize_ratio (MFont *font)
2090 MFont request = *font;
2092 mfont__resize (font, &request);
2093 return (font->property[MFONT_SIZE] * 100 / request.property[MFONT_SIZE]);
2099 @brief Get a list fonts.
2101 The mfont_list () functions returns a list of fonts available on
2102 frame $FRAME. If $FONT is not nil, it limits fonts to ones that
2103 matchq with $FONT. If $LANGUAGE is not @c Mnil, it limits fonts
2104 to ones that support $LANGUAGE.
2107 This function returns a plist whose keys are family name and
2108 values are pointers to the object MFont. The plist must be freed
2109 by m17n_object_unref (). */
2112 mfont_list (MFrame *frame, MFont *font, MSymbol language)
2114 MPlist *plist = mplist (), *p;
2116 MPLIST_DO (p, frame->font_driver_list)
2118 MFontDriver *driver = MPLIST_VAL (p);
2120 (driver->list) (frame, plist, font, language);
2127 /*** @addtogroup m17nDebug */
2134 The mdebug_dump_font () function prints font $FONT in a human readable
2138 This function returns $FONT. */
2140 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
2142 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr ¤Ë¿Í´Ö¤Ë²ÄÆɤÊ
2146 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
2149 mdebug_dump_font (MFont *font)
2153 name = mfont_unparse_name (font, Mx);
2156 fprintf (stderr, "%s", name);
2163 mdebug_dump_font_list (MFrame *frame, MSymbol family)
2168 plist = mfont_list (frame, NULL, Mnil);
2174 mfont__set_property (&font, MFONT_FAMILY, family);
2175 plist = mfont_list (frame, &font, Mnil);
2177 MPLIST_DO (p, plist)
2179 mdebug_dump_font (MPLIST_VAL (p));
2180 fprintf (stderr, "\n");
2182 M17N_OBJECT_UNREF (plist);