Merge "Skeleton Decorator API" into new_text
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / text / script.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // FILE HEADER
19 #include <dali-toolkit/public-api/text/script.h>
20
21 namespace Dali
22 {
23
24 namespace Toolkit
25 {
26
27 namespace Text
28 {
29
30 namespace
31 {
32 const unsigned int CHAR_ZWS  = 0x200B; ///< Zero width space.
33 const unsigned int CHAR_ZWNJ = 0x200C; ///< Zero width non joiner.
34 const unsigned int CHAR_ZWJ  = 0x200D; ///< Zero width joiner.
35 const unsigned int CHAR_LTRM = 0x200E; ///< Left to Right Mark.
36 const unsigned int CHAR_RTLM = 0x200F; ///< Right to Left Mark.
37 const unsigned int CHAR_TS   = 0x2009; ///< Thin Space.
38 } // namespace
39
40 Script GetCharacterScript( Character character )
41 {
42   // Latin script:
43   // 0x0000 - 0x007f C0 Controls and Basic Latin
44   // 0x0080 - 0x00ff C1 Controls and Latin-1 Supplement
45   // 0x0100 - 0x017f Latin Extended-A
46   // 0x0180 - 0x024f Latin Extended-B
47   // 0x0250 - 0x02af IPA Extensions
48   // 0x02b0 - 0x02ff Spacing Modifier Letters
49   // 0x1d00 - 0x1d7f Phonetic Extensions
50   // 0x1d80 - 0x1dbf Phonetic Extensions Supplement
51   // 0x1e00 - 0x1eff Latin Extended Additional
52   // 0x2070 - 0x209f Superscripts and Subscripts
53   // 0x2100 - 0x214f Letterlike symbols
54   // 0x2150 - 0x218f Number Forms
55   // 0x2c60 - 0x2c7f Latin Extended-C
56   // 0xa720 - 0xa7ff Latin Extended-D
57   // 0xab30 - 0xab6f Latin Extended-E
58   // 0xfb00 - 0xfb4f Alphabetic Presentation Forms
59   // 0xff00 - 0xffef Halfwidth and Fullwidth Forms
60
61   // Brahmic scripts:
62   // 0x0900 - 0x097f Devanagari
63   // 0x0980 - 0x09ff Bengali
64   // 0x0a00 - 0x0a7f Gurmukhi
65   // 0x0a80 - 0x0aff Gujarati
66   // 0x0b00 - 0x0b7f Oriya
67   // 0x0b80 - 0x0bff Tamil
68   // 0x0c00 - 0x0c7f Telugu
69   // 0x0c80 - 0x0cff Kannada
70   // 0x0d00 - 0x0d7f Malayalam
71
72   // Sinhala script.
73   // 0x0d80 - 0x0dff Sinhala
74
75   // Arabic script.
76   // 0x0600 - 0x06ff Arabic
77   // 0x0750 - 0x077f Arabic Supplement
78   // 0x08A0 - 0x08ff Arabic Extended-A
79   // 0xfb50 - 0xfdff Arabic Presentation Forms-A
80   // 0xfe70 - 0xfeff Arabic Presentation Forms-B
81   // 0x1ee00 - 0x1eeff Arabic Mathematical Alphabetic Symbols
82
83   // CJK and Vietnamese script.
84   // 0x2E80 - 0x2eff CJK Radicals Supplement
85   // 0x3000 - 0x303f CJK Symbols and Punctuation
86   // 0x3200 - 0x32ff Enclosed CJK Letters and Months
87   // 0x3400 - 0x4dbf CJK Unified Ideographs Extension A
88   // 0x4e00 - 0x62ff CJK Unified Ideographs
89   // 0x6300 - 0x77ff CJK Unified Ideographs
90   // 0x7800 - 0x8cff CJK Unified Ideographs
91   // 0x8d00 - 0x9fff CJK Unified Ideographs
92   // 0x20000 - 0x215ff CJK Unified Ideographs Extension B
93   // 0x21600 - 0x230ff CJK Unified Ideographs Extension B
94   // 0x23100 - 0x245ff CJK Unified Ideographs Extension B
95   // 0x24600 - 0x260ff CJK Unified Ideographs Extension B
96   // 0x26100 - 0x275ff CJK Unified Ideographs Extension B
97   // 0x27600 - 0x290ff CJK Unified Ideographs Extension B
98   // 0x29100 - 0x2a6df CJK Unified Ideographs Extension B
99   // 2a700-2b73f. CJK Unified Ideographs Extension C
100   // 2b740-2b81f. CJK Unified Ideographs Extension D
101
102   // Hangul script
103   // 0x1100 - 0x11ff Hangul jamo
104   // 0x3130 - 0x318f Hangul Compatibility Jamo
105   // 0xa960 - 0xa97f Hangul Jamo Extended-A
106   // 0xac00 - 0xd7af Hangul Syllables
107   // 0xd7b0 - 0xd7ff Hangul Jamo Extended-B
108
109   // Khmer script
110   // 0x1780 - 0x17ff Khmer
111   // 0x19e0 - 0x19ff Khmer Symbols
112
113   // Lao script
114   // 0x0e80 - 0x0eff Lao
115
116   // Thai script
117   // 0x0e00 - 0x0e7f Thai
118
119   // Burmese script
120   // 0x1000 - 0x109f Myanmar
121
122
123   if( character <= 0x0cff )
124   {
125     if( character <= 0x09ff )
126     {
127       if( character <= 0x077f )
128       {
129         if( character <= 0x02ff )
130         {
131           return TextAbstraction::LATIN;
132         }
133         if( ( 0x0600 <= character ) && ( character <= 0x06ff ) )
134         {
135           return TextAbstraction::ARABIC;
136         }
137         if( ( 0x0750 <= character ) && ( character <= 0x077f ) )
138         {
139           return TextAbstraction::ARABIC;
140         }
141       }
142       else // > 0x077f
143       {
144         if( ( 0x08A0 <= character ) && ( character <= 0x08ff ) )
145         {
146           return TextAbstraction::ARABIC;
147         }
148         if( ( 0x0900 <= character ) && ( character <= 0x097f ) )
149         {
150           return TextAbstraction::DEVANAGARI;
151         }
152         if( ( 0x0980 <= character ) && ( character <= 0x09ff ) )
153         {
154           return TextAbstraction::BENGALI;
155         }
156       }
157     }
158     else // > 0x09ff
159     {
160       if( character <= 0x0b7f )
161       {
162         if( ( 0x0a00 <= character ) && ( character <= 0x0a7f ) )
163         {
164           return TextAbstraction::GURMUKHI;
165         }
166         if( ( 0x0a80 <= character ) && ( character <= 0x0aff ) )
167         {
168           return TextAbstraction::GUJARATI;
169         }
170         if( ( 0x0b00 <= character ) && ( character <= 0x0b7f ) )
171         {
172           return TextAbstraction::ORIYA;
173         }
174       }
175       else // > 0x0b7f
176       {
177         if( ( 0x0b80 <= character ) && ( character <= 0x0bff ) )
178         {
179           return TextAbstraction::TAMIL;
180         }
181         if( ( 0x0c00 <= character ) && ( character <= 0x0c7f ) )
182         {
183           return TextAbstraction::TELUGU;
184         }
185         if( ( 0x0c80 <= character ) && ( character <= 0x0cff ) )
186         {
187           return TextAbstraction::KANNADA;
188         }
189       }
190     }
191   }
192   else // > 0x0cff
193   {
194     if( character <= 0x2c7f )
195     {
196       if( character <= 0x1eff )
197       {
198         if( ( 0x0d00 <= character ) && ( character <= 0x0d7f ) )
199         {
200           return TextAbstraction::MALAYALAM;
201         }
202         if( ( 0x0d80 <= character ) && ( character <= 0x0dff ) )
203         {
204           return TextAbstraction::SINHALA;
205         }
206         if( ( 0x0e00 <= character ) && ( character <= 0x0e7f ) )
207         {
208           return TextAbstraction::THAI;
209         }
210         if( ( 0x0e80 <= character ) && ( character <= 0x0eff ) )
211         {
212           return TextAbstraction::LAO;
213         }
214         if( ( 0x1000 <= character ) && ( character <= 0x109f ) )
215         {
216           return TextAbstraction::BURMESE;
217         }
218         if( ( 0x1100 <= character ) && ( character <= 0x11ff ) )
219         {
220           return TextAbstraction::HANGUL;
221         }
222         if( ( 0x1780 <= character ) && ( character <= 0x17ff ) )
223         {
224           return TextAbstraction::KHMER;
225         }
226         if( ( 0x19e0 <= character ) && ( character <= 0x19ff ) )
227         {
228           return TextAbstraction::KHMER;
229         }
230         if( ( 0x1d00 <= character ) && ( character <= 0x1eff ) )
231         {
232           return TextAbstraction::LATIN;
233         }
234       }
235       else // > 0x1eff
236       {
237         if( ( 0x2070 <= character ) && ( character <= 0x209f ) )
238         {
239           return TextAbstraction::LATIN;
240         }
241         if( ( 0x2100 <= character ) && ( character <= 0x218f ) )
242         {
243           return TextAbstraction::LATIN;
244         }
245         if( ( 0x2c60 <= character ) && ( character <= 0x2c7f ) )
246         {
247           return TextAbstraction::LATIN;
248         }
249       }
250     }
251     else // > 0x2c7f
252     {
253       if( character <= 0xfdff )
254       {
255         if( ( 0x2e80 <= character ) && ( character <= 0x2eff ) )
256         {
257           return TextAbstraction::CJK;
258         }
259         if( ( 0x3000 <= character ) && ( character <= 0x303f ) )
260         {
261           return TextAbstraction::CJK;
262         }
263         if( ( 0x3130 <= character ) && ( character <= 0x318f ) )
264         {
265           return TextAbstraction::HANGUL;
266         }
267         if( ( 0x3200 <= character ) && ( character <= 0x32ff ) )
268         {
269           return TextAbstraction::CJK;
270         }
271         if( ( 0x3400 <= character ) && ( character <= 0x4dbf ) )
272         {
273           return TextAbstraction::CJK;
274         }
275         if( ( 0x4e00 <= character ) && ( character <= 0x62ff ) )
276         {
277           return TextAbstraction::CJK;
278         }
279         if( ( 0x6300 <= character ) && ( character <= 0x77ff ) )
280         {
281           return TextAbstraction::CJK;
282         }
283         if( ( 0x7800 <= character ) && ( character <= 0x8cff ) )
284         {
285           return TextAbstraction::CJK;
286         }
287         if( ( 0x8d00 <= character ) && ( character <= 0x9fff ) )
288         {
289           return TextAbstraction::CJK;
290         }
291         if( ( 0xa720 <= character ) && ( character <= 0xa7ff ) )
292         {
293           return TextAbstraction::LATIN;
294         }
295         if( ( 0xa960 <= character ) && ( character <= 0xa97f ) )
296         {
297           return TextAbstraction::HANGUL;
298         }
299         if( ( 0xab30 <= character ) && ( character <= 0xab6f ) )
300         {
301           return TextAbstraction::LATIN;
302         }
303         if( ( 0xac00 <= character ) && ( character <= 0xd7af ) )
304         {
305           return TextAbstraction::HANGUL;
306         }
307         if( ( 0xd7b0 <= character ) && ( character <= 0xd7ff ) )
308         {
309           return TextAbstraction::HANGUL;
310         }
311         if( ( 0xfb00 <= character ) && ( character <= 0xfb4f ) )
312         {
313           return TextAbstraction::LATIN;
314         }
315         if( ( 0xfb50 <= character ) && ( character <= 0xfdff ) )
316         {
317           return TextAbstraction::ARABIC;
318         }
319       }
320       else // > 0xfdff
321       {
322         if( ( 0xfe70 <= character ) && ( character <= 0xfeff ) )
323         {
324           return TextAbstraction::ARABIC;
325         }
326         if( ( 0xff00 <= character ) && ( character <= 0xffef ) )
327         {
328           return TextAbstraction::LATIN;
329         }
330         if( ( 0x1ee00 <= character ) && ( character <= 0x1eeff ) )
331         {
332           return TextAbstraction::ARABIC;
333         }
334         if( ( 0x20000 <= character ) && ( character <= 0x215ff ) )
335         {
336           return TextAbstraction::CJK;
337         }
338         if( ( 0x21600 <= character ) && ( character <= 0x230ff ) )
339         {
340           return TextAbstraction::CJK;
341         }
342         if( ( 0x23100 <= character ) && ( character <= 0x245ff ) )
343         {
344           return TextAbstraction::CJK;
345         }
346         if( ( 0x24600 <= character ) && ( character <= 0x260ff ) )
347         {
348           return TextAbstraction::CJK;
349         }
350         if( ( 0x26100 <= character ) && ( character <= 0x275ff ) )
351         {
352           return TextAbstraction::CJK;
353         }
354         if( ( 0x27600 <= character ) && ( character <= 0x290ff ) )
355         {
356           return TextAbstraction::CJK;
357         }
358         if( ( 0x29100 <= character ) && ( character <= 0x2a6df ) )
359         {
360           return TextAbstraction::CJK;
361         }
362         if( ( 0x2a700 <= character ) && ( character <= 0x2b73f ) )
363         {
364           return TextAbstraction::CJK;
365         }
366         if( ( 0x2b740 <= character ) && ( character <= 0x2b81f ) )
367         {
368           return TextAbstraction::CJK;
369         }
370       }
371     }
372   }
373
374   return TextAbstraction::UNKNOWN;
375 }
376
377 bool IsZeroWidthNonJoiner( Character character )
378 {
379   return CHAR_ZWNJ == character;
380 }
381
382 bool IsZeroWidthJoiner( Character character )
383 {
384   return CHAR_ZWJ == character;
385 }
386
387 bool IsZeroWidthSpace( Character character )
388 {
389   return CHAR_ZWS == character;
390 }
391
392 bool IsLeftToRightMark( Character character )
393 {
394   return CHAR_LTRM == character;
395 }
396
397 bool IsRightToLeftMark( Character character )
398 {
399   return CHAR_RTLM == character;
400 }
401
402 bool IsThinSpace( Character character )
403 {
404   return CHAR_TS == character;
405 }
406
407 } // namespace Text
408
409 } // namespace Toolkit
410
411 } // namespace Dali