Merge pull request #1966 from Labrium/sdf-font-hintingmode

Add SDF HintingMode
This commit is contained in:
Sasha Szpakowski
2024-06-22 22:06:23 -03:00
committed by GitHub
4 changed files with 24 additions and 2 deletions
+1
View File
@@ -147,6 +147,7 @@ protected:
FontMetrics metrics;
float dpiScale;
bool sdf;
}; // Rasterizer
+1
View File
@@ -49,6 +49,7 @@ public:
{
Hinting hinting = HINTING_NORMAL;
OptionalFloat dpiScale;
bool sdf = false;
};
virtual ~TrueTypeRasterizer() {}
@@ -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
+5
View File
@@ -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;