mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 04:18:43 +00:00
458 lines
16 KiB
Diff
458 lines
16 KiB
Diff
Index: FontCharacter.cs
|
|
===================================================================
|
|
--- FontCharacter.cs (revision 81403)
|
|
+++ FontCharacter.cs (working copy)
|
|
@@ -6,6 +6,150 @@
|
|
{
|
|
public class FontCharacter
|
|
{
|
|
+ private class SingleForm
|
|
+ {
|
|
+ byte[] Data;
|
|
+ bool Filled;
|
|
+ Image LoadedImage;
|
|
+ byte Height;
|
|
+ byte Width;
|
|
+ UInt32 Bits;
|
|
+
|
|
+ public SingleForm(byte[] data, byte height, byte width, UInt32 bits)
|
|
+ {
|
|
+ this.Data = data;
|
|
+ this.Filled = false;
|
|
+ this.Height = height;
|
|
+ this.Width = width;
|
|
+ this.Bits = bits;
|
|
+ }
|
|
+
|
|
+ public Image GetCharacter()
|
|
+ {
|
|
+ if (Filled)
|
|
+ {
|
|
+ return LoadedImage;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ LoadedImage = LoadFromBinary(Data, Height, Width, Bits);
|
|
+ Filled = true;
|
|
+ Data = null;
|
|
+ return LoadedImage;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private byte ReadByte(bool[] data)
|
|
+ {
|
|
+ byte r = 0;
|
|
+ for (int i = 0; i < 8; i++)
|
|
+ {
|
|
+ if (!data[i]) // The data loading seems to invert the bools.
|
|
+ {
|
|
+ r <<= 1;
|
|
+ r += 1;
|
|
+ }
|
|
+ }
|
|
+ return r;
|
|
+ }
|
|
+
|
|
+ private Image LoadFromBinary(byte[] data, byte height, byte width, uint bits)
|
|
+ {
|
|
+ #region LoadData
|
|
+ bool[] idata = new bool[data.Length * 8];
|
|
+ int bitnum = 0;
|
|
+ for (int inc = 0; inc < data.Length; inc++)
|
|
+ {
|
|
+ if ((data[inc] & 1) == 1)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 2) == 2)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 4) == 4)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 8) == 8)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 16) == 16)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 32) == 32)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 64) == 64)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ if ((data[inc] & 128) == 128)
|
|
+ {
|
|
+ idata[bitnum] = true;
|
|
+ }
|
|
+ bitnum++;
|
|
+ }
|
|
+ #endregion
|
|
+
|
|
+ bitnum = 0;
|
|
+ Image i = new Image(width, height);
|
|
+
|
|
+ //for (uint y = 0; y < height; y++)
|
|
+ for (uint x = 0; x < width; x++)
|
|
+ {
|
|
+ //for (uint x = 0; x < width; x++)
|
|
+ for (uint y = 0; y < height; y++)
|
|
+ {
|
|
+ if (bitnum >= bits)
|
|
+ {
|
|
+ break;
|
|
+ }
|
|
+ if (idata[bitnum])
|
|
+ {
|
|
+ bitnum++;
|
|
+ if (idata[bitnum])
|
|
+ {
|
|
+ bitnum++;
|
|
+ i.SetPixel(x, y, Colors.Black); // Color the pixel white
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ bitnum++;
|
|
+ bool[] tmp = new bool[8];
|
|
+ Array.Copy(idata, bitnum, tmp, 0, 8);
|
|
+ bitnum += 8;
|
|
+ byte greyscale = ReadByte(tmp);
|
|
+ i.SetPixel(x, y, new Pixel(greyscale, greyscale, greyscale, 255));
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ bitnum++;
|
|
+ i.SetPixel(x, y, Colors.White); // Color the pixel black
|
|
+ }
|
|
+ }
|
|
+ if (bitnum >= bits)
|
|
+ {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return i;
|
|
+ }
|
|
+ }
|
|
+
|
|
Image[] forms;
|
|
|
|
public FontCharacter(Image character, FontFlag flags)
|
|
Index: OPFF.cs
|
|
===================================================================
|
|
--- OPFF.cs (revision 81403)
|
|
+++ OPFF.cs (working copy)
|
|
@@ -14,6 +14,7 @@
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
+using System.IO;
|
|
|
|
namespace Orvid.Graphics.FontSupport
|
|
{
|
|
@@ -25,6 +26,12 @@
|
|
get { return name; }
|
|
}
|
|
|
|
+ private UInt16 ver;
|
|
+ public UInt16 FileFormatVersion
|
|
+ {
|
|
+ get { return ver; }
|
|
+ }
|
|
+
|
|
FontCharacterSet foundChars = new FontCharacterSet();
|
|
|
|
public OPFF(byte[] data)
|
|
@@ -55,7 +62,7 @@
|
|
return r;
|
|
}
|
|
|
|
- private UInt32 ReadInt32(byte[] data)
|
|
+ private UInt32 ReadUInt32(byte[] data)
|
|
{
|
|
UInt32 r = 0;
|
|
|
|
@@ -70,6 +77,17 @@
|
|
return r;
|
|
}
|
|
|
|
+ private UInt16 ReadUInt16(byte[] data)
|
|
+ {
|
|
+ UInt16 r = 0;
|
|
+
|
|
+ r += data[1];
|
|
+ r <<= 8;
|
|
+ r += data[0];
|
|
+
|
|
+ return r;
|
|
+ }
|
|
+
|
|
private void Load(byte[] data)
|
|
{
|
|
if (data[0] == 0xFF) // this means it's been compressed in LZMA format.
|
|
@@ -82,10 +100,19 @@
|
|
|
|
int curloc = 8; // There are 8 empty bytes at the start of the header.
|
|
|
|
- byte[] datarr = new byte[256];
|
|
+ byte[] datarr = new byte[2];
|
|
+ Array.Copy(data, curloc, datarr, 0, 2);
|
|
+ curloc += 2;
|
|
+ ver = ReadUInt16(datarr);
|
|
+ if (ver > 47)
|
|
+ {
|
|
+ throw new Exception("Format version is to high!");
|
|
+ }
|
|
+
|
|
+ datarr = new byte[256];
|
|
Array.Copy(data, curloc, datarr, 0, 256);
|
|
curloc += 256;
|
|
- name = new String(ASCIIEncoding.ASCII.GetChars(datarr));
|
|
+ name = new String(ASCIIEncoding.ASCII.GetChars(datarr)).Replace("\0","");
|
|
|
|
datarr = new byte[8];
|
|
Array.Copy(data, curloc, datarr, 0, 8);
|
|
@@ -106,15 +133,15 @@
|
|
curloc++;
|
|
byte width = data[curloc];
|
|
curloc++;
|
|
- int len = (Int32)Math.Ceiling((double)((width * height) / 8));
|
|
+ datarr = new byte[4];
|
|
+ Array.Copy(data, curloc, datarr, 0, 4);
|
|
+ curloc += 4;
|
|
+ int bits = (int)ReadUInt32(datarr);
|
|
+ int len = (Int32)Math.Ceiling((double)(bits / 8));
|
|
datarr = new byte[len];
|
|
Array.Copy(data, curloc, datarr, 0, len);
|
|
curloc += len;
|
|
- Image im = LoadFromBinary(datarr, height, width);
|
|
- if (prevCharNumber > ushort.MaxValue)
|
|
- {
|
|
- throw new Exception();
|
|
- }
|
|
+ Image im = LoadFromBinary(datarr, height, width, bits);
|
|
foundChars.AddCharacter((int)prevCharNumber, im, flags);
|
|
}
|
|
else
|
|
@@ -123,31 +150,45 @@
|
|
datarr = new byte[4];
|
|
Array.Copy(data, curloc, datarr, 0, 4);
|
|
curloc += 4;
|
|
- prevCharNumber = ReadInt32(datarr);
|
|
- if (prevCharNumber > ushort.MaxValue)
|
|
- {
|
|
- throw new Exception();
|
|
- }
|
|
+ prevCharNumber = ReadUInt32(datarr);
|
|
FontFlag flags = (FontFlag)data[curloc];
|
|
curloc++;
|
|
byte height = data[curloc];
|
|
curloc++;
|
|
byte width = data[curloc];
|
|
curloc++;
|
|
- int len = (Int32)Math.Ceiling((double)((width * height) / 8));
|
|
+ datarr = new byte[4];
|
|
+ Array.Copy(data, curloc, datarr, 0, 4);
|
|
+ curloc += 4;
|
|
+ int bits = (int)ReadUInt32(datarr);
|
|
+ int len = (Int32)Math.Ceiling((double)(bits / 8));
|
|
datarr = new byte[len];
|
|
Array.Copy(data, curloc, datarr, 0, len);
|
|
curloc += len;
|
|
- Image im = LoadFromBinary(datarr, height, width);
|
|
+ Image im = LoadFromBinary(datarr, height, width, bits);
|
|
foundChars.AddCharacter((int)prevCharNumber, im, flags);
|
|
}
|
|
}
|
|
}
|
|
|
|
- private Image LoadFromBinary(byte[] data, byte height, byte width)
|
|
+ private byte ReadByte(bool[] data)
|
|
{
|
|
+ byte r = 0;
|
|
+ for (int i = 0; i < 8; i++)
|
|
+ {
|
|
+ if (data[i]) // The data loading seems to invert the bools.
|
|
+ {
|
|
+ r |= (byte)(((byte)1) << i);
|
|
+ }
|
|
+ }
|
|
+ return r;
|
|
+ }
|
|
+
|
|
+ private Image LoadFromBinary(byte[] data, byte height, byte width, int bits)
|
|
+ {
|
|
#region LoadData
|
|
- bool[] idata = new bool[height * width];
|
|
+ //Array.Reverse(data);
|
|
+ bool[] idata = new bool[data.Length * 8];
|
|
int bitnum = 0;
|
|
for (int inc = 0; inc < data.Length; inc++)
|
|
{
|
|
@@ -166,70 +207,139 @@
|
|
// throw new Exception();
|
|
//}
|
|
|
|
- if (((byte)(data[inc] << 7) >> 7) == 1)
|
|
+ #region HighToLowBitLoading
|
|
+ if ((data[inc] & 128) == 128)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if (((byte)(data[inc] << 6) >> 7) == 1)
|
|
+ if ((data[inc] & 64) == 64)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if (((byte)(data[inc] << 5) >> 7) == 1)
|
|
+ if ((data[inc] & 32) == 32)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if (((byte)(data[inc] << 4) >> 7) == 1)
|
|
+ if ((data[inc] & 16) == 16)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if (((byte)(data[inc] << 3) >> 7) == 1)
|
|
+ if ((data[inc] & 8) == 8)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if (((byte)(data[inc] << 2) >> 7) == 1)
|
|
+ if ((data[inc] & 4) == 4)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if (((byte)(data[inc] << 1) >> 7) == 1)
|
|
+ if ((data[inc] & 2) == 2)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
- if ((data[inc] >> 7) == 1)
|
|
+ if ((data[inc] & 1) == 1)
|
|
{
|
|
idata[bitnum] = true;
|
|
}
|
|
bitnum++;
|
|
+ #endregion
|
|
+
|
|
+ #region LowToHighBitLoading
|
|
+ //if ((data[inc] & 1) == 1)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 2) == 2)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 4) == 4)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 8) == 8)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 16) == 16)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 32) == 32)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 64) == 64)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ //if ((data[inc] & 128) == 128)
|
|
+ //{
|
|
+ // idata[bitnum] = true;
|
|
+ //}
|
|
+ //bitnum++;
|
|
+ #endregion
|
|
+
|
|
}
|
|
#endregion
|
|
|
|
bitnum = 0;
|
|
Image i = new Image(width, height);
|
|
+ //StreamWriter s = new StreamWriter(Path.GetFullPath("lg.txt"));
|
|
|
|
//for (uint y = 0; y < height; y++)
|
|
+ //for (uint y = (uint)(height - 1); (y >= 0 && y != uint.MaxValue); y--)
|
|
for (uint x = 0; x < width; x++)
|
|
+ //for (uint x = (uint)(width - 1); (x >= 0 && x != uint.MaxValue); x--)
|
|
{
|
|
//for (uint x = 0; x < width; x++)
|
|
+ //for (uint x = (uint)(width - 1); (x >= 0 && x != uint.MaxValue); x--)
|
|
for (uint y = 0; y < height; y++)
|
|
+ //for (uint y = (uint)(height - 1); (y >= 0 && y != uint.MaxValue); y--)
|
|
{
|
|
if (idata[bitnum])
|
|
{
|
|
- i.SetPixel(x, y, Colors.Black); // Color the pixel white
|
|
+ bitnum++;
|
|
+ if (idata[bitnum])
|
|
+ {
|
|
+ bitnum++;
|
|
+ //s.WriteLine("Pixel at (" + x.ToString() + ", " + y.ToString() + ") is 00");
|
|
+ i.SetPixel(x, y, Colors.Black); // Color the pixel black
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ bitnum++;
|
|
+ bool[] tmp = new bool[8];
|
|
+ Array.Copy(idata, bitnum, tmp, 0, 8);
|
|
+ //s.WriteLine("Pixel at (" + x.ToString() + ", " + y.ToString() + ") is 01-" + (tmp[0] ? "1" : "0") + (tmp[1] ? "1" : "0") + (tmp[2] ? "1" : "0") + (tmp[3] ? "1" : "0") + (tmp[4] ? "1" : "0") + (tmp[5] ? "1" : "0") + (tmp[6] ? "1" : "0") + (tmp[7] ? "1" : "0"));
|
|
+ bitnum += 8;
|
|
+ byte greyscale = ReadByte(tmp);
|
|
+ i.SetPixel(x, y, new Pixel(greyscale, greyscale, greyscale, 255));
|
|
+ }
|
|
}
|
|
else
|
|
{
|
|
- i.SetPixel(x, y, Colors.White); // Color the pixel black
|
|
+ bitnum++;
|
|
+ //s.WriteLine("Pixel at (" + x.ToString() + ", " + y.ToString() + ") is 1");
|
|
+ i.SetPixel(x, y, Colors.White);
|
|
}
|
|
- bitnum++;
|
|
}
|
|
}
|
|
-
|
|
+ //s.Flush();
|
|
+ //s.Close();
|
|
return i;
|
|
}
|
|
|