diff --git a/SDL_ttf.c b/SDL_ttf.c index ad136ba5..3a138f44 100644 --- a/SDL_ttf.c +++ b/SDL_ttf.c @@ -3128,6 +3128,46 @@ int TTF_SetFontScriptName(TTF_Font *font, const char *script) #endif } +int TTF_GetScriptName(Uint32 ch, char *script, size_t script_size) +{ +#if TTF_USE_HARFBUZZ + + TTF_CHECK_POINTER(script, -1); + if (script_size < 5) { + return TTF_SetError("Insufficient script buffer size"); + } + + hb_buffer_t* hb_buffer = hb_buffer_create(); + + if (hb_buffer == NULL) { + return TTF_SetError("Cannot create harfbuzz buffer"); + } + + hb_unicode_funcs_t* hb_unicode_functions = hb_buffer_get_unicode_funcs(hb_buffer); + + if (hb_unicode_functions == NULL) { + hb_buffer_destroy(hb_buffer); + return TTF_SetError("Cannot get harfbuzz unicode funcs"); + } + + 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 + return TTF_SetError("Unsupported"); +#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..8459a083 100644 --- a/SDL_ttf.h +++ b/SDL_ttf.h @@ -2311,6 +2311,24 @@ 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 + * \param script_size size of the script buffer, must be at least 5 (see above.) + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL_ttf 2.23.0. + */ +extern DECLSPEC int SDLCALL TTF_GetScriptName(Uint32 ch, char *script, size_t script_size); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus }