From c182fd1a16fdcc8792283042efdc309241f268c6 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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);