blob: d8ea0ea64b8d32911ff05937c8519a8c00730426 [file] [log] [blame]
Behdad Esfahbod5c441882009-08-10 20:05:16 -04001/*
2 * Copyright (C) 2009 Red Hat, Inc.
3 *
4 * This is part of HarfBuzz, an OpenType Layout engine 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-unicode-private.h"
30
31/*
32 * hb_unicode_funcs_t
33 */
34
Behdad Esfahbod49f261d2009-08-10 23:35:05 -040035static hb_codepoint_t hb_unicode_get_mirroring_nil (hb_codepoint_t unicode) { return unicode; }
Behdad Esfahbod48910f82009-08-10 23:05:05 -040036static hb_category_t hb_unicode_get_general_category_nil (hb_codepoint_t unicode) { return HB_CATEGORY_OTHER_LETTER; }
37static hb_script_t hb_unicode_get_script_nil (hb_codepoint_t unicode) { return HB_SCRIPT_UNKNOWN; }
38static unsigned int hb_unicode_get_combining_class_nil (hb_codepoint_t unicode) { return 0; }
39static unsigned int hb_unicode_get_eastasian_width_nil (hb_codepoint_t unicode) { return 1; }
40
Behdad Esfahbodaf9e1042009-08-10 23:21:33 -040041hb_unicode_funcs_t _hb_unicode_funcs_nil = {
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -040042 HB_REFERENCE_COUNT_INVALID, /* ref_count */
43
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -040044 TRUE, /* immutable */
45
Behdad Esfahbod48910f82009-08-10 23:05:05 -040046 hb_unicode_get_general_category_nil,
47 hb_unicode_get_combining_class_nil,
Behdad Esfahbod49f261d2009-08-10 23:35:05 -040048 hb_unicode_get_mirroring_nil,
Behdad Esfahbod48910f82009-08-10 23:05:05 -040049 hb_unicode_get_script_nil,
50 hb_unicode_get_eastasian_width_nil
Behdad Esfahbod5c441882009-08-10 20:05:16 -040051};
52
53hb_unicode_funcs_t *
54hb_unicode_funcs_create (void)
55{
56 hb_unicode_funcs_t *ufuncs;
57
58 if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
59 return &_hb_unicode_funcs_nil;
60
Behdad Esfahbod48910f82009-08-10 23:05:05 -040061 *ufuncs = _hb_unicode_funcs_nil;
62 HB_OBJECT_DO_INIT (ufuncs);
63
Behdad Esfahbod5c441882009-08-10 20:05:16 -040064 return ufuncs;
65}
66
67hb_unicode_funcs_t *
68hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
69{
70 HB_OBJECT_DO_REFERENCE (ufuncs);
71}
72
73unsigned int
74hb_unicode_funcs_get_reference_count (hb_unicode_funcs_t *ufuncs)
75{
76 HB_OBJECT_DO_GET_REFERENCE_COUNT (ufuncs);
77}
78
79void
80hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
81{
82 HB_OBJECT_DO_DESTROY (ufuncs);
83
84 free (ufuncs);
85}
86
87hb_unicode_funcs_t *
88hb_unicode_funcs_copy (hb_unicode_funcs_t *other_ufuncs)
89{
90 hb_unicode_funcs_t *ufuncs;
91
92 if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
93 return &_hb_unicode_funcs_nil;
94
95 *ufuncs = *other_ufuncs;
96 HB_OBJECT_DO_INIT (ufuncs);
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -040097 ufuncs->immutable = FALSE;
Behdad Esfahbod5c441882009-08-10 20:05:16 -040098
99 return ufuncs;
100}
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400101
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400102void
103hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
104{
105 if (HB_OBJECT_IS_INERT (ufuncs))
106 return;
107
108 ufuncs->immutable = TRUE;
109}
110
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400111
112void
Behdad Esfahbod49f261d2009-08-10 23:35:05 -0400113hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
114 hb_unicode_get_mirroring_func_t mirroring_func)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400115{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400116 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400117 return;
118
Behdad Esfahbod49f261d2009-08-10 23:35:05 -0400119 ufuncs->get_mirroring = mirroring_func ? mirroring_func : hb_unicode_get_mirroring_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400120}
121
122void
123hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
124 hb_unicode_get_general_category_func_t general_category_func)
125{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400126 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400127 return;
128
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400129 ufuncs->get_general_category = general_category_func ? general_category_func : hb_unicode_get_general_category_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400130}
131
132void
133hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
134 hb_unicode_get_script_func_t script_func)
135{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400136 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400137 return;
138
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400139 ufuncs->get_script = script_func ? script_func : hb_unicode_get_script_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400140}
141
142void
143hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
144 hb_unicode_get_combining_class_func_t combining_class_func)
145{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400146 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400147 return;
148
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400149 ufuncs->get_combining_class = combining_class_func ? combining_class_func : hb_unicode_get_combining_class_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400150}
151
152void
153hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
154 hb_unicode_get_eastasian_width_func_t eastasian_width_func)
155{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400156 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400157 return;
158
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400159 ufuncs->get_eastasian_width = eastasian_width_func ? eastasian_width_func : hb_unicode_get_eastasian_width_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400160}
161
Behdad Esfahbodff44f882009-11-06 19:48:16 -0500162
163#define LTR HB_DIRECTION_LTR
164#define RTL HB_DIRECTION_RTL
165const hb_direction_t horiz_dir[] =
166{
167 LTR, /* Zyyy */
168 LTR, /* Qaai */
169 RTL, /* Arab */
170 LTR, /* Armn */
171 LTR, /* Beng */
172 LTR, /* Bopo */
173 LTR, /* Cher */
174 LTR, /* Qaac */
175 LTR, /* Cyrl (Cyrs) */
176 LTR, /* Dsrt */
177 LTR, /* Deva */
178 LTR, /* Ethi */
179 LTR, /* Geor (Geon, Geoa) */
180 LTR, /* Goth */
181 LTR, /* Grek */
182 LTR, /* Gujr */
183 LTR, /* Guru */
184 LTR, /* Hani */
185 LTR, /* Hang */
186 RTL, /* Hebr */
187 LTR, /* Hira */
188 LTR, /* Knda */
189 LTR, /* Kana */
190 LTR, /* Khmr */
191 LTR, /* Laoo */
192 LTR, /* Latn (Latf, Latg) */
193 LTR, /* Mlym */
194 LTR, /* Mong */
195 LTR, /* Mymr */
196 LTR, /* Ogam */
197 LTR, /* Ital */
198 LTR, /* Orya */
199 LTR, /* Runr */
200 LTR, /* Sinh */
201 RTL, /* Syrc (Syrj, Syrn, Syre) */
202 LTR, /* Taml */
203 LTR, /* Telu */
204 RTL, /* Thaa */
205 LTR, /* Thai */
206 LTR, /* Tibt */
207 LTR, /* Cans */
208 LTR, /* Yiii */
209 LTR, /* Tglg */
210 LTR, /* Hano */
211 LTR, /* Buhd */
212 LTR, /* Tagb */
213
214 /* Unicode-4.0 additions */
215 LTR, /* Brai */
216 LTR, /* Cprt */
217 LTR, /* Limb */
218 LTR, /* Osma */
219 LTR, /* Shaw */
220 LTR, /* Linb */
221 LTR, /* Tale */
222 LTR, /* Ugar */
223
224 /* Unicode-4.1 additions */
225 LTR, /* Talu */
226 LTR, /* Bugi */
227 LTR, /* Glag */
228 LTR, /* Tfng */
229 LTR, /* Sylo */
230 LTR, /* Xpeo */
231 LTR, /* Khar */
232
233 /* Unicode-5.0 additions */
234 LTR, /* Zzzz */
235 LTR, /* Bali */
236 LTR, /* Xsux */
237 RTL, /* Phnx */
238 LTR, /* Phag */
239 RTL, /* Nkoo */
240
241 /* Unicode-5.1 additions */
242 LTR, /* Kali */
243 LTR, /* Lepc */
244 LTR, /* Rjng */
245 LTR, /* Sund */
246 LTR, /* Saur */
247 LTR, /* Cham */
248 LTR, /* Olck */
249 LTR, /* Vaii */
250 LTR, /* Cari */
251 LTR, /* Lyci */
252 LTR /* Lydi */
253};
254#undef LTR
255#undef RTL
256
257HB_INTERNAL hb_direction_t
258_hb_script_get_horizontal_direction (hb_script_t script)
259{
260 if (HB_UNLIKELY ((unsigned int) script >= ARRAY_LENGTH (horiz_dir)))
261 return HB_DIRECTION_LTR;
262
263 return horiz_dir[script];
264}