-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
112 lines (86 loc) · 3.11 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using bmfont2cs.Xml;
namespace bmfont2cs {
class Program {
const string classTemplate = "{0}ProportionalFont{1}";
const string beginningTemplate = @"
//
// Bitmap font CS source generated by bmfont2cs.py
//
using System;
using System.Collections.Generic;
using FontUtility;
public class {0} : ProportionalFontBase {{
private static readonly Dictionary<char, byte[][]> characterLookup;
private static readonly Dictionary<string, short> kerningLookup;
public {0}() {{
this.Height = {1};
this.Spacing = {2};
this.fontCharacters = {0}.characterLookup;
this.kerningOffsets = {0}.kerningLookup;
}}
static {0}() {{
{0}.characterLookup = new Dictionary<char, byte[][]> {{
";
const string middleTemplate = @"
}};
{0}.kerningLookup = new Dictionary<string, short> {{
";
const string endTemplate = @"
}};
}}
}}";
static void Main( string[] args ) {
if( args.Length != 1 ) {
Console.WriteLine( "Usage: bmfont2cs example.fnt" );
Environment.Exit( 1 );
}
var fileName = args[ 0 ];
if( !File.Exists( fileName ) ) {
Console.WriteLine( "Unable to find file '{0}'", fileName );
Environment.Exit( 2 );
}
FileStream fileStream = new FileStream( fileName, FileMode.Open, FileAccess.Read );
TextReader reader = new StreamReader( fileStream );
Xml.BmFont font = null;
try {
font = Xml.BmFont.Deserialize( reader );
}
catch( Exception ex ) {
Console.WriteLine( ex.Message );
Environment.Exit( 3 );
}
for( int pageIndex = 0; pageIndex < font.Pages.Length; pageIndex++ ) {
var output = new StringBuilder();
var className = string.Format( classTemplate, font.Info.Face, pageIndex == 0 ? "" : pageIndex.ToString() );
if( File.Exists( font.Pages[ pageIndex ].File ) ) {
var bitmap = new Bitmap( font.Pages[ pageIndex ].File );
output.AppendFormat( beginningTemplate, className, font.Info.Size, font.Common.LineHeight );
var extractor = new CharacterExtractor( font, bitmap );
var asciiIndexes = font.Chars.Characters.Select( c => c.Id ).Where( num => num >= 32 && num <= 127 ).OrderBy( num => num ).ToList();
foreach( var asciiIndex in asciiIndexes ) {
var character = ( char )( byte )asciiIndex;
var boolMap = extractor.GetCharacter( character, 0, 3 );
output.AppendFormat( OutputGenerator.AsComments( "\t\t\t\t", boolMap ) );
output.AppendFormat( "\t\t\t{{ '{0}', new byte[][] {{\n", ( character == '\'' ? "\\'" : character.ToString() ) );
output.Append( OutputGenerator.AsCSharpByteArray( "\t\t\t\t", OutputGenerator.As1BitPageFormat( boolMap ) ) );
output.Append( "\t\t\t}},\n" );
}
output.AppendFormat( middleTemplate, className );
output.Append( OutputGenerator.AsKerningArray( "\t\t\t", asciiIndexes, font.Kernings ) );
output.AppendFormat( endTemplate );
File.WriteAllText( className + ".cs", output.ToString() );
}
else {
Console.WriteLine( "cannot find {0}", font.Pages[ pageIndex ].File );
}
}
Console.WriteLine( "done" );
Environment.Exit( 0 );
}
}
}