From 60e3b47b5f108149e8fe477cfa28422f18ced7f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Paulo?= Date: Mon, 27 May 2024 11:56:07 +0100 Subject: [PATCH] Add TTF_GetScript to retreive the script to which unicode character belongs --- SDL_ttf.c | 41 +++++++++++++++++++++++++++++++++++++++++ SDL_ttf.h | 17 +++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/SDL_ttf.c b/SDL_ttf.c index ad136ba5..db6cdc41 100644 --- a/SDL_ttf.c +++ b/SDL_ttf.c @@ -3128,6 +3128,47 @@ int TTF_SetFontScriptName(TTF_Font *font, const char *script) #endif } +extern DECLSPEC int SDLCALL TTF_GetScript(Uint32 ch, char script[5]) +{ +#if TTF_USE_HARFBUZZ + + TTF_CHECK_POINTER(script, -1); + + hb_buffer_t* hb_buffer = hb_buffer_create(); + + if (hb_buffer == NULL) { + TTF_SetError("Cannot create harfbuzz buffer"); + return -1; + } + + hb_unicode_funcs_t* hb_unicode_functions = hb_buffer_get_unicode_funcs(hb_buffer); + + if (hb_unicode_functions == NULL) { + TTF_SetError("Cannot get harfbuzz unicode funcs"); + hb_buffer_destroy(hb_buffer); + return -1; + } + + hb_buffer_clear_contents(hb_buffer); + hb_buffer_set_content_type(hb_buffer, HB_BUFFER_CONTENT_TYPE_UNICODE); + + uint8_t const untagged_script[4] = { HB_UNTAG(hb_unicode_script(hb_unicode_functions, ch)) }; + + script[0] = (char)untagged_script[0]; + script[1] = (char)untagged_script[1]; + script[2] = (char)untagged_script[2]; + script[3] = (char)untagged_script[3]; + script[4] = '\0'; + + hb_buffer_destroy(hb_buffer); + return 0; + +#else + TTF_SetError("Unsupported"); + return -1; +#endif +} + static int TTF_Size_Internal(TTF_Font *font, const char *text, const str_type_t str_type, int *w, int *h, int *xstart, int *ystart, diff --git a/SDL_ttf.h b/SDL_ttf.h index a00e2906..deacc27a 100644 --- a/SDL_ttf.h +++ b/SDL_ttf.h @@ -2311,6 +2311,23 @@ extern DECLSPEC int SDLCALL TTF_SetFontDirection(TTF_Font *font, TTF_Direction d */ extern DECLSPEC int SDLCALL TTF_SetFontScriptName(TTF_Font *font, const char *script); +/** + * Query the script to which unicode character belongs. + * + * The supplied script pointer should be able to hold four characters and + * the null-terminator. + * + * If SDL_ttf was not built with HarfBuzz support, this function returns -1. + * + * \param ch the character to check. + * \param script on return, filled in with the the script as a null-terminated + * string of exactly 4 characters + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL_ttf ?. + */ +extern DECLSPEC int SDLCALL TTF_GetScript(Uint32 ch, char script[5]); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus }