aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2007-04-13 01:36:53 +0000
committerKenichi Handa2007-04-13 01:36:53 +0000
commit1c82b4b3a1b93f96b983141cf783ef06ff9d4897 (patch)
tree87e22068cdaa97373f1e6764037f1c31a2e99843 /src
parentdaa4ff491f1fbda6efe207b214c21c1fa3b09755 (diff)
downloademacs-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.
Diffstat (limited to 'src')
-rw-r--r--src/fontset.c210
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
532static 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
538static Lisp_Object 543static Lisp_Object
539fontset_font (fontset, c, face, id) 544fontset_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 798static Lisp_Object
803 if (enable_font_backend) 799fontset_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)));