Mercurial > emacs
comparison src/fontset.c @ 90440:33277d7748f3
(reorder_font_vector): Pay attention to the case that
the 3rd element of font_def is nil.
(fontset_font): For the default fontset, append one more fontset
elements for a script-based font specification. Don't add script
attribute on finding a font.
(new_fontset_from_font): Unconditionally set FONTSET_ASCII to the
font name.
(fontset_ascii_font): If a font can't be opened, return nil.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 09 Jun 2006 02:14:49 +0000 |
parents | 55a58b0d3d9e |
children | 5956a1352bc4 |
comparison
equal
deleted
inserted
replaced
90439:fb253905e9c3 | 90440:33277d7748f3 |
---|---|
459 FONT-DEF has this form: | 459 FONT-DEF has this form: |
460 [FACE-ID FONT-INDEX [ FONT-SPEC ENCODING REPERTORY ]] */ | 460 [FACE-ID FONT-INDEX [ FONT-SPEC ENCODING REPERTORY ]] */ |
461 for (i = 0; i < size; i++) | 461 for (i = 0; i < size; i++) |
462 { | 462 { |
463 font_def = AREF (fontset_element, i + 3); | 463 font_def = AREF (fontset_element, i + 3); |
464 charset_id_table[i] = XINT (AREF (AREF (font_def, 2), 1)); | 464 if (! NILP (AREF (font_def, 2))) |
465 charset_id_table[i] = XINT (AREF (AREF (font_def, 2), 1)); | |
466 else | |
467 charset_id_table[i] = -1; | |
465 } | 468 } |
466 | 469 |
467 /* Then, store FONT-DEFs in NEW_VEC in the correct order. */ | 470 /* Then, store FONT-DEFs in NEW_VEC in the correct order. */ |
468 for (idx = 0, list = Vcharset_ordered_list; | 471 for (idx = 0, list = Vcharset_ordered_list; |
469 idx < size && CONSP (list); list = XCDR (list)) | 472 idx < size && CONSP (list); list = XCDR (list)) |
470 { | 473 { |
471 for (i = 0; i < size; i++) | 474 for (i = 0; i < size; i++) |
472 if (charset_id_table[i] == XINT (XCAR (list))) | 475 if (charset_id_table[i] == XINT (XCAR (list))) |
473 new_vec[idx++] = AREF (fontset_element, i + 3); | 476 new_vec[idx++] = AREF (fontset_element, i + 3); |
474 } | 477 } |
478 for (i = 0; i < size; i++) | |
479 if (charset_id_table[i] < 0) | |
480 new_vec[idx++] = AREF (fontset_element, i + 3); | |
475 | 481 |
476 /* At last, update FONT-DEFs. */ | 482 /* At last, update FONT-DEFs. */ |
477 for (i = 0; i < size; i++) | 483 for (i = 0; i < size; i++) |
478 ASET (fontset_element, i + 3, new_vec[i]); | 484 ASET (fontset_element, i + 3, new_vec[i]); |
479 } | 485 } |
560 goto try_fallback; | 566 goto try_fallback; |
561 } | 567 } |
562 /* Build a vector [ -1 -1 nil NEW-ELT0 NEW-ELT1 NEW-ELT2 ... ], | 568 /* Build a vector [ -1 -1 nil NEW-ELT0 NEW-ELT1 NEW-ELT2 ... ], |
563 where the first -1 is to force reordering of NEW-ELTn, | 569 where the first -1 is to force reordering of NEW-ELTn, |
564 NEW-ETLn is [nil nil AREF (elt, n) nil]. */ | 570 NEW-ETLn is [nil nil AREF (elt, n) nil]. */ |
571 #ifdef USE_FONT_BACKEND | |
572 if (enable_font_backend | |
573 && EQ (base_fontset, Vdefault_fontset)) | |
574 vec = Fmake_vector (make_number (ASIZE (elt) + 4), make_number (-1)); | |
575 else | |
576 #endif /* not USE_FONT_BACKEND */ | |
565 vec = Fmake_vector (make_number (ASIZE (elt) + 3), make_number (-1)); | 577 vec = Fmake_vector (make_number (ASIZE (elt) + 3), make_number (-1)); |
566 ASET (vec, 2, Qnil); | 578 ASET (vec, 2, Qnil); |
567 for (i = 0; i < ASIZE (elt); i++) | 579 for (i = 0; i < ASIZE (elt); i++) |
568 { | 580 { |
569 Lisp_Object tmp; | 581 Lisp_Object tmp; |
575 #endif /* USE_FONT_BACKEND */ | 587 #endif /* USE_FONT_BACKEND */ |
576 tmp = Fmake_vector (make_number (4), Qnil); | 588 tmp = Fmake_vector (make_number (4), Qnil); |
577 ASET (tmp, 2, AREF (elt, i)); | 589 ASET (tmp, 2, AREF (elt, i)); |
578 ASET (vec, 3 + i, tmp); | 590 ASET (vec, 3 + i, tmp); |
579 } | 591 } |
592 #ifdef USE_FONT_BACKEND | |
593 if (enable_font_backend | |
594 && EQ (base_fontset, Vdefault_fontset)) | |
595 { | |
596 Lisp_Object script, font_spec, tmp; | |
597 | |
598 script = CHAR_TABLE_REF (Vchar_script_table, c); | |
599 if (NILP (script)) | |
600 script = intern ("latin"); | |
601 font_spec = Ffont_spec (0, NULL); | |
602 ASET (font_spec, FONT_REGISTRY_INDEX, Qiso10646_1); | |
603 ASET (font_spec, FONT_EXTRA_INDEX, | |
604 Fcons (Fcons (QCscript, script), Qnil)); | |
605 tmp = Fmake_vector (make_number (5), Qnil); | |
606 ASET (tmp, 3, font_spec); | |
607 ASET (vec, 3 + i, tmp); | |
608 } | |
609 #endif /* USE_FONT_BACKEND */ | |
610 | |
580 /* Then store it in the fontset. */ | 611 /* Then store it in the fontset. */ |
581 FONTSET_SET (fontset, range, vec); | 612 FONTSET_SET (fontset, range, vec); |
582 } | 613 } |
583 | 614 |
584 retry: | 615 retry: |
635 /* ELT == [ FACE-ID FONT-INDEX FONT-DEF FONT-ENTITY FONT-OBJECT ] */ | 666 /* ELT == [ FACE-ID FONT-INDEX FONT-DEF FONT-ENTITY FONT-OBJECT ] */ |
636 Lisp_Object font_entity = AREF (elt, 3); | 667 Lisp_Object font_entity = AREF (elt, 3); |
637 Lisp_Object font_object = AREF (elt, 4); | 668 Lisp_Object font_object = AREF (elt, 4); |
638 int has_char; | 669 int has_char; |
639 | 670 |
640 if (NILP (font_entity)) | 671 if (NILP (font_entity) && ! NILP (AREF (font_def, 0))) |
641 { | 672 { |
642 Lisp_Object tmp = AREF (font_def, 0); | 673 Lisp_Object tmp = AREF (font_def, 0); |
643 Lisp_Object spec = Ffont_spec (0, NULL); | 674 Lisp_Object spec = Ffont_spec (0, NULL); |
644 Lisp_Object script; | 675 Lisp_Object script; |
645 | 676 |
650 Lisp_Object family = AREF (tmp, 0); | 681 Lisp_Object family = AREF (tmp, 0); |
651 Lisp_Object registry = AREF (tmp, 5);; | 682 Lisp_Object registry = AREF (tmp, 5);; |
652 | 683 |
653 font_merge_old_spec (Qnil, family, registry, spec); | 684 font_merge_old_spec (Qnil, family, registry, spec); |
654 } | 685 } |
655 script = CHAR_TABLE_REF (Vchar_script_table, c); | |
656 if (! NILP (script)) | |
657 ASET (spec, FONT_EXTRA_INDEX, | |
658 Fcons (Fcons (QCscript, script), Qnil)); | |
659 font_entity = font_find_for_lface (f, face->lface, spec); | 686 font_entity = font_find_for_lface (f, face->lface, spec); |
687 ASET (elt, 3, font_entity); | |
688 } | |
689 else if (FONT_SPEC_P (font_entity)) | |
690 { | |
691 font_entity = font_find_for_lface (f, face->lface, font_entity); | |
660 ASET (elt, 3, font_entity); | 692 ASET (elt, 3, font_entity); |
661 } | 693 } |
662 if (NILP (font_entity)) | 694 if (NILP (font_entity)) |
663 { | 695 { |
664 ASET (elt, 1, make_number (-1)); | 696 ASET (elt, 1, make_number (-1)); |
1808 { | 1840 { |
1809 Lisp_Object xlfd = Ffont_xlfd_name (font_object); | 1841 Lisp_Object xlfd = Ffont_xlfd_name (font_object); |
1810 int id = new_fontset_from_font_name (xlfd); | 1842 int id = new_fontset_from_font_name (xlfd); |
1811 Lisp_Object fontset = FONTSET_FROM_ID (id); | 1843 Lisp_Object fontset = FONTSET_FROM_ID (id); |
1812 | 1844 |
1813 if (STRINGP (FONTSET_ASCII (fontset))) | 1845 FONTSET_ASCII (fontset) = build_string (font_get_name (font_object)); |
1814 FONTSET_ASCII (fontset) = Fcons (FONTSET_ASCII (fontset), | 1846 |
1815 Fcons (font_object, Qnil)); | |
1816 else | |
1817 { | |
1818 Lisp_Object val = XCDR (FONTSET_ASCII (fontset)); | |
1819 | |
1820 for (; ! NILP (val); val = XCDR (val)) | |
1821 if (EQ (XCAR (val), font_object)) | |
1822 break; | |
1823 if (NILP (val)) | |
1824 { | |
1825 val = FONTSET_ASCII (fontset); | |
1826 XSETCDR (val, Fcons (font_object, XCDR (val))); | |
1827 } | |
1828 } | |
1829 return id; | 1847 return id; |
1830 } | 1848 } |
1831 | 1849 |
1832 struct font * | 1850 struct font * |
1833 fontset_ascii_font (f, id) | 1851 fontset_ascii_font (f, id) |
1867 else | 1885 else |
1868 { | 1886 { |
1869 font_object = font_open_by_name (f, SDATA (ascii_slot)); | 1887 font_object = font_open_by_name (f, SDATA (ascii_slot)); |
1870 FONTSET_ASCII (fontset) = Fcons (ascii_slot, Fcons (font_object, Qnil)); | 1888 FONTSET_ASCII (fontset) = Fcons (ascii_slot, Fcons (font_object, Qnil)); |
1871 } | 1889 } |
1890 if (NILP (font_object)) | |
1891 return NULL; | |
1872 return XSAVE_VALUE (font_object)->pointer; | 1892 return XSAVE_VALUE (font_object)->pointer; |
1873 } | 1893 } |
1874 | 1894 |
1875 #endif /* USE_FONT_BACKEND */ | 1895 #endif /* USE_FONT_BACKEND */ |
1876 | 1896 |