unicode: Cleanup implementation
[framework/uifw/harfbuzz.git] / src / hb-glib.cc
1 /*
2  * Copyright (C) 2009  Red Hat, Inc.
3  *
4  *  This is part of HarfBuzz, a text shaping library.
5  *
6  * Permission is hereby granted, without written agreement and without
7  * license or royalty fees, to use, copy, modify, and distribute this
8  * software and its documentation for any purpose, provided that the
9  * above copyright notice and the following two paragraphs appear in
10  * all copies of this software.
11  *
12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16  * DAMAGE.
17  *
18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  *
24  * Red Hat Author(s): Behdad Esfahbod
25  */
26
27 #include "hb-private.h"
28
29 #include "hb-glib.h"
30
31 #include "hb-unicode-private.hh"
32
33 #include <glib.h>
34
35 HB_BEGIN_DECLS
36
37
38 static unsigned int
39 hb_glib_get_combining_class (hb_unicode_funcs_t *ufuncs,
40                              hb_codepoint_t      unicode,
41                              void               *user_data)
42
43 {
44   return g_unichar_combining_class (unicode);
45 }
46
47 static unsigned int
48 hb_glib_get_eastasian_width (hb_unicode_funcs_t *ufuncs,
49                              hb_codepoint_t      unicode,
50                              void               *user_data)
51 {
52   return g_unichar_iswide (unicode) ? 2 : 1;
53 }
54
55 static hb_unicode_general_category_t
56 hb_glib_get_general_category (hb_unicode_funcs_t *ufuncs,
57                               hb_codepoint_t      unicode,
58                               void               *user_data)
59
60 {
61   /* hb_unicode_general_category_t and GUnicodeType are identical */
62   return (hb_unicode_general_category_t) g_unichar_type (unicode);
63 }
64
65 static hb_codepoint_t
66 hb_glib_get_mirroring (hb_unicode_funcs_t *ufuncs,
67                        hb_codepoint_t      unicode,
68                        void               *user_data)
69 {
70   g_unichar_get_mirror_char (unicode, &unicode);
71   return unicode;
72 }
73
74 static hb_script_t
75 hb_glib_get_script (hb_unicode_funcs_t *ufuncs,
76                     hb_codepoint_t      unicode,
77                     void               *user_data)
78 {
79   GUnicodeScript script = g_unichar_get_script (unicode);
80   switch (script)
81   {
82 #define MATCH_SCRIPT(C) case G_UNICODE_SCRIPT_##C: return HB_SCRIPT_##C
83 #define MATCH_SCRIPT2(C1, C2) case G_UNICODE_SCRIPT_##C1: return HB_SCRIPT_##C2
84
85   MATCH_SCRIPT2(INVALID_CODE, INVALID);
86
87   MATCH_SCRIPT (COMMON);             /* Zyyy */
88   MATCH_SCRIPT (INHERITED);          /* Qaai */
89   MATCH_SCRIPT (ARABIC);             /* Arab */
90   MATCH_SCRIPT (ARMENIAN);           /* Armn */
91   MATCH_SCRIPT (BENGALI);            /* Beng */
92   MATCH_SCRIPT (BOPOMOFO);           /* Bopo */
93   MATCH_SCRIPT (CHEROKEE);           /* Cher */
94   MATCH_SCRIPT (COPTIC);             /* Qaac */
95   MATCH_SCRIPT (CYRILLIC);           /* Cyrl (Cyrs) */
96   MATCH_SCRIPT (DESERET);            /* Dsrt */
97   MATCH_SCRIPT (DEVANAGARI);         /* Deva */
98   MATCH_SCRIPT (ETHIOPIC);           /* Ethi */
99   MATCH_SCRIPT (GEORGIAN);           /* Geor (Geon); Geoa) */
100   MATCH_SCRIPT (GOTHIC);             /* Goth */
101   MATCH_SCRIPT (GREEK);              /* Grek */
102   MATCH_SCRIPT (GUJARATI);           /* Gujr */
103   MATCH_SCRIPT (GURMUKHI);           /* Guru */
104   MATCH_SCRIPT (HAN);                /* Hani */
105   MATCH_SCRIPT (HANGUL);             /* Hang */
106   MATCH_SCRIPT (HEBREW);             /* Hebr */
107   MATCH_SCRIPT (HIRAGANA);           /* Hira */
108   MATCH_SCRIPT (KANNADA);            /* Knda */
109   MATCH_SCRIPT (KATAKANA);           /* Kana */
110   MATCH_SCRIPT (KHMER);              /* Khmr */
111   MATCH_SCRIPT (LAO);                /* Laoo */
112   MATCH_SCRIPT (LATIN);              /* Latn (Latf); Latg) */
113   MATCH_SCRIPT (MALAYALAM);          /* Mlym */
114   MATCH_SCRIPT (MONGOLIAN);          /* Mong */
115   MATCH_SCRIPT (MYANMAR);            /* Mymr */
116   MATCH_SCRIPT (OGHAM);              /* Ogam */
117   MATCH_SCRIPT (OLD_ITALIC);         /* Ital */
118   MATCH_SCRIPT (ORIYA);              /* Orya */
119   MATCH_SCRIPT (RUNIC);              /* Runr */
120   MATCH_SCRIPT (SINHALA);            /* Sinh */
121   MATCH_SCRIPT (SYRIAC);             /* Syrc (Syrj, Syrn); Syre) */
122   MATCH_SCRIPT (TAMIL);              /* Taml */
123   MATCH_SCRIPT (TELUGU);             /* Telu */
124   MATCH_SCRIPT (THAANA);             /* Thaa */
125   MATCH_SCRIPT (THAI);               /* Thai */
126   MATCH_SCRIPT (TIBETAN);            /* Tibt */
127   MATCH_SCRIPT (CANADIAN_ABORIGINAL);/* Cans */
128   MATCH_SCRIPT (YI);                 /* Yiii */
129   MATCH_SCRIPT (TAGALOG);            /* Tglg */
130   MATCH_SCRIPT (HANUNOO);            /* Hano */
131   MATCH_SCRIPT (BUHID);              /* Buhd */
132   MATCH_SCRIPT (TAGBANWA);           /* Tagb */
133
134   /* Unicode-4.0 additions */
135   MATCH_SCRIPT (BRAILLE);            /* Brai */
136   MATCH_SCRIPT (CYPRIOT);            /* Cprt */
137   MATCH_SCRIPT (LIMBU);              /* Limb */
138   MATCH_SCRIPT (OSMANYA);            /* Osma */
139   MATCH_SCRIPT (SHAVIAN);            /* Shaw */
140   MATCH_SCRIPT (LINEAR_B);           /* Linb */
141   MATCH_SCRIPT (TAI_LE);             /* Tale */
142   MATCH_SCRIPT (UGARITIC);           /* Ugar */
143
144   /* Unicode-4.1 additions */
145   MATCH_SCRIPT (NEW_TAI_LUE);        /* Talu */
146   MATCH_SCRIPT (BUGINESE);           /* Bugi */
147   MATCH_SCRIPT (GLAGOLITIC);         /* Glag */
148   MATCH_SCRIPT (TIFINAGH);           /* Tfng */
149   MATCH_SCRIPT (SYLOTI_NAGRI);       /* Sylo */
150   MATCH_SCRIPT (OLD_PERSIAN);        /* Xpeo */
151   MATCH_SCRIPT (KHAROSHTHI);         /* Khar */
152
153   /* Unicode-5.0 additions */
154   MATCH_SCRIPT (UNKNOWN);            /* Zzzz */
155   MATCH_SCRIPT (BALINESE);           /* Bali */
156   MATCH_SCRIPT (CUNEIFORM);          /* Xsux */
157   MATCH_SCRIPT (PHOENICIAN);         /* Phnx */
158   MATCH_SCRIPT (PHAGS_PA);           /* Phag */
159   MATCH_SCRIPT (NKO);                /* Nkoo */
160
161   /* Unicode-5.1 additions */
162   MATCH_SCRIPT (KAYAH_LI);           /* Kali */
163   MATCH_SCRIPT (LEPCHA);             /* Lepc */
164   MATCH_SCRIPT (REJANG);             /* Rjng */
165   MATCH_SCRIPT (SUNDANESE);          /* Sund */
166   MATCH_SCRIPT (SAURASHTRA);         /* Saur */
167   MATCH_SCRIPT (CHAM);               /* Cham */
168   MATCH_SCRIPT (OL_CHIKI);           /* Olck */
169   MATCH_SCRIPT (VAI);                /* Vaii */
170   MATCH_SCRIPT (CARIAN);             /* Cari */
171   MATCH_SCRIPT (LYCIAN);             /* Lyci */
172   MATCH_SCRIPT (LYDIAN);             /* Lydi */
173
174   /* Unicode-5.2 additions */
175 #if GLIB_CHECK_VERSION(2,26,0)
176   MATCH_SCRIPT (AVESTAN);                /* Avst */
177   MATCH_SCRIPT (BAMUM);                  /* Bamu */
178   MATCH_SCRIPT (EGYPTIAN_HIEROGLYPHS);   /* Egyp */
179   MATCH_SCRIPT (IMPERIAL_ARAMAIC);       /* Armi */
180   MATCH_SCRIPT (INSCRIPTIONAL_PAHLAVI);  /* Phli */
181   MATCH_SCRIPT (INSCRIPTIONAL_PARTHIAN); /* Prti */
182   MATCH_SCRIPT (JAVANESE);               /* Java */
183   MATCH_SCRIPT (KAITHI);                 /* Kthi */
184   MATCH_SCRIPT (TAI_THAM);               /* Lana */
185   MATCH_SCRIPT (LISU);                   /* Lisu */
186   MATCH_SCRIPT (MEETEI_MAYEK);           /* Mtei */
187   MATCH_SCRIPT (OLD_SOUTH_ARABIAN);      /* Sarb */
188 #if GLIB_CHECK_VERSION(2,27,92)
189   MATCH_SCRIPT (OLD_TURKIC);             /* Orkh */
190 #else
191   MATCH_SCRIPT2(OLD_TURKISH, OLD_TURKIC);/* Orkh */
192 #endif
193   MATCH_SCRIPT (SAMARITAN);              /* Samr */
194   MATCH_SCRIPT (TAI_VIET);               /* Tavt */
195 #endif
196
197   /* Unicode-6.0 additions */
198 #if GLIB_CHECK_VERSION(2,28,0)
199   MATCH_SCRIPT (BATAK);                  /* Batk */
200   MATCH_SCRIPT (BRAHMI);                 /* Brah */
201   MATCH_SCRIPT (MANDAIC);                /* Mand */
202 #endif
203
204 #undef MATCH_SCRIPT
205 #undef MATCH_SCRIPT2
206   }
207
208   return HB_SCRIPT_UNKNOWN;
209 }
210
211 static hb_unicode_funcs_t glib_ufuncs = {
212   HB_REFERENCE_COUNT_INVALID, /* ref_count */
213   NULL, /* parent */
214   TRUE, /* immutable */
215   {
216     hb_glib_get_combining_class,
217     hb_glib_get_eastasian_width,
218     hb_glib_get_general_category,
219     hb_glib_get_mirroring,
220     hb_glib_get_script
221   }
222 };
223
224 hb_unicode_funcs_t *
225 hb_glib_get_unicode_funcs (void)
226 {
227   return &glib_ufuncs;
228 }
229
230
231 HB_END_DECLS