+ /* Take one or two passes over the font list. Do the second
+ pass only if we really need it, i.e., only if the first pass
+ found no fonts and skipped some scalable fonts. */
+ bool skipped_some_scalable_fonts = false;
+ for (int i_pass = 0;
+ (i_pass == 0
+ || (i_pass == 1 && NILP (list) && skipped_some_scalable_fonts));
+ i_pass++)
+ for (i = 0; i < num_fonts; i++)
+ {
+ ptrdiff_t len;
+
+ if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0)
+ continue;
+ if (NILP (entity))
+ entity = font_make_entity ();
+ len = xfont_decode_coding_xlfd (indices[i], -1, buf);
+ if (font_parse_xlfd (buf, len, entity) < 0)
+ continue;
+ ASET (entity, FONT_TYPE_INDEX, Qx);
+ /* Avoid auto-scaled fonts. */
+ if (INTEGERP (AREF (entity, FONT_DPI_INDEX))
+ && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX))
+ && XINT (AREF (entity, FONT_DPI_INDEX)) != 0
+ && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0)
+ continue;
+ /* Avoid not-allowed scalable fonts. */
+ if (NILP (Vscalable_fonts_allowed))
+ {
+ int size = 0;