diff options
| author | Kenichi Handa | 2006-06-16 12:34:49 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-06-16 12:34:49 +0000 |
| commit | ef18374fba5547c616da8b449232566fb7de58cb (patch) | |
| tree | 3b9c6f4debbdbc56841848f8476b12b2dbbbb4c8 | |
| parent | ff35ddd4f7eb75bf2eaee655f309bd81b360e3df (diff) | |
| download | emacs-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.c | 436 |
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 | ||
| 639 | int | 641 | int |
| 640 | font_parse_xlfd (name, font, merge) | 642 | font_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 | |||
| 978 | int | ||
| 979 | font_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 | |||
| 1064 | int | ||
| 1065 | font_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 | |||
| 1134 | static int | ||
| 1135 | font_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 | |||
| 972 | void | 1147 | void |
| 973 | font_merge_old_spec (name, family, registry, spec) | 1148 | font_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 | ||
| 1928 | int | ||
| 1929 | font_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 | |||
| 1753 | Lisp_Object | 1946 | Lisp_Object |
| 1754 | font_find_object (font) | 1947 | font_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 | ||
| 1946 | char * | 2139 | Lisp_Object |
| 1947 | font_get_name (font_object) | 2140 | font_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 | |
| 2151 | Lisp_Object | ||
| 2152 | font_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 | ||
| 1957 | Lisp_Object | 2165 | Lisp_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 | ||
| 1967 | extern 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 | ||
| 1969 | Lisp_Object | 2178 | Lisp_Object |
| 1970 | font_find_for_lface (f, lface, spec) | 2179 | font_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 | ||
| 2124 | void | 2291 | void |
| @@ -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 | } |