From 68a973351fcc8327e72ed65266983e946d0780d5 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Wed, 19 May 1993 03:07:10 +0000 Subject: [PATCH] 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. --- src/xfaces.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/xfaces.c b/src/xfaces.c index 2339b57829..48068b014f 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -420,7 +420,12 @@ unload_color (f, pixel) /* 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 @@ ensure_face_ready (f, id) /* 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) -- 2.20.1