2 * Copyright © 2009 Red Hat, Inc.
3 * Copyright © 2011 Codethink Limited
4 * Copyright © 2010,2011,2012 Google, Inc.
6 * This is part of HarfBuzz, a text shaping library.
8 * Permission is hereby granted, without written agreement and without
9 * license or royalty fees, to use, copy, modify, and distribute this
10 * software and its documentation for any purpose, provided that the
11 * above copyright notice and the following two paragraphs appear in
12 * all copies of this software.
14 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
20 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
23 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
26 * Red Hat Author(s): Behdad Esfahbod
27 * Codethink Author(s): Ryan Lortie
28 * Google Author(s): Behdad Esfahbod
31 #include "hb-private.hh"
33 #include "hb-unicode-private.hh"
41 static hb_unicode_combining_class_t
42 hb_unicode_combining_class_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
43 hb_codepoint_t unicode HB_UNUSED
,
44 void *user_data HB_UNUSED
)
46 return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED
;
50 hb_unicode_eastasian_width_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
51 hb_codepoint_t unicode HB_UNUSED
,
52 void *user_data HB_UNUSED
)
57 static hb_unicode_general_category_t
58 hb_unicode_general_category_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
59 hb_codepoint_t unicode HB_UNUSED
,
60 void *user_data HB_UNUSED
)
62 return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER
;
66 hb_unicode_mirroring_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
67 hb_codepoint_t unicode HB_UNUSED
,
68 void *user_data HB_UNUSED
)
74 hb_unicode_script_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
75 hb_codepoint_t unicode HB_UNUSED
,
76 void *user_data HB_UNUSED
)
78 return HB_SCRIPT_UNKNOWN
;
82 hb_unicode_compose_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
83 hb_codepoint_t a HB_UNUSED
,
84 hb_codepoint_t b HB_UNUSED
,
85 hb_codepoint_t
*ab HB_UNUSED
,
86 void *user_data HB_UNUSED
)
92 hb_unicode_decompose_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
93 hb_codepoint_t ab HB_UNUSED
,
94 hb_codepoint_t
*a HB_UNUSED
,
95 hb_codepoint_t
*b HB_UNUSED
,
96 void *user_data HB_UNUSED
)
103 hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t
*ufuncs HB_UNUSED
,
104 hb_codepoint_t u HB_UNUSED
,
105 hb_codepoint_t
*decomposed HB_UNUSED
,
106 void *user_data HB_UNUSED
)
112 #define HB_UNICODE_FUNCS_IMPLEMENT_SET \
113 HB_UNICODE_FUNCS_IMPLEMENT (glib) \
114 HB_UNICODE_FUNCS_IMPLEMENT (icu) \
115 HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \
116 HB_UNICODE_FUNCS_IMPLEMENT (nil) \
117 /* ^--- Add new callbacks before nil */
119 #define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty
121 /* Prototype them all */
122 #define HB_UNICODE_FUNCS_IMPLEMENT(set) \
123 extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void);
124 HB_UNICODE_FUNCS_IMPLEMENT_SET
125 #undef HB_UNICODE_FUNCS_IMPLEMENT
129 hb_unicode_funcs_get_default (void)
131 #define HB_UNICODE_FUNCS_IMPLEMENT(set) \
132 return hb_##set##_get_unicode_funcs ();
135 HB_UNICODE_FUNCS_IMPLEMENT(glib
)
136 #elif defined(HAVE_ICU)
137 HB_UNICODE_FUNCS_IMPLEMENT(icu
)
138 #elif defined(HAVE_UCDN)
139 HB_UNICODE_FUNCS_IMPLEMENT(ucdn
)
141 #define HB_UNICODE_FUNCS_NIL 1
142 HB_UNICODE_FUNCS_IMPLEMENT(nil
)
145 #undef HB_UNICODE_FUNCS_IMPLEMENT
148 #if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
149 #pragma message("Could not find any Unicode functions implementation, you have to provide your own.")
150 #pragma message("To suppress this warnings, define HB_NO_UNICODE_FUNCS.")
154 hb_unicode_funcs_create (hb_unicode_funcs_t
*parent
)
156 hb_unicode_funcs_t
*ufuncs
;
158 if (!(ufuncs
= hb_object_create
<hb_unicode_funcs_t
> ()))
159 return hb_unicode_funcs_get_empty ();
162 parent
= hb_unicode_funcs_get_empty ();
164 hb_unicode_funcs_make_immutable (parent
);
165 ufuncs
->parent
= hb_unicode_funcs_reference (parent
);
167 ufuncs
->func
= parent
->func
;
169 /* We can safely copy user_data from parent since we hold a reference
170 * onto it and it's immutable. We should not copy the destroy notifiers
172 ufuncs
->user_data
= parent
->user_data
;
178 const hb_unicode_funcs_t _hb_unicode_funcs_nil
= {
179 HB_OBJECT_HEADER_STATIC
,
182 true, /* immutable */
184 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
185 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
186 #undef HB_UNICODE_FUNC_IMPLEMENT
191 hb_unicode_funcs_get_empty (void)
193 return const_cast<hb_unicode_funcs_t
*> (&_hb_unicode_funcs_nil
);
197 hb_unicode_funcs_reference (hb_unicode_funcs_t
*ufuncs
)
199 return hb_object_reference (ufuncs
);
203 hb_unicode_funcs_destroy (hb_unicode_funcs_t
*ufuncs
)
205 if (!hb_object_destroy (ufuncs
)) return;
207 #define HB_UNICODE_FUNC_IMPLEMENT(name) \
208 if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
209 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
210 #undef HB_UNICODE_FUNC_IMPLEMENT
212 hb_unicode_funcs_destroy (ufuncs
->parent
);
218 hb_unicode_funcs_set_user_data (hb_unicode_funcs_t
*ufuncs
,
219 hb_user_data_key_t
*key
,
221 hb_destroy_func_t destroy
,
224 return hb_object_set_user_data (ufuncs
, key
, data
, destroy
, replace
);
228 hb_unicode_funcs_get_user_data (hb_unicode_funcs_t
*ufuncs
,
229 hb_user_data_key_t
*key
)
231 return hb_object_get_user_data (ufuncs
, key
);
236 hb_unicode_funcs_make_immutable (hb_unicode_funcs_t
*ufuncs
)
238 if (hb_object_is_inert (ufuncs
))
241 ufuncs
->immutable
= true;
245 hb_unicode_funcs_is_immutable (hb_unicode_funcs_t
*ufuncs
)
247 return ufuncs
->immutable
;
251 hb_unicode_funcs_get_parent (hb_unicode_funcs_t
*ufuncs
)
253 return ufuncs
->parent
? ufuncs
->parent
: hb_unicode_funcs_get_empty ();
257 #define HB_UNICODE_FUNC_IMPLEMENT(name) \
260 hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
261 hb_unicode_##name##_func_t func, \
263 hb_destroy_func_t destroy) \
265 if (ufuncs->immutable) \
268 if (ufuncs->destroy.name) \
269 ufuncs->destroy.name (ufuncs->user_data.name); \
272 ufuncs->func.name = func; \
273 ufuncs->user_data.name = user_data; \
274 ufuncs->destroy.name = destroy; \
276 ufuncs->func.name = ufuncs->parent->func.name; \
277 ufuncs->user_data.name = ufuncs->parent->user_data.name; \
278 ufuncs->destroy.name = NULL; \
282 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
283 #undef HB_UNICODE_FUNC_IMPLEMENT
286 #define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \
289 hb_unicode_##name (hb_unicode_funcs_t *ufuncs, \
290 hb_codepoint_t unicode) \
292 return ufuncs->name (unicode); \
294 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
295 #undef HB_UNICODE_FUNC_IMPLEMENT
298 hb_unicode_compose (hb_unicode_funcs_t
*ufuncs
,
303 return ufuncs
->compose (a
, b
, ab
);
307 hb_unicode_decompose (hb_unicode_funcs_t
*ufuncs
,
312 return ufuncs
->decompose (ab
, a
, b
);
316 hb_unicode_decompose_compatibility (hb_unicode_funcs_t
*ufuncs
,
318 hb_codepoint_t
*decomposed
)
320 return ufuncs
->decompose_compatibility (u
, decomposed
);
324 /* See hb-unicode-private.hh for details. */
326 _hb_modified_combining_class
[256] =
328 0, /* HB_UNICODE_COMBINING_CLASS_NOT_REORDERED */
329 1, /* HB_UNICODE_COMBINING_CLASS_OVERLAY */
331 7, /* HB_UNICODE_COMBINING_CLASS_NUKTA */
332 8, /* HB_UNICODE_COMBINING_CLASS_KANA_VOICING */
333 9, /* HB_UNICODE_COMBINING_CLASS_VIRAMA */
336 HB_MODIFIED_COMBINING_CLASS_CCC10
,
337 HB_MODIFIED_COMBINING_CLASS_CCC11
,
338 HB_MODIFIED_COMBINING_CLASS_CCC12
,
339 HB_MODIFIED_COMBINING_CLASS_CCC13
,
340 HB_MODIFIED_COMBINING_CLASS_CCC14
,
341 HB_MODIFIED_COMBINING_CLASS_CCC15
,
342 HB_MODIFIED_COMBINING_CLASS_CCC16
,
343 HB_MODIFIED_COMBINING_CLASS_CCC17
,
344 HB_MODIFIED_COMBINING_CLASS_CCC18
,
345 HB_MODIFIED_COMBINING_CLASS_CCC19
,
346 HB_MODIFIED_COMBINING_CLASS_CCC20
,
347 HB_MODIFIED_COMBINING_CLASS_CCC21
,
348 HB_MODIFIED_COMBINING_CLASS_CCC22
,
349 HB_MODIFIED_COMBINING_CLASS_CCC23
,
350 HB_MODIFIED_COMBINING_CLASS_CCC24
,
351 HB_MODIFIED_COMBINING_CLASS_CCC25
,
352 HB_MODIFIED_COMBINING_CLASS_CCC26
,
355 HB_MODIFIED_COMBINING_CLASS_CCC27
,
356 HB_MODIFIED_COMBINING_CLASS_CCC28
,
357 HB_MODIFIED_COMBINING_CLASS_CCC29
,
358 HB_MODIFIED_COMBINING_CLASS_CCC30
,
359 HB_MODIFIED_COMBINING_CLASS_CCC31
,
360 HB_MODIFIED_COMBINING_CLASS_CCC32
,
361 HB_MODIFIED_COMBINING_CLASS_CCC33
,
362 HB_MODIFIED_COMBINING_CLASS_CCC34
,
363 HB_MODIFIED_COMBINING_CLASS_CCC35
,
366 HB_MODIFIED_COMBINING_CLASS_CCC36
,
369 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
370 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
374 HB_MODIFIED_COMBINING_CLASS_CCC84
,
375 85, 86, 87, 88, 89, 90,
376 HB_MODIFIED_COMBINING_CLASS_CCC91
,
377 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
380 HB_MODIFIED_COMBINING_CLASS_CCC103
,
382 HB_MODIFIED_COMBINING_CLASS_CCC107
,
383 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
386 HB_MODIFIED_COMBINING_CLASS_CCC118
,
388 HB_MODIFIED_COMBINING_CLASS_CCC122
,
389 123, 124, 125, 126, 127, 128,
392 HB_MODIFIED_COMBINING_CLASS_CCC129
,
393 HB_MODIFIED_COMBINING_CLASS_CCC130
,
395 HB_MODIFIED_COMBINING_CLASS_CCC132
,
396 133, 134, 135, 136, 137, 138, 139,
399 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
400 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
401 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
402 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
403 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
404 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
406 200, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT */
408 202, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW */
409 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
410 214, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE */
412 216, /* HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT */
414 218, /* HB_UNICODE_COMBINING_CLASS_BELOW_LEFT */
416 220, /* HB_UNICODE_COMBINING_CLASS_BELOW */
418 222, /* HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT */
420 224, /* HB_UNICODE_COMBINING_CLASS_LEFT */
422 226, /* HB_UNICODE_COMBINING_CLASS_RIGHT */
424 228, /* HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT */
426 230, /* HB_UNICODE_COMBINING_CLASS_ABOVE */
428 232, /* HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT */
429 233, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW */
430 234, /* HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE */
431 235, 236, 237, 238, 239,
432 240, /* HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT */
433 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
434 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */