diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ftfont.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/ftfont.c b/src/ftfont.c index 260f259615a..46f32e0f5fe 100644 --- a/src/ftfont.c +++ b/src/ftfont.c | |||
| @@ -2687,6 +2687,152 @@ ftfont_variation_glyphs (struct font *font, int c, unsigned variations[256]) | |||
| 2687 | 2687 | ||
| 2688 | #ifdef HAVE_HARFBUZZ | 2688 | #ifdef HAVE_HARFBUZZ |
| 2689 | 2689 | ||
| 2690 | static hb_unicode_combining_class_t | ||
| 2691 | uni_combining (hb_unicode_funcs_t *funcs, hb_codepoint_t ch, void *user_data) | ||
| 2692 | { | ||
| 2693 | /* FIXME: Is it OK to load the table each time like this? */ | ||
| 2694 | Lisp_Object table = uniprop_table (intern ("canonical-combining-class")); | ||
| 2695 | if (!NILP (table)) | ||
| 2696 | { | ||
| 2697 | /* FIXME: something is wrong here, the classes we are getting do not make | ||
| 2698 | * sense. */ | ||
| 2699 | Lisp_Object combining = CHAR_TABLE_REF (table, ch); | ||
| 2700 | if (INTEGERP (combining)) | ||
| 2701 | return (hb_unicode_combining_class_t) XFIXNUM (combining); | ||
| 2702 | } | ||
| 2703 | |||
| 2704 | return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED; | ||
| 2705 | } | ||
| 2706 | |||
| 2707 | static hb_unicode_general_category_t | ||
| 2708 | uni_general (hb_unicode_funcs_t *funcs, hb_codepoint_t ch, void *user_data) | ||
| 2709 | { | ||
| 2710 | Lisp_Object category = CHAR_TABLE_REF (Vunicode_category_table, ch); | ||
| 2711 | |||
| 2712 | if (INTEGERP (category)) | ||
| 2713 | { | ||
| 2714 | switch (XFIXNUM (category)) | ||
| 2715 | { | ||
| 2716 | case UNICODE_CATEGORY_Cc: | ||
| 2717 | return HB_UNICODE_GENERAL_CATEGORY_CONTROL; | ||
| 2718 | case UNICODE_CATEGORY_Cf: | ||
| 2719 | return HB_UNICODE_GENERAL_CATEGORY_FORMAT; | ||
| 2720 | case UNICODE_CATEGORY_Cn: | ||
| 2721 | return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED; | ||
| 2722 | case UNICODE_CATEGORY_Co: | ||
| 2723 | return HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE; | ||
| 2724 | case UNICODE_CATEGORY_Cs: | ||
| 2725 | return HB_UNICODE_GENERAL_CATEGORY_SURROGATE; | ||
| 2726 | case UNICODE_CATEGORY_Ll: | ||
| 2727 | return HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER; | ||
| 2728 | case UNICODE_CATEGORY_Lm: | ||
| 2729 | return HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER; | ||
| 2730 | case UNICODE_CATEGORY_Lo: | ||
| 2731 | return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER; | ||
| 2732 | case UNICODE_CATEGORY_Lt: | ||
| 2733 | return HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER; | ||
| 2734 | case UNICODE_CATEGORY_Lu: | ||
| 2735 | return HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER; | ||
| 2736 | case UNICODE_CATEGORY_Mc: | ||
| 2737 | return HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK; | ||
| 2738 | case UNICODE_CATEGORY_Me: | ||
| 2739 | return HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK; | ||
| 2740 | case UNICODE_CATEGORY_Mn: | ||
| 2741 | return HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK; | ||
| 2742 | case UNICODE_CATEGORY_Nd: | ||
| 2743 | return HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER; | ||
| 2744 | case UNICODE_CATEGORY_Nl: | ||
| 2745 | return HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER; | ||
| 2746 | case UNICODE_CATEGORY_No: | ||
| 2747 | return HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER; | ||
| 2748 | case UNICODE_CATEGORY_Pc: | ||
| 2749 | return HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION; | ||
| 2750 | case UNICODE_CATEGORY_Pd: | ||
| 2751 | return HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION; | ||
| 2752 | case UNICODE_CATEGORY_Pe: | ||
| 2753 | return HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION; | ||
| 2754 | case UNICODE_CATEGORY_Pf: | ||
| 2755 | return HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION; | ||
| 2756 | case UNICODE_CATEGORY_Pi: | ||
| 2757 | return HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION; | ||
| 2758 | case UNICODE_CATEGORY_Po: | ||
| 2759 | return HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION; | ||
| 2760 | case UNICODE_CATEGORY_Ps: | ||
| 2761 | return HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION; | ||
| 2762 | case UNICODE_CATEGORY_Sc: | ||
| 2763 | return HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL; | ||
| 2764 | case UNICODE_CATEGORY_Sk: | ||
| 2765 | return HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL; | ||
| 2766 | case UNICODE_CATEGORY_Sm: | ||
| 2767 | return HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL; | ||
| 2768 | case UNICODE_CATEGORY_So: | ||
| 2769 | return HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL; | ||
| 2770 | case UNICODE_CATEGORY_Zl: | ||
| 2771 | return HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR; | ||
| 2772 | case UNICODE_CATEGORY_Zp: | ||
| 2773 | return HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR; | ||
| 2774 | case UNICODE_CATEGORY_Zs: | ||
| 2775 | return HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR; | ||
| 2776 | case UNICODE_CATEGORY_UNKNOWN: | ||
| 2777 | return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED; | ||
| 2778 | } | ||
| 2779 | } | ||
| 2780 | |||
| 2781 | return HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED; | ||
| 2782 | } | ||
| 2783 | |||
| 2784 | static hb_codepoint_t | ||
| 2785 | uni_mirroring (hb_unicode_funcs_t *funcs, hb_codepoint_t ch, void *user_data) | ||
| 2786 | { | ||
| 2787 | return bidi_mirror_char (ch); | ||
| 2788 | } | ||
| 2789 | |||
| 2790 | static hb_script_t | ||
| 2791 | uni_script (hb_unicode_funcs_t *funcs, hb_codepoint_t ch, void *user_data) | ||
| 2792 | { | ||
| 2793 | Lisp_Object script = CHAR_TABLE_REF (Vchar_script_table, ch); | ||
| 2794 | |||
| 2795 | if (SYMBOLP (script)) | ||
| 2796 | { | ||
| 2797 | /* FIXME: from_string wants an ISO 15924 script tag here. */ | ||
| 2798 | return hb_script_from_string (SSDATA (SYMBOL_NAME (script)), | ||
| 2799 | SBYTES (SYMBOL_NAME (script))); | ||
| 2800 | } | ||
| 2801 | |||
| 2802 | return HB_SCRIPT_INVALID; | ||
| 2803 | } | ||
| 2804 | |||
| 2805 | static hb_bool_t | ||
| 2806 | uni_compose (hb_unicode_funcs_t *funcs, hb_codepoint_t a, hb_codepoint_t b, | ||
| 2807 | hb_codepoint_t *ab, void *user_data) | ||
| 2808 | { | ||
| 2809 | /* FIXME: implement */ | ||
| 2810 | return false; | ||
| 2811 | } | ||
| 2812 | |||
| 2813 | static hb_bool_t | ||
| 2814 | uni_decompose (hb_unicode_funcs_t *funcs, hb_codepoint_t ab, hb_codepoint_t *a, | ||
| 2815 | hb_codepoint_t *b, void *user_data) | ||
| 2816 | { | ||
| 2817 | /* FIXME: implement */ | ||
| 2818 | return false; | ||
| 2819 | } | ||
| 2820 | |||
| 2821 | static hb_unicode_funcs_t * | ||
| 2822 | get_hb_unicode_funcs (void) | ||
| 2823 | { | ||
| 2824 | hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (NULL); | ||
| 2825 | |||
| 2826 | hb_unicode_funcs_set_combining_class_func (funcs, uni_combining, NULL, NULL); | ||
| 2827 | hb_unicode_funcs_set_general_category_func (funcs, uni_general, NULL, NULL); | ||
| 2828 | hb_unicode_funcs_set_mirroring_func (funcs, uni_mirroring, NULL, NULL); | ||
| 2829 | hb_unicode_funcs_set_script_func (funcs, uni_script, NULL, NULL); | ||
| 2830 | hb_unicode_funcs_set_compose_func (funcs, uni_compose, NULL, NULL); | ||
| 2831 | hb_unicode_funcs_set_decompose_func (funcs, uni_decompose, NULL, NULL); | ||
| 2832 | |||
| 2833 | return funcs; | ||
| 2834 | } | ||
| 2835 | |||
| 2690 | static Lisp_Object | 2836 | static Lisp_Object |
| 2691 | ftfont_shape_by_hb (Lisp_Object lgstring, FT_Face ft_face, hb_font_t *hb_font, | 2837 | ftfont_shape_by_hb (Lisp_Object lgstring, FT_Face ft_face, hb_font_t *hb_font, |
| 2692 | FT_Matrix *matrix) | 2838 | FT_Matrix *matrix) |
| @@ -2716,6 +2862,9 @@ ftfont_shape_by_hb (Lisp_Object lgstring, FT_Face ft_face, hb_font_t *hb_font, | |||
| 2716 | if (!text_len) | 2862 | if (!text_len) |
| 2717 | goto done; | 2863 | goto done; |
| 2718 | 2864 | ||
| 2865 | hb_unicode_funcs_t* ufuncs = get_hb_unicode_funcs(); | ||
| 2866 | hb_buffer_set_unicode_funcs(hb_buffer, ufuncs); | ||
| 2867 | |||
| 2719 | hb_buffer_set_content_type (hb_buffer, HB_BUFFER_CONTENT_TYPE_UNICODE); | 2868 | hb_buffer_set_content_type (hb_buffer, HB_BUFFER_CONTENT_TYPE_UNICODE); |
| 2720 | hb_buffer_set_cluster_level (hb_buffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS); | 2869 | hb_buffer_set_cluster_level (hb_buffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS); |
| 2721 | 2870 | ||