aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenichi Handa2006-06-16 12:34:49 +0000
committerKenichi Handa2006-06-16 12:34:49 +0000
commitef18374fba5547c616da8b449232566fb7de58cb (patch)
tree3b9c6f4debbdbc56841848f8476b12b2dbbbb4c8
parentff35ddd4f7eb75bf2eaee655f309bd81b360e3df (diff)
downloademacs-ef18374fba5547c616da8b449232566fb7de58cb.tar.gz
emacs-ef18374fba5547c616da8b449232566fb7de58cb.zip
(XLFD_SMALLNUM_MASK): Delete this macro.
(XLFD_LARGENUM_MASK): Delete XLFD_ENCODING_MASK from it. (font_expand_wildcards): Fix handling ENCODING field. Avoid unnecessary checks for weight, slant, and swidth. (font_parse_fcname): New function. (font_unparse_fcname): New function. (font_parse_name): New function. (font_match_p): New function. (font_get_name): Return value changed to Lisp string. (font_get_spec): New function. (Qunspecified, Qignore_defface): Don't extern them. (font_find_for_lface): Assume that LFACE is fully specified. (font_load_for_face): If lface[LFACE_FONT_INDEX] is an font object, use it for FACE. (font_open_by_name): Call Ffont_spec with QCname prop. Don't call driver->parse_name. (Ffont_spec): Call font_parse_name, not font_parse_xlfd.
-rw-r--r--src/font.c436
1 files changed, 304 insertions, 132 deletions
diff --git a/src/font.c b/src/font.c
index 35575e3ad3f..38cf29d0c02 100644
--- a/src/font.c
+++ b/src/font.c
@@ -475,9 +475,8 @@ font_expand_wildcards (field, n)
475#define XLFD_SYMBOL_MASK (XLFD_FOUNDRY_MASK | XLFD_FAMILY_MASK \ 475#define XLFD_SYMBOL_MASK (XLFD_FOUNDRY_MASK | XLFD_FAMILY_MASK \
476 | XLFD_ADSTYLE_MASK | XLFD_REGISTRY_MASK) 476 | XLFD_ADSTYLE_MASK | XLFD_REGISTRY_MASK)
477#define XLFD_NULL_MASK (XLFD_FOUNDRY_MASK | XLFD_ADSTYLE_MASK) 477#define XLFD_NULL_MASK (XLFD_FOUNDRY_MASK | XLFD_ADSTYLE_MASK)
478#define XLFD_SMALLNUM_MASK (XLFD_PIXEL_MASK | XLFD_ENCODING_MASK)
479#define XLFD_LARGENUM_MASK (XLFD_POINT_MASK | XLFD_RESX_MASK | XLFD_RESY_MASK \ 478#define XLFD_LARGENUM_MASK (XLFD_POINT_MASK | XLFD_RESX_MASK | XLFD_RESY_MASK \
480 | XLFD_AVGWIDTH_MASK | XLFD_ENCODING_MASK) 479 | XLFD_AVGWIDTH_MASK)
481#define XLFD_REGENC_MASK (XLFD_REGISTRY_MASK | XLFD_ENCODING_MASK) 480#define XLFD_REGENC_MASK (XLFD_REGISTRY_MASK | XLFD_ENCODING_MASK)
482 481
483 /* Initialize RANGE_MASK for FIELD[0] which can be 0th to (14 - N)th 482 /* Initialize RANGE_MASK for FIELD[0] which can be 0th to (14 - N)th
@@ -512,11 +511,14 @@ font_expand_wildcards (field, n)
512 { 511 {
513 int numeric = XINT (val); 512 int numeric = XINT (val);
514 513
515 if (numeric <= 48) 514 if (i + 1 == n)
516 from = XLFD_PIXEL_INDEX, to = XLFD_ENCODING_INDEX, 515 from = to = XLFD_ENCODING_INDEX,
517 mask = XLFD_SMALLNUM_MASK; 516 mask = XLFD_ENCODING_MASK;
517 else if (numeric <= 48)
518 from = to = XLFD_PIXEL_INDEX,
519 mask = XLFD_PIXEL_MASK;
518 else 520 else
519 from = XLFD_POINT_INDEX, to = XLFD_ENCODING_INDEX, 521 from = XLFD_POINT_INDEX, to = XLFD_AVGWIDTH_MASK,
520 mask = XLFD_LARGENUM_MASK; 522 mask = XLFD_LARGENUM_MASK;
521 } 523 }
522 else if (EQ (val, null_string)) 524 else if (EQ (val, null_string))
@@ -535,11 +537,17 @@ font_expand_wildcards (field, n)
535 from = to = XLFD_ENCODING_INDEX, 537 from = to = XLFD_ENCODING_INDEX,
536 mask = XLFD_ENCODING_MASK; 538 mask = XLFD_ENCODING_MASK;
537 } 539 }
538 else if (!NILP (prop_name_to_numeric (FONT_WEIGHT_INDEX, val))) 540 else if (range_from <= XLFD_WEIGHT_INDEX
541 && range_to >= XLFD_WEIGHT_INDEX
542 && !NILP (prop_name_to_numeric (FONT_WEIGHT_INDEX, val)))
539 from = to = XLFD_WEIGHT_INDEX, mask = XLFD_WEIGHT_MASK; 543 from = to = XLFD_WEIGHT_INDEX, mask = XLFD_WEIGHT_MASK;
540 else if (!NILP (prop_name_to_numeric (FONT_SLANT_INDEX, val))) 544 else if (range_from <= XLFD_SLANT_INDEX
545 && range_to >= XLFD_SLANT_INDEX
546 && !NILP (prop_name_to_numeric (FONT_SLANT_INDEX, val)))
541 from = to = XLFD_SLANT_INDEX, mask = XLFD_SLANT_MASK; 547 from = to = XLFD_SLANT_INDEX, mask = XLFD_SLANT_MASK;
542 else if (!NILP (prop_name_to_numeric (FONT_WIDTH_INDEX, val))) 548 else if (range_from <= XLFD_SWIDTH_INDEX
549 && range_to >= XLFD_SWIDTH_INDEX
550 && !NILP (prop_name_to_numeric (FONT_WIDTH_INDEX, val)))
543 from = to = XLFD_SWIDTH_INDEX, mask = XLFD_SWIDTH_MASK; 551 from = to = XLFD_SWIDTH_INDEX, mask = XLFD_SWIDTH_MASK;
544 else 552 else
545 { 553 {
@@ -626,15 +634,9 @@ font_expand_wildcards (field, n)
626 return 0; 634 return 0;
627} 635}
628 636
629/* Parse NAME (null terminated) as XLFD format, and store information 637/* Parse NAME (null terminated) as XLFD and store information in FONT
630 in FONT (font-spec or font-entity). If NAME is successfully 638 (font-spec or font-entity). See font_parse_name for more
631 parsed, return 2 (non-scalable font), 1 (scalable vector font), or 639 detail. */
632 0 (auto-scaled font). Otherwise return -1.
633
634 If FONT is a font-entity, store RESY-SPACING-AVWIDTH information as
635 a symbol in FONT_EXTRA_INDEX.
636
637 If MERGE is nonzero, set a property of FONT only when it's nil. */
638 640
639int 641int
640font_parse_xlfd (name, font, merge) 642font_parse_xlfd (name, font, merge)
@@ -969,6 +971,179 @@ font_unparse_xlfd (font, pixel_size, name, nbytes)
969 f[XLFD_RESY_INDEX], f[XLFD_REGISTRY_INDEX]); 971 f[XLFD_RESY_INDEX], f[XLFD_REGISTRY_INDEX]);
970} 972}
971 973
974/* Parse NAME (null terminated) as Fonconfig's name format and store
975 information in FONT (font-spec or font-entity). See
976 font_parse_name for more detail. */
977
978int
979font_parse_fcname (name, font, merge)
980 char *name;
981 Lisp_Object font;
982 int merge;
983{
984 char *p0, *p1;
985 Lisp_Object family = Qnil;
986 double point_size = 0;
987 int pixel_size = 0;
988 Lisp_Object extra = AREF (font, FONT_EXTRA_INDEX);
989
990 /* It is assured that (name[0] && name[0] != '-'). */
991 if (name[0] == ':')
992 p0 = name;
993 else
994 {
995 for (p0 = name + 1; *p0 && (*p0 != '-' && *p0 != ':'); p0++);
996 family = intern_font_field (name, p0 - name);
997 if (*p0 == '-')
998 {
999 point_size = strtod (p0 + 1, &p1);
1000 if (*p1 && *p1 != ':')
1001 return -1;
1002 p0 = p1;
1003 }
1004 if (! merge || NILP (AREF (font, FONT_FAMILY_INDEX)))
1005 ASET (font, FONT_FAMILY_INDEX, family);
1006 }
1007 while (*p0)
1008 {
1009 Lisp_Object key, val;
1010 enum font_property_index prop;
1011
1012 p1 = index (name, '=');
1013 if (! p1)
1014 return -1;
1015 if (memcmp (p0 + 1, "pixelsize=", 10) == 0)
1016 prop = FONT_SIZE_INDEX;
1017 else
1018 {
1019 key = intern_font_field (p0, p1 - p0);
1020 prop = check_font_prop_name (key);
1021 }
1022 p0 = p1 + 1;
1023 for (p1 = p0; *p1 && *p1 != ':'; p1++);
1024 if (prop == FONT_SIZE_INDEX)
1025 {
1026 pixel_size = atoi (p0);
1027 }
1028 else
1029 {
1030 val = intern_font_field (p0, p1 - p0);
1031 if (prop < FONT_EXTRA_INDEX)
1032 {
1033 if (! merge || NILP (AREF (font, prop)))
1034 {
1035 val = font_property_table[prop].validater (prop, val);
1036 if (! EQ (val, Qerror))
1037 ASET (font, prop, val);
1038 }
1039 }
1040 else
1041 {
1042 if (! merge || NILP (Fplist_get (extra, key)))
1043 extra = Fplist_put (extra, key, val);
1044 }
1045 }
1046 p0 = p1;
1047 }
1048 ASET (font, FONT_EXTRA_INDEX, extra);
1049 if (! merge || NILP (AREF (font, FONT_SIZE_INDEX)))
1050 {
1051 if (point_size > 0)
1052 ASET (font, FONT_SIZE_INDEX, make_float (point_size));
1053 else if (pixel_size > 0)
1054 ASET (font, FONT_SIZE_INDEX, make_number (pixel_size));
1055 }
1056
1057 return (NILP (AREF (font, FONT_SIZE_INDEX)) ? 1 : 2);
1058}
1059
1060/* Store fontconfig's font name of FONT (font-spec or font-entity) in
1061 NAME (NBYTES length), and return the name length. If
1062 FONT_SIZE_INDEX of FONT is 0, use PIXEL_SIZE instead. */
1063
1064int
1065font_unparse_fcname (font, pixel_size, name, nbytes)
1066 Lisp_Object font;
1067 int pixel_size;
1068 char *name;
1069 int nbytes;
1070{
1071 Lisp_Object val, size;
1072 int pt = 0;
1073 int i, j, len = 1;
1074 char *p;
1075
1076 if (SYMBOLP (AREF (font, FONT_FAMILY_INDEX))
1077 && ! NILP (AREF (font, FONT_FAMILY_INDEX)))
1078 len += SBYTES (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX)));
1079 size = AREF (font, FONT_SIZE_INDEX);
1080 if (INTEGERP (size))
1081 {
1082 if (XINT (size) > 0)
1083 pixel_size = XINT (size);
1084 if (pixel_size > 0)
1085 len += 21; /* for ":pixelsize=NUM" */
1086 }
1087 else if (FLOATP (size))
1088 {
1089 pt = (int) XFLOAT_DATA (size);
1090 if (pt > 0)
1091 len += 11; /* for "-NUM" */
1092 }
1093 if (SYMBOLP (AREF (font, FONT_FOUNDRY_INDEX))
1094 && ! NILP (AREF (font, FONT_FOUNDRY_INDEX)))
1095 /* ":foundry=NAME" */
1096 len += 9 + SBYTES (SYMBOL_NAME (AREF (font, FONT_FOUNDRY_INDEX)));
1097 if (INTEGERP (AREF (font, FONT_WEIGHT_INDEX)))
1098 len += 18; /* ":weight=NUM" */
1099 if (INTEGERP (AREF (font, FONT_SLANT_INDEX)))
1100 len += 17; /* ":slant=NUM" */
1101 if (INTEGERP (AREF (font, FONT_WIDTH_INDEX)))
1102 len += 17; /* ":width=NUM" */
1103 if (len > nbytes)
1104 return -1;
1105 p = name;
1106 if (! NILP (AREF (font, FONT_FAMILY_INDEX)))
1107 strcpy (p, SDATA (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX)))),
1108 p += SBYTES (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX)));
1109 if (pt > 0)
1110 p += sprintf (p, "-%d", pt);
1111 else if (pixel_size > 0)
1112 p += sprintf (p, ":pixelsize=%d", pixel_size);
1113 if (! NILP (AREF (font, FONT_FOUNDRY_INDEX)))
1114 p += sprintf (p, ":foundry=%s", SDATA (AREF (font, FONT_FOUNDRY_INDEX)));
1115 if (INTEGERP (AREF (font, FONT_WEIGHT_INDEX)))
1116 p += sprintf (p, ":weight=%d", XINT (AREF (font, FONT_WEIGHT_INDEX)));
1117 if (INTEGERP (AREF (font, FONT_SLANT_INDEX)))
1118 p += sprintf (p, ":slant=%d", XINT (AREF (font, FONT_SLANT_INDEX)));
1119 if (INTEGERP (AREF (font, FONT_WIDTH_INDEX)))
1120 p += sprintf (p, ":width=%d", XINT (AREF (font, FONT_WIDTH_INDEX)));
1121 return (p - name);
1122}
1123
1124/* Parse NAME (null terminated) and store information in FONT
1125 (font-spec or font-entity). If NAME is successfully parsed, return
1126 2 (size is specified), 1 (size is not specified), or 0 (size is not
1127 specified but resolution is specified). Otherwise return -1.
1128
1129 If NAME is XLFD and FONT is a font-entity, store
1130 RESY-SPACING-AVWIDTH information as a symbol in FONT_EXTRA_INDEX.
1131
1132 If MERGE is nonzero, set a property of FONT only when it's nil. */
1133
1134static int
1135font_parse_name (name, font, merge)
1136 char *name;
1137 Lisp_Object font;
1138 int merge;
1139{
1140 if (name[0] == '-' || index (name, '*'))
1141 return font_parse_xlfd (name, font, merge);
1142 if (name[0])
1143 return font_parse_fcname (name, font, merge);
1144 return -1;
1145}
1146
972void 1147void
973font_merge_old_spec (name, family, registry, spec) 1148font_merge_old_spec (name, family, registry, spec)
974 Lisp_Object name, family, registry, spec; 1149 Lisp_Object name, family, registry, spec;
@@ -1750,6 +1925,24 @@ font_symbolic_width (font)
1750 return width; 1925 return width;
1751} 1926}
1752 1927
1928int
1929font_match_p (spec, entity)
1930 Lisp_Object spec, entity;
1931{
1932 int i;
1933
1934 for (i = FONT_FOUNDRY_INDEX; i < FONT_SIZE_INDEX; i++)
1935 if (! NILP (AREF (spec, i))
1936 && ! EQ (AREF (spec, i), AREF (entity, i)))
1937 return 0;
1938 if (INTEGERP (AREF (spec, FONT_SIZE_INDEX))
1939 && XINT (AREF (entity, FONT_SIZE_INDEX)) > 0
1940 && (XINT (AREF (spec, FONT_SIZE_INDEX))
1941 != XINT (AREF (entity, FONT_SIZE_INDEX))))
1942 return 0;
1943 return 1;
1944}
1945
1753Lisp_Object 1946Lisp_Object
1754font_find_object (font) 1947font_find_object (font)
1755 struct font *font; 1948 struct font *font;
@@ -1943,15 +2136,30 @@ font_encode_char (font_object, c)
1943 return font->driver->encode_char (font, c); 2136 return font->driver->encode_char (font, c);
1944} 2137}
1945 2138
1946char * 2139Lisp_Object
1947font_get_name (font_object) 2140font_get_name (font_object)
1948 Lisp_Object font_object; 2141 Lisp_Object font_object;
1949{ 2142{
1950 struct font *font = XSAVE_VALUE (font_object)->pointer; 2143 struct font *font = XSAVE_VALUE (font_object)->pointer;
2144 char *name = (font->font.full_name ? font->font.full_name
2145 : font->font.name ? font->font.name
2146 : NULL);
1951 2147
1952 return (font->font.full_name ? font->font.full_name 2148 return (name ? make_unibyte_string (name, strlen (name)) : null_string);
1953 : font->file_name ? font->file_name 2149}
1954 : ""); 2150
2151Lisp_Object
2152font_get_spec (font_object)
2153 Lisp_Object font_object;
2154{
2155 struct font *font = XSAVE_VALUE (font_object)->pointer;
2156 Lisp_Object spec = Ffont_spec (0, NULL);
2157 int i;
2158
2159 for (i = 0; i < FONT_SIZE_INDEX; i++)
2160 ASET (spec, i, AREF (font->entity, i));
2161 ASET (spec, FONT_SIZE_INDEX, make_number (font->pixel_size));
2162 return spec;
1955} 2163}
1956 2164
1957Lisp_Object 2165Lisp_Object
@@ -1964,7 +2172,8 @@ font_get_frame (font)
1964 return AREF (font, FONT_FRAME_INDEX); 2172 return AREF (font, FONT_FRAME_INDEX);
1965} 2173}
1966 2174
1967extern Lisp_Object Qunspecified, Qignore_defface; 2175/* Find a font entity best matching with LFACE. If SPEC is non-nil,
2176 the font must exactly match with it. */
1968 2177
1969Lisp_Object 2178Lisp_Object
1970font_find_for_lface (f, lface, spec) 2179font_find_for_lface (f, lface, spec)
@@ -1972,18 +2181,9 @@ font_find_for_lface (f, lface, spec)
1972 Lisp_Object *lface; 2181 Lisp_Object *lface;
1973 Lisp_Object spec; 2182 Lisp_Object spec;
1974{ 2183{
1975 Lisp_Object attrs[LFACE_FONT_INDEX + 1]; 2184 Lisp_Object frame, entities;
1976 Lisp_Object frame, val, entities;
1977 int i; 2185 int i;
1978 unsigned char try_unspecified[FONT_SPEC_MAX];
1979 2186
1980 for (i = 0; i <= LFACE_FONT_INDEX; i++)
1981 {
1982 val = lface[i];
1983 if (EQ (val, Qunspecified) || EQ (val, Qignore_defface))
1984 val = Qnil;
1985 attrs[i] = val;
1986 }
1987 if (NILP (spec)) 2187 if (NILP (spec))
1988 for (i = 0; i < FONT_SPEC_MAX; i++) 2188 for (i = 0; i < FONT_SPEC_MAX; i++)
1989 ASET (scratch_font_spec, i, Qnil); 2189 ASET (scratch_font_spec, i, Qnil);
@@ -1991,54 +2191,26 @@ font_find_for_lface (f, lface, spec)
1991 for (i = 0; i < FONT_SPEC_MAX; i++) 2191 for (i = 0; i < FONT_SPEC_MAX; i++)
1992 ASET (scratch_font_spec, i, AREF (spec, i)); 2192 ASET (scratch_font_spec, i, AREF (spec, i));
1993 2193
1994 /* If SPEC doesn't specify a specific property, it can be tried with
1995 nil even if FACE specifies it. */
1996 for (i = FONT_FOUNDRY_INDEX; i <= FONT_SIZE_INDEX; i++)
1997 try_unspecified[i] = NILP (AREF (scratch_font_spec, i));
1998
1999 if (NILP (spec) && STRINGP (attrs[LFACE_FONT_INDEX]))
2000 font_merge_old_spec (attrs[LFACE_FONT_INDEX], Qnil, Qnil,
2001 scratch_font_spec);
2002 if (NILP (AREF (scratch_font_spec, FONT_FAMILY_INDEX)) 2194 if (NILP (AREF (scratch_font_spec, FONT_FAMILY_INDEX))
2003 && ! NILP (attrs[LFACE_FAMILY_INDEX])) 2195 && ! NILP (lface[LFACE_FAMILY_INDEX]))
2004 font_merge_old_spec (Qnil, attrs[LFACE_FAMILY_INDEX], Qnil, 2196 font_merge_old_spec (Qnil, lface[LFACE_FAMILY_INDEX], Qnil,
2005 scratch_font_spec); 2197 scratch_font_spec);
2006 if (NILP (AREF (scratch_font_spec, FONT_REGISTRY_INDEX))) 2198 if (NILP (AREF (scratch_font_spec, FONT_REGISTRY_INDEX)))
2007 { 2199 ASET (scratch_font_spec, FONT_REGISTRY_INDEX, intern ("iso8859-1"));
2008 ASET (scratch_font_spec, FONT_REGISTRY_INDEX, intern ("iso8859-1"));
2009 try_unspecified[FONT_REGISTRY_INDEX] = 0;
2010 }
2011
2012 for (i = FONT_FAMILY_INDEX; i <= FONT_SIZE_INDEX; i++)
2013 if (try_unspecified[i]
2014 && NILP (AREF (scratch_font_spec, i)))
2015 try_unspecified[i] = 0;
2016 2200
2017 XSETFRAME (frame, f); 2201 XSETFRAME (frame, f);
2018 entities = font_list_entities (frame, scratch_font_spec); 2202 entities = font_list_entities (frame, scratch_font_spec);
2019 while (ASIZE (entities) == 0) 2203 while (ASIZE (entities) == 0)
2020 { 2204 {
2021 if (try_unspecified[FONT_WEIGHT_INDEX] 2205 if (! NILP (AREF (scratch_font_spec, FONT_FOUNDRY_INDEX))
2022 || try_unspecified[FONT_SLANT_INDEX] 2206 && (NILP (spec) || NILP (AREF (spec, FONT_FOUNDRY_INDEX))))
2023 || try_unspecified[FONT_WIDTH_INDEX]
2024 || try_unspecified[FONT_SIZE_INDEX])
2025 { 2207 {
2026 for (i = FONT_WEIGHT_INDEX; i <= FONT_SIZE_INDEX; i++)
2027 {
2028 try_unspecified[i] = 0;
2029 ASET (scratch_font_spec, i, Qnil);
2030 }
2031 entities = font_list_entities (frame, scratch_font_spec);
2032 }
2033 else if (try_unspecified[FONT_FOUNDRY_INDEX])
2034 {
2035 try_unspecified[FONT_FOUNDRY_INDEX] = 0;
2036 ASET (scratch_font_spec, FONT_FOUNDRY_INDEX, Qnil); 2208 ASET (scratch_font_spec, FONT_FOUNDRY_INDEX, Qnil);
2037 entities = font_list_entities (frame, scratch_font_spec); 2209 entities = font_list_entities (frame, scratch_font_spec);
2038 } 2210 }
2039 else if (try_unspecified[FONT_FAMILY_INDEX]) 2211 else if (! NILP (AREF (scratch_font_spec, FONT_FAMILY_INDEX))
2212 && (NILP (spec) || NILP (AREF (spec, FONT_FAMILY_INDEX))))
2040 { 2213 {
2041 try_unspecified[FONT_FAMILY_INDEX] = 0;
2042 ASET (scratch_font_spec, FONT_FAMILY_INDEX, Qnil); 2214 ASET (scratch_font_spec, FONT_FAMILY_INDEX, Qnil);
2043 entities = font_list_entities (frame, scratch_font_spec); 2215 entities = font_list_entities (frame, scratch_font_spec);
2044 } 2216 }
@@ -2048,30 +2220,22 @@ font_find_for_lface (f, lface, spec)
2048 2220
2049 if (ASIZE (entities) > 1) 2221 if (ASIZE (entities) > 1)
2050 { 2222 {
2051 Lisp_Object prefer = scratch_font_prefer; 2223 Lisp_Object prefer = scratch_font_prefer, val;
2052 2224 int size;
2053 for (i = 0; i < FONT_WEIGHT_INDEX; i++) 2225
2054 ASET (prefer, i, Qnil); 2226 ASET (prefer, FONT_WEIGHT_INDEX,
2055 if (! NILP (attrs[LFACE_WEIGHT_INDEX])) 2227 font_prop_validate_style (FONT_WEIGHT_INDEX,
2056 ASET (prefer, FONT_WEIGHT_INDEX, 2228 lface[LFACE_WEIGHT_INDEX]));
2057 font_prop_validate_style (FONT_WEIGHT_INDEX, 2229 ASET (prefer, FONT_SLANT_INDEX,
2058 attrs[LFACE_WEIGHT_INDEX])); 2230 font_prop_validate_style (FONT_SLANT_INDEX,
2059 if (! NILP (attrs[LFACE_SLANT_INDEX])) 2231 lface[LFACE_SLANT_INDEX]));
2060 ASET (prefer, FONT_SLANT_INDEX, 2232 ASET (prefer, FONT_WIDTH_INDEX,
2061 font_prop_validate_style (FONT_SLANT_INDEX, 2233 font_prop_validate_style (FONT_WIDTH_INDEX,
2062 attrs[LFACE_SLANT_INDEX])); 2234 lface[LFACE_SWIDTH_INDEX]));
2063 if (! NILP (attrs[LFACE_SWIDTH_INDEX])) 2235 val = lface[LFACE_HEIGHT_INDEX];
2064 ASET (prefer, FONT_WIDTH_INDEX, 2236 size = POINT_TO_PIXEL (XINT (val), f->resy);
2065 font_prop_validate_style (FONT_WIDTH_INDEX, 2237 ASET (prefer, FONT_SIZE_INDEX, make_number (size));
2066 attrs[LFACE_SWIDTH_INDEX]));
2067 if (! NILP (attrs[LFACE_HEIGHT_INDEX]))
2068 {
2069 int size;
2070 2238
2071 val = attrs[LFACE_HEIGHT_INDEX];
2072 size = POINT_TO_PIXEL (XINT (val), f->resy);
2073 ASET (prefer, FONT_SIZE_INDEX, make_number (size));
2074 }
2075 font_sort_entites (entities, prefer, frame, spec); 2239 font_sort_entites (entities, prefer, frame, spec);
2076 } 2240 }
2077 2241
@@ -2095,30 +2259,33 @@ font_load_for_face (f, face)
2095 FRAME_PTR f; 2259 FRAME_PTR f;
2096 struct face *face; 2260 struct face *face;
2097{ 2261{
2098 Lisp_Object entity; 2262 Lisp_Object font_object = face->lface[LFACE_FONT_INDEX];
2099 2263
2100 face->font_info_id = -1; 2264 if (NILP (font_object))
2101 face->font_info = NULL;
2102 face->font = NULL;
2103 face->font_name = NULL;
2104
2105 entity = font_find_for_lface (f, face->lface, Qnil);
2106 if (! NILP (entity))
2107 { 2265 {
2108 Lisp_Object font_object = font_open_for_lface (f, face->lface, entity); 2266 Lisp_Object entity = font_find_for_lface (f, face->lface, Qnil);
2109 2267
2110 if (! NILP (font_object)) 2268 if (! NILP (entity))
2111 { 2269 font_object = font_open_for_lface (f, face->lface, entity);
2112 struct font *font = XSAVE_VALUE (font_object)->pointer; 2270 }
2113 2271
2114 face->font = font->font.font; 2272 if (! NILP (font_object))
2115 face->font_info = (struct font_info *) font; 2273 {
2116 face->font_info_id = 0; 2274 struct font *font = XSAVE_VALUE (font_object)->pointer;
2117 face->font_name = font->font.full_name; 2275
2118 } 2276 face->font = font->font.font;
2277 face->font_info = (struct font_info *) font;
2278 face->font_info_id = 0;
2279 face->font_name = font->font.full_name;
2280 }
2281 else
2282 {
2283 face->font = NULL;
2284 face->font_info = NULL;
2285 face->font_info_id = -1;
2286 face->font_name = NULL;
2287 add_to_log ("Unable to load font for a face%s", null_string, Qnil);
2119 } 2288 }
2120 if (! face->font)
2121 add_to_log ("Unable to load font for a face%s", null_string, Qnil);
2122} 2289}
2123 2290
2124void 2291void
@@ -2149,32 +2316,37 @@ font_open_by_name (f, name)
2149 FRAME_PTR f; 2316 FRAME_PTR f;
2150 char *name; 2317 char *name;
2151{ 2318{
2152 Lisp_Object spec = Ffont_spec (0, NULL); 2319 Lisp_Object args[2];
2320 Lisp_Object spec;
2153 Lisp_Object frame; 2321 Lisp_Object frame;
2154 struct font_driver_list *dlist; 2322 struct font_driver_list *dlist;
2323 int pixel_size;
2155 2324
2156 XSETFRAME (frame, f); 2325 XSETFRAME (frame, f);
2157 ASET (spec, FONT_EXTRA_INDEX, 2326 args[0] = QCname;
2158 Fcons (Fcons (QCname, make_unibyte_string (name, strlen (name))), 2327 args[1] = make_unibyte_string (name, strlen (name));
2159 Qnil)); 2328 spec = Ffont_spec (2, args);
2160 2329
2330 if (INTEGERP (AREF (spec, FONT_SIZE_INDEX)))
2331 pixel_size = XINT (AREF (spec, FONT_SIZE_INDEX));
2332 else if (FLOATP (AREF (spec, FONT_SIZE_INDEX)))
2333 {
2334 double pt = XFLOAT_DATA (AREF (spec, FONT_SIZE_INDEX));
2335 pixel_size = POINT_TO_PIXEL (pt * 10, f->resy);
2336 }
2337 else
2338 pixel_size = 12;
2161 for (dlist = f->font_driver_list; dlist; dlist = dlist->next) 2339 for (dlist = f->font_driver_list; dlist; dlist = dlist->next)
2162 if (dlist->driver->parse_name 2340 {
2163 && dlist->driver->parse_name (f, name, spec) >= 0) 2341 Lisp_Object entities = font_list_entities (frame, spec);
2164 { 2342 Lisp_Object font_object;
2165 Lisp_Object entities = font_list_entities (frame, spec); 2343
2166 Lisp_Object font_object; 2344 if (ASIZE (entities) == 0)
2167 int pixel_size; 2345 continue;
2168 2346 font_object = font_open_entity (f, AREF (entities, 0), pixel_size);
2169 if (ASIZE (entities) == 0) 2347 if (! NILP (font_object))
2170 continue; 2348 return font_object;
2171 pixel_size = XINT (AREF (AREF (entities, 0), FONT_SIZE_INDEX)); 2349 }
2172 if (pixel_size == 0 && INTEGERP (AREF (spec, FONT_SIZE_INDEX)))
2173 pixel_size = XINT (AREF (spec, FONT_SIZE_INDEX));
2174 font_object = font_open_entity (f, AREF (entities, 0), pixel_size);
2175 if (! NILP (font_object))
2176 return font_object;
2177 }
2178 return Qnil; 2350 return Qnil;
2179} 2351}
2180 2352
@@ -2268,7 +2440,7 @@ usage: (font-spec &rest properties) */)
2268 else 2440 else
2269 { 2441 {
2270 if (EQ (key, QCname)) 2442 if (EQ (key, QCname))
2271 font_parse_xlfd ((char *) SDATA (val), spec, 0); 2443 font_parse_name ((char *) SDATA (val), spec, 0);
2272 extra = Fcons (Fcons (key, val), extra); 2444 extra = Fcons (Fcons (key, val), extra);
2273 } 2445 }
2274 } 2446 }