+
+static void
+merge_face_list (f, face, prop)
+ FRAME_PTR f;
+ struct face *face;
+ Lisp_Object prop;
+{
+ Lisp_Object length;
+ int len;
+ Lisp_Object *faces;
+ int j;
+
+ if (CONSP (prop)
+ && ! STRINGP (XCONS (prop)->cdr))
+ {
+ /* We have a list of faces, merge them in reverse order. */
+
+ length = Fsafe_length (prop);
+ len = XFASTINT (length);
+
+ /* Put them into an array. */
+ faces = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
+ for (j = 0; j < len; j++)
+ {
+ faces[j] = Fcar (prop);
+ prop = Fcdr (prop);
+ }
+ /* So that we can merge them in the reverse order. */
+ }
+ else
+ {
+ faces = (Lisp_Object *) alloca (sizeof (Lisp_Object));
+ faces[0] = prop;
+ len = 1;
+ }
+
+ for (j = len - 1; j >= 0; j--)
+ {
+ if (CONSP (faces[j]))
+ {
+ if (EQ (XCONS (faces[j])->car, Qbackground_color))
+ face->background = load_color (f, XCONS (faces[j])->cdr);
+ if (EQ (XCONS (faces[j])->car, Qforeground_color))
+ face->foreground = load_color (f, XCONS (faces[j])->cdr);
+ }
+ else
+ {
+ int facecode = face_name_id_number (f, faces[j]);
+ if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
+ && FRAME_PARAM_FACES (f) [facecode] != 0)
+ merge_faces (FRAME_PARAM_FACES (f) [facecode], face);
+ }
+ }
+}
+