X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d4aca72ead4c1e53819e6e3249e26400a9879a0e..d1ab001b5ba5db6d33d93e78ae2373ce7fd72128:/src/w32font.c diff --git a/src/w32font.c b/src/w32font.c index 6306a8460e..018e657256 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -1,12 +1,12 @@ /* Font backend for the Microsoft Windows API. - Copyright (C) 2007-2015 Free Software Foundation, Inc. + Copyright (C) 2007-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,12 +26,7 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "w32term.h" #include "frame.h" -#include "dispextern.h" -#include "character.h" -#include "charset.h" -#include "coding.h" -#include "fontset.h" -#include "font.h" +#include "coding.h" /* for ENCODE_SYSTEM, DECODE_SYSTEM */ #include "w32font.h" #ifdef WINDOWSNT #include "w32.h" @@ -244,7 +239,7 @@ intern_font_name (char * string) Lisp_Object str = DECODE_SYSTEM (build_string (string)); ptrdiff_t len = SCHARS (str); Lisp_Object obarray = check_obarray (Vobarray); - Lisp_Object tem = oblookup (obarray, SDATA (str), len, len); + Lisp_Object tem = oblookup (obarray, SSDATA (str), len, len); /* This code is similar to intern function from lread.c. */ return SYMBOLP (tem) ? tem : intern_driver (str, obarray, tem); } @@ -650,12 +645,31 @@ w32font_draw (struct glyph_string *s, int from, int to, HBRUSH brush; RECT rect; struct font *font = s->font; - + int ascent = font->ascent, descent = font->descent; + + /* Font's global ascent and descent values might be + preposterously large for some fonts. We fix here the case + when those fonts are used for display of glyphless + characters, because drawing background with font dimensions + in those cases makes the display illegible. There's only one + more call to the draw method with with_background set to + true, and that's in x_draw_glyph_string_foreground, when + drawing the cursor, where we have no such heuristics + available. FIXME. */ + if (s->first_glyph->type == GLYPHLESS_GLYPH + && (s->first_glyph->u.glyphless.method == GLYPHLESS_DISPLAY_HEX_CODE + || s->first_glyph->u.glyphless.method == GLYPHLESS_DISPLAY_ACRONYM)) + { + ascent = + s->first_glyph->slice.glyphless.lower_yoff + - s->first_glyph->slice.glyphless.upper_yoff; + descent = 0; + } brush = CreateSolidBrush (s->gc->background); rect.left = x; - rect.top = y - font->ascent; + rect.top = y - ascent; rect.right = x + s->width; - rect.bottom = y + font->descent; + rect.bottom = y + descent; FillRect (s->hdc, &rect, brush); DeleteObject (brush); } @@ -782,7 +796,8 @@ w32font_list_internal (struct frame *f, Lisp_Object font_spec, && !EQ (spec_charset, Qiso10646_1) && !EQ (spec_charset, Qunicode_bmp) && !EQ (spec_charset, Qunicode_sip) - && !EQ (spec_charset, Qunknown)) + && !EQ (spec_charset, Qunknown) + && !EQ (spec_charset, Qascii_0)) return Qnil; } @@ -1459,12 +1474,12 @@ add_font_entity_to_list (ENUMLOGFONTEX *logical_font, by a foundry, we accept raster fonts if the font name is found anywhere within the full name. */ if ((logical_font->elfLogFont.lfOutPrecision == OUT_STRING_PRECIS - && !strstr (logical_font->elfFullName, + && !strstr ((char *)logical_font->elfFullName, logical_font->elfLogFont.lfFaceName)) /* Check for well known substitutions that mess things up in the presence of Type-1 fonts of the same name. */ || (!check_face_name (&logical_font->elfLogFont, - logical_font->elfFullName))) + (char *)logical_font->elfFullName))) return 1; /* Make a font entity for the font. */ @@ -1641,7 +1656,7 @@ registry_to_w32_charset (Lisp_Object charset) else if (EQ (charset, Qiso8859_1)) return ANSI_CHARSET; else if (SYMBOLP (charset)) - return x_to_w32_charset (SDATA (SYMBOL_NAME (charset))); + return x_to_w32_charset (SSDATA (SYMBOL_NAME (charset))); else return DEFAULT_CHARSET; } @@ -1763,7 +1778,7 @@ w32_to_x_charset (int fncharset, char *matching) || !SYMBOLP (XCAR (XCDR (this_entry)))) continue; - x_charset = SDATA (XCAR (this_entry)); + x_charset = SSDATA (XCAR (this_entry)); w32_charset = XCAR (XCDR (this_entry)); codepage = XCDR (XCDR (this_entry)); @@ -1968,7 +1983,7 @@ fill_in_logfont (struct frame *f, LOGFONT *logfont, Lisp_Object font_spec) else if (SYMBOLP (tmp)) { strncpy (logfont->lfFaceName, - SDATA (ENCODE_SYSTEM (SYMBOL_NAME (tmp))), LF_FACESIZE); + SSDATA (ENCODE_SYSTEM (SYMBOL_NAME (tmp))), LF_FACESIZE); logfont->lfFaceName[LF_FACESIZE-1] = '\0'; } } @@ -2064,7 +2079,7 @@ list_all_matching_fonts (struct font_callback_data *match_data) if (NILP (family)) continue; else if (SYMBOLP (family)) - name = SDATA (ENCODE_SYSTEM (SYMBOL_NAME (family))); + name = SSDATA (ENCODE_SYSTEM (SYMBOL_NAME (family))); else continue;