the display string do. This sounds like a design bug,
but Emacs always did that since v21.1, so changing that
might be a big deal. */
- bool use_default = (it->string_from_prefix_prop_p != 0);
- base_face_id = DEFAULT_FACE_ID;
- if (!use_default)
- {
- base_face_id = underlying_face_id (it);
- /* Reject the underlying face, if that face is different
- from the iterator face, and we filter by attr_filter,
- and that face's value of the filter attribute is nil
- or unspecified; use the default face instead. */
- struct face *bf = FACE_FROM_ID_OR_NULL (it->f, base_face_id);
- if (base_face_id != it->base_face_id
- && attr_filter > 0
- && (NILP (bf->lface[attr_filter])
- || EQ (bf->lface[attr_filter], Qunspecified)))
- use_default = true;
- }
- if (use_default)
- base_face_id = (!NILP (Vface_remapping_alist)
- ? lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID)
- : DEFAULT_FACE_ID);
+ base_face_id = it->string_from_display_prop_p
+ ? (!NILP (Vface_remapping_alist)
+ ? lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID)
+ : DEFAULT_FACE_ID)
+ : underlying_face_id (it);
}
return face_at_string_position (it->w,
/* Begin with attributes from the base face. */
memcpy (attrs, base_face->lface, sizeof attrs);
+ /* Reset the attribute of the base face used as the filter, because
+ otherwise there's no way for faces to be merged to countermand that. */
+ if (EQ (attrs[attr_filter], Qt))
+ attrs[attr_filter] = Qnil;
/* Merge in attributes specified via text properties. */
if (!NILP (prop))