emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/xfaces.c,v


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/xfaces.c,v
Date: Tue, 05 Feb 2008 02:36:41 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Miles Bader <miles>     08/02/05 02:36:41

Index: xfaces.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xfaces.c,v
retrieving revision 1.374
retrieving revision 1.375
diff -u -b -r1.374 -r1.375
--- xfaces.c    1 Feb 2008 22:34:19 -0000       1.374
+++ xfaces.c    5 Feb 2008 02:36:40 -0000       1.375
@@ -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;
+      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, XVECTOR (lface)->contents, to,
-                         named_merge_points);
+         merge_face_vectors (f, from, to, named_merge_points);
       UNGCPRO;
-      return 1;
+       }
+
+      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);
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]