Kaynağa Gözat

Add Signed Distance Field fonts support. (#508)

Pavel Alexandrov 6 yıl önce
ebeveyn
işleme
c53b4bfdf6

+ 26 - 1
h2d/Font.hx

@@ -45,6 +45,26 @@ class FontChar {
 
 }
 
+/** Channel reading method for SDF. **/
+@:enum abstract SDFChannel(Int) from Int to Int {
+	/** Use red channel of a texture to determine distance. **/
+	var Red = 0;
+	/** Use green channel of a texture to determine distance. **/
+	var Green = 1;
+	/** Use blue channel of a texture to determine distance. **/
+	var Blue = 2;
+	/** Use alpha channel of a texture to determine distance. **/
+	var Alpha = 3;
+	/** Use RGB channels of a texture to determine distance. See here for details: https://github.com/Chlumsky/msdfgen **/
+	var MultiChannel = 4;
+}
+
+enum FontType {
+	BitmapFont;
+	/** Signed Distance Field font. Channel indexes are in RGBA order. See here for info: https://github.com/libgdx/libgdx/wiki/Distance-field-fonts **/
+	SignedDistanceField(channel : SDFChannel, alphaCutoff : Float, smoothing : Float);
+}
+
 class Font {
 
 	public var name(default, null) : String;
@@ -53,6 +73,7 @@ class Font {
 	public var lineHeight(default, null) : Int;
 	public var tile(default,null) : h2d.Tile;
 	public var tilePath(default,null) : String;
+	public var type : FontType;
 	public var charset : hxd.Charset;
 	var glyphs : Map<Int,FontChar>;
 	var nullChar : FontChar;
@@ -61,7 +82,7 @@ class Font {
 	var offsetX:Int = 0;
 	var offsetY:Int = 0;
 
-	function new(name,size) {
+	function new(name,size,?type) {
 		this.name = name;
 		this.size = size;
 		this.initSize = size;
@@ -70,6 +91,10 @@ class Font {
 		charset = hxd.Charset.getDefault();
 		if (name != null)
 			this.tilePath = haxe.io.Path.withExtension(name, "png");
+		if (type == null)
+			this.type = BitmapFont;
+		else
+			this.type = type;
 	}
 
 	public inline function getChar( code : Int ) {

+ 24 - 6
h2d/Text.hx

@@ -36,6 +36,7 @@ class Text extends Drawable {
 	#if lime
 	var waShader : h3d.shader.WhiteAlpha;
 	#end
+	var sdfShader : h3d.shader.SignedDistanceField;
 
 	public function new( font : Font, ?parent : h2d.Object ) {
 		super(parent);
@@ -50,13 +51,30 @@ class Text extends Drawable {
 	function set_font(font) {
 		if( this.font == font ) return font;
 		this.font = font;
-		#if lime
-		if( font.tile.getTexture().format == ALPHA ){
-			if( waShader == null ) addShader( waShader = new h3d.shader.WhiteAlpha() );
-		}else{
-			if( waShader != null ) removeShader( waShader );
+		if ( font != null ) {
+			#if lime
+			if( font.tile.getTexture().format == ALPHA ){
+				if( waShader == null ) addShader( waShader = new h3d.shader.WhiteAlpha() );
+			}else{
+				if( waShader != null ) removeShader( waShader );
+			}
+			#end
+			switch( font.type ) {
+				case BitmapFont:
+					if ( sdfShader != null ) {
+						removeShader(sdfShader);
+						sdfShader = null;
+					}
+				case SignedDistanceField(channel, alphaCutoff, smoothing):
+					if ( sdfShader == null ) {
+						sdfShader = new h3d.shader.SignedDistanceField();
+						addShader(sdfShader);
+					}
+					sdfShader.alphaCutoff = alphaCutoff;
+					sdfShader.smoothing = smoothing;
+					sdfShader.channel = channel;
+			}
 		}
-		#end
 		if( glyphs != null ) glyphs.remove();
 		glyphs = new TileGroup(font == null ? null : font.tile, this);
 		glyphs.visible = false;

+ 39 - 0
h3d/shader/SignedDistanceField.hx

@@ -0,0 +1,39 @@
+package h3d.shader;
+
+class SignedDistanceField extends hxsl.Shader {
+
+	static var SRC = {
+		
+		@:import h3d.shader.Base2d;
+
+		// Mode of operation - single-channel or multi-channel.
+		@const var channel : Int = 0;
+		/**
+			Variable used to determine the edge of the field. ( default : 0.5 ) 
+			Can be used to provide cheaper Outline for Text compared to Filter usage.
+		**/
+		@param var alphaCutoff : Float = 0.5;
+		/**
+			Determines smoothing of the edge. Lower value is sharper.
+		**/
+		@param var smoothing : Float = 0.04166666666666666666666666666667; // 1/24
+
+		function median(r : Float, g : Float, b : Float) : Float {
+			return max(min(r, g), min(max(r, g), b));
+		}
+
+		function fragment() {
+			var textureSample : Vec4 = textureColor;
+			var distance : Float;
+
+			distance = if (channel == 0) textureSample.r;
+				else if (channel == 1) textureSample.g;
+				else if (channel == 2) textureSample.b;
+				else if (channel == 3) textureSample.a;
+				else median(textureSample.r, textureSample.g, textureSample.b);
+			
+			textureColor = vec4(1.0, 1.0, 1.0, smoothstep(alphaCutoff - smoothing, alphaCutoff + smoothing, distance));
+		}
+	}
+
+}

+ 33 - 3
hxd/res/BitmapFont.hx

@@ -9,13 +9,13 @@ class BitmapFont extends Resource {
 
 	var loader : Loader;
 	var font : h2d.Font;
+	var sdfFonts:Array<h2d.Font>;
 
-	public function new(entry) {
+	public function new( entry ) {
 		super(entry);
 		this.loader = hxd.res.Loader.currentInstance;
 	}
 
-	@:access(h2d.Font)
 	public function toFont() : h2d.Font {
 		if ( font == null ) {
 			font = hxd.fmt.bfnt.FontParser.parse(entry.getBytes(), entry.path, resolveTile);
@@ -23,7 +23,37 @@ class BitmapFont extends Resource {
 		return font;
 	}
 
-	function resolveTile(path:String) : h2d.Tile {
+	/**
+		Load and cache Signed Distance Field font with specified size, channel, alphaCutoff and smoothing. ( default : initial size, red, 0.5, 1 / 32 )
+		For more information on SDF texture generation refer to this page: https://github.com/libgdx/libgdx/wiki/Distance-field-fonts
+		For more information on MSDF texture generation refer to this page: https://github.com/Chlumsky/msdfgen
+	**/
+	public function toSdfFont(?size:Int, channel : h2d.Font.SDFChannel = 0, alphaCutoff : Float = 0.5, smoothing : Float = 1 / 32 ) {
+		if ( sdfFonts == null ) sdfFonts = new Array();
+		if ( size == null ) size = toFont().size;
+		for ( font in sdfFonts ) {
+			switch ( font.type ) {
+				case SignedDistanceField(fchannel, falphaCutoff, fsmoothing):
+					if (font.size == size && fchannel == channel && falphaCutoff == alphaCutoff && fsmoothing == smoothing ) {
+						return font;
+					}
+				default:
+			}
+		}
+		var font : h2d.Font = hxd.fmt.bfnt.FontParser.parse(entry.getBytes(), entry.path, resolveSdfTile);
+		font.type = h2d.Font.FontType.SignedDistanceField(channel, alphaCutoff, smoothing);
+		font.resizeTo(size);
+		sdfFonts.push(font);
+		return font;
+	}
+
+	function resolveSdfTile( path : String ) : h2d.Tile {
+		var tex = loader.load(path).toTexture();
+		tex.filter = Linear;
+		return h2d.Tile.fromTexture(tex);
+	}
+
+	function resolveTile( path : String ) : h2d.Tile {
 		return loader.load(path).toTile();
 	}
 

+ 9 - 0
samples/Text.hx

@@ -55,6 +55,7 @@ class Text extends hxd.App {
 
 	var textWidgets:Array<TextWidget> = [];
 	var resizeWidgets: Array<TextWidget> = [];
+	var sdfText:h2d.Text;
 
 	override function init() {
 
@@ -207,6 +208,13 @@ class Text extends hxd.App {
 			tf.maxWidth = 400;
 			tf = createText(flow, "FontBuilder Divo format", Align.Left, hxd.Res.customFont.toFont());
 			tf.maxWidth = 400;
+
+			// Signed Distance Field textures can be another way to do scalable fonts apart from rasterizing every single size used.
+			// They also look nice when rotated.
+			// See here for details: https://github.com/libgdx/libgdx/wiki/Distance-field-fonts
+			sdfText = createText(flow, "Signed Distance Field texture", Align.Left, hxd.Res.sdf_font.toSdfFont(null, 3));
+			sdfText.smooth = true; // Smoothing is mandatory when scaling SDF textures.
+			sdfText.maxWidth = 400;
 		}
 
 		onResize();
@@ -217,6 +225,7 @@ class Text extends hxd.App {
 		for (w in resizeWidgets) {
 			w.setMaxWidth(Std.int(300 + Math.sin(haxe.Timer.stamp() * 0.5) * 100.0));
 		}
+		sdfText.setScale(0.5 + (Math.cos(haxe.Timer.stamp() * 0.5) + 1) * .5);
 	}
 
 	static function main() {

+ 291 - 0
samples/res/sdf_font.fnt

@@ -0,0 +1,291 @@
+info face="Arial" size=32 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=0,0
+common lineHeight=40 base=30 scaleW=512 scaleH=512 pages=1 packed=0
+page id=0 file="sdf_font.png"
+chars count=191
+char id=0       x=35   y=143  width=19   height=24   xoffset=3    yoffset=7    xadvance=26   page=0    chnl=0 
+char id=10      x=0    y=0    width=0    height=0    xoffset=-1   yoffset=0    xadvance=2    page=0    chnl=0 
+char id=32      x=0    y=0    width=0    height=0    xoffset=-1   yoffset=0    xadvance=11   page=0    chnl=0 
+char id=33      x=183  y=91   width=6    height=26   xoffset=3    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=34      x=123  y=168  width=12   height=11   xoffset=0    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=35      x=259  y=91   width=20   height=26   xoffset=-1   yoffset=5    xadvance=20   page=0    chnl=0 
+char id=36      x=223  y=33   width=19   height=30   xoffset=0    yoffset=4    xadvance=20   page=0    chnl=0 
+char id=37      x=232  y=91   width=27   height=26   xoffset=1    yoffset=5    xadvance=30   page=0    chnl=0 
+char id=38      x=436  y=117  width=21   height=25   xoffset=0    yoffset=6    xadvance=23   page=0    chnl=0 
+char id=39      x=503  y=143  width=6    height=11   xoffset=0    yoffset=5    xadvance=8    page=0    chnl=0 
+char id=40      x=94   y=0    width=10   height=32   xoffset=1    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=41      x=104  y=0    width=11   height=32   xoffset=0    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=42      x=81   y=168  width=12   height=13   xoffset=0    yoffset=5    xadvance=14   page=0    chnl=0 
+char id=43      x=356  y=143  width=18   height=18   xoffset=1    yoffset=9    xadvance=21   page=0    chnl=0 
+char id=44      x=135  y=168  width=6    height=11   xoffset=2    yoffset=25   xadvance=11   page=0    chnl=0 
+char id=45      x=190  y=168  width=12   height=6    xoffset=0    yoffset=18   xadvance=13   page=0    chnl=0 
+char id=46      x=184  y=168  width=6    height=6    xoffset=2    yoffset=25   xadvance=11   page=0    chnl=0 
+char id=47      x=208  y=91   width=12   height=26   xoffset=-1   yoffset=5    xadvance=11   page=0    chnl=0 
+char id=48      x=164  y=91   width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=49      x=496  y=65   width=12   height=26   xoffset=2    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=50      x=34   y=91   width=18   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=51      x=52   y=91   width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=52      x=71   y=91   width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=53      x=90   y=91   width=18   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=54      x=108  y=91   width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=55      x=127  y=91   width=18   height=26   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=56      x=145  y=91   width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=57      x=411  y=117  width=19   height=25   xoffset=0    yoffset=6    xadvance=20   page=0    chnl=0 
+char id=58      x=504  y=117  width=6    height=20   xoffset=2    yoffset=11   xadvance=11   page=0    chnl=0 
+char id=59      x=430  y=117  width=6    height=25   xoffset=2    yoffset=11   xadvance=11   page=0    chnl=0 
+char id=60      x=374  y=143  width=18   height=17   xoffset=1    yoffset=10   xadvance=21   page=0    chnl=0 
+char id=61      x=63   y=168  width=18   height=13   xoffset=1    yoffset=11   xadvance=21   page=0    chnl=0 
+char id=62      x=392  y=143  width=18   height=17   xoffset=1    yoffset=10   xadvance=21   page=0    chnl=0 
+char id=63      x=189  y=91   width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=64      x=5    y=0    width=32   height=33   xoffset=1    yoffset=5    xadvance=34   page=0    chnl=0 
+char id=65      x=349  y=33   width=23   height=26   xoffset=-1   yoffset=5    xadvance=23   page=0    chnl=0 
+char id=66      x=372  y=33   width=20   height=26   xoffset=2    yoffset=5    xadvance=23   page=0    chnl=0 
+char id=67      x=392  y=33   width=23   height=26   xoffset=0    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=68      x=415  y=33   width=22   height=26   xoffset=2    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=69      x=437  y=33   width=19   height=26   xoffset=2    yoffset=5    xadvance=23   page=0    chnl=0 
+char id=70      x=456  y=33   width=19   height=26   xoffset=2    yoffset=5    xadvance=22   page=0    chnl=0 
+char id=71      x=475  y=33   width=25   height=26   xoffset=0    yoffset=5    xadvance=27   page=0    chnl=0 
+char id=72      x=0    y=65   width=20   height=26   xoffset=2    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=73      x=500  y=33   width=6    height=26   xoffset=2    yoffset=5    xadvance=11   page=0    chnl=0 
+char id=74      x=20   y=65   width=15   height=26   xoffset=0    yoffset=5    xadvance=18   page=0    chnl=0 
+char id=75      x=35   y=65   width=21   height=26   xoffset=2    yoffset=5    xadvance=23   page=0    chnl=0 
+char id=76      x=56   y=65   width=17   height=26   xoffset=2    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=77      x=73   y=65   width=24   height=26   xoffset=2    yoffset=5    xadvance=29   page=0    chnl=0 
+char id=78      x=97   y=65   width=20   height=26   xoffset=2    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=79      x=117  y=65   width=26   height=26   xoffset=0    yoffset=5    xadvance=27   page=0    chnl=0 
+char id=80      x=143  y=65   width=20   height=26   xoffset=2    yoffset=5    xadvance=23   page=0    chnl=0 
+char id=81      x=265  y=33   width=25   height=28   xoffset=0    yoffset=5    xadvance=27   page=0    chnl=0 
+char id=82      x=163  y=65   width=21   height=26   xoffset=2    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=83      x=184  y=65   width=20   height=26   xoffset=0    yoffset=5    xadvance=23   page=0    chnl=0 
+char id=84      x=204  y=65   width=22   height=26   xoffset=-1   yoffset=5    xadvance=21   page=0    chnl=0 
+char id=85      x=226  y=65   width=20   height=26   xoffset=2    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=86      x=246  y=65   width=24   height=26   xoffset=-1   yoffset=5    xadvance=23   page=0    chnl=0 
+char id=87      x=270  y=65   width=33   height=26   xoffset=-1   yoffset=5    xadvance=34   page=0    chnl=0 
+char id=88      x=303  y=65   width=23   height=26   xoffset=-1   yoffset=5    xadvance=23   page=0    chnl=0 
+char id=89      x=326  y=65   width=23   height=26   xoffset=-1   yoffset=5    xadvance=23   page=0    chnl=0 
+char id=90      x=349  y=65   width=22   height=26   xoffset=-1   yoffset=5    xadvance=22   page=0    chnl=0 
+char id=91      x=115  y=0    width=9    height=32   xoffset=1    yoffset=5    xadvance=11   page=0    chnl=0 
+char id=92      x=220  y=91   width=12   height=26   xoffset=-1   yoffset=5    xadvance=11   page=0    chnl=0 
+char id=93      x=124  y=0    width=9    height=32   xoffset=0    yoffset=5    xadvance=11   page=0    chnl=0 
+char id=94      x=477  y=143  width=14   height=15   xoffset=0    yoffset=5    xadvance=16   page=0    chnl=0 
+char id=95      x=202  y=168  width=22   height=6    xoffset=-2   yoffset=31   xadvance=20   page=0    chnl=0 
+char id=96      x=168  y=168  width=8    height=7    xoffset=0    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=97      x=92   y=143  width=17   height=20   xoffset=0    yoffset=11   xadvance=19   page=0    chnl=0 
+char id=98      x=371  y=65   width=17   height=26   xoffset=1    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=99      x=109  y=143  width=16   height=20   xoffset=0    yoffset=11   xadvance=18   page=0    chnl=0 
+char id=100     x=388  y=65   width=17   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=101     x=125  y=143  width=18   height=20   xoffset=0    yoffset=11   xadvance=19   page=0    chnl=0 
+char id=102     x=405  y=65   width=12   height=26   xoffset=0    yoffset=5    xadvance=12   page=0    chnl=0 
+char id=103     x=417  y=65   width=17   height=26   xoffset=0    yoffset=11   xadvance=19   page=0    chnl=0 
+char id=104     x=434  y=65   width=17   height=26   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=105     x=451  y=65   width=6    height=26   xoffset=1    yoffset=5    xadvance=9    page=0    chnl=0 
+char id=106     x=83   y=0    width=11   height=32   xoffset=-3   yoffset=5    xadvance=9    page=0    chnl=0 
+char id=107     x=457  y=65   width=16   height=26   xoffset=1    yoffset=5    xadvance=18   page=0    chnl=0 
+char id=108     x=473  y=65   width=6    height=26   xoffset=1    yoffset=5    xadvance=9    page=0    chnl=0 
+char id=109     x=143  y=143  width=26   height=20   xoffset=1    yoffset=11   xadvance=29   page=0    chnl=0 
+char id=110     x=169  y=143  width=17   height=20   xoffset=1    yoffset=11   xadvance=20   page=0    chnl=0 
+char id=111     x=186  y=143  width=18   height=20   xoffset=0    yoffset=11   xadvance=19   page=0    chnl=0 
+char id=112     x=479  y=65   width=17   height=26   xoffset=1    yoffset=11   xadvance=19   page=0    chnl=0 
+char id=113     x=0    y=91   width=17   height=26   xoffset=0    yoffset=11   xadvance=19   page=0    chnl=0 
+char id=114     x=204  y=143  width=11   height=20   xoffset=1    yoffset=11   xadvance=13   page=0    chnl=0 
+char id=115     x=215  y=143  width=17   height=20   xoffset=0    yoffset=11   xadvance=18   page=0    chnl=0 
+char id=116     x=400  y=117  width=11   height=25   xoffset=-1   yoffset=6    xadvance=11   page=0    chnl=0 
+char id=117     x=232  y=143  width=17   height=20   xoffset=1    yoffset=11   xadvance=20   page=0    chnl=0 
+char id=118     x=249  y=143  width=17   height=20   xoffset=-1   yoffset=11   xadvance=17   page=0    chnl=0 
+char id=119     x=266  y=143  width=27   height=20   xoffset=-2   yoffset=11   xadvance=25   page=0    chnl=0 
+char id=120     x=293  y=143  width=17   height=20   xoffset=-1   yoffset=11   xadvance=16   page=0    chnl=0 
+char id=121     x=17   y=91   width=17   height=26   xoffset=-1   yoffset=11   xadvance=17   page=0    chnl=0 
+char id=122     x=310  y=143  width=17   height=20   xoffset=-1   yoffset=11   xadvance=17   page=0    chnl=0 
+char id=123     x=133  y=0    width=12   height=32   xoffset=0    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=124     x=0    y=0    width=5    height=33   xoffset=2    yoffset=5    xadvance=10   page=0    chnl=0 
+char id=125     x=145  y=0    width=12   height=32   xoffset=0    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=126     x=149  y=168  width=19   height=8    xoffset=0    yoffset=15   xadvance=21   page=0    chnl=0 
+char id=161     x=279  y=91   width=6    height=26   xoffset=3    yoffset=11   xadvance=13   page=0    chnl=0 
+char id=162     x=157  y=0    width=17   height=32   xoffset=0    yoffset=6    xadvance=20   page=0    chnl=0 
+char id=163     x=285  y=91   width=19   height=26   xoffset=-1   yoffset=5    xadvance=20   page=0    chnl=0 
+char id=164     x=410  y=143  width=17   height=17   xoffset=0    yoffset=11   xadvance=20   page=0    chnl=0 
+char id=165     x=304  y=91   width=19   height=26   xoffset=-1   yoffset=5    xadvance=20   page=0    chnl=0 
+char id=166     x=37   y=0    width=5    height=33   xoffset=2    yoffset=5    xadvance=10   page=0    chnl=0 
+char id=167     x=42   y=0    width=18   height=33   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=168     x=224  y=168  width=12   height=6    xoffset=0    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=169     x=323  y=91   width=27   height=26   xoffset=-1   yoffset=5    xadvance=26   page=0    chnl=0 
+char id=170     x=491  y=143  width=12   height=15   xoffset=0    yoffset=5    xadvance=14   page=0    chnl=0 
+char id=171     x=427  y=143  width=16   height=17   xoffset=1    yoffset=13   xadvance=20   page=0    chnl=0 
+char id=172     x=93   y=168  width=18   height=12   xoffset=1    yoffset=12   xadvance=21   page=0    chnl=0 
+char id=174     x=350  y=91   width=27   height=26   xoffset=-1   yoffset=5    xadvance=26   page=0    chnl=0 
+char id=175     x=236  y=168  width=22   height=6    xoffset=-2   yoffset=1    xadvance=20   page=0    chnl=0 
+char id=176     x=111  y=168  width=12   height=12   xoffset=1    yoffset=5    xadvance=15   page=0    chnl=0 
+char id=177     x=54   y=143  width=18   height=22   xoffset=0    yoffset=9    xadvance=20   page=0    chnl=0 
+char id=178     x=0    y=168  width=13   height=15   xoffset=-1   yoffset=5    xadvance=13   page=0    chnl=0 
+char id=179     x=13   y=168  width=12   height=15   xoffset=-1   yoffset=5    xadvance=13   page=0    chnl=0 
+char id=180     x=176  y=168  width=8    height=7    xoffset=3    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=181     x=377  y=91   width=17   height=26   xoffset=1    yoffset=11   xadvance=20   page=0    chnl=0 
+char id=182     x=174  y=0    width=20   height=32   xoffset=-1   yoffset=5    xadvance=19   page=0    chnl=0 
+char id=183     x=258  y=168  width=6    height=6    xoffset=3    yoffset=15   xadvance=13   page=0    chnl=0 
+char id=184     x=141  y=168  width=8    height=10   xoffset=1    yoffset=28   xadvance=13   page=0    chnl=0 
+char id=185     x=25   y=168  width=10   height=15   xoffset=1    yoffset=5    xadvance=13   page=0    chnl=0 
+char id=186     x=50   y=168  width=13   height=14   xoffset=0    yoffset=6    xadvance=14   page=0    chnl=0 
+char id=187     x=443  y=143  width=16   height=17   xoffset=1    yoffset=13   xadvance=20   page=0    chnl=0 
+char id=188     x=394  y=91   width=29   height=26   xoffset=0    yoffset=5    xadvance=29   page=0    chnl=0 
+char id=189     x=423  y=91   width=28   height=26   xoffset=0    yoffset=5    xadvance=29   page=0    chnl=0 
+char id=190     x=451  y=91   width=29   height=26   xoffset=0    yoffset=5    xadvance=29   page=0    chnl=0 
+char id=191     x=480  y=91   width=18   height=26   xoffset=1    yoffset=11   xadvance=22   page=0    chnl=0 
+char id=192     x=194  y=0    width=23   height=32   xoffset=-1   yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=193     x=217  y=0    width=23   height=32   xoffset=-1   yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=194     x=240  y=0    width=23   height=32   xoffset=-1   yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=195     x=263  y=0    width=23   height=32   xoffset=-1   yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=196     x=118  y=33   width=23   height=31   xoffset=-1   yoffset=0    xadvance=23   page=0    chnl=0 
+char id=197     x=242  y=33   width=23   height=30   xoffset=-1   yoffset=1    xadvance=23   page=0    chnl=0 
+char id=198     x=0    y=117  width=34   height=26   xoffset=-2   yoffset=5    xadvance=34   page=0    chnl=0 
+char id=199     x=60   y=0    width=23   height=33   xoffset=0    yoffset=5    xadvance=25   page=0    chnl=0 
+char id=200     x=286  y=0    width=19   height=32   xoffset=2    yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=201     x=305  y=0    width=19   height=32   xoffset=2    yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=202     x=324  y=0    width=19   height=32   xoffset=2    yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=203     x=141  y=33   width=19   height=31   xoffset=2    yoffset=0    xadvance=23   page=0    chnl=0 
+char id=204     x=343  y=0    width=8    height=32   xoffset=0    yoffset=-1   xadvance=11   page=0    chnl=0 
+char id=205     x=351  y=0    width=8    height=32   xoffset=1    yoffset=-1   xadvance=11   page=0    chnl=0 
+char id=206     x=359  y=0    width=14   height=32   xoffset=-2   yoffset=-1   xadvance=11   page=0    chnl=0 
+char id=207     x=497  y=0    width=12   height=31   xoffset=-1   yoffset=0    xadvance=11   page=0    chnl=0 
+char id=208     x=34   y=117  width=24   height=26   xoffset=-1   yoffset=5    xadvance=25   page=0    chnl=0 
+char id=209     x=373  y=0    width=20   height=32   xoffset=2    yoffset=-1   xadvance=25   page=0    chnl=0 
+char id=210     x=393  y=0    width=26   height=32   xoffset=0    yoffset=-1   xadvance=27   page=0    chnl=0 
+char id=211     x=419  y=0    width=26   height=32   xoffset=0    yoffset=-1   xadvance=27   page=0    chnl=0 
+char id=212     x=445  y=0    width=26   height=32   xoffset=0    yoffset=-1   xadvance=27   page=0    chnl=0 
+char id=213     x=471  y=0    width=26   height=32   xoffset=0    yoffset=-1   xadvance=27   page=0    chnl=0 
+char id=214     x=160  y=33   width=26   height=31   xoffset=0    yoffset=0    xadvance=27   page=0    chnl=0 
+char id=215     x=35   y=168  width=15   height=15   xoffset=1    yoffset=12   xadvance=21   page=0    chnl=0 
+char id=216     x=290  y=33   width=26   height=28   xoffset=0    yoffset=5    xadvance=27   page=0    chnl=0 
+char id=217     x=0    y=33   width=20   height=32   xoffset=2    yoffset=-1   xadvance=25   page=0    chnl=0 
+char id=218     x=20   y=33   width=20   height=32   xoffset=2    yoffset=-1   xadvance=25   page=0    chnl=0 
+char id=219     x=40   y=33   width=20   height=32   xoffset=2    yoffset=-1   xadvance=25   page=0    chnl=0 
+char id=220     x=186  y=33   width=20   height=31   xoffset=2    yoffset=0    xadvance=25   page=0    chnl=0 
+char id=221     x=60   y=33   width=23   height=32   xoffset=-1   yoffset=-1   xadvance=23   page=0    chnl=0 
+char id=222     x=58   y=117  width=20   height=26   xoffset=2    yoffset=5    xadvance=23   page=0    chnl=0 
+char id=223     x=78   y=117  width=19   height=26   xoffset=1    yoffset=5    xadvance=22   page=0    chnl=0 
+char id=224     x=97   y=117  width=17   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=225     x=114  y=117  width=17   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=226     x=131  y=117  width=17   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=227     x=148  y=117  width=17   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=228     x=457  y=117  width=17   height=25   xoffset=0    yoffset=6    xadvance=19   page=0    chnl=0 
+char id=229     x=316  y=33   width=17   height=27   xoffset=0    yoffset=4    xadvance=19   page=0    chnl=0 
+char id=230     x=327  y=143  width=29   height=20   xoffset=0    yoffset=11   xadvance=30   page=0    chnl=0 
+char id=231     x=333  y=33   width=16   height=27   xoffset=0    yoffset=11   xadvance=18   page=0    chnl=0 
+char id=232     x=165  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=233     x=183  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=234     x=201  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=235     x=474  y=117  width=18   height=25   xoffset=0    yoffset=6    xadvance=19   page=0    chnl=0 
+char id=236     x=498  y=91   width=8    height=26   xoffset=0    yoffset=5    xadvance=11   page=0    chnl=0 
+char id=237     x=219  y=117  width=8    height=26   xoffset=1    yoffset=5    xadvance=11   page=0    chnl=0 
+char id=238     x=227  y=117  width=14   height=26   xoffset=-2   yoffset=5    xadvance=11   page=0    chnl=0 
+char id=239     x=492  y=117  width=12   height=25   xoffset=-1   yoffset=6    xadvance=11   page=0    chnl=0 
+char id=240     x=241  y=117  width=19   height=26   xoffset=0    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=241     x=260  y=117  width=17   height=26   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=242     x=277  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=243     x=295  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=244     x=313  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=245     x=331  y=117  width=18   height=26   xoffset=0    yoffset=5    xadvance=19   page=0    chnl=0 
+char id=246     x=0    y=143  width=18   height=25   xoffset=0    yoffset=6    xadvance=19   page=0    chnl=0 
+char id=247     x=459  y=143  width=18   height=16   xoffset=0    yoffset=10   xadvance=20   page=0    chnl=0 
+char id=248     x=72   y=143  width=20   height=22   xoffset=0    yoffset=10   xadvance=22   page=0    chnl=0 
+char id=249     x=349  y=117  width=17   height=26   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=250     x=366  y=117  width=17   height=26   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=251     x=383  y=117  width=17   height=26   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=252     x=18   y=143  width=17   height=25   xoffset=1    yoffset=6    xadvance=20   page=0    chnl=0 
+char id=253     x=83   y=33   width=17   height=32   xoffset=-1   yoffset=5    xadvance=17   page=0    chnl=0 
+char id=254     x=100  y=33   width=18   height=32   xoffset=1    yoffset=5    xadvance=20   page=0    chnl=0 
+char id=255     x=206  y=33   width=17   height=31   xoffset=-1   yoffset=6    xadvance=17   page=0    chnl=0 
+kernings count=95
+kerning first=87 second=58 amount=-1
+kerning first=49 second=49 amount=-2
+kerning first=89 second=65 amount=-2
+kerning first=84 second=79 amount=-1
+kerning first=65 second=84 amount=-2
+kerning first=82 second=86 amount=-1
+kerning first=76 second=87 amount=-2
+kerning first=87 second=97 amount=-1
+kerning first=84 second=99 amount=-4
+kerning first=86 second=101 amount=-2
+kerning first=102 second=102 amount=-1
+kerning first=84 second=105 amount=-1
+kerning first=89 second=111 amount=-3
+kerning first=89 second=112 amount=-2
+kerning first=89 second=113 amount=-3
+kerning first=84 second=115 amount=-4
+kerning first=87 second=117 amount=-1
+kerning first=89 second=118 amount=-2
+kerning first=65 second=119 amount=-1
+kerning first=84 second=121 amount=-2
+kerning first=119 second=44 amount=-2
+kerning first=84 second=117 amount=-1
+kerning first=119 second=46 amount=-2
+kerning first=87 second=59 amount=-1
+kerning first=84 second=114 amount=-1
+kerning first=80 second=65 amount=-2
+kerning first=86 second=46 amount=-3
+kerning first=65 second=89 amount=-2
+kerning first=65 second=87 amount=-1
+kerning first=89 second=46 amount=-4
+kerning first=86 second=105 amount=-1
+kerning first=65 second=86 amount=-2
+kerning first=84 second=111 amount=-4
+kerning first=80 second=44 amount=-4
+kerning first=87 second=114 amount=-1
+kerning first=65 second=121 amount=-1
+kerning first=65 second=118 amount=-1
+kerning first=114 second=44 amount=-2
+kerning first=86 second=111 amount=-2
+kerning first=114 second=46 amount=-2
+kerning first=76 second=121 amount=-1
+kerning first=70 second=46 amount=-4
+kerning first=87 second=101 amount=-1
+kerning first=84 second=32 amount=-1
+kerning first=87 second=46 amount=-2
+kerning first=86 second=114 amount=-1
+kerning first=89 second=101 amount=-3
+kerning first=84 second=46 amount=-4
+kerning first=84 second=58 amount=-4
+kerning first=76 second=32 amount=-1
+kerning first=32 second=89 amount=-1
+kerning first=86 second=58 amount=-1
+kerning first=65 second=32 amount=-2
+kerning first=86 second=65 amount=-2
+kerning first=76 second=86 amount=-2
+kerning first=84 second=45 amount=-2
+kerning first=89 second=44 amount=-4
+kerning first=82 second=89 amount=-1
+kerning first=70 second=44 amount=-4
+kerning first=86 second=45 amount=-2
+kerning first=76 second=89 amount=-2
+kerning first=89 second=58 amount=-2
+kerning first=89 second=105 amount=-1
+kerning first=86 second=117 amount=-1
+kerning first=84 second=101 amount=-4
+kerning first=89 second=97 amount=-2
+kerning first=86 second=121 amount=-1
+kerning first=89 second=59 amount=-2
+kerning first=84 second=44 amount=-4
+kerning first=70 second=65 amount=-2
+kerning first=86 second=59 amount=-1
+kerning first=84 second=65 amount=-2
+kerning first=86 second=44 amount=-3
+kerning first=87 second=44 amount=-2
+kerning first=121 second=46 amount=-2
+kerning first=82 second=84 amount=-1
+kerning first=118 second=46 amount=-2
+kerning first=82 second=87 amount=-1
+kerning first=87 second=65 amount=-1
+kerning first=87 second=111 amount=-1
+kerning first=89 second=45 amount=-3
+kerning first=121 second=44 amount=-2
+kerning first=32 second=84 amount=-1
+kerning first=89 second=32 amount=-1
+kerning first=76 second=84 amount=-2
+kerning first=80 second=46 amount=-4
+kerning first=84 second=97 amount=-4
+kerning first=32 second=65 amount=-2
+kerning first=84 second=119 amount=-2
+kerning first=84 second=59 amount=-4
+kerning first=80 second=32 amount=-1
+kerning first=89 second=117 amount=-2
+kerning first=118 second=44 amount=-2
+kerning first=87 second=45 amount=-1
+kerning first=86 second=97 amount=-2

BIN
samples/res/sdf_font.png