changeset 91531:24d3fbc119ce

Revert 2008-02-01 change to src/xfaces.c by cyd@stupidchicken.com Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1051
author Miles Bader <miles@gnu.org>
date Tue, 05 Feb 2008 02:36:40 +0000
parents 678a84aa5ccd
children c4baafae1dc1
files src/ChangeLog src/xfaces.c
diffstat 2 files changed, 71 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Feb 05 02:21:43 2008 +0000
+++ b/src/ChangeLog	Tue Feb 05 02:36:40 2008 +0000
@@ -1,3 +1,9 @@
+2008-02-05  Miles Bader  <miles@gnu.org>
+
+	* xfaces.c (get_lface_attributes, merge_named_face)
+	(lookup_named_face, lookup_derived_face, realize_named_face):
+	Revert 2008-02-01 change by cyd@stupidchicken.com.
+
 2008-02-04  Kenichi Handa  <handa@ni.aist.go.jp>
 
 	* fontset.c (Ffontset_info): Handle the case of inhibitting the
--- a/src/xfaces.c	Tue Feb 05 02:21:43 2008 +0000
+++ b/src/xfaces.c	Tue Feb 05 02:36:40 2008 +0000
@@ -492,6 +492,7 @@
 static int x_face_list_fonts P_ ((struct frame *, char *,
 				  struct font_name **, int, int));
 static int font_scalable_p P_ ((struct font_name *));
+static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object *, int));
 static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned *));
 static unsigned char *xstrlwr P_ ((unsigned char *));
 static struct frame *frame_or_selected_frame P_ ((Lisp_Object, int));
@@ -3438,6 +3439,36 @@
 }
 
 
+/* Get face attributes of face FACE_NAME from frame-local faces on
+   frame F.  Store the resulting attributes in ATTRS which must point
+   to a vector of Lisp_Objects of size LFACE_VECTOR_SIZE.  If SIGNAL_P
+   is non-zero, signal an error if FACE_NAME does not name a face.
+   Otherwise, value is zero if FACE_NAME is not a face.  */
+
+static INLINE int
+get_lface_attributes (f, face_name, attrs, signal_p)
+     struct frame *f;
+     Lisp_Object face_name;
+     Lisp_Object *attrs;
+     int signal_p;
+{
+  Lisp_Object lface;
+  int success_p;
+
+  lface = lface_from_face_name (f, face_name, signal_p);
+  if (!NILP (lface))
+    {
+      bcopy (XVECTOR (lface)->contents, attrs,
+	     LFACE_VECTOR_SIZE * sizeof *attrs);
+      success_p = 1;
+    }
+  else
+    success_p = 0;
+
+  return success_p;
+}
+
+
 /* Non-zero if all attributes in face attribute vector ATTRS are
    specified, i.e. are non-nil.  */
 
@@ -3723,14 +3754,12 @@
 
 /* Merge two Lisp face attribute vectors on frame F, FROM and TO, and
    store the resulting attributes in TO, which must be already be
-   completely specified and contain only absolute attributes. The
-   contents of FROM are not altered.
-
-   Every specified attribute of FROM overrides the corresponding
-   attribute of TO; relative attributes in FROM are merged with the
-   absolute value in TO and replace it.  NAMED_MERGE_POINTS is used
-   internally to detect loops in face inheritance; it should be 0 when
-   called from other places.  */
+   completely specified and contain only absolute attributes.  Every
+   specified attribute of FROM overrides the corresponding attribute of
+   TO; relative attributes in FROM are merged with the absolute value in
+   TO and replace it.  NAMED_MERGE_POINTS is used internally to detect
+   loops in face inheritance; it should be 0 when called from other
+   places.  */
 
 static INLINE void
 merge_face_vectors (f, from, to, named_merge_points)
@@ -3794,15 +3823,17 @@
 			      face_name, &named_merge_points))
     {
       struct gcpro gcpro1;
-      Lisp_Object lface = lface_from_face_name (f, face_name, 0);
-      if (NILP (lface))
-	return 0;
-
-      GCPRO1 (named_merge_point.face_name);
-      merge_face_vectors (f, XVECTOR (lface)->contents, to,
-			  named_merge_points);
-      UNGCPRO;
-      return 1;
+      Lisp_Object from[LFACE_VECTOR_SIZE];
+      int ok = get_lface_attributes (f, face_name, from, 0);
+
+      if (ok)
+	{
+	  GCPRO1 (named_merge_point.face_name);
+	  merge_face_vectors (f, from, to, named_merge_points);
+	  UNGCPRO;
+	}
+
+      return ok;
     }
   else
     return 0;
@@ -3829,8 +3860,6 @@
    (BACKGROUND-COLOR . COLOR) where COLOR is a color name.  This is
    for compatibility with 20.2.
 
-   The contents of FACE_REF is not altered by this function.
-
    Face specifications earlier in lists take precedence over later
    specifications.  */
 
@@ -6088,7 +6117,8 @@
      Lisp_Object symbol;
      int signal_p;
 {
-  Lisp_Object lface, attrs[LFACE_VECTOR_SIZE];
+  Lisp_Object attrs[LFACE_VECTOR_SIZE];
+  Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE];
   struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
 
   if (default_face == NULL)
@@ -6100,12 +6130,11 @@
 	abort ();  /* realize_basic_faces must have set it up  */
     }
 
-  lface = lface_from_face_name (f, symbol, signal_p);
-  if (NILP (lface))
+  if (!get_lface_attributes (f, symbol, symbol_attrs, signal_p))
     return -1;
 
   bcopy (default_face->lface, attrs, sizeof attrs);
-  merge_face_vectors (f, XVECTOR (lface)->contents, attrs, 0);
+  merge_face_vectors (f, symbol_attrs, attrs, 0);
 
   return lookup_face (f, attrs);
 }
@@ -6236,16 +6265,16 @@
      int face_id;
      int signal_p;
 {
-  Lisp_Object lface, attrs[LFACE_VECTOR_SIZE];
+  Lisp_Object attrs[LFACE_VECTOR_SIZE];
   Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE];
   struct face *default_face = FACE_FROM_ID (f, face_id);
 
   if (!default_face)
     abort ();
 
-  lface = lface_from_face_name (f, symbol, signal_p);
+  get_lface_attributes (f, symbol, symbol_attrs, signal_p);
   bcopy (default_face->lface, attrs, sizeof attrs);
-  merge_face_vectors (f, XVECTOR (lface)->contents, attrs, 0);
+  merge_face_vectors (f, symbol_attrs, attrs, 0);
   return lookup_face (f, attrs);
 }
 
@@ -7536,16 +7565,18 @@
      Lisp_Object symbol;
      int id;
 {
+  struct face_cache *c = FRAME_FACE_CACHE (f);
   Lisp_Object lface = lface_from_face_name (f, symbol, 0);
   Lisp_Object attrs[LFACE_VECTOR_SIZE];
-  struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID);
+  Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE];
+  struct face *new_face;
 
   /* The default face must exist and be fully specified.  */
-  bcopy (default_face->lface, attrs, LFACE_VECTOR_SIZE * sizeof *attrs);
+  get_lface_attributes (f, Qdefault, attrs, 1);
   check_lface_attrs (attrs);
   xassert (lface_fully_specified_p (attrs));
 
-  /* If SYMBOL isn't known as a face, create it.  */
+  /* If SYMBOL isn't know as a face, create it.  */
   if (NILP (lface))
     {
       Lisp_Object frame;
@@ -7554,8 +7585,11 @@
     }
 
   /* Merge SYMBOL's face with the default face.  */
-  merge_face_vectors (f, XVECTOR (lface)->contents, attrs, 0);
-  realize_face (FRAME_FACE_CACHE (f), attrs, id);
+  get_lface_attributes (f, symbol, symbol_attrs, 1);
+  merge_face_vectors (f, symbol_attrs, attrs, 0);
+
+  /* Realize the face.  */
+  new_face = realize_face (c, attrs, id);
 }