aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhaled Hosny2018-08-24 01:52:25 +0200
committerKhaled Hosny2018-12-10 00:08:50 +0200
commit0a1e695fe34171f767d5cd7aabd31a4ebfdda6f2 (patch)
treec80002da57ced762463c17c9aa06de85dcac93bc
parent68e675d5cfb3d5b1dcf6b82691663a0f4c157a3a (diff)
downloademacs-0a1e695fe34171f767d5cd7aabd31a4ebfdda6f2.tar.gz
emacs-0a1e695fe34171f767d5cd7aabd31a4ebfdda6f2.zip
WIP: implement some Unicode callback functions
-rw-r--r--src/ftfont.c149
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
2690static hb_unicode_combining_class_t
2691uni_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
2707static hb_unicode_general_category_t
2708uni_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
2784static hb_codepoint_t
2785uni_mirroring (hb_unicode_funcs_t *funcs, hb_codepoint_t ch, void *user_data)
2786{
2787 return bidi_mirror_char (ch);
2788}
2789
2790static hb_script_t
2791uni_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
2805static hb_bool_t
2806uni_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
2813static hb_bool_t
2814uni_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
2821static hb_unicode_funcs_t *
2822get_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
2690static Lisp_Object 2836static Lisp_Object
2691ftfont_shape_by_hb (Lisp_Object lgstring, FT_Face ft_face, hb_font_t *hb_font, 2837ftfont_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