From 358c940763a6db452ada6d58c712c5f412ce9008 Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Thu, 23 Jul 2020 16:55:01 +0800 Subject: [PATCH] use hb_buffer_set_unicode_funcs --- src/font/freetype2.c | 6 ++-- src/font/freetype2.h | 2 +- src/font/harzbuff-minigui-funcs.c | 59 ++++++++++++++----------------- src/newgdi/shape-glyphs-complex.c | 11 ++++++ 4 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/font/freetype2.c b/src/font/freetype2.c index 1b3a725f..1c1a0548 100644 --- a/src/font/freetype2.c +++ b/src/font/freetype2.c @@ -1217,7 +1217,7 @@ BOOL font_InitFreetypeLibrary (void) goto error_library; } -#if 0 // def _MGCOMPLEX_SCRIPTS +#ifdef _MGCOMPLEX_SCRIPTS __mg_init_harzbuff_funcs(); #endif @@ -1229,7 +1229,7 @@ error_ftc_manager: #endif /* _MGFONT_TTF_CACHE */ -#if 0 // def _MGCOMPLEX_SCRIPTS +#ifdef _MGCOMPLEX_SCRIPTS __mg_init_harzbuff_funcs(); #endif @@ -1258,7 +1258,7 @@ void font_TermFreetypeLibrary (void) FT_DESTROY_LOCK(&ft_lock); -#if 0 // def _MGCOMPLEX_SCRIPTS +#ifdef _MGCOMPLEX_SCRIPTS __mg_term_harzbuff_funcs(); #endif } diff --git a/src/font/freetype2.h b/src/font/freetype2.h index e6c73c97..471cb293 100644 --- a/src/font/freetype2.h +++ b/src/font/freetype2.h @@ -163,7 +163,7 @@ extern void __mg_ttc_sys_deinit(void); extern TTFCACHEINFO *__mg_ttc_search(HCACHE hCache, Glyph32 gv, int *size); extern void __mg_ttc_refer(HCACHE hCache); -#if 0 // def _MGCOMPLEX_SCRIPTS +#ifdef _MGCOMPLEX_SCRIPTS extern void __mg_init_harzbuff_funcs(void); extern void __mg_term_harzbuff_funcs(void); #endif diff --git a/src/font/harzbuff-minigui-funcs.c b/src/font/harzbuff-minigui-funcs.c index ec14a544..643bb8ac 100644 --- a/src/font/harzbuff-minigui-funcs.c +++ b/src/font/harzbuff-minigui-funcs.c @@ -120,55 +120,48 @@ hb_minigui_unicode_decompose (hb_unicode_funcs_t *ufuncs, return UCharDecompose(ab, a, b); } -static hb_unicode_funcs_t *_funcs; -hb_unicode_funcs_t *hb_ext_get_unicode_funcs(void) -{ - if (_funcs) - return _funcs; - - _funcs = hb_unicode_funcs_create (NULL); - - hb_unicode_funcs_set_combining_class_func (_funcs, - hb_minigui_unicode_combining_class, NULL, NULL); - hb_unicode_funcs_set_general_category_func (_funcs, - hb_minigui_unicode_general_category, NULL, NULL); - hb_unicode_funcs_set_mirroring_func (_funcs, - hb_minigui_unicode_mirroring, NULL, NULL); - hb_unicode_funcs_set_script_func (_funcs, - hb_minigui_unicode_script, NULL, NULL); - hb_unicode_funcs_set_compose_func (_funcs, - hb_minigui_unicode_compose, NULL, NULL); - hb_unicode_funcs_set_decompose_func (_funcs, - hb_minigui_unicode_decompose, NULL, NULL); - - hb_unicode_funcs_make_immutable (_funcs); - - return _funcs; -} - -#if 0 -typedef hb_unicode_funcs_t *(*hb_get_unicode_funcs) (void); -extern hb_get_unicode_funcs __hb_extern_get_unicode_funcs; +/* extern hb_unicode_funcs_t *__mg_hb_unifuncs */ +hb_unicode_funcs_t *__mg_hb_unifuncs; void __mg_init_harzbuff_funcs(void) { _DBG_PRINTF("%s: called\n", __FUNCTION__); - __hb_extern_get_unicode_funcs = get_unicode_funcs; + + if (__mg_hb_unifuncs) + return; + + __mg_hb_unifuncs = hb_unicode_funcs_create (NULL); + + hb_unicode_funcs_set_combining_class_func (__mg_hb_unifuncs, + hb_minigui_unicode_combining_class, NULL, NULL); + hb_unicode_funcs_set_general_category_func (__mg_hb_unifuncs, + hb_minigui_unicode_general_category, NULL, NULL); + hb_unicode_funcs_set_mirroring_func (__mg_hb_unifuncs, + hb_minigui_unicode_mirroring, NULL, NULL); + hb_unicode_funcs_set_script_func (__mg_hb_unifuncs, + hb_minigui_unicode_script, NULL, NULL); + hb_unicode_funcs_set_compose_func (__mg_hb_unifuncs, + hb_minigui_unicode_compose, NULL, NULL); + hb_unicode_funcs_set_decompose_func (__mg_hb_unifuncs, + hb_minigui_unicode_decompose, NULL, NULL); + + hb_unicode_funcs_make_immutable (__mg_hb_unifuncs); + + return; } void __mg_term_harzbuff_funcs(void) { _DBG_PRINTF("%s: called\n", __FUNCTION__); - if (_funcs) { - hb_unicode_funcs_destroy(_funcs); + if (__mg_hb_unifuncs) { + hb_unicode_funcs_destroy(__mg_hb_unifuncs); } else { _ERR_PRINTF("%s: hb_unicode_funcs_t object is NULL\n", __FUNCTION__); } } -#endif #endif /* defined(_MGCHARSET_UNICODE) && defined(_MGCOMPLEX_SCRIPTS) */ diff --git a/src/newgdi/shape-glyphs-complex.c b/src/newgdi/shape-glyphs-complex.c index 84d9ca9e..4b390998 100644 --- a/src/newgdi/shape-glyphs-complex.c +++ b/src/newgdi/shape-glyphs-complex.c @@ -75,6 +75,9 @@ #include #include +/* __mg_hb_unifuncs is implemented in src/font/harzbuff-minigui-funcs.c */ +extern hb_unicode_funcs_t *__mg_hb_unifuncs; + // define _CACHED_HB_FONT if you want use the cached HB fonts #define _CACHED_HB_FONT 1 @@ -216,6 +219,14 @@ static BOOL shape_layout_run(SEInstance* inst, if (hb_buf == NULL) goto error; + /* use our own unicode functions */ + if (__mg_hb_unifuncs) { + hb_buffer_set_unicode_funcs(hb_buf, __mg_hb_unifuncs); + } + else { + _DBG_PRINTF("Unicode functions for HarfBuzz does not initialized\n"); + } + hb_buffer_set_content_type(hb_buf, HB_BUFFER_CONTENT_TYPE_UNICODE); for (i = 0; i < run->len; i++) { hb_buffer_add(hb_buf, run->ucs[i], i);