changeset 2883:b8a3b11892dc

Make sure that all the display faces use fonts of the same dimensions as the default face, so as not to confuse the rest of the redisplay code. * xfaces.c (same_size_fonts): New function. (merge_faces): Only merge in a new font from the FROM face if it is the same size as the font in the TO face.
author Jim Blandy <jimb@redhat.com>
date Wed, 19 May 1993 03:07:10 +0000
parents 0990f98b4a6c
children e52ea063421a
files src/xfaces.c
diffstat 1 files changed, 26 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Wed May 19 03:06:38 1993 +0000
+++ b/src/xfaces.c	Wed May 19 03:07:10 1993 +0000
@@ -420,7 +420,12 @@
 
 /* Initializing face arrays for frames. */
 
-/* Set up faces 0 and 1 based on the normal text and modeline GC's.  */
+/* Set up faces 0 and 1 based on the normal text and modeline GC's.
+   This gets called whenever the parameters stored in the frame itself
+   (i.e. font, background color, etcetera) change.
+
+   Note that the first two faces just contain references to the
+   frame's own resources.  We shouldn't free them.  */
 void
 init_frame_faces (f)
      struct frame *f;
@@ -547,16 +552,32 @@
 
 /* Computing faces appropriate for a given piece of text in a buffer.  */
 
+/* Return non-zero if FONT1 and FONT2 have the same size bounding box.
+   We assume that they're both character-cell fonts.  */
+static int
+same_size_fonts (font1, font2)
+     XFontStruct *font1, *font2;
+{
+  XCharStruct *bounds1 = font1->min_bounds;
+  XCharStruct *bounds2 = font2->min_bounds;
+
+  return (bounds1->width == bounds2->width
+	  && bounds1->ascent == bounds2->ascent
+	  && bounds1->descent == bounds2->descent);
+}
+
+
 /* Modify face TO by copying from FROM all properties which have
    nondefault settings.  */
 static void 
 merge_faces (from, to)
      struct face *from, *to;
 {
-  if (from->font != (XFontStruct *)FACE_DEFAULT)
-    {
-      to->font = from->font;
-    }
+  /* Only merge the font if it's the same size as the base font.  */
+  if (from->font != (XFontStruct *) FACE_DEFAULT
+      && ! from->font->per_char
+      && same_size_fonts (from->font, to->font))
+    to->font = from->font;
   if (from->foreground != FACE_DEFAULT)
     to->foreground = from->foreground;
   if (from->background != FACE_DEFAULT)