+ ASET (work, FONT_SIZE_INDEX, Qnil);
+ foundry[0] = AREF (work, FONT_FOUNDRY_INDEX);
+ if (! NILP (foundry[0]))
+ foundry[1] = null_vector;
+ else if (STRINGP (attrs[LFACE_FOUNDRY_INDEX]))
+ {
+ foundry[0] = font_intern_prop (SDATA (attrs[LFACE_FOUNDRY_INDEX]),
+ SBYTES (attrs[LFACE_FOUNDRY_INDEX]), 1);
+ foundry[1] = Qnil;
+ foundry[2] = null_vector;
+ }
+ else
+ foundry[0] = Qnil, foundry[1] = null_vector;
+
+ val = AREF (work, FONT_FAMILY_INDEX);
+ if (NILP (val) && STRINGP (attrs[LFACE_FAMILY_INDEX]))
+ val = font_intern_prop (SDATA (attrs[LFACE_FAMILY_INDEX]),
+ SBYTES (attrs[LFACE_FAMILY_INDEX]), 1);
+ if (NILP (val))
+ {
+ family = alloca ((sizeof family[0]) * 2);
+ family[0] = Qnil;
+ family[1] = null_vector; /* terminator. */
+ }
+ else
+ {
+ Lisp_Object alters
+ = Fassoc_string (val, Vface_alternative_font_family_alist, Qt);
+
+ if (! NILP (alters))
+ {
+ family = alloca ((sizeof family[0]) * (XINT (Flength (alters)) + 2));
+ for (i = 0; CONSP (alters); i++, alters = XCDR (alters))
+ family[i] = XCAR (alters);
+ if (NILP (AREF (spec, FONT_FAMILY_INDEX)))
+ family[i++] = Qnil;
+ family[i] = null_vector;
+ }
+ else
+ {
+ family = alloca ((sizeof family[0]) * 3);
+ i = 0;
+ family[i++] = val;
+ if (NILP (AREF (spec, FONT_FAMILY_INDEX)))
+ family[i++] = Qnil;
+ family[i] = null_vector;
+ }
+ }
+
+ for (j = 0; SYMBOLP (family[j]); j++)
+ {
+ ASET (work, FONT_FAMILY_INDEX, family[j]);
+ for (i = 0; SYMBOLP (foundry[i]); i++)
+ {
+ ASET (work, FONT_FOUNDRY_INDEX, foundry[i]);
+ entities = font_list_entities (frame, work);
+ if (ASIZE (entities) > 0)
+ break;
+ }
+ if (ASIZE (entities) > 0)
+ break;
+ }