diff options
| author | Kenichi Handa | 2007-04-13 01:36:53 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2007-04-13 01:36:53 +0000 |
| commit | 1c82b4b3a1b93f96b983141cf783ef06ff9d4897 (patch) | |
| tree | 87e22068cdaa97373f1e6764037f1c31a2e99843 | |
| parent | daa4ff491f1fbda6efe207b214c21c1fa3b09755 (diff) | |
| download | emacs-1c82b4b3a1b93f96b983141cf783ef06ff9d4897.tar.gz emacs-1c82b4b3a1b93f96b983141cf783ef06ff9d4897.zip | |
(fontset_find_font): New function.
(fontset_font): Use fontset_find_font.
(make_fontset_for_ascii_face): Don't set face ID in rfont_def.
Register the specified font for all Latin characters.
(new_fontset_from_font): Register the specified font for all Latin
characters.
(dump_fontset): For a realized fontset, include the base fontset
name in the returned vector.
| -rw-r--r-- | src/fontset.c | 210 |
1 files changed, 112 insertions, 98 deletions
diff --git a/src/fontset.c b/src/fontset.c index c92e05c3f02..a7bf7de943f 100644 --- a/src/fontset.c +++ b/src/fontset.c | |||
| @@ -529,18 +529,23 @@ load_font_get_repertory (f, face, font_def, fontset) | |||
| 529 | return font_info->font_idx; | 529 | return font_info->font_idx; |
| 530 | } | 530 | } |
| 531 | 531 | ||
| 532 | static Lisp_Object fontset_find_font P_ ((Lisp_Object, int, struct face *, | ||
| 533 | int, int)); | ||
| 532 | 534 | ||
| 533 | /* Return RFONT-DEF (vector) in the realized fontset FONTSET for the | 535 | /* Return RFONT-DEF (vector) in the realized fontset FONTSET for the |
| 534 | character C. If the corresponding font is not yet opened, open it | 536 | character C. If the corresponding font is not yet opened, open it |
| 535 | (if FACE is not NULL) or return Qnil (if FACE is NULL). | 537 | (if FACE is not NULL) or return Qnil (if FACE is NULL). |
| 536 | If no proper font is found for C, return Qnil. */ | 538 | If no proper font is found for C, return Qnil. |
| 539 | ID is a charset-id that must be preferred, or -1 meaning no | ||
| 540 | preference. | ||
| 541 | If FALLBACK if nonzero, search only fallback fonts. */ | ||
| 537 | 542 | ||
| 538 | static Lisp_Object | 543 | static Lisp_Object |
| 539 | fontset_font (fontset, c, face, id) | 544 | fontset_find_font (fontset, c, face, id, fallback) |
| 540 | Lisp_Object fontset; | 545 | Lisp_Object fontset; |
| 541 | int c; | 546 | int c; |
| 542 | struct face *face; | 547 | struct face *face; |
| 543 | int id; | 548 | int id, fallback; |
| 544 | { | 549 | { |
| 545 | Lisp_Object base_fontset, elt, vec; | 550 | Lisp_Object base_fontset, elt, vec; |
| 546 | int i, from, to; | 551 | int i, from, to; |
| @@ -548,75 +553,80 @@ fontset_font (fontset, c, face, id) | |||
| 548 | FRAME_PTR f = XFRAME (FONTSET_FRAME (fontset)); | 553 | FRAME_PTR f = XFRAME (FONTSET_FRAME (fontset)); |
| 549 | 554 | ||
| 550 | base_fontset = FONTSET_BASE (fontset); | 555 | base_fontset = FONTSET_BASE (fontset); |
| 551 | vec = CHAR_TABLE_REF (fontset, c); | 556 | if (! fallback) |
| 552 | if (EQ (vec, Qt)) | 557 | vec = CHAR_TABLE_REF (fontset, c); |
| 553 | goto try_fallback; | 558 | else |
| 554 | 559 | vec = FONTSET_FALLBACK (fontset); | |
| 555 | if (NILP (vec)) | 560 | if (NILP (vec)) |
| 556 | { | 561 | { |
| 557 | /* We have not yet decided a face for C. */ | 562 | /* We have not yet decided a font for C. */ |
| 558 | Lisp_Object range; | 563 | Lisp_Object range; |
| 559 | 564 | ||
| 560 | if (! face) | 565 | if (! face) |
| 561 | return Qnil; | 566 | return Qnil; |
| 562 | elt = FONTSET_REF_AND_RANGE (base_fontset, c, from, to); | 567 | if (! fallback) |
| 568 | elt = FONTSET_REF_AND_RANGE (base_fontset, c, from, to); | ||
| 569 | else | ||
| 570 | elt = FONTSET_FALLBACK (base_fontset); | ||
| 563 | range = Fcons (make_number (from), make_number (to)); | 571 | range = Fcons (make_number (from), make_number (to)); |
| 564 | if (NILP (elt)) | 572 | if (NILP (elt)) |
| 565 | { | 573 | { |
| 566 | /* Record that we have no font for characters of this | 574 | /* Qt means we have no font for characters of this range. */ |
| 567 | range. */ | ||
| 568 | vec = Qt; | 575 | vec = Qt; |
| 569 | FONTSET_SET (fontset, range, vec); | ||
| 570 | goto try_fallback; | ||
| 571 | } | 576 | } |
| 572 | /* Build a vector [ -1 -1 nil NEW-ELT0 NEW-ELT1 NEW-ELT2 ... ], | ||
| 573 | where the first -1 is to force reordering of NEW-ELTn, | ||
| 574 | NEW-ETLn is [nil nil AREF (elt, n) nil]. */ | ||
| 575 | #ifdef USE_FONT_BACKEND | ||
| 576 | if (enable_font_backend | ||
| 577 | && EQ (base_fontset, Vdefault_fontset)) | ||
| 578 | vec = Fmake_vector (make_number (ASIZE (elt) + 4), make_number (-1)); | ||
| 579 | else | 577 | else |
| 580 | #endif /* not USE_FONT_BACKEND */ | ||
| 581 | vec = Fmake_vector (make_number (ASIZE (elt) + 3), make_number (-1)); | ||
| 582 | ASET (vec, 2, Qnil); | ||
| 583 | for (i = 0; i < ASIZE (elt); i++) | ||
| 584 | { | 578 | { |
| 585 | Lisp_Object tmp; | 579 | /* Build a vector [ -1 -1 nil NEW-ELT0 NEW-ELT1 NEW-ELT2 ... ], |
| 586 | 580 | where the first -1 is to force reordering of NEW-ELTn, | |
| 581 | NEW-ELTn is [nil nil AREF (elt, n) nil]. */ | ||
| 587 | #ifdef USE_FONT_BACKEND | 582 | #ifdef USE_FONT_BACKEND |
| 588 | if (enable_font_backend) | 583 | if (! fallback |
| 589 | tmp = Fmake_vector (make_number (5), Qnil); | 584 | && enable_font_backend |
| 585 | && EQ (base_fontset, Vdefault_fontset)) | ||
| 586 | vec = Fmake_vector (make_number (ASIZE (elt) + 4), Qnil); | ||
| 590 | else | 587 | else |
| 591 | #endif /* USE_FONT_BACKEND */ | 588 | #endif /* not USE_FONT_BACKEND */ |
| 592 | tmp = Fmake_vector (make_number (4), Qnil); | 589 | vec = Fmake_vector (make_number (ASIZE (elt) + 3), Qnil); |
| 593 | ASET (tmp, 2, AREF (elt, i)); | 590 | ASET (vec, 0, make_number (-1)); |
| 594 | ASET (vec, 3 + i, tmp); | 591 | ASET (vec, 1, make_number (-1)); |
| 595 | } | 592 | for (i = 0; i < ASIZE (elt); i++) |
| 593 | { | ||
| 594 | Lisp_Object tmp; | ||
| 595 | |||
| 596 | tmp = Fmake_vector (make_number (5), Qnil); | ||
| 597 | ASET (tmp, 2, AREF (elt, i)); | ||
| 598 | ASET (vec, 3 + i, tmp); | ||
| 599 | } | ||
| 596 | #ifdef USE_FONT_BACKEND | 600 | #ifdef USE_FONT_BACKEND |
| 597 | if (enable_font_backend | 601 | if (! fallback |
| 598 | && EQ (base_fontset, Vdefault_fontset)) | 602 | && enable_font_backend |
| 599 | { | 603 | && EQ (base_fontset, Vdefault_fontset)) |
| 600 | Lisp_Object script, font_spec, tmp; | 604 | { |
| 601 | 605 | Lisp_Object script, font_spec, tmp; | |
| 602 | script = CHAR_TABLE_REF (Vchar_script_table, c); | 606 | |
| 603 | if (NILP (script)) | 607 | script = CHAR_TABLE_REF (Vchar_script_table, c); |
| 604 | script = intern ("latin"); | 608 | if (NILP (script)) |
| 605 | font_spec = Ffont_spec (0, NULL); | 609 | script = intern ("latin"); |
| 606 | ASET (font_spec, FONT_REGISTRY_INDEX, Qiso10646_1); | 610 | font_spec = Ffont_spec (0, NULL); |
| 607 | ASET (font_spec, FONT_EXTRA_INDEX, | 611 | ASET (font_spec, FONT_REGISTRY_INDEX, Qiso10646_1); |
| 608 | Fcons (Fcons (QCscript, script), Qnil)); | 612 | ASET (font_spec, FONT_EXTRA_INDEX, |
| 609 | tmp = Fmake_vector (make_number (5), Qnil); | 613 | Fcons (Fcons (QCscript, script), Qnil)); |
| 610 | ASET (tmp, 3, font_spec); | 614 | tmp = Fmake_vector (make_number (5), Qnil); |
| 611 | ASET (vec, 3 + i, tmp); | 615 | ASET (tmp, 3, font_spec); |
| 612 | } | 616 | ASET (vec, 3 + i, tmp); |
| 617 | } | ||
| 613 | #endif /* USE_FONT_BACKEND */ | 618 | #endif /* USE_FONT_BACKEND */ |
| 614 | 619 | ||
| 615 | /* Then store it in the fontset. */ | 620 | /* Then store it in the fontset. */ |
| 616 | FONTSET_SET (fontset, range, vec); | 621 | if (! fallback) |
| 622 | FONTSET_SET (fontset, range, vec); | ||
| 623 | else | ||
| 624 | FONTSET_FALLBACK (fontset) = vec; | ||
| 625 | } | ||
| 617 | } | 626 | } |
| 627 | if (EQ (vec, Qt)) | ||
| 628 | return Qnil; | ||
| 618 | 629 | ||
| 619 | retry: | ||
| 620 | if (XINT (AREF (vec, 0)) != charset_ordered_list_tick) | 630 | if (XINT (AREF (vec, 0)) != charset_ordered_list_tick) |
| 621 | /* The priority of charsets is changed after we selected a face | 631 | /* The priority of charsets is changed after we selected a face |
| 622 | for C last time. */ | 632 | for C last time. */ |
| @@ -781,53 +791,45 @@ fontset_font (fontset, c, face, id) | |||
| 781 | /* Now we have the opened font. */ | 791 | /* Now we have the opened font. */ |
| 782 | return elt; | 792 | return elt; |
| 783 | } | 793 | } |
| 794 | return Qnil; | ||
| 795 | } | ||
| 784 | 796 | ||
| 785 | try_fallback: | ||
| 786 | if (! EQ (vec, FONTSET_FALLBACK (fontset))) | ||
| 787 | { | ||
| 788 | vec = FONTSET_FALLBACK (fontset); | ||
| 789 | if (VECTORP (vec)) | ||
| 790 | goto retry; | ||
| 791 | if (EQ (vec, Qt)) | ||
| 792 | goto try_default; | ||
| 793 | elt = FONTSET_FALLBACK (base_fontset); | ||
| 794 | if (! NILP (elt)) | ||
| 795 | { | ||
| 796 | vec = Fmake_vector (make_number (ASIZE (elt) + 3), make_number (-1)); | ||
| 797 | ASET (vec, 2, Qnil); | ||
| 798 | for (i = 0; i < ASIZE (elt); i++) | ||
| 799 | { | ||
| 800 | Lisp_Object tmp; | ||
| 801 | 797 | ||
| 802 | #ifdef USE_FONT_BACKEND | 798 | static Lisp_Object |
| 803 | if (enable_font_backend) | 799 | fontset_font (fontset, c, face, id) |
| 804 | tmp = Fmake_vector (make_number (5), Qnil); | 800 | Lisp_Object fontset; |
| 805 | else | 801 | int c; |
| 806 | #endif /* USE_FONT_BACKEND */ | 802 | struct face *face; |
| 807 | tmp = Fmake_vector (make_number (4), Qnil); | 803 | int id; |
| 808 | ASET (tmp, 2, AREF (elt, i)); | 804 | { |
| 809 | ASET (vec, 3 + i, tmp); | 805 | Lisp_Object rfont_def; |
| 810 | } | 806 | Lisp_Object base_fontset; |
| 811 | FONTSET_FALLBACK (fontset) = vec; | ||
| 812 | goto retry; | ||
| 813 | } | ||
| 814 | /* Record that this fontset has no fallback fonts. */ | ||
| 815 | FONTSET_FALLBACK (fontset) = Qt; | ||
| 816 | } | ||
| 817 | 807 | ||
| 818 | /* Try the default fontset. */ | 808 | /* Try a font-group for C. */ |
| 819 | try_default: | 809 | rfont_def = fontset_find_font (fontset, c, face, id, 0); |
| 810 | if (! NILP (rfont_def)) | ||
| 811 | return rfont_def; | ||
| 812 | base_fontset = FONTSET_BASE (fontset); | ||
| 813 | /* Try a font-group for C of the default fontset. */ | ||
| 820 | if (! EQ (base_fontset, Vdefault_fontset)) | 814 | if (! EQ (base_fontset, Vdefault_fontset)) |
| 821 | { | 815 | { |
| 822 | if (NILP (FONTSET_DEFAULT (fontset))) | 816 | if (NILP (FONTSET_DEFAULT (fontset))) |
| 823 | FONTSET_DEFAULT (fontset) | 817 | FONTSET_DEFAULT (fontset) |
| 824 | = make_fontset (FONTSET_FRAME (fontset), Qnil, Vdefault_fontset); | 818 | = make_fontset (FONTSET_FRAME (fontset), Qnil, Vdefault_fontset); |
| 825 | return fontset_font (FONTSET_DEFAULT (fontset), c, face, id); | 819 | rfont_def = fontset_find_font (FONTSET_DEFAULT (fontset), c, face, id, 0); |
| 826 | } | 820 | } |
| 827 | return Qnil; | 821 | if (! NILP (rfont_def)) |
| 822 | return rfont_def; | ||
| 823 | /* Try a fallback font-group. */ | ||
| 824 | rfont_def = fontset_find_font (fontset, c, face, id, 1); | ||
| 825 | if (! NILP (rfont_def)) | ||
| 826 | return rfont_def; | ||
| 827 | /* Try a fallback font-group of the default fontset . */ | ||
| 828 | if (! EQ (base_fontset, Vdefault_fontset)) | ||
| 829 | rfont_def = fontset_find_font (FONTSET_DEFAULT (fontset), c, face, id, 1); | ||
| 830 | return rfont_def; | ||
| 828 | } | 831 | } |
| 829 | 832 | ||
| 830 | |||
| 831 | /* Return a newly created fontset with NAME. If BASE is nil, make a | 833 | /* Return a newly created fontset with NAME. If BASE is nil, make a |
| 832 | base fontset. Otherwise make a realized fontset whose base is | 834 | base fontset. Otherwise make a realized fontset whose base is |
| 833 | BASE. */ | 835 | BASE. */ |
| @@ -1073,7 +1075,7 @@ make_fontset_for_ascii_face (f, base_fontset_id, face) | |||
| 1073 | 1075 | ||
| 1074 | fontset = make_fontset (frame, Qnil, base_fontset); | 1076 | fontset = make_fontset (frame, Qnil, base_fontset); |
| 1075 | { | 1077 | { |
| 1076 | Lisp_Object elt, rfont_def; | 1078 | Lisp_Object elt, rfont_def, val; |
| 1077 | 1079 | ||
| 1078 | elt = FONTSET_REF (base_fontset, 0); | 1080 | elt = FONTSET_REF (base_fontset, 0); |
| 1079 | xassert (VECTORP (elt) && ASIZE (elt) > 0); | 1081 | xassert (VECTORP (elt) && ASIZE (elt) > 0); |
| @@ -1092,7 +1094,6 @@ make_fontset_for_ascii_face (f, base_fontset_id, face) | |||
| 1092 | rfont_def = Fmake_vector (make_number (4), Qnil); | 1094 | rfont_def = Fmake_vector (make_number (4), Qnil); |
| 1093 | ASET (rfont_def, 3, build_string (face->font_name)); | 1095 | ASET (rfont_def, 3, build_string (face->font_name)); |
| 1094 | } | 1096 | } |
| 1095 | ASET (rfont_def, 0, make_number (face->id)); | ||
| 1096 | ASET (rfont_def, 1, make_number (face->font_info_id)); | 1097 | ASET (rfont_def, 1, make_number (face->font_info_id)); |
| 1097 | ASET (rfont_def, 2, AREF (elt, 0)); | 1098 | ASET (rfont_def, 2, AREF (elt, 0)); |
| 1098 | elt = Fmake_vector (make_number (4), Qnil); | 1099 | elt = Fmake_vector (make_number (4), Qnil); |
| @@ -1100,7 +1101,13 @@ make_fontset_for_ascii_face (f, base_fontset_id, face) | |||
| 1100 | ASET (elt, 1, make_number (charset_ascii)); | 1101 | ASET (elt, 1, make_number (charset_ascii)); |
| 1101 | ASET (elt, 2, rfont_def); | 1102 | ASET (elt, 2, rfont_def); |
| 1102 | ASET (elt, 3, rfont_def); | 1103 | ASET (elt, 3, rfont_def); |
| 1103 | char_table_set_range (fontset, 0, 127, elt); | 1104 | |
| 1105 | val = Fcons (Qlatin, Qnil); | ||
| 1106 | map_char_table (accumulate_script_ranges, Qnil, Vchar_script_table, val); | ||
| 1107 | for (val = XCDR (val); CONSP (val); val = XCDR (val)) | ||
| 1108 | char_table_set_range (fontset, XINT (XCAR (XCAR (val))), | ||
| 1109 | XINT (XCDR (XCAR (val))), elt); | ||
| 1110 | FONTSET_FALLBACK (fontset) = elt; | ||
| 1104 | } | 1111 | } |
| 1105 | return XINT (FONTSET_ID (fontset)); | 1112 | return XINT (FONTSET_ID (fontset)); |
| 1106 | } | 1113 | } |
| @@ -1851,7 +1858,7 @@ new_fontset_from_font (font_object) | |||
| 1851 | { | 1858 | { |
| 1852 | Lisp_Object font_name = font_get_name (font_object); | 1859 | Lisp_Object font_name = font_get_name (font_object); |
| 1853 | Lisp_Object font_spec = font_get_spec (font_object); | 1860 | Lisp_Object font_spec = font_get_spec (font_object); |
| 1854 | Lisp_Object short_name, name, fontset; | 1861 | Lisp_Object fontset_spec, short_name, name, fontset; |
| 1855 | 1862 | ||
| 1856 | if (NILP (auto_fontset_alist)) | 1863 | if (NILP (auto_fontset_alist)) |
| 1857 | short_name = build_string ("fontset-startup"); | 1864 | short_name = build_string ("fontset-startup"); |
| @@ -1863,21 +1870,26 @@ new_fontset_from_font (font_object) | |||
| 1863 | sprintf (temp, "fontset-auto%d", len); | 1870 | sprintf (temp, "fontset-auto%d", len); |
| 1864 | short_name = build_string (temp); | 1871 | short_name = build_string (temp); |
| 1865 | } | 1872 | } |
| 1866 | ASET (font_spec, FONT_REGISTRY_INDEX, short_name); | 1873 | fontset_spec = Fcopy_sequence (font_spec); |
| 1867 | name = Ffont_xlfd_name (font_spec); | 1874 | ASET (fontset_spec, FONT_REGISTRY_INDEX, short_name); |
| 1875 | name = Ffont_xlfd_name (fontset_spec); | ||
| 1868 | if (NILP (name)) | 1876 | if (NILP (name)) |
| 1869 | { | 1877 | { |
| 1870 | int i; | 1878 | int i; |
| 1871 | 1879 | ||
| 1872 | for (i = 0; i < FONT_SIZE_INDEX; i++) | 1880 | for (i = 0; i < FONT_SIZE_INDEX; i++) |
| 1873 | if ((i != FONT_FAMILY_INDEX) && (i != FONT_REGISTRY_INDEX)) | 1881 | if ((i != FONT_FAMILY_INDEX) && (i != FONT_REGISTRY_INDEX)) |
| 1874 | ASET (font_spec, i, Qnil); | 1882 | ASET (fontset_spec, i, Qnil); |
| 1875 | name = Ffont_xlfd_name (font_spec); | 1883 | name = Ffont_xlfd_name (fontset_spec); |
| 1876 | if (NILP (name)) | 1884 | if (NILP (name)) |
| 1877 | abort (); | 1885 | abort (); |
| 1878 | } | 1886 | } |
| 1879 | fontset = make_fontset (Qnil, name, Qnil); | 1887 | fontset = make_fontset (Qnil, name, Qnil); |
| 1880 | FONTSET_ASCII (fontset) = font_name; | 1888 | FONTSET_ASCII (fontset) = font_name; |
| 1889 | font_spec = Fcons (SYMBOL_NAME (AREF (font_spec, FONT_FAMILY_INDEX)), | ||
| 1890 | SYMBOL_NAME (AREF (font_spec, FONT_REGISTRY_INDEX))); | ||
| 1891 | Fset_fontset_font (name, Qlatin, font_spec, Qnil, Qnil); | ||
| 1892 | Fset_fontset_font (name, Qnil, font_spec, Qnil, Qnil); | ||
| 1881 | return XINT (FONTSET_ID (fontset)); | 1893 | return XINT (FONTSET_ID (fontset)); |
| 1882 | } | 1894 | } |
| 1883 | 1895 | ||
| @@ -2362,9 +2374,11 @@ dump_fontset (fontset) | |||
| 2362 | FRAME_PTR f = XFRAME (frame); | 2374 | FRAME_PTR f = XFRAME (frame); |
| 2363 | 2375 | ||
| 2364 | if (FRAME_LIVE_P (f)) | 2376 | if (FRAME_LIVE_P (f)) |
| 2365 | ASET (vec, 1, f->name); | 2377 | ASET (vec, 1, |
| 2378 | Fcons (FONTSET_NAME (FONTSET_BASE (fontset)), f->name)); | ||
| 2366 | else | 2379 | else |
| 2367 | ASET (vec, 1, Qt); | 2380 | ASET (vec, 1, |
| 2381 | Fcons (FONTSET_NAME (FONTSET_BASE (fontset)), Qnil)); | ||
| 2368 | } | 2382 | } |
| 2369 | if (!NILP (FONTSET_DEFAULT (fontset))) | 2383 | if (!NILP (FONTSET_DEFAULT (fontset))) |
| 2370 | ASET (vec, 2, FONTSET_ID (FONTSET_DEFAULT (fontset))); | 2384 | ASET (vec, 2, FONTSET_ID (FONTSET_DEFAULT (fontset))); |