X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fhb-unicode.cc;h=aba2cd3b2211a7d99069fd16d6e3afad94aa6aaa;hb=45412523dc295cb5ee12e096bfacb282cc925843;hp=62cbcdc63411fd6ac6aa12843d6008438862b958;hpb=56eb5ad6f94c32189ad219438db9a18683ca6846;p=framework%2Fuifw%2Fharfbuzz.git diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index 62cbcdc..aba2cd3 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -40,45 +40,67 @@ HB_BEGIN_DECLS */ static unsigned int -hb_unicode_get_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode HB_UNUSED, - void *user_data HB_UNUSED) +hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode HB_UNUSED, + void *user_data HB_UNUSED) { return 0; } static unsigned int -hb_unicode_get_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode HB_UNUSED, - void *user_data HB_UNUSED) +hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode HB_UNUSED, + void *user_data HB_UNUSED) { return 1; } static hb_unicode_general_category_t -hb_unicode_get_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode HB_UNUSED, - void *user_data HB_UNUSED) +hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode HB_UNUSED, + void *user_data HB_UNUSED) { return HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER; } static hb_codepoint_t -hb_unicode_get_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode HB_UNUSED, - void *user_data HB_UNUSED) +hb_unicode_mirroring_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode HB_UNUSED, + void *user_data HB_UNUSED) { return unicode; } static hb_script_t -hb_unicode_get_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode HB_UNUSED, - void *user_data HB_UNUSED) +hb_unicode_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode HB_UNUSED, + void *user_data HB_UNUSED) { return HB_SCRIPT_UNKNOWN; } +static hb_bool_t +hb_unicode_compose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t a HB_UNUSED, + hb_codepoint_t b HB_UNUSED, + hb_codepoint_t *ab HB_UNUSED, + void *user_data HB_UNUSED) +{ + /* TODO handle Hangul jamo here? */ + return FALSE; +} + +static hb_bool_t +hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t ab HB_UNUSED, + hb_codepoint_t *a HB_UNUSED, + hb_codepoint_t *b HB_UNUSED, + void *user_data HB_UNUSED) +{ + /* TODO handle Hangul jamo here? */ + return FALSE; +} + hb_unicode_funcs_t _hb_unicode_funcs_nil = { HB_OBJECT_HEADER_STATIC, @@ -86,11 +108,9 @@ hb_unicode_funcs_t _hb_unicode_funcs_nil = { NULL, /* parent */ TRUE, /* immutable */ { - hb_unicode_get_combining_class_nil, - hb_unicode_get_eastasian_width_nil, - hb_unicode_get_general_category_nil, - hb_unicode_get_mirroring_nil, - hb_unicode_get_script_nil, +#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil, + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_UNICODE_FUNC_IMPLEMENT } }; @@ -115,7 +135,7 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent) hb_unicode_funcs_make_immutable (parent); ufuncs->parent = hb_unicode_funcs_reference (parent); - ufuncs->get = parent->get; + ufuncs->func = parent->func; /* We can safely copy user_data from parent since we hold a reference * onto it and it's immutable. We should not copy the destroy notifiers @@ -126,6 +146,12 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent) } hb_unicode_funcs_t * +hb_unicode_funcs_get_empty (void) +{ + return &_hb_unicode_funcs_nil; +} + +hb_unicode_funcs_t * hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs) { return hb_object_reference (ufuncs); @@ -136,13 +162,10 @@ hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs) { if (!hb_object_destroy (ufuncs)) return; -#define DESTROY(name) if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name) - DESTROY (combining_class); - DESTROY (eastasian_width); - DESTROY (general_category); - DESTROY (mirroring); - DESTROY (script); -#undef DESTROY +#define HB_UNICODE_FUNC_IMPLEMENT(name) \ + if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name); + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_UNICODE_FUNC_IMPLEMENT hb_unicode_funcs_destroy (ufuncs->parent); @@ -188,49 +211,64 @@ hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs) } -#define IMPLEMENT(return_type, name) \ - \ -void \ -hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ - hb_unicode_get_##name##_func_t func, \ - void *user_data, \ - hb_destroy_func_t destroy) \ -{ \ - if (ufuncs->immutable) \ - return; \ - \ - if (ufuncs->destroy.name) \ - ufuncs->destroy.name (ufuncs->user_data.name); \ - \ - if (func) { \ - ufuncs->get.name = func; \ - ufuncs->user_data.name = user_data; \ - ufuncs->destroy.name = destroy; \ - } else if (ufuncs->parent != NULL) { \ - ufuncs->get.name = ufuncs->parent->get.name; \ - ufuncs->user_data.name = ufuncs->parent->user_data.name; \ - ufuncs->destroy.name = NULL; \ - } else { \ - ufuncs->get.name = hb_unicode_get_##name##_nil; \ - ufuncs->user_data.name = NULL; \ - ufuncs->destroy.name = NULL; \ - } \ -} \ - \ -return_type \ -hb_unicode_get_##name (hb_unicode_funcs_t *ufuncs, \ - hb_codepoint_t unicode) \ -{ \ - return ufuncs->get.name (ufuncs, unicode, ufuncs->user_data.name); \ -} - -IMPLEMENT (unsigned int, combining_class) -IMPLEMENT (unsigned int, eastasian_width) -IMPLEMENT (hb_unicode_general_category_t, general_category) -IMPLEMENT (hb_codepoint_t, mirroring) -IMPLEMENT (hb_script_t, script) - -#undef IMPLEMENT +#define HB_UNICODE_FUNC_IMPLEMENT(name) \ + \ +void \ +hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ + hb_unicode_##name##_func_t func, \ + void *user_data, \ + hb_destroy_func_t destroy) \ +{ \ + if (ufuncs->immutable) \ + return; \ + \ + if (ufuncs->destroy.name) \ + ufuncs->destroy.name (ufuncs->user_data.name); \ + \ + if (func) { \ + ufuncs->func.name = func; \ + ufuncs->user_data.name = user_data; \ + ufuncs->destroy.name = destroy; \ + } else { \ + ufuncs->func.name = ufuncs->parent->func.name; \ + ufuncs->user_data.name = ufuncs->parent->user_data.name; \ + ufuncs->destroy.name = NULL; \ + } \ +} + + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_UNICODE_FUNC_IMPLEMENT + + +#define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \ + \ +return_type \ +hb_unicode_##name (hb_unicode_funcs_t *ufuncs, \ + hb_codepoint_t unicode) \ +{ \ + return ufuncs->func.name (ufuncs, unicode, ufuncs->user_data.name); \ +} + HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE +#undef HB_UNICODE_FUNC_IMPLEMENT +hb_bool_t +hb_unicode_compose (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t a, + hb_codepoint_t b, + hb_codepoint_t *ab) +{ + *ab = 0; + return ufuncs->func.compose (ufuncs, a, b, ab, ufuncs->user_data.compose); +} + +hb_bool_t +hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t ab, + hb_codepoint_t *a, + hb_codepoint_t *b) +{ + *a = ab; *b = 0; + return ufuncs->func.decompose (ufuncs, ab, a, b, ufuncs->user_data.decompose); +} HB_END_DECLS