# HG changeset patch # User Jim Blandy # Date 737780830 0 # Node ID b8a3b11892dccb5e8f7a85d18e77d691ef155b08 # Parent 0990f98b4a6c1ff65ed3e22f17abf07d22613566 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. diff -r 0990f98b4a6c -r b8a3b11892dc src/xfaces.c --- 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)