Cosmos/source2/Tools/TTF2OPFF Converter/Form1.cs
blah38621_cp 92dcac4a51 Made a few improvements to the speed of the ILScanner, including caching the resolved plugs.
Added the possibility for an optimization step in the IL2CPU MSBuild task. Currently commented out, but should work fine with a few modifications to the optimizer.
Moved classes that are dependent on Cosmos from the Orvid.Graphics, into the Orvid.Graphics.Cosmos assembly. 
Re-factored the font mechanism, added partially working .fnt Font support. 
Added a Rectangle class, and a Vec2d class, which is the same as Vec2, except with doubles for the X and Y values.
Made a small aesthetic improvement to the output of the File2ByteArray Converter.
2011-09-03 21:05:46 +00:00

611 lines
24 KiB
C#

//#define GZipCompression
//#define DeflateCompression
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.IO.Compression;
namespace TTF2OPFF_Converter
{
internal enum CompressionType
{
None,
Deflate,
LZMA,
GZip,
BZip2,
}
public partial class Form1 : Form
{
private class BinaryWriter : System.IO.BinaryWriter
{
private bool[] curByte = new bool[8];
private byte curBitIndx = 0;
private System.Collections.BitArray ba;
public BinaryWriter(Stream s) : base(s) { }
public override void Flush()
{
base.Write(ConvertToByte(curByte));
base.Flush();
}
public override void Write(bool value)
{
curByte[curBitIndx] = value;
curBitIndx++;
if (curBitIndx == 8)
{
base.Write(ConvertToByte(curByte));
this.curBitIndx = 0;
this.curByte = new bool[8];
}
}
public override void Write(byte value)
{
ba = new BitArray(new byte[] { value });
for (byte i = 0; i < 8; i++)
{
this.Write(ba[i]);
}
ba = null;
}
public override void Write(byte[] buffer)
{
for (int i = 0; i < buffer.Length; i++)
{
this.Write((byte)buffer[i]);
}
}
public override void Write(uint value)
{
ba = new BitArray(BitConverter.GetBytes(value));
for (byte i = 0; i < 32; i++)
{
this.Write(ba[i]);
}
ba = null;
}
public override void Write(ulong value)
{
ba = new BitArray(BitConverter.GetBytes(value));
for (byte i = 0; i < 64; i++)
{
this.Write(ba[i]);
}
ba = null;
}
public override void Write(ushort value)
{
ba = new BitArray(BitConverter.GetBytes(value));
for (byte i = 0; i < 16; i++)
{
this.Write(ba[i]);
}
ba = null;
}
private static byte ConvertToByte(bool[] bools)
{
byte b = 0;
byte bitIndex = 0;
for (int i = 0; i < 8; i++)
{
if (bools[i])
{
b |= (byte)(((byte)1) << bitIndex);
}
bitIndex++;
}
return b;
}
}
private string OutputFileName;
private CompressionType CompressionMode = CompressionType.None;
public Form1()
{
InitializeComponent();
}
private void BrowseButton_Click(object sender, EventArgs e)
{
if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
OutputFileName = saveFileDialog1.FileName;
textBox1.Text = OutputFileName;
}
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (FontFamily f in FontFamily.Families)
{
FontComboBox.Items.Add(f.Name);
}
FontComboBox.SelectedIndex = 0;
CompressionComboBox.SelectedIndex = 0;
}
private void ConvertButton_Click(object sender, EventArgs e)
{
if (OutputFileName == null || OutputFileName == "")
{
MessageBox.Show("Invalid File Name!");
}
else
{
//FileStream str;
FileStream final;
dynamic strm;
#region Already Exists
if (File.Exists(OutputFileName))
{
if (MessageBox.Show("A file at '" + OutputFileName + "' already exists! Would you like to overwrite it?", "File Already Exists", MessageBoxButtons.YesNoCancel) == System.Windows.Forms.DialogResult.Yes)
{
}
else
{
return;
}
}
else
{
File.Create(OutputFileName).Close();
}
#endregion
#region Compression Config
//if (CompressionMode == CompressionType.Deflate)
//{
// str = new FileStream(OutputFileName, FileMode.Truncate);
// strm = new DeflateStream(str, System.IO.Compression.CompressionMode.Compress);
// final = null;
//}
//else if (CompressionMode == CompressionType.GZip)
//{
// str = new FileStream(OutputFileName, FileMode.Truncate);
// strm = new GZipStream(str, System.IO.Compression.CompressionMode.Compress);
// final = null;
//}
if (CompressionMode == CompressionType.LZMA)
{
if (File.Exists(OutputFileName + ".uncmpr"))
{
File.Delete(OutputFileName + ".uncmpr");
}
strm = File.Create(OutputFileName + ".uncmpr");
final = new FileStream(OutputFileName, FileMode.Truncate);
}
else
{
strm = new FileStream(OutputFileName, FileMode.Truncate);
final = null;
}
#endregion
BinaryWriter br = new BinaryWriter(strm);
br.Write((byte)0);
br.Write((byte)0);
br.Write((byte)0);
br.Write((byte)0);
br.Write((byte)0); // Write the 8 empty bytes of the header
br.Write((byte)0);
br.Write((byte)0);
br.Write((byte)0);
byte[] buffer;
br.Write((UInt16)47); // write the format version.
string FontName = (string)FontComboBox.SelectedItem;
buffer = ASCIIEncoding.ASCII.GetBytes(FontName);
int i = 256 - buffer.Length;
if (i < 0)
{
throw new Exception("Font Name is to long!");
}
else
{
br.Write(buffer);
for (int i2 = 0; i2 < i; i2++)
{
br.Write((byte)0); // Fill the rest of the 256 bytes.
}
}
System.Windows.Media.Typeface t = new System.Windows.Media.Typeface(FontName);
System.Windows.Media.GlyphTypeface glyph;
if (t.TryGetGlyphTypeface(out glyph))
{
t = null;
IDictionary<int, ushort> charKeyMap = (IDictionary<int, ushort>)glyph.CharacterToGlyphMap;
glyph = null;
SortedSet<int> chars = new SortedSet<int>();
foreach (KeyValuePair<int, ushort> c in charKeyMap)
{
chars.Add(c.Key);
}
charKeyMap = null;
Font f = new Font(FontName, 128, GraphicsUnit.Pixel);
UInt64 charsToWrite = (ulong)chars.Count;// *16;
br.Write(charsToWrite); // Write the number of chars to read.
int prevChar = 0;
for (byte style = 0; style < 1; style++)
{
f = new Font(FontName, 64, (FontStyle)style, GraphicsUnit.Pixel);
foreach (int ch in chars)
{
Bitmap Backend = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(Backend);
SizeF sz = g.MeasureString(new String(new char[] { (char)ch }), f);
byte height = (byte)Math.Ceiling(sz.Height + 2);
byte width = (byte)Math.Ceiling(sz.Width + 4);
Backend = new Bitmap(width, height);
g = Graphics.FromImage(Backend);
g.Clear(Color.White);
g.DrawString(new String(new char[] { (char)ch }), f, new SolidBrush(Color.Black), 2, 2);
g.Flush(System.Drawing.Drawing2D.FlushIntention.Flush);
if (prevChar + 1 == ch)
{
br.Write((byte)255); // write that it's incremented from the previous char.
}
else
{
br.Write((byte)0); // write that it's not incremented from the previous char.
br.Write((UInt32)ch); // Write the char number.
}
pictureBox1.Image = Backend;
pictureBox1.Refresh();
br.Write((byte)style); // write it's style
br.Write((byte)height); // write the height
br.Write((byte)width); // write the width
buffer = ConvertToByteArray(Backend);
br.Write(buffer);
prevChar = ch;
}
strm.Flush();
System.GC.Collect();
}
if (CompressionMode == CompressionType.LZMA)
{
strm.Position = 0;
buffer = new byte[strm.Length];
strm.Read(buffer, 0, (Int32)strm.Length);
buffer = Orvid.Compression.LZMACoder.Compress(buffer);
final.WriteByte(255);
final.Write(buffer, 0, buffer.Length);
final.Flush();
final.Close();
final.Dispose();
}
strm.Flush();
strm.Close();
strm.Dispose();
if (CompressionMode == CompressionType.LZMA)
{
File.Delete(OutputFileName + ".uncmpr");
}
//pictureBox1.Image = null;
MessageBox.Show("Conversion Completed Successfully!");
}
else
{
throw new Exception("Unable to load the glyph typeface!");
}
}
}
private byte[] ConvertToByteArray(Bitmap b)
{
MemoryStream m = new MemoryStream();
BinaryWriter br = new BinaryWriter(m);
int bitnum = 0;
//Color White = Color.FromArgb(0, 0, 0);
//Color Black = Color.FromArgb(255, 255, 255);
Color curPix;
for (int x = 0; x < b.Width; x++)
{
for (int y = 0; y < b.Height; y++)
{
curPix = b.GetPixel(x, y);
//if (curPix != White)
//{
// if (curPix == Black)
// {
// br.Write(false);
// bitnum++;
// br.Write(false);
// bitnum++;
// }
// else // Write that it's a greyscale pixel, and it's value.
// {
// br.Write(false);
// bitnum++;
// br.Write(true);
// bitnum++;
br.Write(GetGreyscaleByte(curPix));
bitnum += 8;
// }
//}
//else
//{
// br.Write(true);
// bitnum++;
//}
}
}
byte[] tmp = BitConverter.GetBytes((UInt32)bitnum);
byte[] arr2 = new byte[m.Length + 4];
Array.Copy(tmp, arr2, 4); // write the number of bits
tmp = m.GetBuffer();
Array.Copy(tmp, 0, arr2, 4, m.Length);
//throw new Exception();
return arr2;
}
private byte GetGreyscaleByte(Color c)
{
return (byte)((0.2125 * c.R) + (0.7154 * c.G) + (0.0721 * c.B));
}
private void FontComboBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
//private static Orvid.Graphics.FontSupport.OPFF opfFont = null;
private void button1_Click(object sender, EventArgs e)
{
//if (opfFont == null)
//{
// FileStream str = new FileStream("Arial-Compressed.opff", FileMode.Open);
// byte[] data = new byte[str.Length];
// str.Read(data, 0, (int)str.Length);
// opfFont = new Orvid.Graphics.FontSupport.OPFF(data);
// data = null;
// str.Close();
// str.Dispose();
//}
//Orvid.Graphics.Image i = opfFont.GetCharacter(Int32.Parse(textBox2.Text), Orvid.Graphics.FontSupport.FontStyle.Normal);
////i = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(i.Width * 4, i.Height * 4));
////o.AntiAlias();
////o.HalveSize();
////o.HalveSize();
//pictureBox1.Image = (Bitmap)i;
//pictureBox1.Size = new Size(i.Width, i.Height);
//pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
//pictureBox1.BringToFront();
//System.GC.Collect();
//Font f2 = new Font("Arial", 64, (FontStyle)0, GraphicsUnit.Pixel);
//Bitmap Backend = new Bitmap(i.Width, i.Height);
//Graphics g = Graphics.FromImage(Backend);
//g.Clear(Color.White);
//g.DrawString(new String(new char[] { (char)Int32.Parse(textBox2.Text) }), f2, new SolidBrush(Color.Black), 2, 2);
//g.Flush(System.Drawing.Drawing2D.FlushIntention.Flush);
//pictureBox2.Image = Backend;
//pictureBox2.Size = new Size(i.Width, i.Height);
//f2 = null;
//g = null;
//i = null;
//System.GC.Collect();
}
private void CompressionComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
CompressionMode = (CompressionType)Enum.Parse(typeof(CompressionType), (String)CompressionComboBox.Items[CompressionComboBox.SelectedIndex]);
}
private void CompressionComboBox_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
bool thso = false;
bool t2 = false;
bool t3 = false;
private void TestButton2_Click(object sender, EventArgs e)
{
//Bitmap b = (Bitmap)Bitmap.FromFile(Path.GetFullPath("IMGP4154.JPG"));
//FileStream s = new FileStream(Path.GetFullPath("test2.oif"), FileMode.OpenOrCreate);
//Orvid.Graphics.Image i = new Orvid.Graphics.Image(b.Width, b.Height);
//for (uint x = 0; x < i.Width; x++)
//{
// for (uint y = 0; y < i.Height; y++)
// {
// i.SetPixel(x, y, b.GetPixel((int)x, (int)y));
// }
//}
//Orvid.Graphics.ImageFormats.OIFImage oif = new Orvid.Graphics.ImageFormats.OIFImage();
//oif.Save(i, s);
//s.Flush();
//s.Close();
if (!thso)
{
FileStream s = new FileStream(Path.GetFullPath("Building.png"), FileMode.Open);
Orvid.Graphics.ImageFormats.PngImage p = new Orvid.Graphics.ImageFormats.PngImage();
Orvid.Graphics.Image i = p.Load(s);
s.Close();
s.Dispose();
Bitmap b = new Bitmap(i.Width, i.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
b.SetPixel((int)x, (int)y, i.GetPixel(x, y));
}
}
pictureBox1.Image = b;
thso = true;
}
else
{
if (!t2)
{
Bitmap b = (Bitmap)pictureBox1.Image;
Orvid.Graphics.Image i = new Orvid.Graphics.Image(b.Width, b.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
i.SetPixel(x, y, b.GetPixel((int)x, (int)y));
}
}
i = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(b.Width / 4, b.Height / 4), Orvid.Graphics.ImageManipulator.ScalingAlgorithm.Bicubic);
Bitmap b2 = new Bitmap(i.Width, i.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
b2.SetPixel((int)x, (int)y, i.GetPixel(x, y));
}
}
pictureBox2.Image = b2;
pictureBox2.Size = new Size(b2.Width, b2.Height);
t2 = true;
}
else
{
if (!t3)
{
Bitmap b = (Bitmap)pictureBox1.Image;
Orvid.Graphics.Image i = new Orvid.Graphics.Image(b.Width, b.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
i.SetPixel(x, y, b.GetPixel((int)x, (int)y));
}
}
i = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(b.Width / 4, b.Height / 4), Orvid.Graphics.ImageManipulator.ScalingAlgorithm.Bilinear);
Bitmap b2 = new Bitmap(i.Width, i.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
b2.SetPixel((int)x, (int)y, i.GetPixel(x, y));
}
}
pictureBox2.Image = b2;
pictureBox2.Size = new Size(b2.Width, b2.Height);
t3 = true;
}
else
{
Bitmap b = (Bitmap)pictureBox1.Image;
Orvid.Graphics.Image i = new Orvid.Graphics.Image(b.Width, b.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
i.SetPixel(x, y, b.GetPixel((int)x, (int)y));
}
}
i = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(b.Width / 2, b.Height / 2), Orvid.Graphics.ImageManipulator.ScalingAlgorithm.NearestNeighbor);
Bitmap b2 = new Bitmap(i.Width, i.Height);
for (uint x = 0; x < i.Width; x++)
{
for (uint y = 0; y < i.Height; y++)
{
b2.SetPixel((int)x, (int)y, i.GetPixel(x, y));
}
}
pictureBox2.Image = b2;
pictureBox2.Size = new Size(b2.Width, b2.Height);
t2 = false;
t3 = false;
}
}
}
//Font f = new Font("Chiller", 64, (FontStyle)0, GraphicsUnit.Pixel);
//Bitmap b = new Bitmap(1, 1);
//Graphics g = Graphics.FromImage(b);
//SizeF sz = g.MeasureString(new String(new char[] { (char)6 }), f);
//byte height = (byte)Math.Ceiling(sz.Height + 2);
//byte width = (byte)Math.Ceiling(sz.Width + 4);
//b = new Bitmap(width, height);
//g = Graphics.FromImage(b);
//g.Clear(Color.White);
//g.DrawString(new String(new char[] { (char)Int32.Parse(textBox2.Text) }), f, new SolidBrush(Color.Black), 2, 2);
//g.Flush(System.Drawing.Drawing2D.FlushIntention.Flush);
//pictureBox1.Image = b;
//pictureBox1.Size = new Size(b.Width, b.Height);
//Orvid.Graphics.Image i = new Orvid.Graphics.Image(b.Width, b.Height);
//for (uint x = 0; x < i.Width; x++)
//{
// for (uint y = 0; y < i.Height; y++)
// {
// i.SetPixel(x, y, b.GetPixel((int)x, (int)y));
// }
//}
//FileStream s = new FileStream("Test.oif", FileMode.OpenOrCreate);
//Orvid.Graphics.ImageFormats.OIFImage t = new Orvid.Graphics.ImageFormats.OIFImage();
//t.Save(i, s);
//s.Flush();
//s.Close();
//s.Dispose();
//s = new FileStream("Test.oif", FileMode.Open);
//Orvid.Graphics.Image i2 = t.Load(s);
//Bitmap b2 = new Bitmap(i2.Width, i2.Height);
//for (uint x = 0; x < i2.Width; x++)
//{
// for (uint y = 0; y < i2.Height; y++)
// {
// b2.SetPixel((int)x, (int)y, i2.GetPixel(x, y));
// }
//}
//pictureBox2.Image = b2;
//pictureBox2.Size = new Size(b2.Width, b2.Height);
//s.Close();
//s.Dispose();
}
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter || e.KeyData == Keys.Return)
{
e.Handled = true;
button1_Click(button1, new EventArgs());
}
}
}
}