* dispextern.h (face_at_buffer_position, face_for_overlay_string)
[bpt/emacs.git] / src / xfaces.c
index c2a5dd9..087dc86 100644 (file)
@@ -894,9 +894,10 @@ init_frame_faces (f)
   /* Make the image cache.  */
   if (FRAME_WINDOW_P (f))
     {
-      if (FRAME_X_IMAGE_CACHE (f) == NULL)
-       FRAME_X_IMAGE_CACHE (f) = make_image_cache ();
-      ++FRAME_X_IMAGE_CACHE (f)->refcount;
+      if (FRAME_IMAGE_CACHE (f) == NULL)
+       /* Is that ever possible??  --Stef  */
+       FRAME_IMAGE_CACHE (f) = make_image_cache ();
+      ++FRAME_IMAGE_CACHE (f)->refcount;
     }
 #endif /* HAVE_WINDOW_SYSTEM */
 
@@ -933,7 +934,7 @@ free_frame_faces (f)
 #ifdef HAVE_WINDOW_SYSTEM
   if (FRAME_WINDOW_P (f))
     {
-      struct image_cache *image_cache = FRAME_X_IMAGE_CACHE (f);
+      struct image_cache *image_cache = FRAME_IMAGE_CACHE (f);
       if (image_cache)
        {
          --image_cache->refcount;
@@ -1008,11 +1009,9 @@ clear_face_cache (clear_fonts_p)
        {
          f = XFRAME (frame);
          if (FRAME_WINDOW_P (f))
-           {
              clear_face_gcs (FRAME_FACE_CACHE (f));
-             clear_image_cache (f, 0);
-           }
        }
+      clear_image_caches (Qnil);
     }
 #endif /* HAVE_WINDOW_SYSTEM */
 }
@@ -3694,7 +3693,8 @@ set_lface_from_font_and_fontset (f, lface, font_object, fontset, force_p)
       LFACE_SWIDTH (lface) = ! NILP (val) ? val : width;
     }
 
-  LFACE_FONT (lface) = font_object;
+  LFACE_FONT (lface) = make_unibyte_string (font->font.full_name,
+                                           strlen (font->font.full_name));
   LFACE_FONTSET (lface) = fontset_name (fontset);
 }
 #endif /* USE_FONT_BACKEND */
@@ -4100,7 +4100,7 @@ Value is a vector of face attributes.  */)
     {
       global_lface = Fmake_vector (make_number (LFACE_VECTOR_SIZE),
                                   Qunspecified);
-      AREF (global_lface, 0) = Qface;
+      ASET (global_lface, 0, Qface);
       Vface_new_frame_defaults = Fcons (Fcons (face, global_lface),
                                        Vface_new_frame_defaults);
 
@@ -4122,7 +4122,7 @@ Value is a vector of face attributes.  */)
     }
   else if (f == NULL)
     for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
-      AREF (global_lface, i) = Qunspecified;
+      ASET (global_lface, i, Qunspecified);
 
   /* Add a frame-local definition.  */
   if (f)
@@ -4131,12 +4131,12 @@ Value is a vector of face attributes.  */)
        {
          lface = Fmake_vector (make_number (LFACE_VECTOR_SIZE),
                                Qunspecified);
-         AREF (lface, 0) = Qface;
+         ASET (lface, 0, Qface);
          f->face_alist = Fcons (Fcons (face, lface), f->face_alist);
        }
       else
        for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
-         AREF (lface, i) = Qunspecified;
+         ASET (lface, i, Qunspecified);
     }
   else
     lface = global_lface;
@@ -4540,41 +4540,32 @@ FRAME 0 means change the face on all frames, and change the default
 
 #ifdef USE_FONT_BACKEND
          if (enable_font_backend
-             && FRAME_WINDOW_P (XFRAME (frame))
              && !UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
            {
-             int fontset;
-
+             tmp = Fquery_fontset (value, Qnil);
              if (EQ (attr, QCfontset))
                {
-                 Lisp_Object fontset_name = Fquery_fontset (value, Qnil);
-
-                 if (NILP (fontset_name))
+                 if (NILP (tmp))
                    signal_error ("Invalid fontset name", value);
-                 LFACE_FONTSET (lface) = value;
+                 LFACE_FONTSET (lface) = tmp;
                }
              else
                {
+                 int fontset;
                  Lisp_Object font_object;
 
-                 if (FONT_OBJECT_P (value))
+                 if (! NILP (tmp))
                    {
-                     font_object = value;
-                     fontset = FRAME_FONTSET (f);
+                     fontset = fs_query_fontset (tmp, 0);
+                     value = fontset_ascii (fontset);
                    }
                  else
                    {
-                     CHECK_STRING (value);
-
-                     fontset = fs_query_fontset (value, 0);
-                     if (fontset >= 0)
-                       value = fontset_ascii (fontset);
-                     else
-                       fontset = FRAME_FONTSET (f);
-                     font_object = font_open_by_name (f, SDATA (value));
-                     if (NILP (font_object))
-                       signal_error ("Invalid font", value);
+                     fontset = FRAME_FONTSET (f);
                    }
+                 font_object = font_open_by_name (f, SDATA (value));
+                 if (NILP (font_object))
+                   signal_error ("Invalid font", value);
                  set_lface_from_font_and_fontset (f, lface, font_object,
                                                   fontset, 1);
                }
@@ -5490,10 +5481,10 @@ lface_hash (v)
   return (hash_string_case_insensitive (v[LFACE_FAMILY_INDEX])
          ^ hash_string_case_insensitive (v[LFACE_FOREGROUND_INDEX])
          ^ hash_string_case_insensitive (v[LFACE_BACKGROUND_INDEX])
-         ^ XFASTINT (v[LFACE_WEIGHT_INDEX])
-         ^ XFASTINT (v[LFACE_SLANT_INDEX])
-         ^ XFASTINT (v[LFACE_SWIDTH_INDEX])
-         ^ XFASTINT (v[LFACE_HEIGHT_INDEX]));
+         ^ XHASH (v[LFACE_WEIGHT_INDEX])
+         ^ XHASH (v[LFACE_SLANT_INDEX])
+         ^ XHASH (v[LFACE_SWIDTH_INDEX])
+         ^ XHASH (v[LFACE_HEIGHT_INDEX]));
 }
 
 
@@ -5613,6 +5604,11 @@ prepare_face_for_display (f, face)
       if (face->font)
        {
 #ifdef HAVE_X_WINDOWS
+#ifdef USE_FONT_BACKEND
+         if (enable_font_backend)
+           xgcv.font = FRAME_X_DISPLAY_INFO (f)->font->fid;
+         else
+#endif
          xgcv.font = face->font->fid;
 #endif
 #ifdef WINDOWSNT
@@ -6718,7 +6714,8 @@ Value is ORDER.  */)
     }
 
 #ifdef USE_FONT_BACKEND
-  font_update_sort_order (font_sort_order);
+  if (enable_font_backend)
+    font_update_sort_order (font_sort_order);
 #endif /* USE_FONT_BACKEND */
 
   return Qnil;
@@ -7666,7 +7663,7 @@ realize_non_ascii_face (f, font_id, base_face)
   face->gc = 0;
 #ifdef USE_FONT_BACKEND
   face->extra = NULL;
-#endif
+#endif /* USE_FONT_BACKEND */
 
   /* Don't try to free the colors copied bitwise from BASE_FACE.  */
   face->colors_copied_bitwise_p = 1;
@@ -7728,7 +7725,8 @@ realize_x_face (cache, attrs)
       face->font = default_face->font;
       face->font_info_id = default_face->font_info_id;
 #ifdef USE_FONT_BACKEND
-      face->font_info = default_face->font_info;
+      if (enable_font_backend)
+       face->font_info = default_face->font_info;
 #endif /* USE_FONT_BACKEND */
       face->font_name = default_face->font_name;
       face->fontset
@@ -7757,7 +7755,7 @@ realize_x_face (cache, attrs)
        font_load_for_face (f, face);
       else
 #endif /* USE_FONT_BACKEND */
-      load_face_font (f, face);
+       load_face_font (f, face);
       if (face->font)
        face->fontset = make_fontset_for_ascii_face (f, fontset, face);
       else
@@ -8113,10 +8111,10 @@ int
 face_at_buffer_position (w, pos, region_beg, region_end,
                         endptr, limit, mouse)
      struct window *w;
-     int pos;
-     int region_beg, region_end;
-     int *endptr;
-     int limit;
+     EMACS_INT pos;
+     EMACS_INT region_beg, region_end;
+     EMACS_INT *endptr;
+     EMACS_INT limit;
      int mouse;
 {
   struct frame *f = XFRAME (w->frame);
@@ -8125,7 +8123,7 @@ face_at_buffer_position (w, pos, region_beg, region_end,
   int i, noverlays;
   Lisp_Object *overlay_vec;
   Lisp_Object frame;
-  int endpos;
+  EMACS_INT endpos;
   Lisp_Object propname = mouse ? Qmouse_face : Qface;
   Lisp_Object limit1, end;
   struct face *default_face;
@@ -8151,7 +8149,7 @@ face_at_buffer_position (w, pos, region_beg, region_end,
 
   /* Look at properties from overlays.  */
   {
-    int next_overlay;
+    EMACS_INT next_overlay;
 
     GET_OVERLAYS_AT (pos, overlay_vec, noverlays, &next_overlay, 0);
     if (next_overlay < endpos)
@@ -8218,18 +8216,16 @@ int
 face_for_overlay_string (w, pos, region_beg, region_end,
                         endptr, limit, mouse, overlay)
      struct window *w;
-     int pos;
-     int region_beg, region_end;
-     int *endptr;
-     int limit;
+     EMACS_INT pos;
+     EMACS_INT region_beg, region_end;
+     EMACS_INT *endptr;
+     EMACS_INT limit;
      int mouse;
      Lisp_Object overlay;
 {
   struct frame *f = XFRAME (w->frame);
   Lisp_Object attrs[LFACE_VECTOR_SIZE];
   Lisp_Object prop, position;
-  int i, noverlays;
-  Lisp_Object *overlay_vec;
   Lisp_Object frame;
   int endpos;
   Lisp_Object propname = mouse ? Qmouse_face : Qface;
@@ -8314,9 +8310,9 @@ face_at_string_position (w, string, pos, bufpos, region_beg,
                         region_end, endptr, base_face_id, mouse_p)
      struct window *w;
      Lisp_Object string;
-     int pos, bufpos;
-     int region_beg, region_end;
-     int *endptr;
+     EMACS_INT pos, bufpos;
+     EMACS_INT region_beg, region_end;
+     EMACS_INT *endptr;
      enum face_id base_face_id;
      int mouse_p;
 {