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;
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 if (! field[XLFD_PIXEL])
714 size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0;
715 else if (field[XLFD_PIXEL][0] == '[')
717 /* The pixel size field specifies a transformation matrix of the
718 form "[A B C D]". The XLFD spec says that the scalar value N
719 for the pixel size is equivalent to D. */
720 char *p0 = field[XLFD_PIXEL] + 1, *p1;
723 for (i = 0; i < 4; i++, p0 = p1)
724 d = strtod (p0, &p1);
728 size = atoi (field[XLFD_PIXEL]) * 10;
731 = field[XLFD_FOUNDRY] ? msymbol (field[XLFD_FOUNDRY]) : Mnil;
733 = field[XLFD_FAMILY] ? msymbol (field[XLFD_FAMILY]) : Mnil;
735 = field[XLFD_WEIGHT] ? msymbol (field[XLFD_WEIGHT]) : Mnil;
737 = field[XLFD_SLANT] ? msymbol (field[XLFD_SLANT]) : Mnil;
739 = field[XLFD_SWIDTH] ? msymbol (field[XLFD_SWIDTH]) : Mnil;
741 = field[XLFD_ADSTYLE] ? msymbol (field[XLFD_ADSTYLE]) : Mnil;
742 attrs[MFONT_REGISTRY]
743 = field[XLFD_REGISTRY] ? msymbol (field[XLFD_REGISTRY]) : Mnil;
744 mfont__set_spec (font, attrs, size, resy);
749 xlfd_unparse_name (MFont *font)
755 unsigned short size, resy;
757 prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry);
758 prop[1] = (MSymbol) mfont_get_prop (font, Mfamily);
759 prop[2] = (MSymbol) mfont_get_prop (font, Mweight);
760 prop[3] = (MSymbol) mfont_get_prop (font, Mstyle);
761 prop[4] = (MSymbol) mfont_get_prop (font, Mstretch);
762 prop[5] = (MSymbol) mfont_get_prop (font, Madstyle);
763 prop[6] = (MSymbol) mfont_get_prop (font, Mregistry);
764 for (len = 0, i = 0; i < 7; i++)
768 str[i] = msymbol_name (prop[i]);
769 len += strlen (str[i]);
779 + 3 /* 3 asterisks */
780 + 30 /* 3 integers (each 10 digits) */
781 + 1) /* '\0' terminal */
785 size = (int) mfont_get_prop (font, Msize);
789 size = size / 10 + 1;
790 resy = (int) mfont_get_prop (font, Mresolution);
792 sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-*-*-%s",
793 str[0], str[1], str[2], str[3], str[4], str[5],
794 size, resy, resy, str[6]);
795 return strdup (name);
806 Mfoundry = msymbol ("foundry");
807 mfont__property_table[MFONT_FOUNDRY].property = Mfoundry;
808 Mfamily = msymbol ("family");
809 mfont__property_table[MFONT_FAMILY].property = Mfamily;
810 Mweight = msymbol ("weight");
811 mfont__property_table[MFONT_WEIGHT].property = Mweight;
812 Mstyle = msymbol ("style");
813 mfont__property_table[MFONT_STYLE].property = Mstyle;
814 Mstretch = msymbol ("stretch");
815 mfont__property_table[MFONT_STRETCH].property = Mstretch;
816 Madstyle = msymbol ("adstyle");
817 mfont__property_table[MFONT_ADSTYLE].property = Madstyle;
818 Mregistry = msymbol ("registry");
819 mfont__property_table[MFONT_REGISTRY].property = Mregistry;
821 Msize = msymbol ("size");
822 Mresolution = msymbol ("resolution");
824 Mfontconfig = msymbol ("fontconfig");
827 Mfreetype = msymbol ("freetype");
828 Mxft = msymbol ("xft");
830 /* The first entry of each mfont__property_table must be Mnil so
831 that actual properties get positive numeric numbers. */
832 for (i = 0; i <= MFONT_REGISTRY; i++)
834 MLIST_INIT1 (&mfont__property_table[i], names, 8);
835 MLIST_APPEND1 (&mfont__property_table[i], names, Mnil, MERROR_FONT);
838 /* Register predefined font property names. */
839 for (i = 0; i <= MFONT_REGISTRY; i++)
843 for (j = 0; j < font_common_names[i].num; j++)
845 MSymbol sym = msymbol (font_common_names[i].names[j]);
849 if (msymbol_put (sym, mfont__property_table[i].property,
850 (void *) (j + 1)) < 0)
852 MLIST_APPEND1 (&mfont__property_table[i], names, sym, MERROR_FONT);
856 /* Here, SHIFT starts from 1, not 0. This is because the lowest bit
857 of a score is a flag for a scalable font (see the documentation
859 i = FONT_SCORE_PRIORITY_SIZE - 1;
860 for (shift = 1; i >= 0; i--)
862 font_score_shift_bits[font_score_priority[i]] = shift;
863 if (font_score_priority[i] == MFONT_SIZE)
869 MFONT_INIT (&default_encoding.spec);
870 default_encoding.encoding_name = Mnil;
871 default_encoding.encoding_charset = NULL;
872 default_encoding.repertory_name = Mnil;
873 default_encoding.repertory_charset = NULL;
878 mfont_freetype_path = mplist ();
879 bufsize = strlen (M17NDIR) + 7;
880 buf = alloca (bufsize);
881 sprintf (buf, "%s/fonts", M17NDIR);
882 mplist_add (mfont_freetype_path, Mstring, strdup (buf));
883 path = getenv ("M17NDIR");
886 i = strlen (path) + 7;
889 sprintf (buf, "%s/fonts", path);
890 mplist_push (mfont_freetype_path, Mstring, strdup (buf));
895 if (mfont__ft_init () < 0)
897 #endif /* HAVE_FREETYPE */
898 if (mfont__flt_init () < 0)
913 #endif /* HAVE_FREETYPE */
915 MPLIST_DO (plist, mfont_freetype_path)
916 free (MPLIST_VAL (plist));
917 M17N_OBJECT_UNREF (mfont_freetype_path);
919 if (font_resize_list)
921 MPLIST_DO (plist, font_resize_list)
922 free (MPLIST_VAL (plist));
923 M17N_OBJECT_UNREF (font_resize_list);
924 font_resize_list = NULL;
926 if (font_encoding_list)
928 MPLIST_DO (plist, font_encoding_list)
929 free (MPLIST_VAL (plist));
930 M17N_OBJECT_UNREF (font_encoding_list);
931 font_encoding_list = NULL;
933 for (i = 0; i <= MFONT_REGISTRY; i++)
934 MLIST_FREE1 (&mfont__property_table[i], names);
938 mfont__free_realized (MRealizedFont *rfont)
940 M17N_OBJECT_UNREF (rfont->info);
945 /* Compare FONT with REQUEST and return how much they differs. If
946 FONT does not match with SPEC, return -1. */
949 mfont__score (MFont *font, MFont *spec, MFont *request, int limited_size)
952 int i = FONT_SCORE_PRIORITY_SIZE;
956 enum MFontProperty prop = font_score_priority[i];
958 if (request->property[prop] != 0)
962 if (spec->property[prop] && font->property[prop]
963 && font->property[prop] != spec->property[prop])
965 if (font->property[prop])
966 val = abs (font->property[prop] - request->property[prop]);
967 if (val && prop <= MFONT_FAMILY)
969 if (prop == MFONT_SIZE)
971 if (font->property[MFONT_RESY] == 0)
972 /* This is a scalable font. We prefer a bitmap font
973 if the size matches exactly. */
976 score |= (val << font_score_shift_bits[MFONT_SIZE]
977 | ((limited_size && val > 0) ? 0x400000 : 0));
980 score |= (val > 3 ? 3 : val) << font_score_shift_bits[prop];
987 /** Return 1 iff FONT matches SPEC. */
990 mfont__match_p (MFont *font, MFont *spec, int prop)
992 for (; prop >= 0; prop--)
993 if (spec->property[prop] && font->property[prop]
994 && font->property[prop] != spec->property[prop])
1001 mfont__set_spec_from_face (MFont *spec, MFace *face)
1005 for (i = 0; i <= MFONT_ADSTYLE; i++)
1006 mfont__set_property (spec, i, face->property[i]);
1007 /* The value 1 is "iso8859-1". */
1008 spec->property[MFONT_REGISTRY] = 1;
1009 spec->property[MFONT_SIZE] = (int) (face->property[MFACE_SIZE]);
1010 spec->property[MFONT_RESY] = 0;
1015 mfont__set_spec_from_plist (MFont *spec, MPlist *plist)
1018 MSymbol spec_list[MFONT_REGISTRY + 1];
1022 memset (spec_list, 0, sizeof spec_list);
1023 for (i = 0; ! MPLIST_TAIL_P (plist); i++, plist = MPLIST_NEXT (plist))
1025 if (! MPLIST_SYMBOL_P (plist))
1026 MERROR (MERROR_FONT, Mnil);
1027 spec_list[i] = MPLIST_SYMBOL (plist);
1029 registry = spec_list[i - 1];
1030 mfont__set_property (spec, MFONT_REGISTRY, registry);
1031 for (i -= 2; i >= 0; i--)
1032 mfont__set_property (spec, i, spec_list[i]);
1037 mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size,
1040 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1042 MRealizedFont *best;
1044 int mdebug_mask = MDEBUG_FONT;
1046 if (registry == Mnil)
1049 MPLIST_DO (plist, frame->realized_font_list)
1051 best = MPLIST_VAL (plist);
1052 if (MPLIST_KEY (plist) == registry
1053 && ! memcmp (&best->spec, spec, sizeof (MFont))
1054 && ! memcmp (&best->request, request, sizeof (MFont)))
1056 if (best->layouter != layouter)
1058 MRealizedFont *copy;
1060 MSTRUCT_MALLOC (copy, MERROR_FONT);
1062 copy->layouter = layouter;
1063 mplist_add (frame->realized_font_list, registry, copy);
1065 M17N_OBJECT_REF (copy->info);
1072 MDEBUG_PUSH_TIME ();
1074 MPLIST_DO (plist, frame->font_driver_list)
1076 MFontDriver *driver = MPLIST_VAL (plist);
1078 = (driver->select) (frame, spec, request, limited_size);
1082 this->driver = driver;
1084 || this->score < best->score)
1087 mfont__free_realized (best);
1089 if (this->score == 0)
1093 mfont__free_realized (this);
1097 if (mdebug__flag & mdebug_mask)
1099 char buf1[256], buf2[256];
1102 for (i = 0; i < MFONT_PROPERTY_MAX; i++)
1103 if (! font.property[i])
1104 font.property[i] = request->property[i];
1105 gen_font_name (buf2, &font);
1108 MDEBUG_PRINT_TIME ("FONT",
1109 (stderr, " to select <%s> (%x)from <%s>.",
1110 gen_font_name (buf1, &best->font),
1114 MDEBUG_PRINT_TIME ("FONT", (stderr, " to fail to find <%s>.", buf2));
1120 best->layouter = layouter;
1121 mplist_add (frame->realized_font_list, registry, best);
1126 /** Open a font specified in RFONT. Return 0 if successfully
1127 opened, otherwise return -1. */
1130 mfont__open (MRealizedFont *rfont)
1132 return (rfont->driver->open) (rfont);
1136 mfont__resize (MFont *spec, MFont *request)
1138 MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY);
1139 MFontResize *resize;
1142 if (! font_resize_list)
1143 load_font_resize_table ();
1144 if (! MPLIST_TAIL_P (font_resize_list))
1147 plist = font_resize_list;
1148 while (registry ? (plist = mplist_find_by_key (plist, registry))
1151 resize = (MFontResize *) MPLIST_VAL (plist);
1152 if (mfont__match_p (spec, &resize->spec, MFONT_ADSTYLE))
1154 request->property[MFONT_SIZE]
1155 = request->property[MFONT_SIZE] * resize->resize / 100;
1158 plist = MPLIST_NEXT (plist);
1168 mfont__encode_char (MRealizedFont *rfont, int c)
1170 MFontEncoding *encoding;
1173 if (rfont->layouter != Mnil)
1174 return mfont__flt_encode_char (rfont->layouter, c);
1175 if (! rfont->encoding)
1176 rfont->encoding = find_encoding (&rfont->font);
1177 encoding = rfont->encoding;
1178 if (! encoding->encoding_charset)
1179 return MCHAR_INVALID_CODE;
1180 if (encoding->repertory_charset
1181 && ENCODE_CHAR (encoding->repertory_charset, c) == MCHAR_INVALID_CODE)
1182 return MCHAR_INVALID_CODE;
1183 code = ENCODE_CHAR (encoding->encoding_charset, c);
1184 if (code == MCHAR_INVALID_CODE)
1185 return MCHAR_INVALID_CODE;
1186 return (rfont->driver->encode_char) (rfont, code);
1190 mfont__get_metric (MGlyphString *gstring, int from, int to)
1192 MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
1193 MRealizedFont *rfont = from_g->rface->rfont;
1195 for (g = from_g; g != to_g; g++)
1196 if (g->rface->rfont != rfont)
1198 int idx = GLYPH_INDEX (g);
1200 (rfont->driver->find_metric) (rfont, gstring, from, idx);
1202 rfont = g->rface->rfont;
1205 (rfont->driver->find_metric) (rfont, gstring, from, GLYPH_INDEX (g));
1210 mfont__set_property (MFont *font, enum MFontProperty key, MSymbol val)
1218 numeric = FONT_PROPERTY_NUMERIC (val, key);
1221 numeric = mfont__property_table[key].used;
1222 MLIST_APPEND1 (mfont__property_table + key, names, val, MERROR_FONT);
1223 SET_FONT_PROPERTY_NUMERIC (val, key, numeric);
1226 font->property[key] = numeric;
1230 mfont__set_spec (MFont *font, MSymbol *attrs,
1231 unsigned short size, unsigned short resy)
1235 for (i = 0; i <= MFONT_REGISTRY; i++)
1236 mfont__set_property (font, i, attrs[i]);
1237 font->property[MFONT_SIZE] = size;
1238 font->property[MFONT_RESY] = resy;
1242 mfont__parse_name_into_font (char *name, MSymbol format, MFont *font)
1246 if (format == Mx || format == Mnil)
1247 result = xlfd_parse_name (name, font);
1248 #ifdef HAVE_FONTCONFIG
1249 if (format == Mfontconfig || (! result && format == Mnil))
1250 result = mfont__ft_parse_name (name, font);
1256 mfont__encoding_list (void)
1258 if (! font_encoding_list)
1259 load_font_encoding_table ();
1260 return font_encoding_list;
1264 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
1270 /*** @addtogroup m17nFont */
1274 /***en @name Variables: Keys of font property. */
1275 /***ja @name ÊÑ¿ô: ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëÄêµÁºÑ¤ß¥·¥ó¥Ü¥ë */
1280 @brief Key of font property specifying foundry.
1282 The variable #Mfoundry is a symbol of name <tt>"foundry"</tt> and
1283 is used as a key of font property and face property. The property
1284 value must be a symbol whose name is a foundry name of a font. */
1286 @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1288 ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1289 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1290 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1296 @brief Key of font property specifying family.
1298 The variable #Mfamily is a symbol of name <tt>"family"</tt> and is
1299 used as a key of font property and face property. The property
1300 value must be a symbol whose name is a family name of a font. */
1302 @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1304 ÊÑ¿ô #Mfamily ¤Ï <tt>"family"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1305 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1306 ¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1312 @brief Key of font property specifying weight.
1314 The variable #Mweight is a symbol of name <tt>"weight"</tt> and is
1315 used as a key of font property and face property. The property
1316 value must be a symbol whose name is a weight name of a font (e.g
1317 "medium", "bold"). */
1319 @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1321 ÊÑ¿ô #Mweight ¤Ï <tt>"weight"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1322 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1323 ¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç
1330 @brief Key of font property specifying style.
1332 The variable #Mstyle is a symbol of name <tt>"style"</tt> and is
1333 used as a key of font property and face property. The property
1334 value must be a symbol whose name is a style name of a font (e.g
1337 @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1339 ÊÑ¿ô #Mstyle ¤Ï <tt>"style"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢
1340 ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1341 ¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç
1348 @brief Key of font property specifying stretch.
1350 The variable #Mstretch is a symbol of name <tt>"stretch"</tt> and
1351 is used as a key of font property and face property. The property
1352 value must be a symbol whose name is a stretch name of a font (e.g
1353 "normal", "condensed"). */
1355 @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1357 ÊÑ¿ô #Mstretch ¤Ï <tt>"stretch"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1358 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1359 Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý
1360 ¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1366 @brief Key of font property specifying additional style.
1368 The variable #Madstyle is a symbol of name <tt>"adstyle"</tt> and
1369 is used as a key of font property and face property. The property
1370 value must be a symbol whose name is an additional style name of a
1371 font (e.g "serif", "", "sans"). */
1373 @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1375 ÊÑ¿ô #Madstyle ¤Ï <tt>"adstyle"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢
1376 ¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1377 Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý
1378 ¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1384 @brief Key of font property specifying registry.
1386 The variable #Mregistry is a symbol of name <tt>"registry"</tt>
1387 and is used as a key of font property. The property value must be
1388 a symbol whose name is a registry name a font registry
1389 (e.g. "iso8859-1", "jisx0208.1983-0"). */
1391 @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1393 ÊÑ¿ô #Mregistry ¤Ï <tt>"registry"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó
1394 ¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©
1395 ¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0" Åù) ¤ò̾Á°¤È¤·
1396 ¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1402 @brief Key of font property specifying size.
1404 The variable #Msize is a symbol of name <tt>"size"</tt> and is
1405 used as a key of font property and face property. The property
1406 value must be an integer specifying a font design size in the unit
1407 of 1/10 point (on 100 dpi display). */
1409 @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1411 ÊÑ¿ô #Msize ¤Ï <tt>"size"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©
1412 ¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢
1413 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10 ¥Ý¥¤¥ó
1414 ¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1420 @brief Key of font property specifying resolution.
1422 The variable #Mresolution is a symbol of name <tt>"resolution"</tt> and
1423 is used as a key of font property and face property. The property
1424 value must be an integer to specifying a font resolution in the
1425 unit of dots per inch (dpi). */
1427 @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
1429 ÊÑ¿ô #Mresolution ¤Ï <tt>"resolution"</tt> ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü
1430 ¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é
1431 ¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ô
1432 ÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1435 MSymbol Mresolution;
1438 @brief Symobl of name "fontconfig".
1440 The variable #Mfontconfig is to be used as an argument of the
1441 functions mfont_parse_name () and mfont_unparse_name (). */
1443 MSymbol Mfontconfig;
1446 @brief Symbol of name "x".
1448 The variable #Mx is to be used for a value of <type> member of the
1449 structure #MDrawGlyph to specify the type of <fontp> member is
1450 actually (XFontStruct *). */
1455 @brief Symbol of name "freetype".
1457 The variable #Mfreetype is to be used for a value of <type> member
1458 of the structure #MDrawGlyph to specify the type of <fontp> member
1459 is actually FT_Face. */
1464 @brief Symbol of name "xft".
1466 The variable #Mxft is to be used for a value of <type> member of the
1467 structure #MDrawGlyph to specify the type of <fontp> member
1468 is actually (XftFont *). */
1477 @brief List of font files and directories that contain font files.
1479 The variable @c mfont_freetype_path is a plist of FreeType font
1480 files and directories that contain FreeType font files. Key of
1481 the element is @c Mstring, and the value is a string that
1482 represents a font file or a directory.
1484 The macro M17N_INIT () sets up this variable to contain the
1485 sub-directory "fonts" of the m17n database and the environment
1486 variable "M17NDIR". The first call of mframe () creates the
1487 internal list of the actually available fonts from this variable.
1488 Thus, an application program, if necessary, must modify the
1489 variable before calling mframe (). If it is going to add a new
1490 element, value must be a string that can be safely freed.
1492 If the m17n library is not configured to use the FreeType library,
1493 this variable is not used. */
1495 @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È.
1497 ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë
1498 ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ¡¼¤Ï @c Mstring ¤Ç¤¢
1499 ¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£
1501 ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶ÊÑ
1502 ¿ô "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£
1503 mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ¤ë¥Õ¥©
1504 ¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢
1505 mframe () ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê
1506 ¤¤¡£¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤¤ëʸ»úÎó
1507 ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1509 m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì
1510 ¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */
1512 MPlist *mfont_freetype_path;
1517 @brief Create a new font.
1519 The mfont () function creates a new font object that has no
1523 This function returns a pointer to the created font object. */
1525 @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë.
1527 ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯
1531 ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */
1538 MSTRUCT_CALLOC (font, MERROR_FONT);
1545 @brief Create a font by parsing a fontname.
1547 The mfont_parse_name () function creates a new font object. The
1548 properties are extracted fontname $NAME.
1550 $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME
1551 is parsed as XLFD (X Logical Font Description). If $FORMAT is
1552 #Mfontconfig, $NAME is parsed as Fontconfig's textual
1553 representation of font. If $FORMAT is #Mnil, $NAME is at first
1554 parsed as XLFD, and it it fails, parsed as Fontconfig's
1558 If the operation was successful, this function returns a pointer
1559 to the created font. Otherwise it returns @c NULL. */
1562 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
1564 ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾ $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ
1565 ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
1567 $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢
1568 $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
1569 $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig ¤Î¥Õ¥©¥ó¥È¥Æ¥
1570 ¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD ¤Ë
1571 ½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£
1574 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name () ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î
1575 ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
1578 mfont_parse_name (char *name, MSymbol format)
1580 MFont template, *font;
1582 MFONT_INIT (&template);
1583 if (mfont__parse_name_into_font (name, format, &template) < 0)
1584 MERROR (MERROR_FONT, NULL);
1585 MSTRUCT_CALLOC (font, MERROR_FONT);
1593 @brief Create a fontname from a font.
1595 The mfont_unparse_name () function creates a fontname string
1596 from font $FONT according to $FORMAT.
1598 $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname
1599 is in XLFD (X Logical Font Description) format. If it is
1600 #Mfontconfig, the fontname is in the style of Fontconfig's text
1604 This function returns a newly allocated fontname string, which is
1605 not freed unless the user explicitly does so by free (). */
1608 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
1610 ´Ø¿ô mfont_unparse_name () ¤Ï $FORMAT ¤Ë¤·¤¿¤¬¤Ã¤¿¥Õ¥©¥ó¥È̾¤Îʸ»ú
1611 Îó¤ò¥Õ¥©¥ó¥È$FONT ¤ò¸µ¤Ëºî¤ë¡£
1613 $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£#Mx ¤Ê¤é¤Ð¥Õ¥©
1614 ¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£#Mfontconfig ¤Ê
1615 ¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥¥¹¥Èɽ¸½¤Ë½¾¤¦¡£
1618 ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢
1619 ¥æ¡¼¥¶¤¬ free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */
1622 mfont_unparse_name (MFont *font, MSymbol format)
1627 name = xlfd_unparse_name (font);
1628 #ifdef HAVE_FONTCONFIG
1629 else if (format == Mfontconfig)
1630 name = mfont__ft_unparse_name (font);
1633 MERROR (MERROR_FONT, NULL);
1640 @brief Make a copy of a font.
1642 The mfont_copy () function returns a new copy of font $FONT. */
1644 @brief ¥Õ¥©¥ó¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
1646 ´Ø¿ô Mfont_copy () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£ */
1649 mfont_copy (MFont *font)
1653 MSTRUCT_MALLOC (copy, MERROR_FONT);
1661 @brief Get a property value of a font.
1663 The mfont_get_prop () function gets the value of $KEY property of
1664 font $FONT. $KEY must be one of the following symbols:
1666 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1667 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1670 If $KEY is @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
1671 Madstyle, or @c Mregistry, this function returns the
1672 corresponding value as a symbol. If the font does not have $KEY
1673 property, it returns @c Mnil.
1674 If $KEY is @c Msize or @c Mresolution, this function returns the
1675 corresponding value as an integer. If the font does not have $KEY
1676 property, it returns 0.
1677 If $KEY is something else, it returns @c NULL and assigns an error
1678 code to the external variable #merror_code. */
1681 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
1683 ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥¡¼¤¬
1684 $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì
1687 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1688 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1691 $KEY ¤¬ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c
1692 Madstyle, @c Mregistry ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È
1693 ¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï @c Mnil ¤òÊÖ¤¹¡£
1694 $KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò
1695 ¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤ò
1697 $KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô
1698 #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
1701 mfont_get_prop (MFont *font, MSymbol key)
1703 if (key == Mfoundry)
1704 return (void *) FONT_PROPERTY (font, MFONT_FOUNDRY);
1706 return (void *) FONT_PROPERTY (font, MFONT_FAMILY);
1708 return (void *) FONT_PROPERTY (font, MFONT_WEIGHT);
1710 return (void *) FONT_PROPERTY (font, MFONT_STYLE);
1711 if (key == Mstretch)
1712 return (void *) FONT_PROPERTY (font, MFONT_STRETCH);
1713 if (key == Madstyle)
1714 return (void *) FONT_PROPERTY (font, MFONT_ADSTYLE);
1715 if (key == Mregistry)
1716 return (void *) FONT_PROPERTY (font, MFONT_REGISTRY);
1719 int size = font->property[MFONT_SIZE];
1720 return (void *) size;
1722 if (key == Mresolution)
1724 int resy = font->property[MFONT_RESY];
1725 return (void *) resy;
1728 MERROR (MERROR_FONT, NULL);
1734 @brief Put a property value to a font.
1736 The mfont_put_prop () function puts a font property whose key is
1737 $KEY and value is $VAL to font $FONT. $KEY must be one of the
1740 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1741 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1743 If $KEY is @c Msize or @c Mresolution, $VAL must be an integer.
1744 Otherwise, $VAL must be a symbol. */
1746 @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë.
1748 ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í
1749 ¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢
1752 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1753 @c Madstyle, @c Mregistry, @c Msize, @c Mresolution.
1755 $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ
1756 ¤Ï¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
1759 mfont_put_prop (MFont *font, MSymbol key, void *val)
1761 if (key == Mfoundry)
1762 mfont__set_property (font, MFONT_FOUNDRY, (MSymbol) val);
1763 else if (key == Mfamily)
1764 mfont__set_property (font, MFONT_FAMILY, (MSymbol) val);
1765 else if (key == Mweight)
1766 mfont__set_property (font, MFONT_WEIGHT, (MSymbol) val);
1767 else if (key == Mstyle)
1768 mfont__set_property (font, MFONT_STYLE, (MSymbol) val);
1769 else if (key == Mstretch)
1770 mfont__set_property (font, MFONT_STRETCH, (MSymbol) val);
1771 else if (key == Madstyle)
1772 mfont__set_property (font, MFONT_ADSTYLE, (MSymbol) val);
1773 else if (key == Mregistry)
1774 mfont__set_property (font, MFONT_REGISTRY, (MSymbol) val);
1775 else if (key == Msize)
1777 unsigned size = (unsigned) val;
1778 font->property[MFONT_SIZE] = size;
1780 else if (key == Mresolution)
1782 unsigned resy = (unsigned) val;
1783 font->property[MFONT_RESY] = resy;
1786 MERROR (MERROR_FONT, -1);
1793 @brief Return the font selection priority.
1795 The mfont_selection_priority () function returns a newly created
1796 array of six symbols. The elements are the following
1797 keys of font properties ordered by priority.
1799 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1800 @c Madstyle, @c Msize.
1802 The m17n library selects the best matching font according to the
1803 order of this array. A font that has a different value for a
1804 property of lower priority is preferred to a font that has a
1805 different value for a property of higher priority. */
1807 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÊÖ¤¹.
1809 ´Ø¿ô mfont_selection_priority () ¤Ï6¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã
1810 ¤ÆÊÖ¤¹¡£ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤òÍ¥ÀèÅÙ½ç¤ËÊÂ
1813 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1814 @c Madstyle, @c Msize.
1816 m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£
1817 Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬°ã¤¦¥Õ¥©¥ó¥È¤ÈÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤Î
1818 Ãͤ¬°ã¤¦¥Õ¥©¥ó¥È¤¬¤¢¤ë¾ì¹ç¡¢Á°¼Ô¤¬ÁªÂò¤µ¤ì¤ë¡£
1822 mfont_selection_priority ()
1827 MTABLE_MALLOC (keys, FONT_SCORE_PRIORITY_SIZE, MERROR_FONT);
1828 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
1830 enum MFontProperty prop = font_score_priority[i];
1832 if (prop == MFONT_SIZE)
1834 else if (prop == MFONT_ADSTYLE)
1836 else if (prop == MFONT_FAMILY)
1838 else if (prop == MFONT_WEIGHT)
1840 else if (prop == MFONT_STYLE)
1842 else if (prop == MFONT_STRETCH)
1853 @brief Set the font selection priority.
1855 The mfont_set_selection_priority () function sets font selection
1856 priority according to $KEYS, which is an array of six symbols.
1857 Each element must be one of the below. No two elements must be
1860 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1861 @c Madstyle, @c Msize.
1863 See the documentation of the function mfont_selection_priority ()
1866 @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë.
1868 ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS
1869 ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£³ÆÍ×ÁǤϰʲ¼¤Î¤¦¤Á¤Î¤É¤ì
1870 ¤«¤Ç¤¢¤ê¡¢Á´¤Æ°Û¤Ê¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1872 @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
1873 @c Madstyle, @c Msize.
1875 ¾ÜºÙ¤Ï´Ø¿ô mfont_selection_priority () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
1879 mfont_set_selection_priority (MSymbol *keys)
1881 int priority[FONT_SCORE_PRIORITY_SIZE];
1884 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++, keys++)
1886 enum MFontProperty prop;
1890 else if (*keys == Madstyle)
1891 prop = MFONT_ADSTYLE;
1892 else if (*keys == Mfamily)
1893 prop = MFONT_FAMILY;
1894 else if (*keys == Mweight)
1895 prop = MFONT_WEIGHT;
1896 else if (*keys == Mstyle)
1898 else if (*keys == Mstretch)
1899 prop = MFONT_STRETCH;
1900 else if (*keys == Mfoundry)
1901 prop = MFONT_FOUNDRY;
1903 /* Invalid element. */
1905 for (j = 0; j < i; j++)
1906 if (priority[j] == prop)
1907 /* Duplicated element. */
1911 for (i = 0; i < FONT_SCORE_PRIORITY_SIZE; i++)
1912 font_score_priority[i] = priority[i];
1921 The mfont_find () function returns a pointer to the available font
1922 that matches best the specification $SPEC on frame $FRAME.
1924 $SCORE, if not NULL, must point to a place to store the score
1925 value that indicates how well the found font matches to $SPEC. The
1926 smaller score means a better match. */
1928 @brief ¥Õ¥©¥ó¥È¤òõ¤¹.
1930 ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC ¤Ë¤â¤Ã
1931 ¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
1933 $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC ¤Ë¤É¤ì¤Û¤É¹ç¤Ã
1934 ¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¥¹¥³¥¢¤¬¾®¤µ
1935 ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
1939 mfont_find (MFrame *frame, MFont *spec, int *score, int limited_size)
1942 MRealizedFont *rfont;
1944 MFONT_INIT (&spec_copy);
1945 spec_copy.property[MFONT_REGISTRY] = spec->property[MFONT_REGISTRY];
1947 rfont = mfont__select (frame, &spec_copy, spec, limited_size, Mnil);
1951 *score = rfont->score;
1952 return &rfont->font;
1957 @brief Set encoding of a font.
1959 The mfont_set_encoding () function sets the encoding information
1962 $ENCODING_NAME is a symbol representing a charset that has the
1963 same encoding as the font.
1965 $REPERTORY_NAME is @c Mnil or a symbol representing a charset that
1966 has the same repertory as the font. If it is @c Mnil, whether a
1967 specific character is supported by the font is asked to each font
1971 If the operation was successful, this function returns 0.
1972 Otherwise it returns -1 and assigns an error code to the external
1973 variable #merror_code. */
1975 @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë.
1977 ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó
1980 $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò
1981 ¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
1983 $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó
1984 ¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£@c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ
1985 »ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤Ë
1989 ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°
1990 ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */
1994 mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name)
1996 MCharset *encoding_charset = MCHARSET (encoding_name);
1997 MCharset *repertory_charset;
1999 MFontEncoding *encoding;
2002 if (! encoding_charset)
2003 MERROR (MERROR_FONT, -1);
2004 if (repertory_name != Mnil)
2006 repertory_charset = MCHARSET (repertory_name);
2007 if (! repertory_charset)
2008 MERROR (MERROR_FONT, -1);
2011 repertory_charset = NULL;
2013 MSTRUCT_CALLOC (encoding, MERROR_FONT);
2014 encoding->spec = *font;
2015 encoding->encoding_name = encoding_name;
2016 encoding->encoding_charset = encoding_charset;
2017 encoding->repertory_name = repertory_name;
2018 encoding->repertory_charset = repertory_charset;
2019 registry = FONT_PROPERTY (font, MFONT_REGISTRY);
2020 if (registry == Mnil)
2022 if (! font_encoding_list)
2023 load_font_encoding_table ();
2024 mplist_push (font_encoding_list, registry, encoding);
2025 MPLIST_DO (plist, MPLIST_NEXT (font_encoding_list))
2026 if (! memcmp (font, &((MFontEncoding *) MPLIST_VAL (plist))->spec,
2038 @brief Create a fontname from a font.
2040 This function is obsolete. Use mfont_unparse_name instead. */
2042 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2044 ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2047 mfont_name (MFont *font)
2049 return mfont_unparse_name (font, Mx);
2055 @brief Create a new font from fontname.
2057 This function is obsolete. Use mfont_parse_name () instead. */
2060 @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë.
2062 ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */
2065 mfont_from_name (char *name)
2067 return mfont_parse_name (name, Mx);
2073 @brief Get resize information of a font.
2075 The mfont_resize_ratio () function lookups the m17n database
2076 \<font, reisize\> and returns a resizing ratio (in percentage) of
2077 FONT. For instance, if the return value is 150, that means that
2078 the m17n library uses an 1.5 time bigger font than a specified
2082 @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë
2084 ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \<font, reisize\> ¤ò¸¡
2085 º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë¤òÊÖ¤¹¡£Î㤨
2086 ¤ÐÊÖÃͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5 ÇܤÎ
2087 ¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */
2090 mfont_resize_ratio (MFont *font)
2092 MFont request = *font;
2094 mfont__resize (font, &request);
2095 return (font->property[MFONT_SIZE] * 100 / request.property[MFONT_SIZE]);
2101 @brief Get a list fonts.
2103 The mfont_list () functions returns a list of fonts available on
2104 frame $FRAME. $FONT, if not @c Mnil, limits fonts to ones
2105 matching with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to
2106 ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits
2107 the number of fonts.
2110 This function returns a plist whose keys are family names and
2111 values are pointers to the object MFont. The plist must be freed
2112 by m17n_object_unref (). If no font is found, it returns
2116 mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum)
2118 MPlist *plist = mplist (), *p;
2121 MPLIST_DO (p, frame->font_driver_list)
2123 MFontDriver *driver = MPLIST_VAL (p);
2125 num += (driver->list) (frame, plist, font, language,
2126 maxnum > 0 ? maxnum - num : 0);
2127 if (maxnum > 0 && num >= maxnum)
2130 if (MPLIST_TAIL_P (plist))
2132 M17N_OBJECT_UNREF (plist);
2140 /*** @addtogroup m17nDebug */
2147 The mdebug_dump_font () function prints font $FONT in a human readable
2151 This function returns $FONT. */
2153 @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë.
2155 ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr ¤Ë¿Í´Ö¤Ë²ÄÆɤÊ
2159 ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */
2162 mdebug_dump_font (MFont *font)
2166 name = mfont_unparse_name (font, Mx);
2169 fprintf (stderr, "%s", name);
2176 mdebug_dump_font_list (MFrame *frame, MSymbol family, MSymbol lang)
2181 plist = mfont_list (frame, NULL, lang, 0);
2187 mfont__set_property (&font, MFONT_FAMILY, family);
2188 plist = mfont_list (frame, &font, lang, 0);
2190 MPLIST_DO (p, plist)
2192 mdebug_dump_font (MPLIST_VAL (p));
2193 fprintf (stderr, "\n");
2195 M17N_OBJECT_UNREF (plist);