# HG changeset patch # User Jason Rumney # Date 1204406396 0 # Node ID 9b14fb0bae09512378bbbe478e141e9634e4bc6e # Parent 74ef78ba3461434ab7c24c2e1ad7b64ee739e43d (w32font_full_name): New function. (w32font_open_internal): Use it. diff -r 74ef78ba3461 -r 9b14fb0bae09 src/w32font.c --- a/src/w32font.c Sat Mar 01 21:11:37 2008 +0000 +++ b/src/w32font.c Sat Mar 01 21:19:56 2008 +0000 @@ -76,6 +76,8 @@ static Lisp_Object lispy_antialias_type P_ ((BYTE type)); static Lisp_Object font_supported_scripts P_ ((FONTSIGNATURE * sig)); +static int w32font_full_name P_ ((LOGFONT * font, Lisp_Object font_obj, + int pixel_size, char *name, int nbytes)); /* From old font code in w32fns.c */ char * w32_to_x_charset P_ ((int charset, char * matching)); @@ -757,7 +759,8 @@ 96 bytes and go up in steps of 32. */ len = 96; name = xmalloc (len); - while (name && font_unparse_fcname (font_entity, pixel_size, name, len) < 0) + while (name && w32font_full_name (&logfont, font_entity, pixel_size, + name, len) < 0) { char *new = xrealloc (name, len += 32); @@ -1539,6 +1542,59 @@ return supported; } +/* Generate a full name for a Windows font. + The full name is in fcname format, with weight, slant and antialiasing + specified if they are not "normal". */ +static int +w32font_full_name (font, font_obj, pixel_size, name, nbytes) + LOGFONT * font; + Lisp_Object font_obj; + int pixel_size; + char *name; + int nbytes; +{ + int len; + char *p; + Lisp_Object antialiasing, weight = Qnil; + + len = strlen (font->lfFaceName) + 21; /* :pixelsize=SIZE */ + + if (font->lfItalic) + len += 7; /* :italic */ + + if (font->lfWeight && font->lfWeight != FW_NORMAL) + { + weight = font_symbolic_weight (font_obj); + len += 8 + SBYTES (SYMBOL_NAME (weight)); /* :weight=NAME */ + } + + antialiasing = lispy_antialias_type (font->lfQuality); + if (! NILP (antialiasing)) + len += 11 + SBYTES (SYMBOL_NAME (antialiasing)); /* :antialias=NAME */ + + /* Check that the buffer is big enough */ + if (len > nbytes) + return -1; + + p = name; + p += sprintf (p, "%s", font->lfFaceName); + + if (font->lfHeight) + p += sprintf (p, ":pixelsize=%d", eabs (font->lfHeight)); + else if (pixel_size > 0) + p += sprintf (p, ":pixelsize=%d", pixel_size); + + if (font->lfItalic) + p += sprintf (p, ":italic"); + + if (SYMBOLP (weight) && ! NILP (weight)) + p += sprintf (p, ":weight=%s", SDATA (SYMBOL_NAME (weight))); + + if (SYMBOLP (antialiasing) && ! NILP (antialiasing)) + p += sprintf (p, ":antialias=%s", SDATA (SYMBOL_NAME (antialiasing))); + + return (p - name); +} struct font_driver w32font_driver = {