< prev index next >

src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc

Print this page

        

*** 158,243 **** HB_SCRIPT_BHAIKSUKI, HB_SCRIPT_MARCHEN, HB_SCRIPT_NEWA, HB_SCRIPT_OSAGE, HB_SCRIPT_TANGUT, }; static hb_unicode_combining_class_t ! hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, void *user_data HB_UNUSED) { return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode); } static unsigned int ! hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, void *user_data HB_UNUSED) { int w = ucdn_get_east_asian_width(unicode); return (w == UCDN_EAST_ASIAN_F || w == UCDN_EAST_ASIAN_W) ? 2 : 1; } static hb_unicode_general_category_t ! hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, void *user_data HB_UNUSED) { return (hb_unicode_general_category_t)ucdn_get_general_category(unicode); } static hb_codepoint_t ! hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, void *user_data HB_UNUSED) { return ucdn_mirror(unicode); } static hb_script_t ! hb_ucdn_script(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, void *user_data HB_UNUSED) { return ucdn_script_translate[ucdn_get_script(unicode)]; } static hb_bool_t ! hb_ucdn_compose(hb_unicode_funcs_t *ufuncs, hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, void *user_data HB_UNUSED) { return ucdn_compose(ab, a, b); } static hb_bool_t ! hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs, hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, void *user_data HB_UNUSED) { return ucdn_decompose(ab, a, b); } static unsigned int ! hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs, hb_codepoint_t u, hb_codepoint_t *decomposed, void *user_data HB_UNUSED) { return ucdn_compat_decompose(u, decomposed); } extern "C" HB_INTERNAL hb_unicode_funcs_t * hb_ucdn_get_unicode_funcs (void) { ! static const hb_unicode_funcs_t _hb_ucdn_unicode_funcs = { ! HB_OBJECT_HEADER_STATIC, ! NULL, /* parent */ ! true, /* immutable */ { ! #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_ucdn_##name, HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS #undef HB_UNICODE_FUNC_IMPLEMENT } }; ! return const_cast<hb_unicode_funcs_t *> (&_hb_ucdn_unicode_funcs); } - --- 158,273 ---- HB_SCRIPT_BHAIKSUKI, HB_SCRIPT_MARCHEN, HB_SCRIPT_NEWA, HB_SCRIPT_OSAGE, HB_SCRIPT_TANGUT, + HB_SCRIPT_MASARAM_GONDI, + HB_SCRIPT_NUSHU, + HB_SCRIPT_SOYOMBO, + HB_SCRIPT_ZANABAZAR_SQUARE, }; static hb_unicode_combining_class_t ! hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs HB_UNUSED, ! hb_codepoint_t unicode, void *user_data HB_UNUSED) { return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode); } static unsigned int ! hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs HB_UNUSED, ! hb_codepoint_t unicode, void *user_data HB_UNUSED) { int w = ucdn_get_east_asian_width(unicode); return (w == UCDN_EAST_ASIAN_F || w == UCDN_EAST_ASIAN_W) ? 2 : 1; } static hb_unicode_general_category_t ! hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs HB_UNUSED, ! hb_codepoint_t unicode, void *user_data HB_UNUSED) { return (hb_unicode_general_category_t)ucdn_get_general_category(unicode); } static hb_codepoint_t ! hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs HB_UNUSED, ! hb_codepoint_t unicode, void *user_data HB_UNUSED) { return ucdn_mirror(unicode); } static hb_script_t ! hb_ucdn_script(hb_unicode_funcs_t *ufuncs HB_UNUSED, ! hb_codepoint_t unicode, void *user_data HB_UNUSED) { return ucdn_script_translate[ucdn_get_script(unicode)]; } static hb_bool_t ! hb_ucdn_compose(hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, void *user_data HB_UNUSED) { return ucdn_compose(ab, a, b); } static hb_bool_t ! hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, void *user_data HB_UNUSED) { return ucdn_decompose(ab, a, b); } static unsigned int ! hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t u, hb_codepoint_t *decomposed, void *user_data HB_UNUSED) { return ucdn_compat_decompose(u, decomposed); } + static hb_unicode_funcs_t *static_ucdn_funcs = nullptr; + + #ifdef HB_USE_ATEXIT + static + void free_static_ucdn_funcs (void) + { + hb_unicode_funcs_destroy (static_ucdn_funcs); + } + #endif + extern "C" HB_INTERNAL hb_unicode_funcs_t * hb_ucdn_get_unicode_funcs (void) { ! retry: ! hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_ucdn_funcs); ! if (unlikely (!funcs)) { ! funcs = hb_unicode_funcs_create (nullptr); ! ! #define HB_UNICODE_FUNC_IMPLEMENT(name) \ ! hb_unicode_funcs_set_##name##_func (funcs, hb_ucdn_##name, nullptr, nullptr); HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS #undef HB_UNICODE_FUNC_IMPLEMENT + + hb_unicode_funcs_make_immutable (funcs); + + if (!hb_atomic_ptr_cmpexch (&static_ucdn_funcs, nullptr, funcs)) { + hb_unicode_funcs_destroy (funcs); + goto retry; } + + #ifdef HB_USE_ATEXIT + atexit (free_static_ucdn_funcs); /* First person registers atexit() callback. */ + #endif }; ! return hb_unicode_funcs_reference (funcs); }
< prev index next >