+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);
+}
+
+