From c182fd1a16fdcc8792283042efdc309241f268c6 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 7 Dec 2024 08:45:11 -0800 Subject: [PATCH] Added properties to customize the font outline Fixes https://github.com/libsdl-org/SDL_ttf/issues/422 --- include/SDL3_ttf/SDL_ttf.h | 12 ++++++++++++ src/SDL_ttf.c | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/SDL3_ttf/SDL_ttf.h b/include/SDL3_ttf/SDL_ttf.h index bdf9a5dd..c1e1934e 100644 --- a/include/SDL3_ttf/SDL_ttf.h +++ b/include/SDL3_ttf/SDL_ttf.h @@ -229,6 +229,12 @@ extern SDL_DECLSPEC TTF_Font * SDLCALL TTF_OpenFontWithProperties(SDL_Properties /** * Get the properties associated with a font. * + * The following read-write properties are provided by SDL: + * + * - `TTF_PROP_FONT_OUTLINE_LINE_CAP_NUMBER`: The FT_Stroker_LineCap value used when setting the font outline, defaults to `FT_STROKER_LINECAP_ROUND`. + * - `TTF_PROP_FONT_OUTLINE_LINE_JOIN_NUMBER`: The FT_Stroker_LineJoin value used when setting the font outline, defaults to `FT_STROKER_LINEJOIN_ROUND`. + * - `TTF_PROP_FONT_OUTLINE_MITER_LIMIT_NUMBER`: The FT_Fixed miter limit used when setting the font outline, defaults to 0. + * * \param font the font to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. @@ -239,6 +245,10 @@ extern SDL_DECLSPEC TTF_Font * SDLCALL TTF_OpenFontWithProperties(SDL_Properties */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL TTF_GetFontProperties(TTF_Font *font); +#define TTF_PROP_FONT_OUTLINE_LINE_CAP_NUMBER "SDL_ttf.font.outline.line_cap" +#define TTF_PROP_FONT_OUTLINE_LINE_JOIN_NUMBER "SDL_ttf.font.outline.line_join" +#define TTF_PROP_FONT_OUTLINE_MITER_LIMIT_NUMBER "SDL_ttf.font.outline.miter_limit" + /** * Get the font generation. * @@ -394,6 +404,8 @@ extern SDL_DECLSPEC int SDLCALL TTF_GetFontStyle(const TTF_Font *font); /** * Set a font's current outline. * + * This uses the font properties `TTF_PROP_FONT_OUTLINE_LINE_CAP_NUMBER`, `TTF_PROP_FONT_OUTLINE_LINE_JOIN_NUMBER`, and `TTF_PROP_FONT_OUTLINE_MITER_LIMIT_NUMBER` when setting the font outline. + * * This updates any TTF_Text objects using this font, and clears * already-generated glyphs, if any, from the cache. * diff --git a/src/SDL_ttf.c b/src/SDL_ttf.c index b681c730..74bc4367 100644 --- a/src/SDL_ttf.c +++ b/src/SDL_ttf.c @@ -5057,7 +5057,11 @@ bool TTF_SetFontOutline(TTF_Font *font, int outline) } } - FT_Stroker_Set(font->stroker, outline * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + SDL_PropertiesID props = TTF_GetFontProperties(font); + FT_Stroker_LineCap line_cap = (FT_Stroker_LineCap)SDL_GetNumberProperty(props, TTF_PROP_FONT_OUTLINE_LINE_CAP_NUMBER, FT_STROKER_LINECAP_ROUND); + FT_Stroker_LineJoin line_join = (FT_Stroker_LineJoin)SDL_GetNumberProperty(props, TTF_PROP_FONT_OUTLINE_LINE_JOIN_NUMBER, FT_STROKER_LINEJOIN_ROUND); + FT_Fixed miter_limit = (FT_Fixed)SDL_GetNumberProperty(props, TTF_PROP_FONT_OUTLINE_MITER_LIMIT_NUMBER, 0); + FT_Stroker_Set(font->stroker, outline * 64, line_cap, line_join, miter_limit); } else { if (font->stroker) { FT_Stroker_Done(font->stroker);