Commit 9fa82824 authored by Damyan Pepper's avatar Damyan Pepper Committed by Juanma Barranquero

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.
parent 7163badd
2010-10-13 Damyan Pepper <damyanp@gmail.com>
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 <lekktu@gmail.com>
* font.c (Ffont_variation_glyphs):
......
......@@ -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
......
......@@ -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 */
......
......@@ -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);
}
......
......@@ -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,
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment