Browse Source

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

Add SDF HintingMode
Sasha Szpakowski 1 year ago
parent
commit
2e1e48bc9d

+ 1 - 0
src/modules/font/Rasterizer.h

@@ -147,6 +147,7 @@ protected:
 
 	FontMetrics metrics;
 	float dpiScale;
+	bool sdf;
 
 }; // Rasterizer
 

+ 1 - 0
src/modules/font/TrueTypeRasterizer.h

@@ -49,6 +49,7 @@ public:
 	{
 		Hinting hinting = HINTING_NORMAL;
 		OptionalFloat dpiScale;
+		bool sdf = false;
 	};
 
 	virtual ~TrueTypeRasterizer() {}

+ 17 - 2
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

+ 5 - 0
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;