mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-20 04:48:53 +00:00
186 lines
5.6 KiB
C#
186 lines
5.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace Orvid.Graphics.FontSupport.Old
|
|
{
|
|
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)
|
|
{
|
|
Int32 i = (Int32)flags;
|
|
forms = new Image[i + 1];
|
|
forms[i] = character;
|
|
}
|
|
|
|
public void AddForm(Image character, FontFlag flags)
|
|
{
|
|
Int32 i = (Int32)flags;
|
|
if (i > forms.Length - 1)
|
|
{
|
|
Image[] forms2 = new Image[i + 1];
|
|
Array.Copy(forms, forms2, forms.Length);
|
|
forms = forms2;
|
|
}
|
|
forms[i] = character;
|
|
}
|
|
|
|
public Image GetForm(FontFlag flags)
|
|
{
|
|
if ((Int32)flags < forms.Length)
|
|
{
|
|
return (forms[((Int32)flags)]);
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|