From 9fa828240d621736a61f5938f78cc98805fdcf56 Mon Sep 17 00:00:00 2001 From: Damyan Pepper Date: Wed, 13 Oct 2010 16:07:28 +0200 Subject: [PATCH] Fix handling of font properties on Windows (bug#6303). * src/font.c (font_filter_properties): New function, refactored from ftfont_filter_properties. * src/font.h (font_filter_properties): Declare. * src/ftfont.c (ftfont_filter_properties): Use font_filter_properties. * src/w32font.c (w32font_booleans, w32font_non_booleans): New variables. (w32font_filter_properties): New function. (w32font_driver): Add w32font_filter_properties. --- src/ChangeLog | 11 +++++++++++ src/font.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/font.h | 5 +++++ src/ftfont.c | 43 ++++------------------------------------- src/w32font.c | 21 +++++++++++++++++++- 5 files changed, 93 insertions(+), 40 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 7c1faad6aab..40c0cb231e4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2010-10-13 Damyan Pepper + + Fix handling of font properties on Windows (bug#6303). + * font.c (font_filter_properties): New function, refactored from + ftfont_filter_properties. + * font.h (font_filter_properties): Declare. + * ftfont.c (ftfont_filter_properties): Use font_filter_properties. + * w32font.c (w32font_booleans, w32font_non_booleans): New variables. + (w32font_filter_properties): New function. + (w32font_driver): Add w32font_filter_properties. + 2010-10-12 Juanma Barranquero * font.c (Ffont_variation_glyphs): diff --git a/src/font.c b/src/font.c index c72f189d87f..77f43c81d71 100644 --- a/src/font.c +++ b/src/font.c @@ -3862,6 +3862,59 @@ font_get_frame_data (f, driver) } +/* Sets attributes on a font. Any properties that appear in ALIST and + BOOLEAN_PROPERTIES or NON_BOOLEAN_PROPERTIES are set on the font. + BOOLEAN_PROPERTIES and NON_BOOLEAN_PROPERTIES are NULL-terminated + arrays of strings. This function is intended for use by the font + drivers to implement their specific font_filter_properties. */ +void +font_filter_properties (font, alist, boolean_properties, non_boolean_properties) + Lisp_Object font; + Lisp_Object alist; + const char *boolean_properties[]; + const char *non_boolean_properties[]; +{ + Lisp_Object it; + int i; + + /* Set boolean values to Qt or Qnil */ + for (i = 0; boolean_properties[i] != NULL; ++i) + for (it = alist; ! NILP (it); it = XCDR (it)) + { + Lisp_Object key = XCAR (XCAR (it)); + Lisp_Object val = XCDR (XCAR (it)); + char *keystr = SDATA (SYMBOL_NAME (key)); + + if (strcmp (boolean_properties[i], keystr) == 0) + { + const char *str = INTEGERP (val) ? (XINT (val) ? "true" : "false") + : SYMBOLP (val) ? (const char *) SDATA (SYMBOL_NAME (val)) + : "true"; + + if (strcmp ("false", str) == 0 || strcmp ("False", str) == 0 + || strcmp ("FALSE", str) == 0 || strcmp ("FcFalse", str) == 0 + || strcmp ("off", str) == 0 || strcmp ("OFF", str) == 0 + || strcmp ("Off", str) == 0) + val = Qnil; + else + val = Qt; + + Ffont_put (font, key, val); + } + } + + for (i = 0; non_boolean_properties[i] != NULL; ++i) + for (it = alist; ! NILP (it); it = XCDR (it)) + { + Lisp_Object key = XCAR (XCAR (it)); + Lisp_Object val = XCDR (XCAR (it)); + char *keystr = SDATA (SYMBOL_NAME (key)); + if (strcmp (non_boolean_properties[i], keystr) == 0) + Ffont_put (font, key, val); + } +} + + /* Return the font used to draw character C by FACE at buffer position POS in window W. If STRING is non-nil, it is a string containing C at index POS. If C is negative, get C from the current buffer or diff --git a/src/font.h b/src/font.h index 96227ffe40b..14b1abc4de8 100644 --- a/src/font.h +++ b/src/font.h @@ -814,6 +814,11 @@ extern int font_put_frame_data P_ ((FRAME_PTR f, extern void *font_get_frame_data P_ ((FRAME_PTR f, struct font_driver *driver)); +extern void font_filter_properties (Lisp_Object font, + Lisp_Object alist, + const char *boolean_properties[], + const char *non_boolean_properties[]); + #ifdef HAVE_FREETYPE extern struct font_driver ftfont_driver; #endif /* HAVE_FREETYPE */ diff --git a/src/ftfont.c b/src/ftfont.c index 33a96143fd0..4699c74470f 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -88,7 +88,7 @@ static Lisp_Object ftfont_lookup_cache P_ ((Lisp_Object, enum ftfont_cache_for)); static void ftfont_filter_properties P_ ((Lisp_Object font, Lisp_Object alist)); - + Lisp_Object ftfont_font_format P_ ((FcPattern *, Lisp_Object)); #define SYMBOL_FcChar8(SYM) (FcChar8 *) SDATA (SYMBOL_NAME (SYM)) @@ -264,7 +264,7 @@ ftfont_pattern_entity (p, extra) else { /* As this font is not scalable, parhaps this is a BDF or PCF - font. */ + font. */ FT_Face ft_face; ASET (entity, FONT_ADSTYLE_INDEX, get_adstyle_property (p)); @@ -2113,7 +2113,7 @@ ftfont_drive_otf (font, spec, in, from, to, out, adjustment) return to; } -static int +static int ftfont_try_otf (MFLTFont *font, MFLTOtfSpec *spec, MFLTGlyphString *in, int from, int to) { @@ -2681,42 +2681,7 @@ ftfont_filter_properties (font, alist) Lisp_Object font; Lisp_Object alist; { - Lisp_Object it; - int i; - - /* Set boolean values to Qt or Qnil */ - for (i = 0; ftfont_booleans[i] != NULL; ++i) - for (it = alist; ! NILP (it); it = XCDR (it)) - { - Lisp_Object key = XCAR (XCAR (it)); - Lisp_Object val = XCDR (XCAR (it)); - char *keystr = SDATA (SYMBOL_NAME (key)); - - if (strcmp (ftfont_booleans[i], keystr) == 0) - { - char *str = SYMBOLP (val) ? SDATA (SYMBOL_NAME (val)) : NULL; - if (INTEGERP (val)) str = XINT (val) != 0 ? "true" : "false"; - if (str == NULL) str = "true"; - - val = Qt; - if (strcmp ("false", str) == 0 || strcmp ("False", str) == 0 - || strcmp ("FALSE", str) == 0 || strcmp ("FcFalse", str) == 0 - || strcmp ("off", str) == 0 || strcmp ("OFF", str) == 0 - || strcmp ("Off", str) == 0) - val = Qnil; - Ffont_put (font, key, val); - } - } - - for (i = 0; ftfont_non_booleans[i] != NULL; ++i) - for (it = alist; ! NILP (it); it = XCDR (it)) - { - Lisp_Object key = XCAR (XCAR (it)); - Lisp_Object val = XCDR (XCAR (it)); - char *keystr = SDATA (SYMBOL_NAME (key)); - if (strcmp (ftfont_non_booleans[i], keystr) == 0) - Ffont_put (font, key, val); - } + font_filter_properties (font, alist, ftfont_booleans, ftfont_non_booleans); } diff --git a/src/w32font.c b/src/w32font.c index a07762e970f..e38e1a56fb8 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -2446,6 +2446,25 @@ in the font selection dialog. */) return DECODE_SYSTEM (build_string (buf)); } +static const char *w32font_booleans [] = { + NULL, +}; + +static const char *w32font_non_booleans [] = { + ":script", + ":antialias", + ":style", + NULL, +}; + +static void +w32font_filter_properties (font, alist) + Lisp_Object font; + Lisp_Object alist; +{ + font_filter_properties (font, alist, w32font_booleans, w32font_non_booleans); +} + struct font_driver w32font_driver = { 0, /* Qgdi */ @@ -2475,7 +2494,7 @@ struct font_driver w32font_driver = NULL, /* shape */ NULL, /* check */ NULL, /* get_variation_glyphs */ - NULL, /* filter_properties */ + w32font_filter_properties, }; -- 2.39.2