SDL_ttf: Added properties to customize the font outline

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);