Clone in a terminal:
Commit fbc46c0
Johan Mattsson - 2013-02-16T00:20:13+00:00
fbc46c0faba90e18e9826d9450b821eec4bf5372johan.mattsson.m@gmail.com

load kerning from freetype fonts

Changed files (3)

Diff

diff --git a/libbirdfont/Font.vala b/libbirdfont/Font.valaindex 492c2ea..734b284 100644--- a/libbirdfont/Font.vala+++ b/libbirdfont/Font.vala@@ -890,6 +890,8 @@ public class Font : GLib.Object { 		svg = ((!) data).str; 		svg_loader.load_svg_data (svg); 		+		print (svg);+		 		return true; 	} diff --git a/libbirdfont/OpenFontFormatReader.vala b/libbirdfont/OpenFontFormatReader.valaindex aa90f26..1712dbd 100644--- a/libbirdfont/OpenFontFormatReader.vala+++ b/libbirdfont/OpenFontFormatReader.vala@@ -15,7 +15,7 @@     along with this program.  If not, see <http://www.gnu.org/licenses/>. */ -[CCode (cname = "load_svg_font")]+[CCode (cname = "load_freetype_font")] public extern static StringBuilder? load_freetype_font (string file, out int error);  [CCode (cname = "validate_freetype_font")]diff --git a/libbirdfont/load_svg_font.c b/libbirdfont/load_svg_font.cindex b7c4e79..70a160a 100644--- a/libbirdfont/load_svg_font.c+++ b/libbirdfont/load_svg_font.c@@ -174,7 +174,7 @@ GString* get_svg_contour_data (FT_Vector* points, char* flags, int length, int*  			i += 1; 		} else { 			fprintf (stderr, "WARNING Can not parse outline.\n");-			err = 1;+			*err = 1; 			i++; 		} 		@@ -236,9 +236,46 @@ FT_ULong get_charcode (FT_Face face, FT_UInt gid) { 	return 0; } +GString* get_kerning_data (FT_Face face, FT_Long gid) {+	FT_Error error;+	FT_Vector kerning;+	GString* svg = g_string_new ("");+	FT_ULong char_left;+	FT_ULong char_right;+	FT_Long right;+	+	char_left = get_charcode (face, gid);+	+	if (char_left == 0) {+		fprintf (stderr, "No character code could be found for left kerning value.\n");+		return svg;+	}+	+	for (right = 0; right < face->num_glyphs; right++) {+		error = FT_Get_Kerning (face, gid, right, FT_KERNING_UNSCALED, &kerning);+		if (error) {+			fprintf (stderr, "Failed to obtain kerning value.\n");+			break;+		}+		+		char_right = get_charcode (face, right);+		if (char_left == 0) {+			fprintf (stderr, "No character code could be found for right kerning value.\n");+			return svg;+		}+		+		if (kerning.x > 0) {+			g_string_append_printf (svg, "<hkern u1=\"&#x%x;\" u2=\"&#x%x;\" k=\"%d\" />\n", char_left, char_right, kerning.x);+		}+	}+	+	return svg;+}+ GString* get_svg_font (FT_Face face, int* err) { 	GString* svg = g_string_new (""); 	GString* svg_data;+	GString* hkern; 	GString* font_element = g_string_new (""); 	GString* glyph_element; 	FT_Error error;@@ -249,7 +286,10 @@ GString* get_svg_font (FT_Face face, int* err) { 	*err = OK; 	 	g_string_append (svg, "<?xml version=\"1.0\" standalone=\"no\"?>\n");+	+	// libxml2 fails on this in windows: 	// g_string_append (svg, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\" >\n");+	 	g_string_append (svg, "<svg xmlns=\"http://www.w3.org/2000/svg\">\n"); 	g_string_append (svg, "<defs>\n"); 	g_string_append_printf (svg, "<font id=\"%s\" horiz-adv-x=\"250\">\n", face->family_name);@@ -259,10 +299,11 @@ GString* get_svg_font (FT_Face face, int* err) { 	g_string_printf (font_element, "<font-face units-per-em=\"%f\" ascent=\"%d\" descent=\"%d\" />\n", units_per_em, (int) face->ascender, (int) face->descender);	 	g_string_append (svg, font_element->str); 	+	// glyph outlines 	for (i = 0; i < face->num_glyphs; i++) { 		error = FT_Load_Glyph (face, i, FT_LOAD_DEFAULT); 		if (error) {-			fprintf (stderr, "Freetype failed to load glyph %d.\n", i);+			fprintf (stderr, "Freetype failed to load glyph %d.\n", (int)i); 			fprintf (stderr, "FT_Load_Glyph error %d\n", error); 			*err = error; 			return svg;@@ -295,6 +336,13 @@ GString* get_svg_font (FT_Face face, int* err) { 		g_string_append (svg, "\" />\n"); 	} +	// kerning+	for (i = 0; i < face->num_glyphs; i++) {+		hkern = get_kerning_data (face, i);+		g_string_append (svg, hkern->str);+		g_string_free (hkern, 0);+	}+ 	g_string_append (svg, "</font>\n"); 	g_string_append (svg, "</defs>\n"); 	g_string_append (svg, "</svg>");

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112