Mercurial > emacs
comparison src/fontset.c @ 89349:9a305cf42688
Give 8 extra slots to fontset objects.
(Qfontset_info): New variable.
(syms_of_fontset): Defsym it.
(FONTSET_FALLBACK): New macro.
(fontset_face): Try also the default fontset.
(make_fontset): Realize a fallback fontset from the default
fontset.
(generate_ascii_font_name): Moved from xfaces.c. Rewritten by
using split_font_name_into_vector and build_font_name_from_vector.
(Fset_fontset_font): Access the elements of font_spec by enum
FONT_SPEC_INDEX. If font_spec is a string, extract the registry
name by using split_font_name_into_vector.
(Fnew_fontset): If no ASCII font is specified in FONTLIST,
generate a proper font name from the fontset name. Update
Vfontset_alias_alist.
(n_auto_fontsets): New variable.
(new_fontset_from_font_name): New function.
(Ffont_info): Store the information about fonts generated from the
default fontset in the first extra slot of the returned
char-table.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 10 Jan 2003 07:13:43 +0000 |
parents | 6026c8e5664f |
children | eed327e0bad3 |
comparison
equal
deleted
inserted
replaced
89348:e4ea90e23f57 | 89349:9a305cf42688 |
---|---|
111 | 111 |
112 The value t means that no font is available for the corresponding | 112 The value t means that no font is available for the corresponding |
113 range of characters. | 113 range of characters. |
114 | 114 |
115 | 115 |
116 A fontset has 5 extra slots. | 116 A fontset has 8 extra slots. |
117 | 117 |
118 The 1st slot: the ID number of the fontset | 118 The 1st slot: the ID number of the fontset |
119 | 119 |
120 The 2nd slot: | 120 The 2nd slot: |
121 base: the name of the fontset | 121 base: the name of the fontset |
122 realized: nil | 122 realized: nil |
123 | 123 |
124 The 3rd slot: | 124 The 3rd slot: |
125 base: nli | 125 base: nil |
126 realized: the base fontset | 126 realized: the base fontset |
127 | 127 |
128 The 4th slot: | 128 The 4th slot: |
129 base: nil | 129 base: nil |
130 realized: the frame that the fontset belongs to | 130 realized: the frame that the fontset belongs to |
141 The 7th slot: | 141 The 7th slot: |
142 base: nil | 142 base: nil |
143 realized: Alist of font index vs the corresponding repertory | 143 realized: Alist of font index vs the corresponding repertory |
144 char-table. | 144 char-table. |
145 | 145 |
146 The 8th slot: | |
147 base: nil | |
148 realized: If the base is not the default fontset, a fontset | |
149 realized from the default fontset, else nil. | |
146 | 150 |
147 All fontsets are recorded in the vector Vfontset_table. | 151 All fontsets are recorded in the vector Vfontset_table. |
148 | 152 |
149 | 153 |
150 DEFAULT FONTSET | 154 DEFAULT FONTSET |
167 */ | 171 */ |
168 | 172 |
169 /********** VARIABLES and FUNCTION PROTOTYPES **********/ | 173 /********** VARIABLES and FUNCTION PROTOTYPES **********/ |
170 | 174 |
171 extern Lisp_Object Qfont; | 175 extern Lisp_Object Qfont; |
172 Lisp_Object Qfontset; | 176 static Lisp_Object Qfontset; |
177 static Lisp_Object Qfontset_info; | |
173 static Lisp_Object Qprepend, Qappend; | 178 static Lisp_Object Qprepend, Qappend; |
174 | 179 |
175 /* Vector containing all fontsets. */ | 180 /* Vector containing all fontsets. */ |
176 static Lisp_Object Vfontset_table; | 181 static Lisp_Object Vfontset_table; |
177 | 182 |
269 /* Macros to access special values of (realized) FONTSET. */ | 274 /* Macros to access special values of (realized) FONTSET. */ |
270 #define FONTSET_BASE(fontset) XCHAR_TABLE (fontset)->extras[2] | 275 #define FONTSET_BASE(fontset) XCHAR_TABLE (fontset)->extras[2] |
271 #define FONTSET_FRAME(fontset) XCHAR_TABLE (fontset)->extras[3] | 276 #define FONTSET_FRAME(fontset) XCHAR_TABLE (fontset)->extras[3] |
272 #define FONTSET_NOFONT_FACE(fontset) XCHAR_TABLE (fontset)->extras[5] | 277 #define FONTSET_NOFONT_FACE(fontset) XCHAR_TABLE (fontset)->extras[5] |
273 #define FONTSET_REPERTORY(fontset) XCHAR_TABLE (fontset)->extras[6] | 278 #define FONTSET_REPERTORY(fontset) XCHAR_TABLE (fontset)->extras[6] |
279 #define FONTSET_FALLBACK(fontset) XCHAR_TABLE (fontset)->extras[7] | |
274 | 280 |
275 | 281 |
276 /* Return the element of FONTSET for the character C. If FONTSET is a | 282 /* Return the element of FONTSET for the character C. If FONTSET is a |
277 base fontset other then the default fontset and FONTSET doesn't | 283 base fontset other then the default fontset and FONTSET doesn't |
278 contain information for C, return the information in the default | 284 contain information for C, return the information in the default |
481 fontset_face (fontset, c, face) | 487 fontset_face (fontset, c, face) |
482 Lisp_Object fontset; | 488 Lisp_Object fontset; |
483 int c; | 489 int c; |
484 struct face *face; | 490 struct face *face; |
485 { | 491 { |
486 Lisp_Object elt, vec; | 492 Lisp_Object base_fontset, elt, vec; |
487 int i, from, to; | 493 int i, from, to; |
488 int font_idx; | 494 int font_idx; |
489 FRAME_PTR f = XFRAME (FONTSET_FRAME (fontset)); | 495 FRAME_PTR f = XFRAME (FONTSET_FRAME (fontset)); |
490 | 496 |
497 base_fontset = FONTSET_BASE (fontset); | |
491 elt = CHAR_TABLE_REF (fontset, c); | 498 elt = CHAR_TABLE_REF (fontset, c); |
492 | 499 |
493 if (EQ (elt, Qt)) | 500 if (EQ (elt, Qt)) |
494 goto font_not_found; | 501 goto try_default; |
502 | |
495 if (NILP (elt)) | 503 if (NILP (elt)) |
496 { | 504 { |
497 /* We have not yet decided a face for C. */ | 505 /* We have not yet decided a face for C. */ |
498 Lisp_Object base_fontset, range; | 506 Lisp_Object range; |
499 | 507 |
500 if (! face) | 508 if (! face) |
501 return -1; | 509 return -1; |
502 base_fontset = FONTSET_BASE (fontset); | |
503 elt = FONTSET_REF_AND_RANGE (base_fontset, c, from, to); | 510 elt = FONTSET_REF_AND_RANGE (base_fontset, c, from, to); |
504 range = Fcons (make_number (from), make_number (to)); | 511 range = Fcons (make_number (from), make_number (to)); |
505 if (NILP (elt)) | 512 if (NILP (elt)) |
506 { | 513 { |
507 /* Record that we have no font for characters of this | 514 /* Record that we have no font for characters of this |
508 range. */ | 515 range. */ |
509 FONTSET_SET (fontset, range, Qt); | 516 FONTSET_SET (fontset, range, Qt); |
510 goto font_not_found; | 517 goto try_default; |
511 } | 518 } |
512 elt = Fcopy_sequence (elt); | 519 elt = Fcopy_sequence (elt); |
513 /* Now ELT is a vector of FONT-DEFs. We at first change it to | 520 /* Now ELT is a vector of FONT-DEFs. We at first change it to |
514 FONT-VECTOR, a vector of [ nil nil FONT-DEF ]. */ | 521 FONT-VECTOR, a vector of [ nil nil FONT-DEF ]. */ |
515 for (i = 0; i < ASIZE (elt); i++) | 522 for (i = 0; i < ASIZE (elt); i++) |
554 /* The repertory is specified by charset ID. */ | 561 /* The repertory is specified by charset ID. */ |
555 struct charset *charset | 562 struct charset *charset |
556 = CHARSET_FROM_ID (XINT (AREF (font_def, 2))); | 563 = CHARSET_FROM_ID (XINT (AREF (font_def, 2))); |
557 | 564 |
558 if (! CHAR_CHARSET_P (c, charset)) | 565 if (! CHAR_CHARSET_P (c, charset)) |
559 /* This fond can't display C. */ | 566 /* This font can't display C. */ |
560 continue; | 567 continue; |
561 } | 568 } |
562 else | 569 else |
563 { | 570 { |
564 Lisp_Object slot; | 571 Lisp_Object slot; |
607 | 614 |
608 /* Ok, this face can display C. */ | 615 /* Ok, this face can display C. */ |
609 return XINT (AREF (elt, 0)); | 616 return XINT (AREF (elt, 0)); |
610 } | 617 } |
611 | 618 |
619 try_default: | |
620 if (! EQ (base_fontset, Vdefault_fontset)) | |
621 return fontset_face (FONTSET_FALLBACK (fontset), c, face); | |
622 | |
612 font_not_found: | 623 font_not_found: |
613 /* We have tried all the fonts for C, but none of them can be opened | 624 /* We have tried all the fonts for C, but none of them can be opened |
614 nor can display C. */ | 625 nor can display C. */ |
615 if (NILP (FONTSET_NOFONT_FACE (fontset))) | 626 if (NILP (FONTSET_NOFONT_FACE (fontset))) |
616 { | 627 { |
670 FONTSET_BASE (fontset) = base; | 681 FONTSET_BASE (fontset) = base; |
671 } | 682 } |
672 | 683 |
673 ASET (Vfontset_table, id, fontset); | 684 ASET (Vfontset_table, id, fontset); |
674 next_fontset_id = id + 1; | 685 next_fontset_id = id + 1; |
686 if (! NILP (base) && ! EQ (base, Vdefault_fontset)) | |
687 FONTSET_FALLBACK (fontset) = make_fontset (frame, Qnil, Vdefault_fontset); | |
675 return fontset; | 688 return fontset; |
676 } | 689 } |
677 | 690 |
678 | 691 |
679 | 692 |
1128 XSETCDR (arg, Fcons (Fcons (range, range), XCDR (arg))); | 1141 XSETCDR (arg, Fcons (Fcons (range, range), XCDR (arg))); |
1129 } | 1142 } |
1130 } | 1143 } |
1131 | 1144 |
1132 | 1145 |
1146 /* Return an ASCII font name generated from fontset name NAME and | |
1147 ASCII font specification ASCII_SPEC. NAME is a string conforming | |
1148 to XLFD. ASCII_SPEC is a vector: | |
1149 [FAMILY WEIGHT SLANT SWIDTH ADSTYLE REGISTRY]. */ | |
1150 | |
1151 static INLINE Lisp_Object | |
1152 generate_ascii_font_name (name, ascii_spec) | |
1153 Lisp_Object name, ascii_spec; | |
1154 { | |
1155 Lisp_Object vec; | |
1156 int i; | |
1157 | |
1158 vec = split_font_name_into_vector (name); | |
1159 for (i = FONT_SPEC_FAMILY_INDEX; i <= FONT_SPEC_ADSTYLE_INDEX; i++) | |
1160 if (! NILP (AREF (ascii_spec, i))) | |
1161 ASET (vec, 1 + i, AREF (ascii_spec, i)); | |
1162 if (! NILP (AREF (ascii_spec, FONT_SPEC_REGISTRY_INDEX))) | |
1163 ASET (vec, 12, AREF (ascii_spec, FONT_SPEC_REGISTRY_INDEX)); | |
1164 return build_font_name_from_vector (vec); | |
1165 } | |
1166 | |
1167 | |
1133 DEFUN ("set-fontset-font", Fset_fontset_font, Sset_fontset_font, 3, 5, 0, | 1168 DEFUN ("set-fontset-font", Fset_fontset_font, Sset_fontset_font, 3, 5, 0, |
1134 doc: /* | 1169 doc: /* |
1135 Modify fontset NAME to use FONT-SPEC for CHARACTER. | 1170 Modify fontset NAME to use FONT-SPEC for CHARACTER. |
1136 | 1171 |
1137 CHARACTER may be a cons; (FROM . TO), where FROM and TO are | 1172 CHARACTER may be a cons; (FROM . TO), where FROM and TO are |
1178 | 1213 |
1179 if (VECTORP (font_spec)) | 1214 if (VECTORP (font_spec)) |
1180 { | 1215 { |
1181 int j; | 1216 int j; |
1182 | 1217 |
1183 if (ASIZE (font_spec) != 6) | 1218 if (ASIZE (font_spec) != FONT_SPEC_MAX_INDEX) |
1184 args_out_of_range (make_number (6), | 1219 args_out_of_range (make_number (FONT_SPEC_MAX_INDEX), |
1185 make_number (ASIZE (font_spec))); | 1220 make_number (ASIZE (font_spec))); |
1186 | 1221 |
1187 font_spec = Fcopy_sequence (font_spec); | 1222 font_spec = Fcopy_sequence (font_spec); |
1188 for (j = 0; j < 5; j++) | 1223 for (j = 0; j < FONT_SPEC_MAX_INDEX - 1; j++) |
1189 if (! NILP (AREF (font_spec, j))) | 1224 if (! NILP (AREF (font_spec, j))) |
1190 { | 1225 { |
1191 CHECK_STRING (AREF (font_spec, j)); | 1226 CHECK_STRING (AREF (font_spec, j)); |
1192 ASET (font_spec, j, Fdowncase (AREF (font_spec, j))); | 1227 ASET (font_spec, j, Fdowncase (AREF (font_spec, j))); |
1193 } | 1228 } |
1194 /* REGISTRY should not be omitted. */ | 1229 /* REGISTRY should not be omitted. */ |
1195 CHECK_STRING (AREF (font_spec, 5)); | 1230 CHECK_STRING (AREF (font_spec, FONT_SPEC_REGISTRY_INDEX)); |
1196 registry = Fdowncase (AREF (font_spec, 5)); | 1231 registry = Fdowncase (AREF (font_spec, FONT_SPEC_REGISTRY_INDEX)); |
1197 ASET (font_spec, 5, registry); | 1232 ASET (font_spec, FONT_SPEC_REGISTRY_INDEX, registry); |
1198 | 1233 |
1199 } | 1234 } |
1200 else if (CONSP (font_spec)) | 1235 else if (CONSP (font_spec)) |
1201 { | 1236 { |
1202 Lisp_Object family; | 1237 Lisp_Object family; |
1209 CHECK_STRING (family); | 1244 CHECK_STRING (family); |
1210 family = Fdowncase (family); | 1245 family = Fdowncase (family); |
1211 } | 1246 } |
1212 CHECK_STRING (registry); | 1247 CHECK_STRING (registry); |
1213 registry = Fdowncase (registry); | 1248 registry = Fdowncase (registry); |
1214 font_spec = Fmake_vector (make_number (6), Qnil); | 1249 font_spec = Fmake_vector (make_number (FONT_SPEC_MAX_INDEX), Qnil); |
1215 ASET (font_spec, 0, family); | 1250 ASET (font_spec, FONT_SPEC_FAMILY_INDEX, family); |
1216 ASET (font_spec, 5, registry); | 1251 ASET (font_spec, FONT_SPEC_REGISTRY_INDEX, registry); |
1217 } | 1252 } |
1218 else | 1253 else |
1219 { | 1254 { |
1220 CHECK_STRING (font_spec); | 1255 CHECK_STRING (font_spec); |
1221 font_spec = Fdowncase (font_spec); | 1256 font_spec = Fdowncase (font_spec); |
1222 registry = font_name_registry (font_spec); | 1257 registry = split_font_name_into_vector (font_spec); |
1223 if (NILP (registry)) | 1258 if (NILP (registry)) |
1224 error ("No XLFD: %s", XSTRING (font_spec)->data); | 1259 error ("No XLFD: %s", XSTRING (font_spec)->data); |
1260 if (NILP (AREF (registry, 12)) | |
1261 || NILP (AREF (registry, 13))) | |
1262 error ("Registry must be specified"); | |
1263 registry = concat2 (concat2 (AREF (registry, 12), build_string ("-")), | |
1264 AREF (registry, 13)); | |
1225 } | 1265 } |
1226 | 1266 |
1227 if (STRINGP (font_spec)) | 1267 if (STRINGP (font_spec)) |
1228 encoding = find_font_encoding ((char *) XSTRING (font_spec)->data); | 1268 encoding = find_font_encoding ((char *) XSTRING (font_spec)->data); |
1229 else | 1269 else |
1276 = Fcons (Fcons (make_number (CHARSET_MIN_CHAR (charset)), | 1316 = Fcons (Fcons (make_number (CHARSET_MIN_CHAR (charset)), |
1277 make_number (CHARSET_MAX_CHAR (charset))), | 1317 make_number (CHARSET_MAX_CHAR (charset))), |
1278 range_list); | 1318 range_list); |
1279 if (EQ (character, Qascii)) | 1319 if (EQ (character, Qascii)) |
1280 { | 1320 { |
1281 if (! STRINGP (font_spec)) | 1321 if (VECTORP (font_spec)) |
1282 font_spec = generate_ascii_font_name (FONTSET_NAME (fontset), | 1322 font_spec = generate_ascii_font_name (FONTSET_NAME (fontset), |
1283 font_spec); | 1323 font_spec); |
1284 FONTSET_ASCII (fontset) = font_spec; | 1324 FONTSET_ASCII (fontset) = font_spec; |
1285 } | 1325 } |
1286 } | 1326 } |
1304 | 1344 |
1305 DEFUN ("new-fontset", Fnew_fontset, Snew_fontset, 2, 2, 0, | 1345 DEFUN ("new-fontset", Fnew_fontset, Snew_fontset, 2, 2, 0, |
1306 doc: /* Create a new fontset NAME from font information in FONTLIST. | 1346 doc: /* Create a new fontset NAME from font information in FONTLIST. |
1307 | 1347 |
1308 FONTLIST is an alist of scripts vs the corresponding font specification list. | 1348 FONTLIST is an alist of scripts vs the corresponding font specification list. |
1309 Each element of FONTLIST has the form (SCRIPT FONT-SPEC ...), where | 1349 Each element of FONTLIST has the form (SCRIPT FONT-SPEC ...), where a |
1310 a character of SCRIPT is displayed by a font that matches FONT-SPEC. | 1350 character of SCRIPT is displayed by a font that matches one of |
1311 | 1351 FONT-SPEC. |
1312 SCRIPT is a symbol that appears in the variable `script-alist'. | 1352 |
1353 SCRIPT is a symbol that appears in the first extra slot of the | |
1354 char-table `char-script-table'. | |
1313 | 1355 |
1314 FONT-SPEC is a vector, a cons, or a string. See the documentation of | 1356 FONT-SPEC is a vector, a cons, or a string. See the documentation of |
1315 `set-fontset-font' for the meaning. */) | 1357 `set-fontset-font' for the meaning. */) |
1316 (name, fontlist) | 1358 (name, fontlist) |
1317 Lisp_Object name, fontlist; | 1359 Lisp_Object name, fontlist; |
1321 int id; | 1363 int id; |
1322 | 1364 |
1323 CHECK_STRING (name); | 1365 CHECK_STRING (name); |
1324 CHECK_LIST (fontlist); | 1366 CHECK_LIST (fontlist); |
1325 | 1367 |
1326 /* Check if an ASCII font is specified in FONTLIST. */ | |
1327 val = Fcar (Fcdr (Fassq (Qascii, fontlist))); | |
1328 if (NILP (val)) | |
1329 error ("No ascii font specified"); | |
1330 | |
1331 id = fs_query_fontset (name, 0); | 1368 id = fs_query_fontset (name, 0); |
1332 if (id < 0) | 1369 if (id < 0) |
1333 fontset = make_fontset (Qnil, Fdowncase (name), Qnil); | 1370 { |
1371 name = Fdowncase (name); | |
1372 val = split_font_name_into_vector (name); | |
1373 if (NILP (val)) | |
1374 error ("Fontset name must be in XLFD format"); | |
1375 if (strcmp (XSTRING (AREF (val, 12))->data, "fontset")) | |
1376 error ("Registry field of fontset name must be \"fontset\""); | |
1377 Vfontset_alias_alist | |
1378 = Fcons (Fcons (name, | |
1379 concat2 (concat2 (AREF (val, 12), build_string ("-")), | |
1380 AREF (val, 13))), | |
1381 Vfontset_alias_alist); | |
1382 ASET (val, 12, build_string ("iso8859-1")); | |
1383 fontset = make_fontset (Qnil, name, Qnil); | |
1384 FONTSET_ASCII (fontset) = build_font_name_from_vector (val); | |
1385 } | |
1334 else | 1386 else |
1335 { | 1387 { |
1336 fontset = FONTSET_FROM_ID (id);; | 1388 fontset = FONTSET_FROM_ID (id);; |
1337 free_realized_fontsets (fontset); | 1389 free_realized_fontsets (fontset); |
1338 Fset_char_table_range (fontset, Qt, Qnil); | 1390 Fset_char_table_range (fontset, Qt, Qnil); |
1342 { | 1394 { |
1343 Lisp_Object elt, script; | 1395 Lisp_Object elt, script; |
1344 | 1396 |
1345 elt = Fcar (fontlist); | 1397 elt = Fcar (fontlist); |
1346 script = Fcar (elt); | 1398 script = Fcar (elt); |
1347 elt = Fcdr (elt); | |
1348 Fset_fontset_font (name, script, Fcar (elt), Qnil, Qnil); | |
1349 for (elt = Fcdr (elt); ! NILP (elt); elt = Fcdr (elt)) | 1399 for (elt = Fcdr (elt); ! NILP (elt); elt = Fcdr (elt)) |
1350 Fset_fontset_font (name, script, XCAR (elt), Qnil, Qappend); | 1400 Fset_fontset_font (name, script, Fcar (elt), Qnil, Qappend); |
1351 } | 1401 } |
1352 return name; | 1402 return name; |
1403 } | |
1404 | |
1405 | |
1406 /* Number of fontsets created from a fontname automatically. */ | |
1407 static int n_auto_fontsets; | |
1408 | |
1409 int | |
1410 new_fontset_from_font_name (Lisp_Object fontname) | |
1411 { | |
1412 Lisp_Object name; | |
1413 Lisp_Object vec; | |
1414 | |
1415 fontname = Fdowncase (fontname); | |
1416 vec = split_font_name_into_vector (fontname); | |
1417 if ( NILP (vec)) | |
1418 vec = Fmake_vector (make_number (14), build_string ("")); | |
1419 ASET (vec, 12, build_string ("fontset")); | |
1420 if (n_auto_fontsets == 0) | |
1421 { | |
1422 ASET (vec, 13, build_string ("startup")); | |
1423 name = build_font_name_from_vector (vec); | |
1424 n_auto_fontsets++; | |
1425 } | |
1426 else | |
1427 { | |
1428 char temp[20]; | |
1429 | |
1430 do { | |
1431 sprintf (temp, "auto%d", n_auto_fontsets); | |
1432 ASET (vec, 13, build_string (temp)); | |
1433 name = build_font_name_from_vector (vec); | |
1434 n_auto_fontsets++; | |
1435 } while (fs_query_fontset (name, 0) >= 0); | |
1436 } | |
1437 name = Fnew_fontset (name, | |
1438 Fcons (Fcons (Qascii, Fcons (fontname, Qnil)), Qnil)); | |
1439 Vfontset_alias_alist = Fcons (Fcons (name, fontname), Vfontset_alias_alist); | |
1440 return fs_query_fontset (name, 0); | |
1353 } | 1441 } |
1354 | 1442 |
1355 | 1443 |
1356 DEFUN ("font-info", Ffont_info, Sfont_info, 1, 2, 0, | 1444 DEFUN ("font-info", Ffont_info, Sfont_info, 1, 2, 0, |
1357 doc: /* Return information about a font named NAME on frame FRAME. | 1445 doc: /* Return information about a font named NAME on frame FRAME. |
1463 | 1551 |
1464 [ FAMILY WEIGHT SLANT SWIDTH ADSTYLE REGISTRY ] | 1552 [ FAMILY WEIGHT SLANT SWIDTH ADSTYLE REGISTRY ] |
1465 | 1553 |
1466 or a string of font name pattern. | 1554 or a string of font name pattern. |
1467 | 1555 |
1468 OPENED-FONT is a name of a font actually opened. */) | 1556 OPENED-FONT is a name of a font actually opened. |
1557 | |
1558 The char-table has one extra slot. The value is a char-table | |
1559 containing the information about the derived fonts from the default | |
1560 fontset. The format is the same as abobe. */) | |
1469 (fontset, frame) | 1561 (fontset, frame) |
1470 Lisp_Object fontset, frame; | 1562 Lisp_Object fontset, frame; |
1471 { | 1563 { |
1472 FRAME_PTR f; | 1564 FRAME_PTR f; |
1473 Lisp_Object table, val, elt; | 1565 Lisp_Object table, val, elt; |
1474 Lisp_Object *realized; | 1566 Lisp_Object *realized; |
1475 int n_realized = 0; | 1567 int n_realized = 0; |
1568 int fallback; | |
1476 int c, i, j; | 1569 int c, i, j; |
1477 | 1570 |
1478 (*check_window_system_func) (); | 1571 (*check_window_system_func) (); |
1479 | 1572 |
1480 fontset = check_fontset_name (fontset); | 1573 fontset = check_fontset_name (fontset); |
1496 && EQ (FONTSET_FRAME (elt), frame)) | 1589 && EQ (FONTSET_FRAME (elt), frame)) |
1497 realized[n_realized++] = elt; | 1590 realized[n_realized++] = elt; |
1498 } | 1591 } |
1499 | 1592 |
1500 | 1593 |
1501 table = Fmake_char_table (Qnil, Qnil); | 1594 table = Fmake_char_table (Qfontset_info, Qnil); |
1595 XCHAR_TABLE (table)->extras[0] = Fmake_char_table (Qnil, Qnil); | |
1502 /* Accumulate information of the fontset in TABLE. The format of | 1596 /* Accumulate information of the fontset in TABLE. The format of |
1503 each element is ((FONT-SPEC OPENED-FONT ...) ...). */ | 1597 each element is ((FONT-SPEC OPENED-FONT ...) ...). */ |
1504 for (c = 0; c <= MAX_CHAR; ) | 1598 for (fallback = 0; fallback <= 1; fallback++) |
1505 { | 1599 { |
1506 int from, to; | 1600 Lisp_Object this_fontset, this_table; |
1507 | 1601 |
1508 val = FONTSET_REF_AND_RANGE (fontset, c, from, to); | 1602 if (! fallback) |
1509 if (VECTORP (val)) | |
1510 { | 1603 { |
1511 Lisp_Object alist; | 1604 this_fontset = fontset; |
1512 | 1605 this_table = table; |
1513 /* At first, set ALIST to ((FONT-SPEC) ...). */ | 1606 } |
1514 for (alist = Qnil, i = 0; i < ASIZE (val); i++) | 1607 else |
1515 alist = Fcons (Fcons (AREF (AREF (val, i), 0), Qnil), alist); | 1608 { |
1516 alist = Fnreverse (alist); | 1609 this_fontset = Vdefault_fontset; |
1517 | 1610 this_table = XCHAR_TABLE (table)->extras[0]; |
1518 /* Then store opend font names to cdr of each elements. */ | |
1519 for (i = 0; i < n_realized; i++) | 1611 for (i = 0; i < n_realized; i++) |
1612 realized[i] = FONTSET_FALLBACK (realized[i]); | |
1613 } | |
1614 for (c = 0; c <= MAX_5_BYTE_CHAR; ) | |
1615 { | |
1616 int from, to; | |
1617 | |
1618 val = char_table_ref_and_range (this_fontset, c, &from, &to); | |
1619 if (VECTORP (val)) | |
1520 { | 1620 { |
1521 val = FONTSET_REF (realized[i], c); | 1621 Lisp_Object alist; |
1522 if (NILP (val)) | 1622 |
1523 continue; | 1623 /* At first, set ALIST to ((FONT-SPEC) ...). */ |
1524 val = XCDR (val); | 1624 for (alist = Qnil, i = 0; i < ASIZE (val); i++) |
1525 /* Now VAL is [[FACE-ID FONT-INDEX FONT-DEF] ...]. | 1625 alist = Fcons (Fcons (AREF (AREF (val, i), 0), Qnil), alist); |
1526 If a font of an element is already opened, | 1626 alist = Fnreverse (alist); |
1527 FONT-INDEX of the element is integer. */ | 1627 |
1528 for (j = 0; j < ASIZE (val); j++) | 1628 /* Then store opend font names to cdr of each elements. */ |
1529 if (INTEGERP (AREF (AREF (val, j), 0))) | 1629 for (i = 0; i < n_realized; i++) |
1630 { | |
1631 if (NILP (realized[i])) | |
1632 continue; | |
1633 val = FONTSET_REF (realized[i], c); | |
1634 if (NILP (val)) | |
1635 continue; | |
1636 val = XCDR (val); | |
1637 /* Now VAL is [[FACE-ID FONT-INDEX FONT-DEF] ...]. | |
1638 If a font of an element is already opened, | |
1639 FONT-INDEX of the element is integer. */ | |
1640 for (j = 0; j < ASIZE (val); j++) | |
1641 if (INTEGERP (AREF (AREF (val, j), 0))) | |
1642 { | |
1643 Lisp_Object font_idx; | |
1644 | |
1645 font_idx = AREF (AREF (val, j), 1); | |
1646 elt = Fassq (AREF (AREF (AREF (val, j), 2), 0), alist); | |
1647 if (CONSP (elt) | |
1648 && NILP (Fmemq (font_idx, XCDR(elt)))) | |
1649 nconc2 (elt, Fcons (font_idx, Qnil)); | |
1650 } | |
1651 } | |
1652 for (val = alist; CONSP (val); val = XCDR (val)) | |
1653 for (elt = XCDR (XCAR (val)); CONSP (elt); elt = XCDR (elt)) | |
1530 { | 1654 { |
1531 Lisp_Object font_idx; | 1655 struct font_info *font_info |
1532 | 1656 = (*get_font_info_func) (f, XINT (XCAR (elt))); |
1533 font_idx = AREF (AREF (val, j), 1); | 1657 XSETCAR (elt, build_string (font_info->full_name)); |
1534 elt = Fassq (AREF (AREF (AREF (val, j), 2), 0), alist); | |
1535 if (CONSP (elt) | |
1536 && NILP (Fmemq (font_idx, XCDR(elt)))) | |
1537 nconc2 (elt, Fcons (font_idx, Qnil)); | |
1538 } | 1658 } |
1659 | |
1660 /* Store ALIST in TBL for characters C..TO. */ | |
1661 char_table_set_range (this_table, c, to, alist); | |
1539 } | 1662 } |
1540 for (val = alist; CONSP (val); val = XCDR (val)) | 1663 c = to + 1; |
1541 for (elt = XCDR (XCAR (val)); CONSP (elt); elt = XCDR (elt)) | |
1542 { | |
1543 struct font_info *font_info | |
1544 = (*get_font_info_func) (f, XINT (XCAR (elt))); | |
1545 XSETCAR (elt, build_string (font_info->full_name)); | |
1546 } | |
1547 | |
1548 /* Store ALIST in TABLE for characters C..TO. */ | |
1549 char_table_set_range (table, c, to, alist); | |
1550 } | 1664 } |
1551 c = to + 1; | |
1552 } | 1665 } |
1553 | 1666 |
1554 return table; | 1667 return table; |
1555 } | 1668 } |
1556 | 1669 |
1597 if (!load_font_func) | 1710 if (!load_font_func) |
1598 /* Window system initializer should have set proper functions. */ | 1711 /* Window system initializer should have set proper functions. */ |
1599 abort (); | 1712 abort (); |
1600 | 1713 |
1601 DEFSYM (Qfontset, "fontset"); | 1714 DEFSYM (Qfontset, "fontset"); |
1602 Fput (Qfontset, Qchar_table_extra_slots, make_number (7)); | 1715 Fput (Qfontset, Qchar_table_extra_slots, make_number (8)); |
1716 DEFSYM (Qfontset_info, "fontset-info"); | |
1717 Fput (Qfontset_info, Qchar_table_extra_slots, make_number (1)); | |
1603 | 1718 |
1604 DEFSYM (Qprepend, "prepend"); | 1719 DEFSYM (Qprepend, "prepend"); |
1605 DEFSYM (Qappend, "append"); | 1720 DEFSYM (Qappend, "append"); |
1606 | 1721 |
1607 Vcached_fontset_data = Qnil; | 1722 Vcached_fontset_data = Qnil; |