Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SDF HintingMode #1966

Merged
merged 11 commits into from
Jun 23, 2024
1 change: 1 addition & 0 deletions src/modules/font/Rasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ class Rasterizer : public Object

FontMetrics metrics;
float dpiScale;
bool sdf;

}; // Rasterizer

Expand Down
1 change: 1 addition & 0 deletions src/modules/font/TrueTypeRasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class TrueTypeRasterizer : public Rasterizer
{
Hinting hinting = HINTING_NORMAL;
OptionalFloat dpiScale;
bool sdf = false;
};

virtual ~TrueTypeRasterizer() {}
Expand Down
19 changes: 17 additions & 2 deletions src/modules/font/freetype/TrueTypeRasterizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions src/modules/font/wrap_Font.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down