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 eebfac6a3..84da5112d 100644 --- a/src/modules/font/TrueTypeRasterizer.h +++ b/src/modules/font/TrueTypeRasterizer.h @@ -49,6 +49,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 bd236aabe..9aa4677f2 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); @@ -119,13 +121,26 @@ 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) + 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); 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; 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;