1/*
2 * Copyright 2010, The Android Open Source Project
3 * Copyright 2010, Google Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *  * Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "harfbuzz-external.h"
28
29#include   <unicode/uchar.h>
30#include   <unicode/utypes.h>
31
32/*
33   We use ICU APIs to get the character's Unicode property.
34   This module replaces the harfbuzz-unicode-tables.c which is
35   using static Unicode tables.
36*/
37
38static int
39hb_category_for_char(HB_UChar32 ch) {
40  switch (u_charType(ch)) {
41    case U_CONTROL_CHAR:
42      return HB_Other_Control;
43    case U_FORMAT_CHAR:
44      return HB_Other_Format;
45    case U_UNASSIGNED:
46      return HB_Other_NotAssigned;
47    case U_PRIVATE_USE_CHAR:
48      return HB_Other_PrivateUse;
49    case U_SURROGATE:
50      return HB_Other_Surrogate;
51    case U_LOWERCASE_LETTER:
52      return HB_Letter_Lowercase;
53    case U_MODIFIER_LETTER:
54      return HB_Letter_Modifier;
55    case U_OTHER_LETTER:
56      return HB_Letter_Other;
57    case U_TITLECASE_LETTER:
58      return HB_Letter_Titlecase;
59    case U_UPPERCASE_LETTER:
60      return HB_Letter_Uppercase;
61    case U_COMBINING_SPACING_MARK:
62      return HB_Mark_SpacingCombining;
63    case U_ENCLOSING_MARK:
64      return HB_Mark_Enclosing;
65    case U_NON_SPACING_MARK:
66      return HB_Mark_NonSpacing;
67    case U_DECIMAL_DIGIT_NUMBER :
68      return HB_Number_DecimalDigit;
69    case U_LETTER_NUMBER:
70      return HB_Number_Letter;
71    case U_OTHER_NUMBER:
72      return HB_Number_Other;
73    case U_CONNECTOR_PUNCTUATION:
74      return HB_Punctuation_Connector;
75    case U_DASH_PUNCTUATION:
76      return HB_Punctuation_Dash;
77    case U_END_PUNCTUATION:
78      return HB_Punctuation_Close;
79    case U_FINAL_PUNCTUATION:
80      return HB_Punctuation_FinalQuote;
81    case U_INITIAL_PUNCTUATION:
82      return HB_Punctuation_InitialQuote;
83    case U_OTHER_PUNCTUATION:
84      return HB_Punctuation_Other;
85    case U_START_PUNCTUATION:
86      return HB_Punctuation_Open;
87    case U_CURRENCY_SYMBOL:
88      return HB_Symbol_Currency;
89    case U_MODIFIER_SYMBOL:
90      return HB_Symbol_Modifier;
91    case U_MATH_SYMBOL:
92      return HB_Symbol_Math;
93    case U_OTHER_SYMBOL:
94      return HB_Symbol_Other;
95    case U_LINE_SEPARATOR:
96      return HB_Separator_Line;
97    case U_PARAGRAPH_SEPARATOR:
98      return HB_Separator_Paragraph;
99    case U_SPACE_SEPARATOR:
100      return HB_Separator_Space;
101    default:
102      return HB_Symbol_Other;
103  }
104}
105
106HB_LineBreakClass
107HB_GetLineBreakClass(HB_UChar32 ch) {
108  switch ((ULineBreak)u_getIntPropertyValue(ch, UCHAR_LINE_BREAK)) {
109    case U_LB_MANDATORY_BREAK:
110      return HB_LineBreak_BK;
111    case U_LB_CARRIAGE_RETURN:
112      return HB_LineBreak_CR;
113    case U_LB_LINE_FEED:
114      return HB_LineBreak_LF;
115    case U_LB_COMBINING_MARK:
116      return HB_LineBreak_CM;
117    case U_LB_SURROGATE:
118      return HB_LineBreak_SG;
119    case U_LB_ZWSPACE:
120      return HB_LineBreak_ZW;
121    case U_LB_INSEPARABLE:
122      return HB_LineBreak_IN;
123    case U_LB_GLUE:
124      return HB_LineBreak_GL;
125    case U_LB_CONTINGENT_BREAK:
126      return HB_LineBreak_AL;
127    case U_LB_SPACE:
128      return HB_LineBreak_SP;
129    case U_LB_BREAK_AFTER:
130      return HB_LineBreak_BA;
131    case U_LB_BREAK_BEFORE:
132      return HB_LineBreak_BB;
133    case U_LB_BREAK_BOTH:
134      return HB_LineBreak_B2;
135    case U_LB_HYPHEN:
136      return HB_LineBreak_HY;
137    case U_LB_NONSTARTER:
138      return HB_LineBreak_NS;
139    case U_LB_OPEN_PUNCTUATION:
140      return HB_LineBreak_OP;
141    case U_LB_CLOSE_PUNCTUATION:
142      return HB_LineBreak_CL;
143    case U_LB_QUOTATION:
144      return HB_LineBreak_QU;
145    case U_LB_EXCLAMATION:
146      return HB_LineBreak_EX;
147    case U_LB_IDEOGRAPHIC:
148      return HB_LineBreak_ID;
149    case U_LB_NUMERIC:
150      return HB_LineBreak_NU;
151    case U_LB_INFIX_NUMERIC:
152      return HB_LineBreak_IS;
153    case U_LB_BREAK_SYMBOLS:
154      return HB_LineBreak_SY;
155    case U_LB_ALPHABETIC:
156      return HB_LineBreak_AL;
157    case U_LB_PREFIX_NUMERIC:
158      return HB_LineBreak_PR;
159    case U_LB_POSTFIX_NUMERIC:
160      return HB_LineBreak_PO;
161    case U_LB_COMPLEX_CONTEXT:
162      return HB_LineBreak_SA;
163    case U_LB_AMBIGUOUS:
164      return HB_LineBreak_AL;
165    case U_LB_UNKNOWN:
166      return HB_LineBreak_AL;
167    case U_LB_NEXT_LINE:
168      return HB_LineBreak_AL;
169    case U_LB_WORD_JOINER:
170      return HB_LineBreak_WJ;
171    case U_LB_JL:
172      return HB_LineBreak_JL;
173    case U_LB_JV:
174      return HB_LineBreak_JV;
175    case U_LB_JT:
176      return HB_LineBreak_JT;
177    case U_LB_H2:
178      return HB_LineBreak_H2;
179    case U_LB_H3:
180      return HB_LineBreak_H3;
181    default:
182      return HB_LineBreak_AL;
183  }
184}
185
186int
187HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) {
188  return u_getCombiningClass(ch);
189}
190
191void
192HB_GetUnicodeCharProperties(HB_UChar32 ch,
193                            HB_CharCategory *category,
194                            int *combiningClass) {
195  *category = hb_category_for_char(ch);
196  *combiningClass = u_getCombiningClass(ch);
197}
198
199HB_CharCategory
200HB_GetUnicodeCharCategory(HB_UChar32 ch) {
201  return hb_category_for_char(ch);
202}
203