(libm17n_core_la_LIBADD): Add THAI_WORDSEG_LD_FLAGS,
[m17n/m17n-lib.git] / src / fontset.c
index f525d68..ea836af 100644 (file)
 
     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ïʸ»ú¤«¤é¥Õ¥©¥ó¥È¤Ø¤ÎÂбþÉÕ¤±¤ò¹Ô¤¦¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
 
-    @e ¥Õ¥©¥ó¥È¥»¥Ã¥È ¤Ï @c MFontset ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£M-text ¤ò
-    É½¼¨¤¹¤ëºÝ¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï M-text Ãæ¤Î¸Ä¡¹¤Îʸ»ú¤ËÂФ·¤Æ¤É¤Î¥Õ¥©
-    ¥ó¥È¤òÍѤ¤¤ë¤«¤Îµ¬Â§¤ò¡¢°Ê²¼¤Î¾ðÊó¤Ë½¾¤Ã¤ÆÍ¿¤¨¤ë¡£
+    @e ¥Õ¥©¥ó¥È¥»¥Ã¥È ¤Ï @c MFontset ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£M-text 
+    ¤Îɽ¼¨¤ÎºÝ¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï°Ê²¼¤Î¾ðÊó¤òÍѤ¤¤Æ M-text 
+    Ãæ¤Î¸Ä¡¹¤Îʸ»ú¤Ë¤É¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤ë¤«·è¤á¤ëµ¬Â§¤òÍ¿¤¨¤ë¡£
 
     @li Ê¸»ú¤Îʸ»ú¥×¥í¥Ñ¥Æ¥£ "¥¹¥¯¥ê¥×¥È"
     @li Ê¸»ú¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ "¸À¸ì"
     @li Ê¸»ú¤Î¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£ "ʸ»ú¥»¥Ã¥È"
 
-    ¤³¤ì¤é¤Î¾ðÊ󤬤ɤΤ褦¤ËÍѤ¤¤é¤ì¤ë¤«¤Ï mdraw_text () ¤ÎÀâÌÀ¤ò»²¾È
-    ¤Î¤³¤È¡£
+    ¤³¤ì¤é¤Î¾ðÊ󤬤ɤΤ褦¤ËÍѤ¤¤é¤ì¤ë¤«¤Ï mdraw_text () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
 
     */
 
@@ -63,6 +62,7 @@
 #include <string.h>
 #include <ctype.h>
 
+#include "config.h"
 #include "m17n-gui.h"
 #include "m17n-misc.h"
 #include "internal.h"
@@ -333,6 +333,96 @@ realize_font_group (MFrame *frame, MFont *request, MPlist *font_group,
     }
 }
 
+static void
+realize_fontset_elements (MFrame *frame, MRealizedFontset *realized,
+                         MFontset *fontset, MFont *request)
+{
+  MPlist *per_script, *per_lang, *per_charset, *font_group;
+  MPlist *plist, *pl;
+
+  realized->fontset = fontset;
+  realized->tick = fontset->tick;
+  realized->spec = *request;
+  realized->frame = frame;
+  realized->per_script = per_script = mplist ();
+  MPLIST_DO (plist, fontset->per_script)
+    {
+      per_lang = mplist ();
+      per_script = mplist_add (per_script, MPLIST_KEY (plist), per_lang);
+      MPLIST_DO (pl, MPLIST_PLIST (plist))
+       {
+         font_group = mplist ();
+         mplist_add (font_group, Mplist, MPLIST_VAL (pl));
+         per_lang = mplist_add (per_lang, MPLIST_KEY (pl), font_group);
+       }
+    }
+
+  realized->per_charset = per_charset = mplist ();
+  MPLIST_DO (plist, fontset->per_charset)
+    {
+      font_group = mplist ();
+      mplist_add (font_group, Mplist, MPLIST_VAL (plist));
+      per_charset = mplist_add (per_charset, MPLIST_KEY (plist), font_group);
+    }
+
+  realized->fallback = mplist ();
+  mplist_add (realized->fallback, Mplist, fontset->fallback);
+
+}
+
+static void
+free_realized_fontset_elements (MRealizedFontset *realized)
+{
+  MPlist *plist, *pl, *p;
+  MRealizedFont *rfont;
+
+  if (realized->per_script)
+    {
+      MPLIST_DO (plist, realized->per_script)
+       {
+         MPLIST_DO (pl, MPLIST_PLIST (plist))
+           {
+             MPLIST_DO (p, MPLIST_PLIST (pl))
+               if ((rfont = MPLIST_VAL (p)) && ! rfont->frame)
+                 free (rfont);
+             p = MPLIST_PLIST (pl);
+             M17N_OBJECT_UNREF (p);
+           }
+         pl = MPLIST_PLIST (plist);
+         M17N_OBJECT_UNREF (pl);
+       }
+      M17N_OBJECT_UNREF (realized->per_script);
+    }
+  if (realized->per_charset)
+    {
+      MPLIST_DO (plist, realized->per_charset)
+       {
+         MPLIST_DO (pl, MPLIST_PLIST (plist))
+           if ((rfont = MPLIST_VAL (pl)) && ! rfont->frame)
+             free (rfont);
+         pl = MPLIST_PLIST (plist);
+         M17N_OBJECT_UNREF (pl);
+       }
+      M17N_OBJECT_UNREF (realized->per_charset);
+    }
+  if (realized->fallback)
+    {
+      MPLIST_DO (plist, realized->fallback)
+       if ((rfont = MPLIST_VAL (plist)) && ! rfont->frame)
+         free (rfont);
+      M17N_OBJECT_UNREF (realized->fallback);
+    }
+}
+
+static void
+update_fontset_elements (MRealizedFontset *realized)
+{
+  free_realized_fontset_elements (realized);
+  realize_fontset_elements (realized->frame, realized, realized->fontset,
+                           &realized->spec);
+}
+
+
 \f
 
 /* Internal API */
@@ -375,8 +465,7 @@ mfont__realize_fontset (MFrame *frame, MFontset *fontset, MFace *face)
 {
   MRealizedFontset *realized;
   MFont request;
-  MPlist *per_script, *per_lang, *per_charset, *font_group;
-  MPlist *plist, *pl, *p;
+  MPlist *plist;
 
   if (fontset->mdb)
     load_fontset_contents (fontset);
@@ -387,43 +476,16 @@ mfont__realize_fontset (MFrame *frame, MFontset *fontset, MFace *face)
       mdebug_hook ();
       request.property[MFONT_SIZE] = 120;
     }
-  MPLIST_DO (p, frame->realized_fontset_list)
+  MPLIST_DO (plist, frame->realized_fontset_list)
     {
-      realized = (MRealizedFontset *) MPLIST_VAL (p);
-      if (fontset->name == MPLIST_KEY (p)
+      realized = (MRealizedFontset *) MPLIST_VAL (plist);
+      if (fontset->name == MPLIST_KEY (plist)
          && ! memcmp (&request, &realized->spec, sizeof (request)))
        return realized;
     }
 
   MSTRUCT_MALLOC (realized, MERROR_FONTSET);
-  realized->fontset = fontset;
-  realized->tick = fontset->tick;
-  realized->spec = request;
-  realized->frame = frame;
-  realized->per_script = per_script = mplist ();
-  MPLIST_DO (plist, fontset->per_script)
-    {
-      per_lang = mplist ();
-      per_script = mplist_add (per_script, MPLIST_KEY (plist), per_lang);
-      MPLIST_DO (pl, MPLIST_PLIST (plist))
-       {
-         font_group = mplist ();
-         mplist_add (font_group, Mplist, MPLIST_VAL (pl));
-         per_lang = mplist_add (per_lang, MPLIST_KEY (pl), font_group);
-       }
-    }
-
-  realized->per_charset = per_charset = mplist ();
-  MPLIST_DO (plist, fontset->per_charset)
-    {
-      font_group = mplist ();
-      mplist_add (font_group, Mplist, MPLIST_VAL (plist));
-      per_charset = mplist_add (per_charset, MPLIST_KEY (plist), font_group);
-    }
-
-  realized->fallback = mplist ();
-  mplist_add (realized->fallback, Mplist, fontset->fallback);
-
+  realize_fontset_elements (frame, realized, fontset, &request);
   mplist_add (frame->realized_fontset_list, fontset->name, realized);
   return realized;
 }
@@ -432,149 +494,163 @@ mfont__realize_fontset (MFrame *frame, MFontset *fontset, MFace *face)
 void
 mfont__free_realized_fontset (MRealizedFontset *realized)
 {
-  MPlist *plist, *pl, *p;
+  free_realized_fontset_elements (realized);
+  free (realized);
+}
+
+
+static MRealizedFont *
+try_font_group (MRealizedFontset *realized,
+               MPlist *font_group, MGlyph *g, int *num, int size)
+{
+  MFrame *frame = realized->frame;
   MRealizedFont *rfont;
+  MPlist *plist;
+  int i;
 
-  if (realized->per_script)
+  if (MPLIST_PLIST_P (font_group))
+    realize_font_group (frame, &realized->spec, font_group, size);
+
+  MPLIST_DO (plist, font_group)
     {
-      MPLIST_DO (plist, realized->per_script)
+      rfont = (MRealizedFont *) MPLIST_VAL (plist);
+      if (rfont->status < 0)
+       continue;
+      /* Check if this font can display all glyphs.  */
+      for (i = 0; i < *num; i++)
        {
-         MPLIST_DO (pl, MPLIST_PLIST (plist))
-           {
-             MPLIST_DO (p, MPLIST_PLIST (pl))
-               if ((rfont = MPLIST_VAL (p)) && ! rfont->frame)
-                 free (rfont);
-             p = MPLIST_PLIST (pl);
-             M17N_OBJECT_UNREF (p);
-           }
-         pl = MPLIST_PLIST (plist);
-         M17N_OBJECT_UNREF (pl);
+         g[i].code = mfont__encode_char (rfont,
+                                         g[i].type == GLYPH_CHAR ? g[i].c
+                                         : ' ');
+         if (g[i].code == MCHAR_INVALID_CODE)
+           break;
        }
-      M17N_OBJECT_UNREF (realized->per_script);
-    }
-  if (realized->per_charset)
-    {
-      MPLIST_DO (plist, realized->per_charset)
+      if (i == *num)
        {
-         MPLIST_DO (pl, MPLIST_PLIST (plist))
-           if ((rfont = MPLIST_VAL (pl)) && ! rfont->frame)
-             free (rfont);
-         pl = MPLIST_PLIST (plist);
-         M17N_OBJECT_UNREF (pl);
+         if (rfont->status > 0
+             || mfont__open (rfont) == 0)
+           /* We found a font that can display all glyphs.  */
+           return rfont;
        }
-      M17N_OBJECT_UNREF (realized->per_charset);
     }
-  if (realized->fallback)
+
+  /* We couldn't find a font that can display all glyphs.  Find one
+     that can display at least the first glyph.  */
+  MPLIST_DO (plist, font_group)
     {
-      MPLIST_DO (plist, realized->fallback)
-       if ((rfont = MPLIST_VAL (plist)) && ! rfont->frame)
-         free (rfont);
-      M17N_OBJECT_UNREF (realized->fallback);
+      rfont = (MRealizedFont *) MPLIST_VAL (plist);
+      if (rfont->status < 0)
+       continue;
+      g->code = mfont__encode_char (rfont,
+                                   g->type == GLYPH_CHAR ? g->c : ' ');
+      if (g->code != MCHAR_INVALID_CODE)
+       {
+         if (rfont->status > 0
+             || mfont__open (rfont) == 0)
+           {
+             /* Ok, let's use this font.  Check how many more
+                characters it supports.  */
+             int i;
+
+             for (i = 1; i < *num; i++)
+               {
+                 g[i].code = mfont__encode_char (rfont,
+                                                 g[i].type == GLYPH_CHAR
+                                                 ? g[i].c : ' ');
+                 if (g[i].code == MCHAR_INVALID_CODE)
+                   break;
+               }
+             *num = i;
+             return rfont;
+           }
+       }
     }
 
-  free (realized);
+  return NULL;
 }
 
-
 MRealizedFont *
 mfont__lookup_fontset (MRealizedFontset *realized, MGlyph *g, int *num,
                       MSymbol script, MSymbol language, MSymbol charset,
                       int size)
 {
-  MFrame *frame = realized->frame;
   MCharset *preferred_charset = (charset == Mnil ? NULL : MCHARSET (charset));
   MPlist *per_charset, *per_script, *per_lang;
-  MPlist *font_groups[256], *plist;
-  int n_font_group = 0;
-  MRealizedFont *rfont;
-  int i;
+  MPlist *plist;
+  MRealizedFont *rfont = NULL;
+
+  if (realized->tick != realized->fontset->tick)
+    update_fontset_elements (realized);
 
   if (preferred_charset
-      && (per_charset = mplist_get (realized->per_charset, charset)) != NULL)
-    font_groups[n_font_group++] = per_charset;
+      && (per_charset = mplist_get (realized->per_charset, charset)) != NULL
+      && (rfont = try_font_group (realized, per_charset, g, num, size)))
+    return rfont;
+
   if (script != Mnil
-      && ((per_script = mplist_find_by_key (realized->per_script, script))
-         != NULL))
+      && (per_script = mplist_get (realized->per_script, script)))
     {
-      /* The first loop is for matching language (if any), and the second
-        loop is for non-matching languages.  */
+      /* We prefer font groups in this order:
+         (1) group matching with LANGUAGE if LANGUAGE is not Mnil
+         (2) group for generic language
+         (3) group not matching with LANGUAGE  */
       if (language == Mnil)
        language = Mt;
-      for (i = 0; i < 2; i++)
+      if ((per_lang = mplist_get (per_script, language))
+         && (rfont = try_font_group (realized, per_lang, g, num, size)))
+       return rfont;
+
+      if (language == Mt)
        {
-         MPLIST_DO (per_lang, MPLIST_PLIST (per_script))
-           if ((MPLIST_KEY (per_lang) == language) != i)
-             font_groups[n_font_group++] = MPLIST_PLIST (per_lang);
+         /* Try the above (3) */
+         MPLIST_DO (plist, per_script)
+           if (MPLIST_KEY (plist) != language
+               && (rfont = try_font_group (realized, MPLIST_PLIST (plist),
+                                           g, num, size)))
+             return rfont;
        }
-    }
-  font_groups[n_font_group++] = realized->fallback;
-
-  if (n_font_group == 1)
-    {
-      /* As we only have a fallback font group, try all the other
-        fonts too.  */
-      MPLIST_DO (per_script, realized->per_script)
-       MPLIST_DO (per_lang, MPLIST_PLIST (per_script))
-         font_groups[n_font_group++] = MPLIST_PLIST (per_lang);
-      MPLIST_DO (per_charset, realized->per_charset)
-       font_groups[n_font_group++] = MPLIST_PLIST (per_charset);
-    }
-
-  for (i = 0; i < n_font_group; i++)
-    {
-      int j;
-      
-      if (MPLIST_PLIST_P (font_groups[i]))
-       realize_font_group (frame, &realized->spec, font_groups[i], size);
-
-      MPLIST_DO (plist, font_groups[i])
-        {
-         rfont = (MRealizedFont *) MPLIST_VAL (plist);
-         if (rfont->status < 0)
-           continue;
-         /* Check if this font can display all glyphs.  */
-         for (j = 0; j < *num; j++)
-           {
-             g[j].code = mfont__encode_char (rfont, g[j].c);
-             if (g[j].code == MCHAR_INVALID_CODE)
-               break;
-           }
-         if (j == *num)
-           {
-             if (rfont->status > 0
-                 || mfont__open (rfont) == 0)
-               /* We found a font that can display all glyphs.  */
-               break;
-           }
+      else
+       {
+         /* At first try the above (2) */
+         if ((per_lang = mplist_get (per_script, Mt))
+             && (rfont = try_font_group (realized, per_lang, g, num, size)))
+           return rfont;
+
+         /* Then try the above (3) */
+         MPLIST_DO (plist, per_script)
+           if (MPLIST_KEY (plist) != language
+               && MPLIST_KEY (plist) != Mt
+               && (rfont = try_font_group (realized, MPLIST_PLIST (plist),
+                                           g, num, size)))
+             return rfont;
        }
-      if (! MPLIST_TAIL_P (plist))
-       break;
     }
 
-  if (i < n_font_group) 
+  if (language != Mnil)
+    /* Find a font group for this language from all scripts.  */
+    MPLIST_DO (plist, realized->per_script)
+      if ((per_lang = mplist_get (MPLIST_PLIST (plist), language))
+         && (rfont = try_font_group (realized, per_lang, g, num, size)))
+       return rfont;
+
+  /* Try fallback fonts.  */
+  if ((rfont = try_font_group (realized, realized->fallback, g, num, size)))
     return rfont;
 
-  /* We couldn't find a font that can display all glyphs.  Find one
-     that can display at least the first glyph.  */
-  for (i = 0; i < n_font_group; i++)
+  /* At last try all fonts.  */
+  MPLIST_DO (per_script, realized->per_script)
     {
-      MPLIST_DO (plist, font_groups[i])
-       {
-         rfont = (MRealizedFont *) MPLIST_VAL (plist);
-         if (rfont->status < 0)
-           continue;
-         g->code = mfont__encode_char (rfont, g->c);
-         if (g->code != MCHAR_INVALID_CODE)
-           {
-             if (rfont->status > 0
-                 || mfont__open (rfont) == 0)
-               break;
-           }
-       }
-      if (! MPLIST_TAIL_P (plist))
-       break;
+      MPLIST_DO (per_lang, MPLIST_PLIST (per_script))
+       if ((rfont = try_font_group (realized, MPLIST_PLIST (per_lang),
+                                    g, num, size)))
+         return rfont;
     }
-  return (i < n_font_group ? rfont : NULL);
+  MPLIST_DO (per_charset, realized->per_charset)
+    if ((rfont = try_font_group (realized, MPLIST_PLIST (per_charset),
+                                g, num, size)))
+      return rfont;
+
+  return NULL;
 }
 
 /*** @} */
@@ -610,18 +686,16 @@ mfont__lookup_fontset (MRealizedFontset *realized, MGlyph *g, int *num,
 /***ja 
     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤òÊÖ¤¹.
 
-    ´Ø¿ô mfontset () ¤Ï̾Á° $NAME ¤ò»ý¤Ä¥Õ¥©¥ó¥È¥»¥Ã¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î
-    ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ $NAME ¤¬ @c NULL ¤Ê¤é¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È¥»¥Ã¥È
-    ¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
+    ´Ø¿ô mfontset () ¤Ï̾Á° $NAME ¤ò»ý¤Ä¥Õ¥©¥ó¥È¥»¥Ã¥È¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£ 
+    $NAME ¤¬ @c NULL ¤Ê¤é¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
 
-    $NAME ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥Õ¥©¥ó¥È¥»¥Ã¥È¤¬¤Ê¤±¤ì¤Ð¡¢¿·¤·¤¤¤â¤Î¤¬ºî¤é¤ì
-    ¤ë¡£¤½¤ÎºÝ¡¢m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë \<@c fontset, $NAME\> ¤È¤¤¤¦¥Ç¡¼¥¿
-    ¤¬¤¢¤ì¤Ð¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï¤½¤Î¥Ç¡¼¥¿¤Ë±è¤Ã¤Æ½é´ü²½¤µ¤ì¤ë¡£¤Ê¤±¤ì¤Ð¡¢
-    ¶õ¤Î¤Þ¤Þ¤Ë¤µ¤ì¤ë¡£
+    $NAME ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥Õ¥©¥ó¥È¥»¥Ã¥È¤¬¤Ê¤±¤ì¤Ð¡¢¿·¤·¤¤¤â¤Î¤¬ºî¤é¤ì¤ë¡£¤½¤ÎºÝ¡¢
+    m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë \<@c fontset, $NAME\> 
+    ¤È¤¤¤¦¥Ç¡¼¥¿¤¬¤¢¤ì¤Ð¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï¤½¤Î¥Ç¡¼¥¿¤Ë±è¤Ã¤Æ½é´ü²½¤µ¤ì¤ë¡£
+    ¤Ê¤±¤ì¤Ð¡¢¶õ¤Î¤Þ¤Þ¤Ë¤µ¤ì¤ë¡£
 
-    ¥Þ¥¯¥í M17N_INIT () ¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¥»¥Ã¥È¤òºî¤ë¡£¥¢¥×¥ê¥±¡¼
-    ¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï mframe () ¤ò½é¤á¤Æ¸Æ¤Ö¤Þ¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È
-    ¥»¥Ã¥È¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
+    ¥Þ¥¯¥í M17N_INIT () ¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¥»¥Ã¥È¤òºî¤ë¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï
+    mframe () ¤ò½é¤á¤Æ¸Æ¤Ö¤Þ¤Ç¤Î´Ö¤Ï¥Ç¥Õ¥©¥ë¥È¥Õ¥©¥ó¥È¥»¥Ã¥È¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
 
     @return
     ¤³¤Î´Ø¿ô¤Ï¸«¤Ä¤«¤Ã¤¿¡¢¤¢¤ë¤¤¤Ïºî¤Ã¤¿¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
@@ -649,6 +723,7 @@ mfontset (char *name)
              fontset->per_script = mplist ();
              fontset->per_charset = mplist ();
              fontset->fallback = mplist ();
+             fontset->font_spec_list = mplist ();
            }
          mplist_put (fontset_list, sym, fontset);
        }
@@ -685,9 +760,9 @@ mfontset_name (MFontset *fontset)
 /***ja
     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î¥³¥Ô¡¼¤òºî¤ë.
 
-    ´Ø¿ô mfontset_copy () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤Î¥³¥Ô¡¼¤òºî¤Ã¤Æ¡¢
-    Ì¾Á° $NAME ¤òÍ¿¤¨¡¢¤½¤Î¥³¥Ô¡¼¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£$NAME ¤Ï´û¸¤Î
-    ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î̾Á°¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤½¤Î¾ì¹ç¤Ë¤Ï¥³¥Ô¡¼¤òºî¤é¤º
+    ´Ø¿ô mfontset_copy () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤Î¥³¥Ô¡¼¤òºî¤Ã¤Æ¡¢Ì¾Á°
+    $NAME ¤òÍ¿¤¨¡¢¤½¤Î¥³¥Ô¡¼¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£$NAME 
+    ¤Ï´û¸¤Î¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î̾Á°¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¥³¥Ô¡¼¤òºî¤é¤º¤Ë
     NULL ¤òÊÖ¤¹¡£  */
 
 MFontset *
@@ -702,6 +777,9 @@ mfontset_copy (MFontset *fontset, char *name)
   M17N_OBJECT (copy, free_fontset, MERROR_FONTSET);
   copy->name = sym;
 
+  if (fontset->mdb)
+    load_fontset_contents (fontset);
+
   if (fontset->per_script)
     {
       copy->per_script = mplist ();
@@ -769,10 +847,10 @@ mfontset_copy (MFontset *fontset, char *name)
     only available font for the associated item; all the other fonts
     are removed from the group.
 
-    If $LAYOUTER_NAME is not @c Mnil, it must be a symbol
-    representing a @ref flt.  In that case, if $FONT is selected for
-    drawing an M-text, that font layout table is used to generate a
-    glyph code sequence from a character sequence.
+    If $LAYOUTER_NAME is not @c Mnil, it must be a symbol representing
+    a @ref flt (font layout table).  In that case, if $FONT is
+    selected for drawing an M-text, that font layout table is used to
+    generate a glyph code sequence from a character sequence.
 
     @return
     If the operation was successful, mfontset_modify_entry () returns 0.
@@ -782,43 +860,38 @@ mfontset_copy (MFontset *fontset, char *name)
 /***ja
     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ÎÆâÍƤòÊѹ¹¤¹¤ë.
 
-    ´Ø¿ô mfontset_modify_entry () ¤Ï¡¢$LANGUAGE ¤È $SCRIPT ¤ÎÁȤ߹ç¤ï
-    ¤»¤Þ¤¿¤Ï $CHARSET ¤ËÂФ·¤Æ $FONT ¤Î¥³¥Ô¡¼¤ò»È¤¦¤è¤¦¤Ë¡¢¥Õ¥©¥ó¥È¥»¥Ã
-    ¥È $FONTSET ¤òÀßÄꤹ¤ë¡£
+    ´Ø¿ô mfontset_modify_entry () ¤Ï¡¢$LANGUAGE ¤È $SCRIPT ¤ÎÁȤ߹ç¤ï¤»¡¢¤Þ¤¿¤Ï
+    $CHARSET ¤ËÂФ·¤Æ $FONT ¤Î¥³¥Ô¡¼¤ò»È¤¦¤è¤¦¤Ë¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤òÀßÄꤹ¤ë¡£
 
-    ¥Õ¥©¥ó¥È¥»¥Ã¥È¤Î³Æ¥Õ¥©¥ó¥È¤Ï¡¢ÆÃÄê¤Î¥¹¥¯¥ê¥×¥È¤È¸À¸ì¤Î¥Ú¥¢¡¢ÆÃÄê¤Î
-    Ê¸»ú¥»¥Ã¥È¡¢¥·¥ó¥Ü¥ë @c Mnil ¤Î¤¤¤º¤ì¤«¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¡£Æ±¤¸
-    ¤â¤Î¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ï¥°¥ë¡¼¥×¤ò¹½À®¤¹¤ë¡£
+    ¥Õ¥©¥ó¥È¥»¥Ã¥ÈÃæ¤Î³Æ¥Õ¥©¥ó¥È¤Ï¡¢ÆÃÄê¤Î¥¹¥¯¥ê¥×¥È¤È¸À¸ì¤Î¥Ú¥¢¡¢ÆÃÄê¤Îʸ»ú¥»¥Ã¥È¡¢¥·¥ó¥Ü¥ë
+    @c Mnil ¤Î¤¤¤º¤ì¤«¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¡£Æ±¤¸¤â¤Î¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Õ¥©¥ó¥È¤Ï¥°¥ë¡¼¥×¤ò¹½À®¤¹¤ë¡£
 
     $SCRIPT ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢¥¹¥¯¥ê¥×¥È¤òÆÃÄꤹ¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
     ¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢$LANGUAGE ¤Ï¸À¸ì¤òÆÃÄꤹ¤ë¥·¥ó¥Ü¥ë¤« @c
     Mnil ¤Ç¤¢¤ê¡¢$FONT ¤Ïthe $SCRIPT / $LANGUAGE ¥Ú¥¢¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£
 
-    $CHARSET ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢Ê¸»ú¥»¥Ã¥È¥ª¥Ö¥¸¥§¥¯¥È¤òɽ¤¹¥·¥ó¥Ü¥ë
-    ¤Ç¤¢¤ë¡£¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï $FONT ¤Ï¤½¤Îʸ»ú¥»¥Ã¥È¤È´ØÏ¢ÉÕ¤±¤é¤ì
-    ¤ë¡£
+    $CHARSET ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢Ê¸»ú¥»¥Ã¥È¥ª¥Ö¥¸¥§¥¯¥È¤òɽ¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
+    ¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï $FONT ¤Ï¤½¤Îʸ»ú¥»¥Ã¥È¤È´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£
 
-    $SCRIPT ¤È $CHARSET ¤ÎÁÐÊý¤¬ @c Mnil ¤Ç¤Ê¤¤¾ì¹ç¤Ë¤Ï $FONT ¤Î¥³¥Ô¡¼
-    ¤¬£²¤Äºî¤é¤ì¡¢¤½¤ì¤¾¤ì $SCRIPT / $LANGUAGE ¥Ú¥¢¤Èʸ»ú¥»¥Ã¥È¤Ë´ØÏ¢
-    ÉÕ¤±¤é¤ì¤ë¡£
+    $SCRIPT ¤È $CHARSET ¤ÎÁÐÊý¤¬ @c Mnil ¤Ç¤Ê¤¤¾ì¹ç¤Ë¤Ï $FONT 
+    ¤Î¥³¥Ô¡¼¤¬£²¤Äºî¤é¤ì¡¢¤½¤ì¤¾¤ì $SCRIPT / $LANGUAGE 
+    ¥Ú¥¢¤Èʸ»ú¥»¥Ã¥È¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£
 
-    $SCRIPT ¤È $CHARSET ¤ÎÁÐÊý¤¬ @c Mnil ¤Ê¤é¤Ð¡¢ $FONT ¤Ï @c Mnil ¤È
-    ´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£¤³¤Î¼ï¤Î¥Õ¥©¥ó¥È¤Ï @e fallback @e font ¤È¸Æ¤Ð¤ì¤ë¡£
+    $SCRIPT ¤È $CHARSET ¤ÎÁÐÊý¤¬ @c Mnil ¤Ê¤é¤Ð¡¢ $FONT ¤Ï @c Mnil 
+    ¤È´ØÏ¢ÉÕ¤±¤é¤ì¤ë¡£¤³¤Î¼ï¤Î¥Õ¥©¥ó¥È¤Ï @e fallback @e font ¤È¸Æ¤Ð¤ì¤ë¡£
 
-    °ú¿ô $HOW ¤Ï $FONT ¤ÎÍ¥ÀèÅÙ¤ò»ØÄꤹ¤ë¡£$HOW ¤¬Àµ¤Ê¤é¤Ð¡¢$FONT ¤ÏƱ
-    ¤¸¤â¤Î¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥°¥ë¡¼¥×Ãæ¤ÇºÇ¹â¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¡£$HOW ¤¬Éé¤Ê
-    ¤é¤Ð¡¢ºÇÄã¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¡£$HOW ¤¬ 0 ¤Ê¤é¤Ð¡¢$FONT ¤Ï´ØÏ¢ÉÕ¤±¤é¤ì¤¿
-    ¤â¤Î¤ËÂФ¹¤ëÍ£°ì¤ÎÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤È¤Ê¤ê¡¢Â¾¤Î¥Õ¥©¥ó¥È¤Ï¥°¥ë¡¼¥×
-    ¤«¤é¼è¤ê½ü¤«¤ì¤ë¡£
+    °ú¿ô $HOW ¤Ï $FONT ¤ÎÍ¥ÀèÅÙ¤ò»ØÄꤹ¤ë¡£$HOW ¤¬Àµ¤Ê¤é¤Ð¡¢$FONT 
+    ¤ÏƱ¤¸¤â¤Î¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥°¥ë¡¼¥×Ãæ¤ÇºÇ¹â¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¡£$HOW 
+    ¤¬Éé¤Ê¤é¤Ð¡¢ºÇÄã¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¡£$HOW ¤¬ 0 ¤Ê¤é¤Ð¡¢$FONT 
+    ¤Ï´ØÏ¢ÉÕ¤±¤é¤ì¤¿¤â¤Î¤ËÂФ¹¤ëÍ£°ì¤ÎÍøÍѲÄǽ¤Ê¥Õ¥©¥ó¥È¤È¤Ê¤ê¡¢Â¾¤Î¥Õ¥©¥ó¥È¤Ï¥°¥ë¡¼¥×¤«¤é¼è¤ê½ü¤«¤ì¤ë¡£
 
-    $LAYOUTER_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢@ref flt ¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
-    ¥·¥ó¥Ü¥ë¤Ç¤¢¤ì¤Ð¡¢$FONT ¤òÍѤ¤¤ÆM-text ¤òɽ¼¨¤¹¤ëºÝ¤Ë¤Ï¡¢¤½¤Î FONT
-    LAYOUT TABLE ¤ò»È¤Ã¤Æʸ»úÎ󤫤饰¥ê¥Õ¥³¡¼¥ÉÎó¤òÀ¸À®¤¹¤ë¡£
+    $LAYOUTER_NAME ¤Ï @c Mnil ¤Ç¤¢¤ë¤«¡¢@ref flt 
+    ¡Ê¥Õ¥©¥ó¥È¥ì¥¤¥¢¥¦¥È¥Æ¡¼¥Ö¥ë¡Ë¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£¥·¥ó¥Ü¥ë¤Ç¤¢¤ì¤Ð¡¢$FONT ¤òÍѤ¤¤Æ
+    M-text ¤òɽ¼¨¤¹¤ëºÝ¤Ë¤Ï¡¢¤½¤Î¥Õ¥©¥ó¥È¥ì¥¤¥¢¥¦¥È¥Æ¡¼¥Ö¥ë¤ò»È¤Ã¤Æʸ»úÎ󤫤饰¥ê¥Õ¥³¡¼¥ÉÎó¤òÀ¸À®¤¹¤ë¡£
 
     @return 
     ½èÍý¤¬À®¸ù¤·¤¿¤È¤­¡¢mfontset_modify_entry () ¤Ï 0 ¤òÊÖ¤¹¡£
-    ¼ºÇÔ¤·¤¿¤È¤­¤Ï -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤ò
-    ÀßÄꤹ¤ë¡£  */
+    ¼ºÇÔ¤·¤¿¤È¤­¤Ï -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£  */
 
 /***
     @errors
@@ -884,9 +957,9 @@ mfontset_modify_entry (MFontset *fontset,
     layouter_name = Mt;
   for (i--; i >= 0; i--)
     {
-      if (how == -1)
+      if (how == 1)
        mplist_push (plist[i], layouter_name, font);
-      else if (how == 1)
+      else if (how == -1)
        mplist_add (plist[i], layouter_name, font);
       else
        {
@@ -895,9 +968,151 @@ mfontset_modify_entry (MFontset *fontset,
        }
     }
 
+  fontset->tick++;
   return 0;
 }
 
+/*=*/
+
+/***en
+    @brief Lookup a fontset.
+
+    The mfontset_lookup () function lookups $FONTSET and returns a
+    plist that describes the contents of $FONTSET corresponding to the
+    specified script, language, and charset.
+
+    If $SCRIPT is @c Mt, keys of the returned plist are script name
+    symbols for which some fonts are specified and values are NULL.
+
+    If $SCRIPT is a script name symbol, the returned plist is decided
+    by $LANGUAGE.
+    
+    @li If $LANGUAGE is @c Mt, keys of the plist are language name
+    symbols for which some fonts are specified and values are NULL.  A
+    key may be @c Mt which means some fallback fonts are specified for
+    the script.
+
+    @li If $LANGUAGE is a language name symbol, the plist is a @c
+    FONT-GROUP for the specified script and language.  @c FONT-GROUP
+    is a plist whose keys are FLT (FontLayoutTable) name symbols (@c
+    Mt if no FLT is associated with the font) and values are pointers
+    to #MFont.
+
+    @li If $LANGUAGE is @c Mnil, the plist is fallback @c FONT-GROUP
+    for the script. 
+
+    If $SCRIPT is @c Mnil, the returned plist is decided as below.
+
+    @li If $CHARSET is @c Mt, keys of the returned plist are charset name
+    symbols for which some fonts are specified and values are NULL.
+
+    @li If $CHARSET is a charset name symbol, the plist is a @c FONT-GROUP for
+    the charset.
+
+    @li If $CHARSET is @c Mnil, the plist is a fallback @c FONT-GROUP.
+
+    @return
+    It returns a plist describing the contents of a fontset.  The
+    plist should be freed by m17n_object_unref ().  */
+/***ja
+    @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ò¸¡º÷¤¹¤ë.
+
+    ´Ø¿ô mfontset_lookup () ¤Ï $FONTSET ¤ò¸¡º÷¤·¡¢$FONTSET 
+    ¤ÎÆâÍƤΤ¦¤Á»ØÄꤷ¤¿¥¹¥¯¥ê¥×¥È¡¢¸À¸ì¡¢Ê¸»ú¥»¥Ã¥È¤ËÂбþ¤¹¤ëÉôʬ¤òɽ¤¹
+    plist ¤òÊÖ¤¹¡£
+
+    $SCRIPT ¤¬ @c Mt ¤Ê¤é¤Ð¡¢ÊÖ¤¹ plist 
+    ¤Î¥­¡¼¤Ï¥Õ¥©¥ó¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¥¹¥¯¥ê¥×¥È̾¤Î¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢ÃͤÏ
+    NULL ¤Ç¤¢¤ë¡£
+
+    $SCRIPT ¤¬¥¹¥¯¥ê¥×¥È̾¤Î¥·¥ó¥Ü¥ë¤Ç¤¢¤ì¤Ð¡¢ÊÖ¤¹ 
+    plist ¤Ï $LANGUAGE¤Ë¤è¤Ã¤ÆÄê¤Þ¤ë¡£
+    
+    @li $LANGUAGE ¤¬ @c Mt ¤Ê¤é¤Ð¡¢plist 
+    ¤Î¥­¡¼¤Ï¥Õ¥©¥ó¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¸À¸ì̾¤Î¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢ÃͤÏ
+    NULL ¤Ç¤¢¤ë¡£¥­¡¼¤Ï @c Mt
+    ¤Ç¤¢¤ë¤³¤È¤â¤¢¤ê¡¢¤½¤Î¾ì¹ç¤½¤Î¥¹¥¯¥ê¥×¥È¤Ë¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¥Õ¥©¥ó¥È¤¬¤¢¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
+
+    @li $LANGUAGE ¤¬¸À¸ì̾¤Î¥·¥ó¥Ü¥ë¤Ê¤é¤Ð¡¢plist ¤Ï»ØÄê¤Î¥¹¥¯¥ê¥×¥È¤È¸À¸ì¤ËÂФ¹¤ë
+    @c FONT-GROUP ¤Ç¤¢¤ë¡£@c FONT-GROUP ¤È¤Ï¡¢¥­¡¼¤¬ FLT
+    (FontLayoutTable) Ì¾¤Î¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢Ãͤ¬ #MFont 
+    ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤è¤¦¤Ê plist ¤Ç¤¢¤ë¡£¤¿¤À¤·¥Õ¥©¥ó¥È¤Ë FLT 
+    ¤¬ÂбþÉÕ¤±¤é¤ì¤Æ¤¤¤Ê¤¤»þ¤Ë¤Ï¡¢¥­¡¼¤Ï @c Mt ¤Ë¤Ê¤ë¡£
+
+    @li $LANGUAGE ¤¬ @c Mnil ¤Ê¤é¤Ð¡¢plist ¤Ï¤½¤Î¥¹¥¯¥ê¥×¥ÈÍѤΥե©¡¼¥ë¥Ð¥Ã¥¯
+    @c FONT-GROUP ¤Ç¤¢¤ë¡£
+
+    $SCRIPT ¤¬ @c Mnil ¤Ê¤é¤Ð¡¢ÊÖ¤¹ plist ¤Ï°Ê²¼¤Î¤è¤¦¤ËÄê¤Þ¤ë¡£
+
+    @li $CHARSET ¤¬ @c Mt ¤Ê¤é¤Ð¡¢plist 
+    ¤Î¥­¡¼¤Ï¥Õ¥©¥ó¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ëʸ»ú¥»¥Ã¥È̾¤Î¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢ÃͤÏ
+    NULL ¤Ç¤¢¤ë¡£
+
+    @li $CHARSET ¤¬Ê¸»ú¥»¥Ã¥È̾¤Î¥·¥ó¥Ü¥ë¤Ê¤é¤Ð¡¢plist ¤Ï¤½¤Îʸ»ú¥»¥Ã¥ÈÍѤΠ
+    @c FONT-GROUP ¤Ç¤¢¤ë¡£
+
+    @li $CHARSET ¤¬ @c Mnil ¤Ê¤é¤Ð¡¢plist ¤Ï¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯ @c FONT-GROUP ¤Ç¤¢¤ë¡£
+
+    @return
+    ¤³¤Î´Ø¿ô¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È¤ÎÆâÍƤòɽ¤¹ plist ¤òÊÖ¤¹¡£
+    plist ¤Ï m17n_object_unref () ¤Ç²òÊü¤µ¤ì¤ë¤Ù¤­¤Ç¤¢¤ë¡£  */
+
+MPlist *
+mfontset_lookup (MFontset *fontset,
+                MSymbol script, MSymbol language, MSymbol charset)
+{
+  MPlist *plist = mplist (), *pl, *p;
+
+  if (fontset->mdb)
+    load_fontset_contents (fontset);
+  if (script == Mt)
+    {
+      if (! fontset->per_script)
+       return plist;
+      p = plist;
+      MPLIST_DO (pl, fontset->per_script)
+       p = mplist_add (p, MPLIST_KEY (pl), NULL);
+      return plist;
+    }
+  if (script != Mnil)
+    {
+      if (! fontset->per_script)
+       return plist;
+      pl = mplist_get (fontset->per_script, script);
+      if (! pl)
+       return plist;
+      if (language == Mt)
+       {
+         p = plist;
+         MPLIST_DO (pl, pl)
+           p = mplist_add (p, MPLIST_KEY (pl), NULL);
+         return plist;
+       }
+      if (language == Mnil)
+       language = Mt;
+      pl = mplist_get (pl, language);
+    }
+  else if (charset != Mnil)
+    {
+      if (! fontset->per_charset)
+       return plist;
+      if (charset == Mt)
+       {
+         p = plist;
+         MPLIST_DO (pl, fontset->per_charset)
+           p = mplist_add (p, MPLIST_KEY (pl), NULL);
+         return plist;
+       }
+      pl = mplist_get (fontset->per_charset, charset);
+    }
+  else
+    pl = fontset->fallback;
+  if (! pl)
+    return plist;
+  return mplist_copy (pl);
+}
+
+
 /*** @} */
 
 /*** @addtogroup m17nDebug */
@@ -916,9 +1131,8 @@ mfontset_modify_entry (MFontset *fontset,
 /***ja
     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ò¥À¥ó¥×¤¹¤ë.
 
-    ´Ø¿ô mdebug_dump_face () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤ò stderr ¤Ë¿Í
-    ´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ
-    ¤ë¡£
+    ´Ø¿ô mdebug_dump_face () ¤Ï¥Õ¥©¥ó¥È¥»¥Ã¥È $FONTSET ¤ò stderr 
+    ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
 
     @return
     ¤³¤Î´Ø¿ô¤Ï $FONTSET ¤òÊÖ¤¹¡£  */