X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Ffont.c;h=0a59172fb534c752fdc3c908972359661e997060;hb=3dbe5210009c5328999362178544d143a8f7b992;hp=e1dc00af530465d47bafb27bd3b9a2bbfb81d7f5;hpb=adc1027ee13940a397f8c520c3ac49be372deb97;p=m17n%2Fm17n-lib.git diff --git a/src/font.c b/src/font.c index e1dc00a..0a59172 100644 --- a/src/font.c +++ b/src/font.c @@ -22,7 +22,7 @@ /***en @addtogroup m17nFont - @brief Font object + @brief Font object. The m17n GUI API represents a font by an object of the type @c MFont. A font can have @e font @e properties. Like other types @@ -33,9 +33,10 @@ @c Madstyle, @c Mregistry, @c Msize, @c Mresolution. When the key of a font property is @c Msize or @c Mresolution, its - value is an integer. Otherwise the value is a symbol. "The font - property that belongs to font F and whose key is @c Mxxx" may be - shortened to "the xxx property of F". + value is an integer. Otherwise the value is a symbol. + + "The font property that belongs to font F and whose key is @c + Mxxx" may be shortened to "the xxx property of F". The value of a foundry property is a symbol representing font foundry information, e.g. adobe, misc, etc. @@ -101,11 +102,15 @@ The m17n library, if configured to use the FreeType library, supports all fonts that can be handled by the FreeType library. - The variable #mfont_freetype_path is initialized properly accoding + The variable #mfont_freetype_path is initialized properly according to the configuration of the m17n library and the environment variable @c M17NDIR. See the documentation of the variable for details. + If the m17n library is configured to use the fontconfig librray, + in addition to #mfont_freetype_path, all fonts available via + fontconfig are supported. + The family name of a FreeType font corresponds to the family property. Style names of FreeType fonts correspond to the weight, style, and stretch properties as below. @@ -123,8 +128,8 @@ Narrow Bold Italic bold i condensed Black black r normal Black Italic black i normal - Oblique medium o normal - BoldOblique bold o normal + Oblique medium o normal + BoldOblique bold o normal @endverbatim Style names not listed in the above table are treated as @@ -167,64 +172,59 @@ /***ja @addtogroup m17nFont - @brief ¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È + @brief ¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È. - m17n GUI API ¤Ï¥Õ¥©¥ó¥È¤ò @c MFont ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æɽ¸½¤¹¤ë¡£ - ¥Õ¥©¥ó¥È¤Ï @e ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£Â¾¤Î¥¿¥¤¥×¤Î - ¥×¥í¥Ñ¥Æ¥£Æ±ÍÍ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¥­¡¼¤ÈÃͤ«¤é¤Ê¤ë¡£¥­¡¼¤Ï°Ê²¼¤Î¥· - ¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£ + m17n GUI API ¤Ï¥Õ¥©¥ó¥È¤ò @c MFont ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æɽ¸½¤¹¤ë¡£¥Õ¥©¥ó¥È¤Ï @e + ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¡£Â¾¤Î¥¿¥¤¥×¤Î¥×¥í¥Ñ¥Æ¥£Æ±ÍÍ¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¥­¡¼¤ÈÃͤ«¤é¤Ê¤ê¡¢¥­¡¼¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c Madstyle, @c Mregistry, @c Msize, @c Mresolution - ¥­¡¼¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¡¢ÃͤÏÀ°¿ôÃͤǤ¢¤ê¡¢ - ¥­¡¼¤¬¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Ãͤϥ·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£¡Ö¥Õ¥©¥ó¥È F ¤Î¥Õ¥©¥ó¥È - ¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥­¡¼¤¬ @c Mxxx ¤Ç¤¢¤ë¤â¤Î¡×¤Î¤³¤È¤ò´Êñ¤Ë¡ÖF ¤Î - xxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£ + ¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution + ¤Î¾ì¹ç¡¢ÃͤÏÀ°¿ôÃͤǤ¢¤ê¡¢¥­¡¼¤¬¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Ãͤϥ·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + + ¡Ö¥Õ¥©¥ó¥È F ¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥­¡¼¤¬ @c Mxxx + ¤Ç¤¢¤ë¤â¤Î¡×¤Î¤³¤È¤ò´Êñ¤Ë¡ÖF ¤Î xxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£ - foundry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢adobe, misc Åù¤Î¥Õ¥©¥ó¥È¤Î³«È¯¸µ¾ðÊó¤ò¼¨ - ¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + foundry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢adobe, misc + Åù¤Î¥Õ¥©¥ó¥È¤Î³«È¯¸µ¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - family ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢times, helvetica Åù¤Î¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤ò - ¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + family ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢times, helvetica + Åù¤Î¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - weight ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, bold Åù¤ÎÂÀ¤µ¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥· - ¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + weight ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, bold Åù¤ÎÂÀ¤µ¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - style ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, italic Åù¤Î·¹¤­¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹ - ¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + style ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, italic + Åù¤Î¥¹¥¿¥¤¥ë¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - stretch ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, semicondensed Åù¤Îʸ»úÉý¤Ë´Ø¤¹¤ë - ¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + stretch ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢normal, semicondensed + Åù¤Îʸ»úÉý¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - adstyle ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢serif, sans-serif Åù¤ÎÃê¾ÝŪ¤Ê¥Õ¥©¥ó¥È¥Õ¥¡ - ¥ß¥ê¡¼¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + adstyle ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢serif, sans-serif + Åù¤ÎÃê¾ÝŪ¤Ê¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - registry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢iso10646, iso8895-1 ¤Î¥ì¥¸¥¹¥È¥ê¾ðÊó¤ò - ¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + registry ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢iso10646, iso8895-1 + Åù¤Î¥ì¥¸¥¹¥È¥ê¾ðÊó¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - size ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤òɽ¤ï¤¹À°¿ôÃͤǤ¢ - ¤ê¡¢Ã±°Ì¤Ï 1/10 ¥Ý¥¤¥ó¥È¤Ç¤¢¤ë¡£ + size ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤òɽ¤ï¤¹À°¿ôÃͤǤ¢¤ê¡¢Ã±°Ì¤Ï + 1/10 ¥Ý¥¤¥ó¥È¤Ç¤¢¤ë¡£ - resolution ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢ÁÛÄꤵ¤ì¤Æ¤¤¤ë¥Ç¥Ð¥¤¥¹¤Î²òÁüÅÙ¤òɽ¤ï - ¤¹À°¿ôÃͤǤ¢¤ê¡¢Ã±°Ì¤Ï dots per inch (dpi) ¤Ç¤¢¤ë¡£ + resolution ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢ÁÛÄꤵ¤ì¤Æ¤¤¤ë¥Ç¥Ð¥¤¥¹¤Î²òÁüÅÙ¤òɽ¤ï¤¹À°¿ôÃͤǤ¢¤ê¡¢Ã±°Ì¤Ï + dots per inch (dpi) ¤Ç¤¢¤ë¡£ - m17n ¥é¥¤¥Ö¥é¥ê¤Ï¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò£²¤Ä¤ÎÌÜŪ¤ÇÍѤ¤¤Æ¤¤¤ë¡£¥¢ - ¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¥Õ¥©¥ó¥È¤Î»ØÄê¤ò¼õ¤±¼è¤ëÌÜŪ¤È¡¢¥¢¥×¥ê - ¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤òÄ󼨤¹¤ëÌÜŪ¤Ç¤¢¤ë¡£¥¢¥× - ¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÂФ·¤ÆÄ󼨤ò¹Ô¤¦ºÝ¤Ë¤Ï¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£ - ¤Ï¤¹¤Ù¤Æ¶ñÂÎŪ¤ÊÃͤò»ý¤Ä¡£ + m17n ¥é¥¤¥Ö¥é¥ê¤Ï¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤ò£²¤Ä¤ÎÌÜŪ¤ÇÍѤ¤¤Æ¤¤¤ë¡£ + ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¥Õ¥©¥ó¥È¤Î»ØÄê¤ò¼õ¤±¼è¤ëÌÜŪ¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤òÄ󼨤¹¤ëÌÜŪ¤Ç¤¢¤ë¡£ + ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤ËÂФ·¤ÆÄ󼨤ò¹Ô¤¦ºÝ¤Ë¤Ï¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Ï¤¹¤Ù¤Æ¶ñÂÎŪ¤ÊÃͤò»ý¤Ä¡£ - m17n ¥é¥¤¥Ö¥é¥ê¤ÏWindow ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È¡¢FreeType¥Õ¥©¥ó¥È¡¢ + m17n ¥é¥¤¥Ö¥é¥ê¤Ï Window ¥·¥¹¥Æ¥à¥Õ¥©¥ó¥È¡¢FreeType¥Õ¥©¥ó¥È¡¢ OpenType¥Õ¥©¥ó¥È¤Î£³¼ïÎà¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£ @@ -327,7 +330,7 @@ #include "font.h" #include "face.h" -MFontDriver *mfont__driver_list[MFONT_TYPE_MAX]; +MPlist *mfont__driver_list; /** Indices to font properties sorted by their priority. */ static int font_score_priority[] = @@ -365,9 +368,9 @@ static char *common_weight[] = "light", "demilight", "book", + "regular", "normal", "medium", - "regular", "demibold", "bold", "extrabold", @@ -376,7 +379,9 @@ static char *common_weight[] = static char *common_style[] = { "o", "i", + "slanted", "r", + "rslanted", "ri", "ro" }; static char *common_stretch[] = @@ -517,8 +522,9 @@ load_font_encoding_table () encoding->repertory_name = MPLIST_SYMBOL (elt); if (registry == Mnil) - registry = Mt; - pl = mplist_add (pl, registry, encoding); + mplist_push (font_encoding_list, Mt, encoding); + else + pl = mplist_add (pl, registry, encoding); continue; warning: @@ -599,48 +605,196 @@ find_encoding (MFont *font) if (! font_encoding_list) load_font_encoding_table (); - if (! MPLIST_TAIL_P (font_encoding_list)) - while (1) - { - plist = font_encoding_list; - while (registry ? (plist = mplist_find_by_key (plist, registry)) - : plist) - { - encoding = (MFontEncoding *) MPLIST_VAL (plist); - if (mfont__match_p (font, &encoding->spec, MFONT_ADSTYLE)) - { - if (! encoding->encoding_charset) - encoding->encoding_charset - = MCHARSET (encoding->encoding_name); - if (! encoding->encoding_charset) - { - mplist_pop (plist); - continue; - } - if (encoding->repertory_name == encoding->encoding_name) - encoding->repertory_charset = encoding->encoding_charset; - else if (encoding->repertory_name != Mnil) - { - encoding->repertory_charset - = MCHARSET (encoding->repertory_name); - if (! encoding->repertory_charset) - { - mplist_pop (plist); - continue; - } - } - return encoding; - } - else - plist = MPLIST_NEXT (plist); - } - if (registry == Mnil || registry == Mt) - break; - registry = Mt; - } + plist = font_encoding_list; + while (! MPLIST_TAIL_P (plist)) + { + encoding = (MFontEncoding *) MPLIST_VAL (plist); + if (mfont__match_p (font, &encoding->spec, MFONT_REGISTRY)) + { + if (encoding->encoding_name != Mnil + && ! encoding->encoding_charset) + { + encoding->encoding_charset = MCHARSET (encoding->encoding_name); + if (! encoding->encoding_charset) + { + mplist_pop (plist); + continue; + } + } + if (encoding->repertory_name == encoding->encoding_name) + encoding->repertory_charset = encoding->encoding_charset; + else if (encoding->repertory_name != Mnil) + { + encoding->repertory_charset + = MCHARSET (encoding->repertory_name); + if (! encoding->repertory_charset) + { + mplist_pop (plist); + continue; + } + } + return encoding; + } + + if (registry && MPLIST_KEY (plist) != Mt) + { + plist = mplist_find_by_key (plist, registry); + if (! plist) + break; + } + else + plist = MPLIST_NEXT (plist); + } return &default_encoding; } +/* XLFD parser/generator */ + +/** Indices to each field of split font name. */ + +enum xlfd_field_idx + { + XLFD_FOUNDRY, + XLFD_FAMILY, + XLFD_WEIGHT, + XLFD_SLANT, + XLFD_SWIDTH, + XLFD_ADSTYLE, + XLFD_PIXEL, + XLFD_POINT, + XLFD_RESX, + XLFD_RESY, + XLFD_SPACING, + XLFD_AVGWIDTH, + XLFD_REGISTRY, /* This contains ENCODING. */ + /* anchor */ + XLFD_FIELD_MAX + }; + +static int +xlfd_parse_name (char *name, MFont *font) +{ + char *field[XLFD_FIELD_MAX]; + unsigned short size, resy, avgwidth; + MSymbol attrs[MFONT_PROPERTY_MAX]; + char copy[513]; + int i; + char *p; + + if (name[0] != '-') + return -1; + + field[0] = copy; + for (i = 1, p = copy, name++; *name; p++, name++) + { + if (p - copy > 512) + return -1; + if (*name == '-' + && i < XLFD_FIELD_MAX) + { + *p = '\0'; + if (field[i - 1][0] == '*') + field[i - 1] = NULL; + field[i++] = p + 1; + } + else + *p = tolower (*name); + } + *p = '\0'; + if (field[i - 1][0] == '*') + field[i - 1] = NULL; + while (i < XLFD_FIELD_MAX) + field[i++] = NULL; + + resy = field[XLFD_RESY] ? atoi (field[XLFD_RESY]) : 0; + avgwidth = ((field[XLFD_AVGWIDTH] && isdigit (field[XLFD_AVGWIDTH][0])) + ? atoi (field[XLFD_AVGWIDTH]) : 1); + if (! avgwidth) + size = 0; + else if (! field[XLFD_PIXEL]) + size = field[XLFD_POINT] ? atoi (field[XLFD_POINT]) * resy / 72 : 0; + else if (field[XLFD_PIXEL][0] == '[') + { + /* The pixel size field specifies a transformation matrix of the + form "[A B C D]". The XLFD spec says that the scalar value N + for the pixel size is equivalent to D. */ + char *p0 = field[XLFD_PIXEL] + 1, *p1; + double d; + + for (i = 0; i < 4; i++, p0 = p1) + d = strtod (p0, &p1); + size = d * 10; + } + else + size = atoi (field[XLFD_PIXEL]) * 10; + + attrs[MFONT_FOUNDRY] + = field[XLFD_FOUNDRY] ? msymbol (field[XLFD_FOUNDRY]) : Mnil; + attrs[MFONT_FAMILY] + = field[XLFD_FAMILY] ? msymbol (field[XLFD_FAMILY]) : Mnil; + attrs[MFONT_WEIGHT] + = field[XLFD_WEIGHT] ? msymbol (field[XLFD_WEIGHT]) : Mnil; + attrs[MFONT_STYLE] + = field[XLFD_SLANT] ? msymbol (field[XLFD_SLANT]) : Mnil; + attrs[MFONT_STRETCH] + = field[XLFD_SWIDTH] ? msymbol (field[XLFD_SWIDTH]) : Mnil; + attrs[MFONT_ADSTYLE] + = field[XLFD_ADSTYLE] ? msymbol (field[XLFD_ADSTYLE]) : Mnil; + attrs[MFONT_REGISTRY] + = field[XLFD_REGISTRY] ? msymbol (field[XLFD_REGISTRY]) : Mnil; + mfont__set_spec (font, attrs, size, resy); + return 0; +} + +static char * +xlfd_unparse_name (MFont *font) +{ + MSymbol prop[7]; + char name[513]; + char *str[7]; + int len, i; + unsigned short size, resy; + + prop[0] = (MSymbol) mfont_get_prop (font, Mfoundry); + prop[1] = (MSymbol) mfont_get_prop (font, Mfamily); + prop[2] = (MSymbol) mfont_get_prop (font, Mweight); + prop[3] = (MSymbol) mfont_get_prop (font, Mstyle); + prop[4] = (MSymbol) mfont_get_prop (font, Mstretch); + prop[5] = (MSymbol) mfont_get_prop (font, Madstyle); + prop[6] = (MSymbol) mfont_get_prop (font, Mregistry); + for (len = 0, i = 0; i < 7; i++) + { + if (prop[i] != Mnil) + { + str[i] = msymbol_name (prop[i]); + len += strlen (str[i]); + } + else + { + str[i] = "*"; + len++; + } + } + if ((len + + 12 /* 12 dashes */ + + 3 /* 3 asterisks */ + + 30 /* 3 integers (each 10 digits) */ + + 1) /* '\0' terminal */ + > 513) + return NULL; + + size = (int) mfont_get_prop (font, Msize); + if ((size % 10) < 5) + size /= 10; + else + size = size / 10 + 1; + resy = (int) mfont_get_prop (font, Mresolution); + + sprintf (name, "-%s-%s-%s-%s-%s-%s-%d-*-%d-%d-*-*-%s", + str[0], str[1], str[2], str[3], str[4], str[5], + size, resy, resy, str[6]); + return strdup (name); +} /* Internal API */ @@ -668,6 +822,12 @@ mfont__init () Msize = msymbol ("size"); Mresolution = msymbol ("resolution"); + Mfontconfig = msymbol ("fontconfig"); + + Mx = msymbol ("x"); + Mfreetype = msymbol ("freetype"); + Mxft = msymbol ("xft"); + /* The first entry of each mfont__property_table must be Mnil so that actual properties get positive numeric numbers. */ for (i = 0; i <= MFONT_REGISTRY; i++) @@ -687,15 +847,13 @@ mfont__init () if (sym == Mnil) return -1; - if (msymbol_put(sym, mfont__property_table[i].property, - (void *) (j + 1)) < 0) + if (msymbol_put (sym, mfont__property_table[i].property, + (void *) (j + 1)) < 0) return -1; MLIST_APPEND1 (&mfont__property_table[i], names, sym, MERROR_FONT); } } - memset (mfont__driver_list, 0, sizeof mfont__driver_list); - /* Here, SHIFT starts from 1, not 0. This is because the lowest bit of a score is a flag for a scalable font (see the documentation of mfont_score). */ @@ -780,8 +938,7 @@ mfont__fini () void mfont__free_realized (MRealizedFont *rfont) { - if (rfont->info) - M17N_OBJECT_UNREF (rfont->info); + M17N_OBJECT_UNREF (rfont->info); free (rfont); } @@ -808,6 +965,8 @@ mfont__score (MFont *font, MFont *spec, MFont *request, int limited_size) return -1; if (font->property[prop]) val = abs (font->property[prop] - request->property[prop]); + if (val && prop <= MFONT_FAMILY) + val = 1; if (prop == MFONT_SIZE) { if (font->property[MFONT_RESY] == 0) @@ -850,7 +1009,6 @@ mfont__set_spec_from_face (MFont *spec, MFace *face) spec->property[MFONT_REGISTRY] = 1; spec->property[MFONT_SIZE] = (int) (face->property[MFACE_SIZE]); spec->property[MFONT_RESY] = 0; - spec->property[MFONT_TYPE] = 0; } @@ -881,19 +1039,18 @@ mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size, MSymbol layouter) { MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY); - MPlist *realized_font_list; - MRealizedFont *best_font[MFONT_TYPE_MAX], *best; - int best_index; + MPlist *plist; + MRealizedFont *best; int i; int mdebug_mask = MDEBUG_FONT; if (registry == Mnil) registry = Mt; - MPLIST_DO (realized_font_list, frame->realized_font_list) + MPLIST_DO (plist, frame->realized_font_list) { - best = MPLIST_VAL (realized_font_list); - if (MPLIST_KEY (realized_font_list) == registry + best = MPLIST_VAL (plist); + if (MPLIST_KEY (plist) == registry && ! memcmp (&best->spec, spec, sizeof (MFont)) && ! memcmp (&best->request, request, sizeof (MFont))) { @@ -904,9 +1061,9 @@ mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size, MSTRUCT_MALLOC (copy, MERROR_FONT); *copy = *best; copy->layouter = layouter; + mplist_add (frame->realized_font_list, registry, copy); if (copy->info) M17N_OBJECT_REF (copy->info); - mplist_add (frame->realized_font_list, registry, copy); best = copy; } return best; @@ -915,25 +1072,27 @@ mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size, MDEBUG_PUSH_TIME (); best = NULL; - best_index = -1; - for (i = 0; i < MFONT_TYPE_MAX; i++) + MPLIST_DO (plist, frame->font_driver_list) { - MFontDriver *driver = mfont__driver_list[i]; - - best_font[i] = (driver - ? (driver->select) (frame, spec, request, limited_size) - : NULL); - if (best_font[i] - && (best_index < 0 - || best_font[best_index]->score < best_font[i]->score)) - best_index = i; - } - for (i = 0; i < MFONT_TYPE_MAX; i++) - { - if (i == best_index) - best = best_font[i]; - else if (best_font[i]) - free (best_font[i]); + MFontDriver *driver = MPLIST_VAL (plist); + MRealizedFont *this + = (driver->select) (frame, spec, request, limited_size); + + if (this) + { + this->driver = driver; + if (! best + || this->score < best->score) + { + if (best) + mfont__free_realized (best); + best = this; + if (this->score == 0) + break; + } + else + mfont__free_realized (this); + } } if (mdebug__flag & mdebug_mask) @@ -948,8 +1107,9 @@ mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size, if (best) MDEBUG_PRINT_TIME ("FONT", - (stderr, " to select <%s> from <%s>.", + (stderr, " to select <%s> (%x)from <%s>.", gen_font_name (buf1, &best->font), + best->score, buf2)); else MDEBUG_PRINT_TIME ("FONT", (stderr, " to fail to find <%s>.", buf2)); @@ -970,39 +1130,10 @@ mfont__select (MFrame *frame, MFont *spec, MFont *request, int limited_size, int mfont__open (MRealizedFont *rfont) { - MPlist *realized_font_list; - MSymbol registry = FONT_PROPERTY (&rfont->font, MFONT_REGISTRY); - - if (rfont->status) - mdebug_hook (); - - MPLIST_DO (realized_font_list, rfont->frame->realized_font_list) - { - MRealizedFont *this_rfont = MPLIST_VAL (realized_font_list); - - if (this_rfont->status != 0 - && MPLIST_KEY (realized_font_list) == registry - && ! memcmp (&this_rfont->font, &rfont->font, sizeof (MFont))) - { - if (rfont->info) - M17N_OBJECT_UNREF (rfont->info); - rfont->info = this_rfont->info; - M17N_OBJECT_REF (this_rfont->info); - rfont->status = this_rfont->status; - return (this_rfont->status > 0 ? 0 : -1); - } - } - return (rfont->driver->open) (rfont); } void -mfont__close (MRealizedFont *rfont) -{ - (rfont->driver->close) (rfont); -} - -void mfont__resize (MFont *spec, MFont *request) { MSymbol registry = FONT_PROPERTY (spec, MFONT_REGISTRY); @@ -1033,24 +1164,6 @@ mfont__resize (MFont *spec, MFont *request) } } -/* Return 1 if C is encodable, 0, if C is not encodable, -1 if it - can't be decided now. */ - -int -mfont__encodable_p (MRealizedFont *rfont, MSymbol layouter_name, int c) -{ - MFontEncoding *encoding; - - if (layouter_name != Mnil) - return (mfont__flt_encode_char (layouter_name, c) - != MCHAR_INVALID_CODE); - if (! rfont->encoding) - rfont->encoding = find_encoding (&rfont->spec); - encoding = rfont->encoding; - if (! encoding->repertory_charset) - return -1; - return (ENCODE_CHAR (encoding->repertory_charset, c) != MCHAR_INVALID_CODE); -} unsigned mfont__encode_char (MRealizedFont *rfont, int c) @@ -1065,14 +1178,13 @@ mfont__encode_char (MRealizedFont *rfont, int c) encoding = rfont->encoding; if (! encoding->encoding_charset) return MCHAR_INVALID_CODE; + if (encoding->repertory_charset + && ENCODE_CHAR (encoding->repertory_charset, c) == MCHAR_INVALID_CODE) + return MCHAR_INVALID_CODE; code = ENCODE_CHAR (encoding->encoding_charset, c); if (code == MCHAR_INVALID_CODE) return MCHAR_INVALID_CODE; - if (! encoding->repertory_charset) - return (rfont->driver->encode_char) (rfont, c, code); - if (ENCODE_CHAR (encoding->repertory_charset, c) == MCHAR_INVALID_CODE) - return MCHAR_INVALID_CODE; - return code; + return (rfont->driver->encode_char) (rfont, code); } void @@ -1127,6 +1239,28 @@ mfont__set_spec (MFont *font, MSymbol *attrs, font->property[MFONT_RESY] = resy; } +int +mfont__parse_name_into_font (char *name, MSymbol format, MFont *font) +{ + int result = -1; + + if (format == Mx || format == Mnil) + result = xlfd_parse_name (name, font); +#ifdef HAVE_FONTCONFIG + if (format == Mfontconfig || (! result && format == Mnil)) + result = mfont__ft_parse_name (name, font); +#endif + return result; +} + +MPlist * +mfont__encoding_list (void) +{ + if (! font_encoding_list) + load_font_encoding_table (); + return font_encoding_list; +} + /*** @} */ #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */ @@ -1144,168 +1278,211 @@ mfont__set_spec (MFont *font, MSymbol *attrs, /*=*/ /***en - @brief Key of font property specifying foundry + @brief Key of font property specifying foundry. The variable #Mfoundry is a symbol of name "foundry" and is used as a key of font property and face property. The property value must be a symbol whose name is a foundry name of a font. */ /***ja - @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "fondry" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È - ¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó - ¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mfoundry ¤Ï "fonudry" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Mfoundry; /***en - @brief Key of font property specifying family + @brief Key of font property specifying family. The variable #Mfamily is a symbol of name "family" and is used as a key of font property and face property. The property value must be a symbol whose name is a family name of a font. */ /***ja - @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ¥Õ¥¡¥ß¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "family" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È - ¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó - ¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mfamily ¤Ï "family" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥Õ¥¡¥ß¥ê̾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Mfamily; /***en - @brief Key of font property specifying weight + @brief Key of font property specifying weight. The variable #Mweight is a symbol of name "weight" and is used as a key of font property and face property. The property value must be a symbol whose name is a weight name of a font (e.g "medium", "bold"). */ /***ja - @brief weight ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ÂÀ¤µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "weight" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È - ¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó - ¥È¤Î weight ̾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê - ¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mweight ¤Ï "weight" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤ÎÂÀ¤µÌ¾ ( "medium", "bold" Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Mweight; /***en - @brief Key of font property specifying style + @brief Key of font property specifying style. The variable #Mstyle is a symbol of name "style" and is used as a key of font property and face property. The property value must be a symbol whose name is a style name of a font (e.g "r", "i", "o"). */ /***ja - @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ¥¹¥¿¥¤¥ë¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "style" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È - ¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥©¥ó - ¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ - ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mstyle ¤Ï "style" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥¹¥¿¥¤¥ë̾ ("r", "i", "o" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Mstyle; /***en - @brief Key of font property specifying stretch + @brief Key of font property specifying stretch. The variable #Mstretch is a symbol of name "stretch" and is used as a key of font property and face property. The property value must be a symbol whose name is a stretch name of a font (e.g "normal", "condensed"). */ /***ja - @brief stretch ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief Éý¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "stretch" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó - ¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥© - ¥ó¥È¤Î stretch ̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó - ¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mstretch ¤Ï "stretch" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Îʸ»úÉý̾ ( "normal", "condensed" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Mstretch; /***en - @brief Key of font property specifying additional style + @brief Key of font property specifying additional style. The variable #Madstyle is a symbol of name "adstyle" and is used as a key of font property and face property. The property value must be a symbol whose name is an additional style name of a font (e.g "serif", "", "sans"). */ /***ja - @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief adstyle ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "adstyle" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó - ¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥© - ¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë - ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Madstyle ¤Ï "adstyle" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Î adstyle ̾("serif", "", "sans" Åù)¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Madstyle; /***en - @brief Key of font property specifying registry + @brief Key of font property specifying registry. The variable #Mregistry is a symbol of name "registry" and is used as a key of font property. The property value must be a symbol whose name is a registry name a font registry (e.g. "iso8859-1", "jisx0208.1983-0"). */ /***ja - @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ¥ì¥¸¥¹¥È¥ê¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "registry" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó - ¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥© - ¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0" Åù) ¤ò̾Á°¤È¤· - ¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mregistry ¤Ï "registry" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Î¥ì¥¸¥¹¥È¥ê̾ ( "iso8859-1", "jisx0208.1983-0" + Åù) ¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */ MSymbol Mregistry; /***en - @brief Key of font property specifying size + @brief Key of font property specifying size. The variable #Msize is a symbol of name "size" and is used as a key of font property and face property. The property value must be an integer specifying a font design size in the unit of 1/10 point (on 100 dpi display). */ /***ja - @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ¥µ¥¤¥º¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "size" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥× - ¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢100 dpi - ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10 ¥Ý¥¤¥ó¥Èñ°Ì¤Ç - ¼¨¤¹À°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + ÊÑ¿ô #Msize ¤Ï "size" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢ + 100 dpi ¤Î¥Ç¥£¥¹¥×¥ì¥¤¾å¤Ç¤Î¥Õ¥©¥ó¥È¤Î¥Ç¥¶¥¤¥ó¥µ¥¤¥º¤ò 1/10 + ¥Ý¥¤¥ó¥Èñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */ MSymbol Msize; /***en - @brief Key of font property specifying resolution + @brief Key of font property specifying resolution. The variable #Mresolution is a symbol of name "resolution" and is used as a key of font property and face property. The property value must be an integer to specifying a font resolution in the unit of dots per inch (dpi). */ /***ja - @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼ + @brief ²òÁüÅÙ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼. - ÊÑ¿ô ¤Ï "resolution" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥© - ¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£Ãͤϡ¢¥Õ¥© - ¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - */ + ÊÑ¿ô #Mresolution ¤Ï "resolution" + ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ + Ãͤϡ¢¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò dots per inch (dpi) ñ°Ì¤Ç¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£ */ MSymbol Mresolution; +/***en + @brief Symbol of name "fontconfig". + + The variable #Mfontconfig is to be used as an argument of the + functions mfont_parse_name () and mfont_unparse_name (). */ +/***ja + @brief "fontconfig" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë. + + ÊÑ¿ô #Mfontconfig ¤Ï´Ø¿ô mfont_parse_name () ¤È mfont_unparse_name () + ¤Î°ú¿ô¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ */ + +MSymbol Mfontconfig; + +/***en + @brief Symbol of name "x". + + The variable #Mx is to be used for a value of member of the + structure #MDrawGlyph to specify the type of member is + actually (XFontStruct *). */ +/***ja + @brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë. + + ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð + ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */ + +MSymbol Mx; + +/***en + @brief Symbol of name "freetype". + + The variable #Mfreetype is to be used for a value of member + of the structure #MDrawGlyph to specify the type of member + is actually FT_Face. */ +/***ja + @brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë. + + ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð + ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */ + +MSymbol Mfreetype; + +/***en + @brief Symbol of name "xft". + + The variable #Mxft is to be used for a value of member of the + structure #MDrawGlyph to specify the type of member + is actually (XftFont *). */ +/***ja + @brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë. + + ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð + ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */ + +MSymbol Mxft; + /*=*/ /*** @} */ /*=*/ /***en - @brief List of font files and directories that contain font files + @brief List of font files and directories that contain font files. The variable @c mfont_freetype_path is a plist of FreeType font files and directories that contain FreeType font files. Key of @@ -1323,29 +1500,27 @@ MSymbol Mresolution; If the m17n library is not configured to use the FreeType library, this variable is not used. */ /***ja - @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È + @brief ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È. - ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë - ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ­¡¼¤Ï @c Mstring ¤Ç¤¢ - ¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£ + ÊÑ¿ô @c mfont_freetype_path ¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤È¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Î + plist ¤Ç¤¢¤ë¡£³ÆÍ×ÁǤΥ­¡¼¤Ï @c Mstring + ¤Ç¤¢¤ê¡¢Ãͤϥե©¥ó¥È¥Õ¥¡¥¤¥ë¤«¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¢¤ë¡£ - ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶­ÊÑ - ¿ô"M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£ - mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ­¤ë¥Õ¥© - ¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢ - mframe () ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê - ¤¤¡£¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤­¤ëʸ»úÎó - ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + ¥Þ¥¯¥í M17N_INIT () ¤Ë¤è¤Ã¤Æ¡¢¤³¤ÎÊÑ¿ô¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤È´Ä¶­ÊÑ¿ô + "M17NDIR" ÁÐÊý¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê "fonts" ¤ò´Þ¤à¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£ + mframe () ¤ÎºÇ½é¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¡¢¤³¤ÎÊÑ¿ô¤«¤é¼ÂºÝ¤Ë»ÈÍѤǤ­¤ë¥Õ¥©¥ó¥È¤ÎÆâÉô¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡£ + ¤½¤³¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢mframe () + ¤ò¸Æ¤ÖÁ°¤Ë¡ÊɬÍפʤé¤Ð¡Ë¤³¤ÎÊÑ¿ô¤òÊѹ¹¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + ¿·¤·¤¤Í×ÁǤòÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÃͤϰÂÁ´¤Ë³«Êü¤Ç¤­¤ëʸ»úÎó¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ - m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì - ¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */ + m17n ¥é¥¤¥Ö¥é¥ê¤¬ FreeType ¥é¥¤¥Ö¥é¥ê¤ò»È¤¦¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤ÎÊÑ¿ô¤ÏÍѤ¤¤é¤ì¤Ê¤¤¡£ */ MPlist *mfont_freetype_path; /*=*/ /***en - @brief Create a new font + @brief Create a new font. The mfont () function creates a new font object that has no property. @@ -1355,8 +1530,7 @@ MPlist *mfont_freetype_path; /***ja @brief ¿·¤·¤¤¥Õ¥©¥ó¥È¤òºî¤ë. - ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯ - ¥È¤òºî¤ë¡£ + ´Ø¿ô mfont () ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥©¥ó¥È¤ò¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£ @return ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ */ @@ -1373,39 +1547,46 @@ mfont () /*=*/ /***en - @brief Create a new font from fontname. + @brief Create a font by parsing a fontname. - The mfont_from_name () function creates a new font object. The + The mfont_parse_name () function creates a new font object. The properties are extracted fontname $NAME. - How to extract properties is window system dependent. The m17n-X - library parses $NAME as XLFD (X Logical Font Description). + $FORMAT specifies the format of $NAME. If $FORMAT is #Mx, $NAME + is parsed as XLFD (X Logical Font Description). If $FORMAT is + #Mfontconfig, $NAME is parsed as Fontconfig's textual + representation of font. If $FORMAT is #Mnil, $NAME is at first + parsed as XLFD, and it it fails, parsed as Fontconfig's + representation. @return If the operation was successful, this function returns a pointer to the created font. Otherwise it returns @c NULL. */ /***ja - @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë + @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë. - ´Ø¿ô mfont_from_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾ $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ - ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£ + ´Ø¿ô mfont_parse_name () ¤Ï¡¢¥Õ¥©¥ó¥È̾ + $NAME ¤«¤é¼è¤ê½Ð¤µ¤ì¤¿¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¡¢¿·¤·¤¤¥Õ¥©¥ó¥È¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£ - ¤É¤Î¤è¤¦¤Ë¥×¥í¥Ñ¥Æ¥£¤ò¼è¤ê½Ð¤¹¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£ - m17n-X ¥é¥¤¥Ö¥é¥ê¤Î¾ì¹ç¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ - $NAME ¤ò²òÀϤ¹¤ë¡£ + $FORMAT ¤Ï $NAME ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤹ¤ë¡£$FORMAT ¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢ + $NAME ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£ + $FORMAT ¤¬ #Mfontconfig ¤Ç¤¢¤ì¤Ð $NAME ¤Ï Fontfonfig + ¤Î¥Õ¥©¥ó¥È¥Æ¥­¥¹¥Èɽ¸½¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£$FORMAT ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¤Þ¤º XLFD + ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¡¢¤½¤ì¤Ë¼ºÇÔ¤·¤¿¤é Fontconfig ¤Ë½¾¤Ã¤Æ²òÀϤµ¤ì¤ë¡£ @return - ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_from_name () ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î - ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */ + ½èÍý¤¬À®¸ù¤¹¤ì¤Ð mfont_parse_name () + ¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */ MFont * -mfont_from_name (char *name) +mfont_parse_name (char *name, MSymbol format) { MFont template, *font; - - if (mwin__parse_font_name (name, &template) < 0) - return NULL; + + MFONT_INIT (&template); + if (mfont__parse_name_into_font (name, format, &template) < 0) + MERROR (MERROR_FONT, NULL); MSTRUCT_CALLOC (font, MERROR_FONT); *font = template; return font; @@ -1414,6 +1595,53 @@ mfont_from_name (char *name) /*=*/ /***en + @brief Create a fontname from a font. + + The mfont_unparse_name () function creates a fontname string + from font $FONT according to $FORMAT. + + $FORMAT must be #Mx or #Mfontconfig. If it is #Mx, the fontname + is in XLFD (X Logical Font Description) format. If it is + #Mfontconfig, the fontname is in the style of Fontconfig's text + representation. + + @return + This function returns a newly allocated fontname string, which is + not freed unless the user explicitly does so by free (). */ + +/***ja + @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë. + + ´Ø¿ô mfont_unparse_name () ¤Ï ¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È $FONT + ¤ò¸µ¤Ë$FORMAT ¤Ë½¾¤Ã¤Æºî¤ë¡£ + + $FORMAT ¤Ï #Mx ¤Þ¤¿¤Ï #Mfontconfig ¤Ç¤¢¤ë¡£ + #Mx ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¡£ + #Mfontconfig ¤Ê¤é¤Ð¥Õ¥©¥ó¥È̾¤Ï Fontconfig ¤Î¥Õ¥©¥ó¥È¥Æ¥­¥¹¥Èɽ¸½¤Ë½¾¤¦¡£ + + @return + ¤³¤Î´Ø¿ô¤Ï¿·¤¿¤Ë¥¢¥í¥±¡¼¥È¤·¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶¤¬ + free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */ + +char * +mfont_unparse_name (MFont *font, MSymbol format) +{ + char *name; + + if (format == Mx) + name = xlfd_unparse_name (font); +#ifdef HAVE_FONTCONFIG + else if (format == Mfontconfig) + name = mfont__ft_unparse_name (font); +#endif + else + MERROR (MERROR_FONT, NULL); + return name; +} + +/*=*/ + +/***en @brief Make a copy of a font. The mfont_copy () function returns a new copy of font $FONT. */ @@ -1435,39 +1663,6 @@ mfont_copy (MFont *font) /*=*/ /***en - @brief Create a fontname from a font. - - The mfont_name () function creates a fontname string created from - font $FONT. - - The syntax of fontname is window system dependent. The m17n-X - library returns a fontname conforming to XLFD (X Logical Font - Description). - - @return - This function returns the created fontname string, which is not freed - unless the user explicitly does so by free (). */ -/***ja - @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë. - - ´Ø¿ô mfont_name () ¤Ï¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤ò¥Õ¥©¥ó¥È - $FONT ¤ò¸µ¤Ëºî¤ë¡£ - - ¥Õ¥©¥ó¥È̾¤Îʸˡ¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£m17n-X ¥é¥¤¥Ö¥é¥ê - ¤Ï XLFD (X Logical Font Description) ¤Ë½¾¤¦¥Õ¥©¥ó¥È̾¤òÊÖ¤¹¡£ - - @return ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È̾¤Îʸ»úÎó¤òÊÖ¤¹¡£Ê¸»úÎó¤Ï¡¢¥æ¡¼¥¶ - ¤¬ free () ¤Ë¤è¤Ã¤ÆÌÀ¼¨Åª¤Ë²òÊü¤·¤Ê¤¤¸Â¤ê²òÊü¤µ¤ì¤Ê¤¤¡£ */ - -char * -mfont_name (MFont *font) -{ - return mwin__build_font_name (font); -} - -/*=*/ - -/***en @brief Get a property value of a font. The mfont_get_prop () function gets the value of $KEY property of @@ -1481,34 +1676,28 @@ mfont_name (MFont *font) Madstyle, or @c Mregistry, this function returns the corresponding value as a symbol. If the font does not have $KEY property, it returns @c Mnil. - If $KEY is @c Msize or @c Mresolution, this function returns the corresponding value as an integer. If the font does not have $KEY property, it returns 0. - If $KEY is something else, it returns @c NULL and assigns an error code to the external variable #merror_code. */ - + /***ja - @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£ÃͤòÆÀ¤ë. + @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë. ´Ø¿ô mfont_get_prop () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¡¢¥­¡¼¤¬ - $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì - ¤Ð¤Ê¤é¤Ê¤¤¡£ + $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c Madstyle, @c Mregistry, @c Msize, @c Mresolution. @return $KEY ¤¬ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c - Madstyle, @c Mregistry ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È - ¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï @c Mnil ¤òÊÖ¤¹¡£ - - $KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò - ¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 ¤ò - ÊÖ¤¹¡£ - - $KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô + Madstyle, @c Mregistry ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£ + ¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï @c Mnil ¤òÊÖ¤¹¡£ + $KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution + ¤Î¾ì¹ç¤Ë¤Ï¡¢ÁêÅö¤¹¤ëÃͤò¤ÏÀ°¿ôÃͤȤ·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤¾ì¹ç¤Ë¤Ï 0 + ¤òÊÖ¤¹¡£$KEY ¤¬¤½¤ì°Ê³°¤Î¤â¤Î¤Ç¤¢¤ì¤Ð¡¢@c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */ void * @@ -1556,18 +1745,17 @@ mfont_get_prop (MFont *font, MSymbol key) If $KEY is @c Msize or @c Mresolution, $VAL must be an integer. Otherwise, $VAL must be a symbol. */ -/***ja - @brief ¥Õ¥©¥ó¥È¤Ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤹ¤ë. + /***ja + @brief ¥Õ¥©¥ó¥È¤Î¥×¥í¥Ñ¥Æ¥£¤ËÃͤòÀßÄꤹ¤ë. - ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥­¡¼¤¬$KEY ¤Ç¤¢¤ë¥×¥í - ¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢ - ¤ë¡£ + ´Ø¿ô mfont_put_prop () ¤Ï¡¢¥Õ¥©¥ó¥È $FONT ¤Î¥­¡¼¤¬$KEY + ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY ¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c Madstyle, @c Mregistry, @c Msize, @c Mresolution. - $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ - ¤Ï¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/ + $KEY ¤¬ @c Msize ¤« @c Mresolution ¤Ç¤¢¤ì¤Ð $VAL + ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï¤é¤Ê¤¤¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢$VAL ¤Ï¥·¥ó¥Ü¥ë¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/ int mfont_put_prop (MFont *font, MSymbol key, void *val) @@ -1618,18 +1806,17 @@ mfont_put_prop (MFont *font, MSymbol key, void *val) property of lower priority is preferred to a font that has a different value for a property of higher priority. */ /***ja - @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÊÖ¤¹. + @brief ¥Õ¥©¥ó¥ÈÁªÂò¤ÎÍ¥ÀèÅÙ¤òÊÖ¤¹. - ´Ø¿ô mfont_selection_priority () ¤Ï6¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã - ¤ÆÊÖ¤¹¡£ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤òÍ¥ÀèÅÙ½ç¤ËÊ - ¤Ù¤¿¤â¤Î¤Ç¤¢¤ë¡£ + ´Ø¿ô mfont_selection_priority () ¤Ï 6 ¤Ä¤Î¥·¥ó¥Ü¥ë¤«¤é¤Ê¤ëÇÛÎó¤òºî¤Ã¤ÆÊÖ¤¹¡£ + ÇÛÎó¤ÎÍ×ÁǤϡ¢°Ê²¼¤Î¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤òÍ¥ÀèÅÙ½ç¤Ëʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c Madstyle, @c Msize. m17n ¥é¥¤¥Ö¥é¥ê¤Ï¤³¤ÎÇÛÎó¤Ë½¾¤Ã¤Æ¡¢ºÇ¤â¹çÃפ¹¤ë¥Õ¥©¥ó¥È¤òÁªÂò¤¹¤ë¡£ - Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬°ã¤¦¥Õ¥©¥ó¥È¤ÈÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤Î - Ãͤ¬°ã¤¦¥Õ¥©¥ó¥È¤¬¤¢¤ë¾ì¹ç¡¢Á°¼Ô¤¬ÁªÂò¤µ¤ì¤ë¡£ + ÌÜŪ¤Î¥Õ¥©¥ó¥È¤È¡¢¤½¤ì¤¾¤ì°ã¤¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¤¬¤¢¤Ã¤¿¾ì¹ç¡¢Í¥ÀèÅÙ¤ÎÄ㤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Ê¤¤¥Õ¥©¥ó¥È¡ÊÍ¥ÀèÅ٤ι⤤¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬¹çÃפ·¤Æ¤¤¤ë¥Õ¥©¥ó¥È¡Ë¤¬ÁªÂò¤µ¤ì¤ë¡£ + */ MSymbol * @@ -1680,8 +1867,8 @@ mfont_selection_priority () @brief ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë. ´Ø¿ô mfont_set_selection_priority () ¤Ï¡¢6¤Ä¤Î¥·¥ó¥Ü¥ë¤ÎÇÛÎó $KEYS - ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£³ÆÍ×ÁǤϰʲ¼¤Î¤¦¤Á¤Î¤É¤ì - ¤«¤Ç¤¢¤ê¡¢Á´¤Æ°Û¤Ê¤Ã¤Æ¤¤¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ + ¤Ë¤·¤¿¤¬¤Ã¤Æ¥Õ¥©¥ó¥ÈÁªÂòÍ¥ÀèÅÙ¤òÀßÄꤹ¤ë¡£ÇÛÎó¤Ï°Ê²¼¤Î³ÆÍ×ÁǤòŬÀÚ + ¤Ê½çÈÖ¤Çʤ٤¿¤â¤Î¤Ç¤¢¤ë¡£ @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch, @c Madstyle, @c Msize. @@ -1736,17 +1923,17 @@ mfont_set_selection_priority (MSymbol *keys) that matches best the specification $SPEC on frame $FRAME. $SCORE, if not NULL, must point to a place to store the score - value that indicates how well the found font matches to $SPEC. A + value that indicates how well the found font matches to $SPEC. The smaller score means a better match. */ /***ja @brief ¥Õ¥©¥ó¥È¤òõ¤¹. - ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC ¤Ë¤â¤Ã - ¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ + ´Ø¿ô mfont_find () ¤Ï¡¢¥Õ¥ì¡¼¥à $FRAME ¾å¤Ç¥Õ¥©¥ó¥ÈÄêµÁ $SPEC + ¤Ë¤â¤Ã¤È¤â¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ - $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC ¤Ë¤É¤ì¤Û¤É¹ç¤Ã - ¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¥¹¥³¥¢¤¬¾®¤µ - ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ + $SCORE ¤Ï NULL ¤Ç¤¢¤ë¤«¡¢¸«¤Ä¤«¤Ã¤¿¥Õ¥©¥ó¥È¤¬ $SPEC + ¤Ë¤É¤ì¤Û¤É¹ç¤Ã¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥¹¥³¥¢¤òÊݸ¤¹¤ë¾ì½ê¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£ + ¥¹¥³¥¢¤¬¾®¤µ¤¤¤Û¤ÉÎɤ¯¹ç¤Ã¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */ MFont * @@ -1784,24 +1971,20 @@ mfont_find (MFrame *frame, MFont *spec, int *score, int limited_size) @return If the operation was successful, this function returns 0. Otherwise it returns -1 and assigns an error code to the external - variable @c merror_code. */ + variable #merror_code. */ /***ja @brief ¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÀßÄꤹ¤ë. - ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó - ¤òÀßÄꤹ¤ë¡£ + ´Ø¿ô mfont_set_encoding () ¤Ï¥Õ¥©¥ó¥È $FONT ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¾ðÊó¤òÀßÄꤹ¤ë¡£ - $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò - ¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + $ENCODING_NAME ¤Ï¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ - $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó - ¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£@c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ - »ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤Ë - Ì䤤¹ç¤ï¤»¤ë¡£ + $REPERTORY_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥Õ¥©¥ó¥È¤ÈƱ¤¸¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ý¤Äʸ»ú¥»¥Ã¥È¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ + @c Mnil ¤Ç¤¢¤ì¤Ð¡¢¸Ä¡¹¤Îʸ»ú¤¬¤½¤Î¥Õ¥©¥ó¥È¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢³Æ¡¹¤Î¥Õ¥©¥ó¥È¥É¥é¥¤¥Ð¤ËÌ䤤¹ç¤ï¤»¤ë¡£ @return - ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³° - ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */ + ½èÍý¤¬À®¸ù¤¹¤ì¤Ð¤³¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô + #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£ */ int @@ -1846,6 +2029,122 @@ mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name) return 0; } +/*=*/ + +/***en + @brief Create a fontname from a font. + + This function is obsolete. Use mfont_unparse_name instead. */ +/***ja + @brief ¥Õ¥©¥ó¥È̾¤«¤é¥Õ¥©¥ó¥È¤òºî¤ë. + + ¤³¤Î´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_unparse_name () ¤ò»ÈÍѤΤ³¤È¡£ */ + +char * +mfont_name (MFont *font) +{ + return mfont_unparse_name (font, Mx); +} + +/*=*/ + +/***en + @brief Create a new font from fontname. + + This function is obsolete. Use mfont_parse_name () instead. */ + +/***ja + @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥©¥ó¥È̾¤òºî¤ë. + + ¤³¤ì¤Ï´Ø¿ô¤ÏÇÑ»ßͽÄê¤Ç¤¢¤ë¡£ mfont_parse_name () ¤ò»ÈÍѤΤ³¤È¡£ */ + +MFont * +mfont_from_name (char *name) +{ + return mfont_parse_name (name, Mx); +} + +/*=*/ + +/***en + @brief Get resize information of a font. + + The mfont_resize_ratio () function lookups the m17n database + \ and returns a resizing ratio (in percentage) of + FONT. For instance, if the return value is 150, that means that + the m17n library uses an 1.5 time bigger font than a specified + size. */ + +/***ja + @brief ¥Õ¥©¥ó¥È¤Î¥ê¥µ¥¤¥º¾ðÊó¤òÆÀ¤ë + + ´Ø¿ô mfont_resize_ratio ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹ \ + ¤ò¸¡º÷¤·¡¢¥Õ¥©¥ó¥È FONT ¤Î¥ê¥µ¥¤¥º¤ÎÈæΨ¡Ê¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸¡Ë + ¤òÊÖ¤¹¡£¤¿¤È¤¨¤ÐÊÖ¤¹Ãͤ¬ 150 ¤Ç¤¢¤ì¤Ð¡¢m17n ¥é¥¤¥Ö¥é¥ê¤Ï»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Î 1.5 + ÇܤΥե©¥ó¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ */ + +int +mfont_resize_ratio (MFont *font) +{ + MFont request = *font; + + mfont__resize (font, &request); + return (font->property[MFONT_SIZE] * 100 / request.property[MFONT_SIZE]); +} + +/*=*/ + +/***en + @brief Get a list of fonts. + + The mfont_list () functions returns a list of fonts available on + frame $FRAME. $FONT, if not @c Mnil, limits fonts to ones + that match with $FONT. $LANGUAGE, if not @c Mnil, limits fonts to + ones that support $LANGUAGE. $MAXNUM, if greater than 0, limits + the number of fonts. + + @return + This function returns a plist whose keys are family names and + values are pointers to the object MFont. The plist must be freed + by m17n_object_unref (). If no font is found, it returns + NULL. */ + +/***ja + @brief ¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÆÀ¤ë + + ´Ø¿ô mfont_list () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤ÇÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£ + $FONT ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$FONT ¤È¹çÃפ¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£ + $LANGUAGE ¤¬ @c Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤ò¥µ¥Ý¡¼¥È¤¹¤ëÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£ + $MAXNUM ¤Ï¡¢0 ¤è¤êÂ礭¤¤¾ì¹ç¤Ë¤Ï¡¢ÊÖ¤¹¥Õ¥©¥ó¥È¤Î¿ô¤Î¾å¸Â¤Ç¤¢¤ë¡£ + + @return + ¤³¤Î´Ø¿ô¤Ï¥­¡¼¤¬¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê̾¤Ç¤¢¤êÃͤ¬ MFont ¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Ê + plist ¤òÊÖ¤¹¡£plist ¤Ï m17n_object_unref () + ¤Ç²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£¥Õ¥©¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL ¤òÊÖ¤¹¡£ */ + +MPlist * +mfont_list (MFrame *frame, MFont *font, MSymbol language, int maxnum) +{ + MPlist *plist = mplist (), *p; + int num = 0; + + MPLIST_DO (p, frame->font_driver_list) + { + MFontDriver *driver = MPLIST_VAL (p); + + num += (driver->list) (frame, plist, font, language, + maxnum > 0 ? maxnum - num : 0); + if (maxnum > 0 && num >= maxnum) + break; + } + if (MPLIST_TAIL_P (plist)) + { + M17N_OBJECT_UNREF (plist); + plist = NULL; + } + return plist; +} + /*** @} */ /*** @addtogroup m17nDebug */ @@ -1853,7 +2152,7 @@ mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name) /*** @{ */ /***en - @brief Dump a font + @brief Dump a font. The mdebug_dump_font () function prints font $FONT in a human readable way to the stderr. @@ -1863,8 +2162,8 @@ mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name) /***ja @brief ¥Õ¥©¥ó¥È¤ò¥À¥ó¥×¤¹¤ë. - ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr ¤Ë¿Í´Ö¤Ë²ÄÆÉ¤Ê - ·Á¤Ç°õºþ¤¹¤ë¡£ + ´Ø¿ô mdebug_dump_font () ¤Ï¥Õ¥©¥ó¥È $FONT ¤ò stderr + ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ @return ¤³¤Î´Ø¿ô¤Ï $FONT ¤òÊÖ¤¹¡£ */ @@ -1872,13 +2171,40 @@ mfont_set_encoding (MFont *font, MSymbol encoding_name, MSymbol repertory_name) MFont * mdebug_dump_font (MFont *font) { - char *name = mwin__build_font_name (font); - - fprintf (stderr, "%s", name); - free (name); + char *name; + + name = mfont_unparse_name (font, Mx); + if (name) + { + fprintf (stderr, "%s", name); + free (name); + } return font; } +void +mdebug_dump_font_list (MFrame *frame, MSymbol family, MSymbol lang) +{ + MPlist *plist, *p; + + if (family == Mnil) + plist = mfont_list (frame, NULL, lang, 0); + else + { + MFont font; + + MFONT_INIT (&font); + mfont__set_property (&font, MFONT_FAMILY, family); + plist = mfont_list (frame, &font, lang, 0); + } + MPLIST_DO (p, plist) + { + mdebug_dump_font (MPLIST_VAL (p)); + fprintf (stderr, "\n"); + } + M17N_OBJECT_UNREF (plist); +} + /*** @} */ /*