+ if (from_g->rface->font)
+ {
+ MRealizedFace *rface = from_g->rface, *new;
+
+ if (! rfont)
+ rfont = mfontset__get_font (rface->frame,
+ rface->face.property[MFACE_FONTSET],
+ script, language,
+ rface->font, NULL);
+ else if (script != Mlatin)
+ rfont = mfontset__get_font (rface->frame,
+ rface->face.property[MFACE_FONTSET],
+ script, language,
+ (MFont *) rfont, NULL);
+ if (! rfont)
+ {
+ for (; from_g < to_g && from_g->rface->font; from_g++)
+ from_g->code = MCHAR_INVALID_CODE;
+ }
+ else
+ {
+ if (rface->rfont == rfont && rfont->layouter == Mnil)
+ new = rface;
+ else
+ {
+ MSTRUCT_MALLOC (new, MERROR_FACE);
+ mplist_push (rface->non_ascii_list, Mt, new);
+ *new = *rface;
+ new->rfont = rfont;
+ new->layouter = rfont->layouter;
+ rfont->layouter = Mnil;
+ new->non_ascii_list = NULL;
+ new->ascent = rfont->ascent;
+ new->descent = rfont->descent;
+ }
+ for (; from_g < to_g && from_g->rface->font; from_g++)
+ {
+ from_g->rface = new;
+ if (new->layouter)
+ {
+ from_g->code = mfont__flt_encode_char (new->layouter,
+ from_g->c);
+ if (from_g->code == MCHAR_INVALID_CODE)
+ {
+ from_g->rface = rface;
+ from_g->code = mfont__encode_char (rfont->frame,
+ (MFont *) rfont,
+ NULL, from_g->c);
+ }
+ }
+ else
+ from_g->code = mfont__encode_char (rfont->frame,
+ (MFont *) rfont,
+ NULL, from_g->c);
+ }
+ }
+ return from_g;
+ }
+
+ if (rfont && script == Mlatin)