From 0abff326f91a5ced171e0fc85847a2ea3d807edc Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Fri, 1 Sep 2023 15:33:28 -0600 Subject: [PATCH 1/7] Add SDF HintingMode --- src/modules/font/TrueTypeRasterizer.cpp | 1 + src/modules/font/TrueTypeRasterizer.h | 1 + src/modules/font/freetype/TrueTypeRasterizer.cpp | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/src/modules/font/TrueTypeRasterizer.cpp b/src/modules/font/TrueTypeRasterizer.cpp index eb9a1740d..cd4b6f087 100644 --- a/src/modules/font/TrueTypeRasterizer.cpp +++ b/src/modules/font/TrueTypeRasterizer.cpp @@ -46,6 +46,7 @@ StringMap::En {"light", HINTING_LIGHT}, {"mono", HINTING_MONO}, {"none", HINTING_NONE}, + {"sdf", HINTING_SDF}, }; StringMap TrueTypeRasterizer::hintings(TrueTypeRasterizer::hintingEntries, sizeof(TrueTypeRasterizer::hintingEntries)); diff --git a/src/modules/font/TrueTypeRasterizer.h b/src/modules/font/TrueTypeRasterizer.h index 62b225927..51ea65c8a 100644 --- a/src/modules/font/TrueTypeRasterizer.h +++ b/src/modules/font/TrueTypeRasterizer.h @@ -41,6 +41,7 @@ class TrueTypeRasterizer : public Rasterizer HINTING_LIGHT, HINTING_MONO, HINTING_NONE, + HINTING_SDF, HINTING_MAX_ENUM }; diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index e70367f5d..bb9ff8047 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -97,6 +97,8 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const FT_Render_Mode rendermode = FT_RENDER_MODE_NORMAL; if (hinting == HINTING_MONO) rendermode = FT_RENDER_MODE_MONO; + else if (hinting == HINTING_SDF) + rendermode = FT_RENDER_MODE_SDF; err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1); @@ -206,6 +208,8 @@ FT_UInt TrueTypeRasterizer::hintingToLoadOption(Hinting hint) return FT_LOAD_TARGET_LIGHT; case HINTING_MONO: return FT_LOAD_TARGET_MONO; + case HINTING_SDF: + return FT_LOAD_RENDER; case HINTING_NONE: return FT_LOAD_NO_HINTING; } From fee3bf1a6cd5cb34d0febeb879a010739d702c70 Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:32:05 -0600 Subject: [PATCH 2/7] Fix build errors --- src/modules/font/freetype/TrueTypeRasterizer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index bb9ff8047..1376e81f8 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -89,7 +89,9 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Load_Glyph failed (0x%x)", err); - err = FT_Get_Glyph(face->glyph, &ftglyph); + FT_GlyphSlot slot = face->glyph; + + err = FT_Get_Glyph(slot, &ftglyph); if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Get_Glyph failed (0x%x)", err); @@ -101,13 +103,10 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const rendermode = FT_RENDER_MODE_SDF; err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1); - if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); - FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph; - FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier - + FT_Bitmap &bitmap = bitmap_glyph->bitmap;//just to make things easier // Get metrics glyphMetrics.bearingX = bitmap_glyph->left; glyphMetrics.bearingY = bitmap_glyph->top; @@ -209,7 +208,6 @@ FT_UInt TrueTypeRasterizer::hintingToLoadOption(Hinting hint) case HINTING_MONO: return FT_LOAD_TARGET_MONO; case HINTING_SDF: - return FT_LOAD_RENDER; case HINTING_NONE: return FT_LOAD_NO_HINTING; } From 25c2a0ef726c447a24b1cd90212e39e4dba968a8 Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:32:55 -0600 Subject: [PATCH 3/7] Small tweak --- src/modules/font/freetype/TrueTypeRasterizer.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index 1376e81f8..9c8d8dc71 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -89,9 +89,7 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Load_Glyph failed (0x%x)", err); - FT_GlyphSlot slot = face->glyph; - - err = FT_Get_Glyph(slot, &ftglyph); + err = FT_Get_Glyph(face->glyph, &ftglyph); if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Get_Glyph failed (0x%x)", err); From c3814bc66f49f15cf376341914253b490777d92a Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Thu, 5 Oct 2023 20:12:14 -0600 Subject: [PATCH 4/7] Fix glyph rendering error for empty characters --- src/modules/font/freetype/TrueTypeRasterizer.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index 9c8d8dc71..36a721427 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -102,7 +102,18 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1); if (err != FT_Err_Ok) - throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); + { + if (rendermode == FT_RENDER_MODE_SDF) + { + err = FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1); + if (err != FT_Err_Ok) + throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); + } + else + { + throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); + } + } FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph; FT_Bitmap &bitmap = bitmap_glyph->bitmap;//just to make things easier // Get metrics From b98aced38d8329ab6b4524a658914727217b0dd6 Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Sat, 22 Jun 2024 17:07:06 -0600 Subject: [PATCH 5/7] Move sdf option to settings table --- src/modules/font/Rasterizer.h | 1 + src/modules/font/TrueTypeRasterizer.h | 1 + src/modules/font/freetype/TrueTypeRasterizer.cpp | 10 ++++++++++ src/modules/font/wrap_Font.cpp | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/src/modules/font/Rasterizer.h b/src/modules/font/Rasterizer.h index 20174e498..c3a51e8dd 100644 --- a/src/modules/font/Rasterizer.h +++ b/src/modules/font/Rasterizer.h @@ -147,6 +147,7 @@ class Rasterizer : public Object FontMetrics metrics; float dpiScale; + bool sdf; }; // Rasterizer diff --git a/src/modules/font/TrueTypeRasterizer.h b/src/modules/font/TrueTypeRasterizer.h index 1a158a39a..c627b6e30 100644 --- a/src/modules/font/TrueTypeRasterizer.h +++ b/src/modules/font/TrueTypeRasterizer.h @@ -50,6 +50,7 @@ class TrueTypeRasterizer : public Rasterizer { Hinting hinting = HINTING_NORMAL; OptionalFloat dpiScale; + bool sdf = false; }; virtual ~TrueTypeRasterizer() {} diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index c88deedb3..e96863ac5 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -40,6 +40,8 @@ TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, love::Data *data, int dpiScale = settings.dpiScale.get(defaultdpiscale); size = floorf(size * dpiScale + 0.5f); + sdf = settings.sdf; + if (size <= 0) throw love::Exception("Invalid TrueType font size: %d", size); @@ -121,7 +123,11 @@ GlyphData *TrueTypeRasterizer::getGlyphDataForIndex(int index) const FT_Render_Mode rendermode = FT_RENDER_MODE_NORMAL; if (hinting == HINTING_MONO) rendermode = FT_RENDER_MODE_MONO; +<<<<<<< Updated upstream else if (hinting == HINTING_SDF) +======= + else if (sdf == true) +>>>>>>> Stashed changes rendermode = FT_RENDER_MODE_SDF; err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1); @@ -138,6 +144,10 @@ GlyphData *TrueTypeRasterizer::getGlyphDataForIndex(int index) const throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); } } +<<<<<<< Updated upstream +======= + +>>>>>>> Stashed changes FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph; const FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier diff --git a/src/modules/font/wrap_Font.cpp b/src/modules/font/wrap_Font.cpp index a43377bb0..9c8d00918 100644 --- a/src/modules/font/wrap_Font.cpp +++ b/src/modules/font/wrap_Font.cpp @@ -95,6 +95,11 @@ static TrueTypeRasterizer::Settings luax_checktruetypesettings(lua_State* L, int if (!lua_isnoneornil(L, -1)) s.dpiScale.set((float)luaL_checknumber(L, -1)); lua_pop(L, 1); + + lua_getfield(L, startidx, "sdf"); + if (!lua_isnoneornil(L, -1)) + s.sdf = lua_toboolean(L, -1); + lua_pop(L, 1); } return s; From c52763d369fde06dd5d55b3c7450c28fa80cac82 Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Sat, 22 Jun 2024 17:10:52 -0600 Subject: [PATCH 6/7] Remove stash artefacts --- src/modules/font/TrueTypeRasterizer.cpp | 1 - src/modules/font/TrueTypeRasterizer.h | 1 - src/modules/font/freetype/TrueTypeRasterizer.cpp | 9 +-------- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/modules/font/TrueTypeRasterizer.cpp b/src/modules/font/TrueTypeRasterizer.cpp index 6404fd4fd..e91523281 100644 --- a/src/modules/font/TrueTypeRasterizer.cpp +++ b/src/modules/font/TrueTypeRasterizer.cpp @@ -46,7 +46,6 @@ StringMap::En {"light", HINTING_LIGHT}, {"mono", HINTING_MONO}, {"none", HINTING_NONE}, - {"sdf", HINTING_SDF}, }; StringMap TrueTypeRasterizer::hintings(TrueTypeRasterizer::hintingEntries, sizeof(TrueTypeRasterizer::hintingEntries)); diff --git a/src/modules/font/TrueTypeRasterizer.h b/src/modules/font/TrueTypeRasterizer.h index c627b6e30..84da5112d 100644 --- a/src/modules/font/TrueTypeRasterizer.h +++ b/src/modules/font/TrueTypeRasterizer.h @@ -42,7 +42,6 @@ class TrueTypeRasterizer : public Rasterizer HINTING_LIGHT, HINTING_MONO, HINTING_NONE, - HINTING_SDF, HINTING_MAX_ENUM }; diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index e96863ac5..071393d1c 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -123,14 +123,11 @@ GlyphData *TrueTypeRasterizer::getGlyphDataForIndex(int index) const FT_Render_Mode rendermode = FT_RENDER_MODE_NORMAL; if (hinting == HINTING_MONO) rendermode = FT_RENDER_MODE_MONO; -<<<<<<< Updated upstream - else if (hinting == HINTING_SDF) -======= else if (sdf == true) ->>>>>>> Stashed changes rendermode = FT_RENDER_MODE_SDF; err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1); + if (err != FT_Err_Ok) { if (rendermode == FT_RENDER_MODE_SDF) @@ -144,10 +141,7 @@ GlyphData *TrueTypeRasterizer::getGlyphDataForIndex(int index) const throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); } } -<<<<<<< Updated upstream -======= ->>>>>>> Stashed changes FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph; const FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier @@ -257,7 +251,6 @@ FT_UInt TrueTypeRasterizer::hintingToLoadOption(Hinting hint) return FT_LOAD_TARGET_LIGHT; case HINTING_MONO: return FT_LOAD_TARGET_MONO; - case HINTING_SDF: case HINTING_NONE: return FT_LOAD_NO_HINTING; } From 85cd98ffe55d325ce94031da4672249a543df120 Mon Sep 17 00:00:00 2001 From: Labrium <76017200+Labrium@users.noreply.github.com> Date: Sat, 22 Jun 2024 18:13:47 -0600 Subject: [PATCH 7/7] Fix mono and sdf rendermode conflicts --- src/modules/font/freetype/TrueTypeRasterizer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index 071393d1c..9aa4677f2 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -121,10 +121,10 @@ GlyphData *TrueTypeRasterizer::getGlyphDataForIndex(int index) const throw love::Exception("TrueType Font glyph error: FT_Get_Glyph failed (0x%x)", err); FT_Render_Mode rendermode = FT_RENDER_MODE_NORMAL; - if (hinting == HINTING_MONO) - rendermode = FT_RENDER_MODE_MONO; - else if (sdf == true) + if (sdf) rendermode = FT_RENDER_MODE_SDF; + else if (hinting == HINTING_MONO) + rendermode = FT_RENDER_MODE_MONO; err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1);