OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2009 Red Hat, Inc. | 2 * Copyright © 2009 Red Hat, Inc. |
3 * Copyright © 2011 Google, Inc. | 3 * Copyright © 2011 Google, Inc. |
4 * | 4 * |
5 * This is part of HarfBuzz, a text shaping library. | 5 * This is part of HarfBuzz, a text shaping library. |
6 * | 6 * |
7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 /*{"ahg/awn/xan?", HB_TAG('A','G','W',' ')},*/ /* Agaw */ | 726 /*{"ahg/awn/xan?", HB_TAG('A','G','W',' ')},*/ /* Agaw */ |
727 /*{"gsw?/gsw-FR?", HB_TAG('A','L','S',' ')},*/ /* Alsatian */ | 727 /*{"gsw?/gsw-FR?", HB_TAG('A','L','S',' ')},*/ /* Alsatian */ |
728 /*{"krc", HB_TAG('B','A','L',' ')},*/ /* Balkar */ | 728 /*{"krc", HB_TAG('B','A','L',' ')},*/ /* Balkar */ |
729 /*{"??", HB_TAG('B','C','R',' ')},*/ /* Bible Cree */ | 729 /*{"??", HB_TAG('B','C','R',' ')},*/ /* Bible Cree */ |
730 /*{"zh?", HB_TAG('C','H','N',' ')},*/ /* Chinese (seen in Microsoft fo
nts) */ | 730 /*{"zh?", HB_TAG('C','H','N',' ')},*/ /* Chinese (seen in Microsoft fo
nts) */ |
731 /*{"acf/gcf?", HB_TAG('F','A','N',' ')},*/ /* French Antillean */ | 731 /*{"acf/gcf?", HB_TAG('F','A','N',' ')},*/ /* French Antillean */ |
732 /*{"enf?/yrk?", HB_TAG('F','N','E',' ')},*/ /* Forest Nenets */ | 732 /*{"enf?/yrk?", HB_TAG('F','N','E',' ')},*/ /* Forest Nenets */ |
733 /*{"fuf?", HB_TAG('F','T','A',' ')},*/ /* Futa */ | 733 /*{"fuf?", HB_TAG('F','T','A',' ')},*/ /* Futa */ |
734 /*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */ | 734 /*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */ |
735 /*{"cfm/rnl?", HB_TAG('H','A','L',' ')},*/ /* Halam */ | 735 /*{"cfm/rnl?", HB_TAG('H','A','L',' ')},*/ /* Halam */ |
736 /*{"fonipa", HB_TAG('I','P','P','H')},*/ /* Phonetic transcription—IPA co
nventions */ | |
737 /*{"ga-Latg?/Latg?", HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */ | 736 /*{"ga-Latg?/Latg?", HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */ |
738 /*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */ | 737 /*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */ |
739 /*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/ /* Kebena */ | 738 /*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/ /* Kebena */ |
740 /*{"Geok", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */ | 739 /*{"Geok", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */ |
741 /*{"kca", HB_TAG('K','H','K',' ')},*/ /* Khanty-Kazim */ | 740 /*{"kca", HB_TAG('K','H','K',' ')},*/ /* Khanty-Kazim */ |
742 /*{"kca", HB_TAG('K','H','S',' ')},*/ /* Khanty-Shurishkar */ | 741 /*{"kca", HB_TAG('K','H','S',' ')},*/ /* Khanty-Shurishkar */ |
743 /*{"kca", HB_TAG('K','H','V',' ')},*/ /* Khanty-Vakhi */ | 742 /*{"kca", HB_TAG('K','H','V',' ')},*/ /* Khanty-Vakhi */ |
744 /*{"guz?/kqs?/kss?", HB_TAG('K','I','S',' ')},*/ /* Kisii */ | 743 /*{"guz?/kqs?/kss?", HB_TAG('K','I','S',' ')},*/ /* Kisii */ |
745 /*{"kfa/kfi?/kpb?/xua?/xuj?", HB_TAG('K','O','D',' ')},*/ /* Kodagu */ | 744 /*{"kfa/kfi?/kpb?/xua?/xuj?", HB_TAG('K','O','D',' ')},*/ /* Kodagu */ |
746 /*{"okm?/oko?", HB_TAG('K','O','H',' ')},*/ /* Korean Old Hangul */ | 745 /*{"okm?/oko?", HB_TAG('K','O','H',' ')},*/ /* Korean Old Hangul */ |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 s += 6; | 824 s += 6; |
826 for (i = 0; i < 4 && ISALPHA (s[i]); i++) | 825 for (i = 0; i < 4 && ISALPHA (s[i]); i++) |
827 tag[i] = TOUPPER (s[i]); | 826 tag[i] = TOUPPER (s[i]); |
828 if (i) { | 827 if (i) { |
829 for (; i < 4; i++) | 828 for (; i < 4; i++) |
830 tag[i] = ' '; | 829 tag[i] = ' '; |
831 return HB_TAG_CHAR4 (tag); | 830 return HB_TAG_CHAR4 (tag); |
832 } | 831 } |
833 } | 832 } |
834 | 833 |
| 834 /* |
| 835 * The International Phonetic Alphabet is a variant tag in BCP-47, |
| 836 * which can be applied to any language. |
| 837 */ |
| 838 if (strstr (lang_str, "-fonipa")) { |
| 839 return HB_TAG('I','P','P','H'); /* Phonetic transcription—IPA conventions *
/ |
| 840 } |
| 841 |
835 /* Find a language matching in the first component */ | 842 /* Find a language matching in the first component */ |
836 { | 843 { |
837 const LangTag *lang_tag; | 844 const LangTag *lang_tag; |
838 lang_tag = (LangTag *) bsearch (lang_str, ot_languages, | 845 lang_tag = (LangTag *) bsearch (lang_str, ot_languages, |
839 ARRAY_LENGTH (ot_languages), sizeof (LangTag
), | 846 ARRAY_LENGTH (ot_languages), sizeof (LangTag
), |
840 (hb_compare_func_t) lang_compare_first_compo
nent); | 847 (hb_compare_func_t) lang_compare_first_compo
nent); |
841 if (lang_tag) | 848 if (lang_tag) |
842 return lang_tag->tag; | 849 return lang_tag->tag; |
843 } | 850 } |
844 | 851 |
(...skipping 25 matching lines...) Expand all Loading... |
870 return HB_OT_TAG_DEFAULT_LANGUAGE; | 877 return HB_OT_TAG_DEFAULT_LANGUAGE; |
871 } | 878 } |
872 | 879 |
873 /** | 880 /** |
874 * hb_ot_tag_to_language: | 881 * hb_ot_tag_to_language: |
875 * | 882 * |
876 * | 883 * |
877 * | 884 * |
878 * Return value: (transfer none): | 885 * Return value: (transfer none): |
879 * | 886 * |
880 * Since: 1.0 | 887 * Since: 0.9.2 |
881 **/ | 888 **/ |
882 hb_language_t | 889 hb_language_t |
883 hb_ot_tag_to_language (hb_tag_t tag) | 890 hb_ot_tag_to_language (hb_tag_t tag) |
884 { | 891 { |
885 unsigned int i; | 892 unsigned int i; |
886 | 893 |
887 if (tag == HB_OT_TAG_DEFAULT_LANGUAGE) | 894 if (tag == HB_OT_TAG_DEFAULT_LANGUAGE) |
888 return NULL; | 895 return NULL; |
889 | 896 |
890 for (i = 0; i < ARRAY_LENGTH (ot_languages); i++) | 897 for (i = 0; i < ARRAY_LENGTH (ot_languages); i++) |
891 if (ot_languages[i].tag == tag) | 898 if (ot_languages[i].tag == tag) |
892 return hb_language_from_string (ot_languages[i].language, -1); | 899 return hb_language_from_string (ot_languages[i].language, -1); |
893 | 900 |
894 /* If tag starts with ZH, it's Chinese */ | 901 /* If tag starts with ZH, it's Chinese */ |
895 if ((tag & 0xFFFF0000u) == 0x5A480000u) { | 902 if ((tag & 0xFFFF0000u) == 0x5A480000u) { |
896 switch (tag) { | 903 switch (tag) { |
897 case HB_TAG('Z','H','H',' '): return hb_language_from_string ("zh-hk", -1)
; /* Hong Kong */ | 904 case HB_TAG('Z','H','H',' '): return hb_language_from_string ("zh-hk", -1)
; /* Hong Kong */ |
898 case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -
1); /* Simplified */ | 905 case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -
1); /* Simplified */ |
899 case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -
1); /* Traditional */ | 906 case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -
1); /* Traditional */ |
900 default: break; /* Fall through */ | 907 default: break; /* Fall through */ |
901 } | 908 } |
902 } | 909 } |
903 | 910 |
| 911 /* struct LangTag has only room for 3-letter language tags. */ |
| 912 switch (tag) { |
| 913 case HB_TAG('I','P','P','H'): /* Phonetic transcription—IPA conventions */ |
| 914 return hb_language_from_string ("und-fonipa", -1); |
| 915 } |
| 916 |
904 /* Else return a custom language in the form of "x-hbotABCD" */ | 917 /* Else return a custom language in the form of "x-hbotABCD" */ |
905 { | 918 { |
906 unsigned char buf[11] = "x-hbot"; | 919 unsigned char buf[11] = "x-hbot"; |
907 buf[6] = tag >> 24; | 920 buf[6] = tag >> 24; |
908 buf[7] = (tag >> 16) & 0xFF; | 921 buf[7] = (tag >> 16) & 0xFF; |
909 buf[8] = (tag >> 8) & 0xFF; | 922 buf[8] = (tag >> 8) & 0xFF; |
910 buf[9] = tag & 0xFF; | 923 buf[9] = tag & 0xFF; |
911 if (buf[9] == 0x20) | 924 if (buf[9] == 0x20) |
912 buf[9] = '\0'; | 925 buf[9] = '\0'; |
913 buf[10] = '\0'; | 926 buf[10] = '\0'; |
914 return hb_language_from_string ((char *) buf, -1); | 927 return hb_language_from_string ((char *) buf, -1); |
915 } | 928 } |
916 } | 929 } |
917 | 930 |
918 | 931 |
OLD | NEW |