mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-20 12:58:39 +00:00
530 lines
19 KiB
C#
530 lines
19 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
namespace Orvid.Graphics.FontSupport.bdf
|
|
{
|
|
public class BDFFontContainer
|
|
{
|
|
public const int FOUNDRY = 0;
|
|
public const int FAMILY = 1;
|
|
public const int WEIGHT = 2;
|
|
public const int SLANT = 3;
|
|
public const int SWIDTH = 4;
|
|
public const int ADSTYL = 5;
|
|
public const int PIXELSIZE = 6;
|
|
public const int POINTSIZE = 7;
|
|
public const int HORIZONTAL = 8;
|
|
public const int VERTICAL = 9;
|
|
public const int SPACING = 10;
|
|
public const int AVERAGEWIDTH = 11;
|
|
public const int REGISTRY = 12;
|
|
public const int ENCODING = 13;
|
|
|
|
private static Dictionary<string, string> charMapper = new Dictionary<string, string>();
|
|
static BDFFontContainer()
|
|
{
|
|
|
|
#region Setup charMapper
|
|
charMapper.Add(".undef", "\u0219");
|
|
charMapper.Add(".null", "\u0000");
|
|
charMapper.Add("space", "\u0020");
|
|
charMapper.Add("exclam", "!");
|
|
charMapper.Add("quotedbl", "\"");
|
|
charMapper.Add("numbersign", "#");
|
|
charMapper.Add("dollar", "$");
|
|
charMapper.Add("percent", "%");
|
|
charMapper.Add("ampersand", "&");
|
|
charMapper.Add("quotesingle", "'");
|
|
charMapper.Add("parenleft", "(");
|
|
charMapper.Add("parenright", ")");
|
|
charMapper.Add("asterisk", "*");
|
|
charMapper.Add("plus", "+");
|
|
charMapper.Add("comma", ",");
|
|
charMapper.Add("hyphen", "-");
|
|
charMapper.Add("period", ".");
|
|
charMapper.Add("slash", "/");
|
|
charMapper.Add("one", "1");
|
|
charMapper.Add("two", "2");
|
|
charMapper.Add("three", "3");
|
|
charMapper.Add("four", "4");
|
|
charMapper.Add("five", "5");
|
|
charMapper.Add("six", "6");
|
|
charMapper.Add("seven", "7");
|
|
charMapper.Add("eight", "8");
|
|
charMapper.Add("nine", "9");
|
|
charMapper.Add("zero", "0");
|
|
charMapper.Add("colon", ":");
|
|
charMapper.Add("semicolon", ";");
|
|
charMapper.Add("less", "<");
|
|
charMapper.Add("equal", "=");
|
|
charMapper.Add("greater", ">");
|
|
charMapper.Add("question", "?");
|
|
charMapper.Add("at", "@");
|
|
charMapper.Add("bracketleft", "[");
|
|
charMapper.Add("backslash", "\u005C");
|
|
charMapper.Add("bracketright", "]");
|
|
charMapper.Add("asciicircum", "^");
|
|
charMapper.Add("underscore", "_");
|
|
charMapper.Add("grave", "`");
|
|
charMapper.Add("braceleft", "{");
|
|
charMapper.Add("bar", "|");
|
|
charMapper.Add("braceright", "}");
|
|
charMapper.Add("asciitilde", "~");
|
|
charMapper.Add("ltshade", "\u00B0");
|
|
charMapper.Add("shade", "\u00B1");
|
|
charMapper.Add("dkshade", "\u00B2");
|
|
charMapper.Add("SF110000", "\u00B3");
|
|
charMapper.Add("SF090000", "\u00B4");
|
|
charMapper.Add("SF190000", "\u00B5");
|
|
charMapper.Add("SF200000", "\u00B6");
|
|
charMapper.Add("SF210000", "\u00B7");
|
|
charMapper.Add("SF220000", "\u00B8");
|
|
charMapper.Add("SF230000", "\u00B9");
|
|
charMapper.Add("SF240000", "\u00BA");
|
|
charMapper.Add("SF250000", "\u00BB");
|
|
charMapper.Add("SF260000", "\u00BC");
|
|
charMapper.Add("SF270000", "\u00BD");
|
|
charMapper.Add("SF280000", "\u00BE");
|
|
charMapper.Add("SF030000", "\u00BF");
|
|
charMapper.Add("SF020000", "\u00C0");
|
|
charMapper.Add("SF070000", "\u00C1");
|
|
charMapper.Add("SF060000", "\u00C2");
|
|
charMapper.Add("SF080000", "\u00C3");
|
|
charMapper.Add("SF100000", "\u00C4");
|
|
charMapper.Add("SF050000", "\u00C5");
|
|
charMapper.Add("SF360000", "\u00C6");
|
|
charMapper.Add("SF370000", "\u00C7");
|
|
charMapper.Add("SF380000", "\u00C8");
|
|
charMapper.Add("SF390000", "\u00C9");
|
|
charMapper.Add("SF400000", "\u00CA");
|
|
charMapper.Add("SF410000", "\u00CB");
|
|
charMapper.Add("SF420000", "\u00CC");
|
|
charMapper.Add("SF430000", "\u00CD");
|
|
charMapper.Add("SF440000", "\u00CE");
|
|
charMapper.Add("SF450000", "\u00CF");
|
|
charMapper.Add("SF460000", "\u00D0");
|
|
charMapper.Add("SF470000", "\u00D1");
|
|
charMapper.Add("SF480000", "\u00D2");
|
|
charMapper.Add("SF490000", "\u00D3");
|
|
charMapper.Add("SF500000", "\u00D4");
|
|
charMapper.Add("SF510000", "\u00D5");
|
|
charMapper.Add("SF520000", "\u00D6");
|
|
charMapper.Add("SF530000", "\u00D7");
|
|
charMapper.Add("SF540000", "\u00D8");
|
|
charMapper.Add("SF040000", "\u00D9");
|
|
charMapper.Add("SF010000", "\u00DA");
|
|
charMapper.Add("block", "\u00DB");
|
|
charMapper.Add("dnblock", "\u00DC");
|
|
charMapper.Add("lfblock", "\u00DD");
|
|
charMapper.Add("rtblock", "\u00DE");
|
|
charMapper.Add("upblock", "\u00DF");
|
|
charMapper.Add("space0", "\u0000");
|
|
charMapper.Add("vga1", "\u0001");
|
|
charMapper.Add("vga2", "\u0002");
|
|
charMapper.Add("vga3", "\u0003");
|
|
charMapper.Add("vga4", "\u0004");
|
|
charMapper.Add("vga5", "\u0005");
|
|
charMapper.Add("vga6", "\u0006");
|
|
charMapper.Add("vga7", "\u0007");
|
|
charMapper.Add("vga8", "\u0008");
|
|
charMapper.Add("vga9", "\u0009");
|
|
charMapper.Add("vga10", "\u000A");
|
|
charMapper.Add("vga11", "\u000B");
|
|
charMapper.Add("vga12", "\u000C");
|
|
charMapper.Add("vga13", "\u000D");
|
|
charMapper.Add("vga14", "\u000E");
|
|
charMapper.Add("vga15", "\u000F");
|
|
charMapper.Add("righttriangle", "\u0010");
|
|
charMapper.Add("lefttriangle", "\u0011");
|
|
charMapper.Add("updownarrow", "\u0012");
|
|
charMapper.Add("vga19", "\u0013");
|
|
charMapper.Add("paragraph", "\u0014");
|
|
charMapper.Add("section", "\u0015");
|
|
charMapper.Add("vga22", "\u0016");
|
|
charMapper.Add("vga23", "\u0017");
|
|
charMapper.Add("uparrow", "\u0018");
|
|
charMapper.Add("downarrow", "\u0019");
|
|
charMapper.Add("vga26", "\u001A");
|
|
charMapper.Add("vga27", "\u001B");
|
|
charMapper.Add("vga28", "\u001C");
|
|
charMapper.Add("vga29", "\u001D");
|
|
charMapper.Add("vga30", "\u001E");
|
|
charMapper.Add("vga31", "\u001F");
|
|
charMapper.Add("apostrophe", "\u0027");
|
|
charMapper.Add("minus", "\u002D");
|
|
charMapper.Add("vga127", "\u007F");
|
|
charMapper.Add("Ccedilla", "\u0080");
|
|
charMapper.Add("udiaeresis", "\u0081");
|
|
charMapper.Add("eacute", "\u0082");
|
|
charMapper.Add("acircumflex", "\u0083");
|
|
charMapper.Add("adiaeresis", "\u0084");
|
|
charMapper.Add("agrave", "\u0085");
|
|
charMapper.Add("aring", "\u0086");
|
|
charMapper.Add("ccedilla", "\u0087");
|
|
charMapper.Add("ecircumflex", "\u0088");
|
|
charMapper.Add("ediaeresis", "\u0089");
|
|
charMapper.Add("egrave", "\u008A");
|
|
charMapper.Add("idiaeresis", "\u008B");
|
|
charMapper.Add("icircumflex", "\u008C");
|
|
charMapper.Add("igrave", "\u008D");
|
|
charMapper.Add("Adiaeresis", "\u008E");
|
|
charMapper.Add("Aring", "\u008F");
|
|
charMapper.Add("Eacute", "\u0090");
|
|
charMapper.Add("ae", "\u0091");
|
|
charMapper.Add("AE", "\u0092");
|
|
charMapper.Add("ocircumflex", "\u0093");
|
|
charMapper.Add("odiaeresis", "\u0094");
|
|
charMapper.Add("ograve", "\u0095");
|
|
charMapper.Add("ucircumflex", "\u0096");
|
|
charMapper.Add("ugrave", "\u0097");
|
|
charMapper.Add("ydiaeresis", "\u0098");
|
|
charMapper.Add("Odiaeresis", "\u0099");
|
|
charMapper.Add("Udiaeresis", "\u009A");
|
|
charMapper.Add("cent", "\u009B");
|
|
charMapper.Add("sterling", "\u009C");
|
|
charMapper.Add("yen", "\u009D");
|
|
charMapper.Add("vga158", "\u009E");
|
|
charMapper.Add("vga159", "\u009F");
|
|
charMapper.Add("aacute", "\u00A0");
|
|
charMapper.Add("iacute", "\u00A1");
|
|
charMapper.Add("oacute", "\u00A2");
|
|
charMapper.Add("uacute", "\u00A3");
|
|
charMapper.Add("vga164", "\u00A4");
|
|
charMapper.Add("vga165", "\u00A5");
|
|
charMapper.Add("vga166", "\u00A6");
|
|
charMapper.Add("vga167", "\u00A7");
|
|
charMapper.Add("questiondown", "\u00A8");
|
|
charMapper.Add("hook", "\u00A9");
|
|
charMapper.Add("notsign", "\u00AA");
|
|
charMapper.Add("onehalf", "\u00AB");
|
|
charMapper.Add("onequarter", "\u00AC");
|
|
charMapper.Add("exclamdown", "\u00AD");
|
|
charMapper.Add("guillemotleft", "\u00AE");
|
|
charMapper.Add("guillemotright", "\u00AF");
|
|
charMapper.Add("raster1", "\u00B0");
|
|
charMapper.Add("raster2", "\u00B1");
|
|
charMapper.Add("raster3", "\u00B2");
|
|
charMapper.Add("udline", "\u00B3");
|
|
charMapper.Add("udlline", "\u00B4");
|
|
charMapper.Add("udLline", "\u00B5");
|
|
charMapper.Add("UDlline", "\u00B6");
|
|
charMapper.Add("Dlline", "\u00B7");
|
|
charMapper.Add("dLline", "\u00B8");
|
|
charMapper.Add("UDLline", "\u00B9");
|
|
charMapper.Add("UDline", "\u00BA");
|
|
charMapper.Add("DLline", "\u00BB");
|
|
charMapper.Add("ULline", "\u00BC");
|
|
charMapper.Add("Ulline", "\u00BD");
|
|
charMapper.Add("uLline", "\u00BE");
|
|
charMapper.Add("dlline", "\u00BF");
|
|
charMapper.Add("urlline", "\u00C1");
|
|
charMapper.Add("rdlline", "\u00C2");
|
|
charMapper.Add("urdline", "\u00C3");
|
|
charMapper.Add("rlline", "\u00C4");
|
|
charMapper.Add("urdlline", "\u00C5");
|
|
charMapper.Add("uRdline", "\u00C6");
|
|
charMapper.Add("UrDline", "\u00C7");
|
|
charMapper.Add("URline", "\u00C8");
|
|
charMapper.Add("RDline", "\u00C9");
|
|
charMapper.Add("URLline", "\u00CA");
|
|
charMapper.Add("RDLline", "\u00CB");
|
|
charMapper.Add("URDline", "\u00CC");
|
|
charMapper.Add("RLline", "\u00CD");
|
|
charMapper.Add("URDLline", "\u00CE");
|
|
charMapper.Add("uRLline", "\u00CF");
|
|
charMapper.Add("Urlline", "\u00D0");
|
|
charMapper.Add("RdLline", "\u00D1");
|
|
charMapper.Add("rDlline", "\u00D2");
|
|
charMapper.Add("Urline", "\u00D3");
|
|
charMapper.Add("uRline", "\u00D4");
|
|
charMapper.Add("Rdline", "\u00D5");
|
|
charMapper.Add("rDline", "\u00D6");
|
|
charMapper.Add("UrDlline", "\u00D7");
|
|
charMapper.Add("uRdLline", "\u00D8");
|
|
charMapper.Add("urline", "\u00D9");
|
|
charMapper.Add("rdline", "\u00DA");
|
|
charMapper.Add("fullblock", "\u00DB");
|
|
charMapper.Add("bottomblock", "\u00DC");
|
|
charMapper.Add("leftblock", "\u00DD");
|
|
charMapper.Add("rightblock", "\u00DE");
|
|
charMapper.Add("topblock", "\u00DF");
|
|
charMapper.Add("vga224", "\u00E0");
|
|
charMapper.Add("vga225", "\u00E1");
|
|
charMapper.Add("vga226", "\u00E2");
|
|
charMapper.Add("vga227", "\u00E3");
|
|
charMapper.Add("vga228", "\u00E4");
|
|
charMapper.Add("vga229", "\u00E5");
|
|
charMapper.Add("vga230", "\u00E6");
|
|
charMapper.Add("vga231", "\u00E7");
|
|
charMapper.Add("vga232", "\u00E8");
|
|
charMapper.Add("vga233", "\u00E9");
|
|
charMapper.Add("vga234", "\u00EA");
|
|
charMapper.Add("vga235", "\u00EB");
|
|
charMapper.Add("vga236", "\u00EC");
|
|
charMapper.Add("vga237", "\u00ED");
|
|
charMapper.Add("vga238", "\u00EE");
|
|
charMapper.Add("vga239", "\u00EF");
|
|
charMapper.Add("isequal", "\u00F0");
|
|
charMapper.Add("plusminus", "\u00F1");
|
|
charMapper.Add("vga242", "\u00F2");
|
|
charMapper.Add("vga243", "\u00F3");
|
|
charMapper.Add("vga244", "\u00F4");
|
|
charMapper.Add("vga245", "\u00F5");
|
|
charMapper.Add("division", "\u00F6");
|
|
charMapper.Add("vga247", "\u00F7");
|
|
charMapper.Add("degree", "\u00F8");
|
|
charMapper.Add("smalldot", "\u00F9");
|
|
charMapper.Add("smallerdot", "\u00FA");
|
|
charMapper.Add("vga251", "\u00FB");
|
|
charMapper.Add("vga252", "\u00FC");
|
|
charMapper.Add("twosuperior", "\u00FD");
|
|
charMapper.Add("bullet", "\u00FE");
|
|
charMapper.Add("space255", "\u00FF");
|
|
charMapper.Add("currency", "\u00A4");
|
|
charMapper.Add("brokenbar", "\u00A6");
|
|
charMapper.Add("nonbreakingspace", "\u00A0");
|
|
charMapper.Add("dieresis", "\u0308");
|
|
charMapper.Add("copyright", "\u00A9");
|
|
charMapper.Add("ordfeminine", "\u00AA");
|
|
charMapper.Add("logicalnot", "\u00AC");
|
|
#endregion
|
|
|
|
}
|
|
|
|
private FontStyle style = FontStyle.Normal;
|
|
|
|
public static BDFFontContainer CreateFont(Stream r)
|
|
{
|
|
BDFParser parser = new BDFParser(r);
|
|
return parser.CreateFont();
|
|
}
|
|
|
|
public static int fill(int num)
|
|
{
|
|
return (1 << num + 1) - 1;
|
|
}
|
|
|
|
|
|
|
|
private BDFParser.Rectangle boundingBox = new BDFParser.Rectangle();
|
|
|
|
private String[] comments;
|
|
|
|
private int contentVersion;
|
|
|
|
private int depth = 1;
|
|
|
|
private String[] fontName;
|
|
|
|
private BDFGlyph[] glyphMapper = new BDFGlyph[ushort.MaxValue];
|
|
|
|
private BDFGlyph NotDefGlyph;
|
|
|
|
private Dictionary<String, BDFGlyph> UnknownGlyphs = new Dictionary<String, BDFGlyph>();
|
|
|
|
private BDFGlyph[] glyphs;
|
|
|
|
private String[] properties;
|
|
|
|
private BDFParser.Dimension resolution = new BDFParser.Dimension();
|
|
|
|
private BDFParser.Version version = new BDFParser.Version();
|
|
|
|
private String postScriptName;
|
|
|
|
private int size;
|
|
|
|
private String family;
|
|
|
|
public BDFFontContainer(String[] name, FontStyle style, int size)
|
|
{
|
|
postScriptName = GetPostScriptName(name);
|
|
this.style = style;
|
|
this.size = size;
|
|
this.family = name[FAMILY];
|
|
fontName = name;
|
|
}
|
|
|
|
public String getName()
|
|
{
|
|
return postScriptName;
|
|
}
|
|
|
|
public String getFamily()
|
|
{
|
|
return family;
|
|
}
|
|
|
|
public BDFParser.Rectangle getBoundingBox()
|
|
{
|
|
return boundingBox;
|
|
}
|
|
|
|
public FontStyle getStyle()
|
|
{
|
|
return style;
|
|
}
|
|
|
|
public String[] getComments()
|
|
{
|
|
return comments;
|
|
}
|
|
|
|
public int getContentVersion()
|
|
{
|
|
return contentVersion;
|
|
}
|
|
|
|
public int getDepth()
|
|
{
|
|
return depth;
|
|
}
|
|
|
|
public int getSize()
|
|
{
|
|
return size;
|
|
}
|
|
|
|
public BDFMetrics getFontMetrics()
|
|
{
|
|
return new BDFMetrics(this);
|
|
}
|
|
|
|
public BDFGlyph getGlyph(char ch)
|
|
{
|
|
BDFGlyph g = glyphMapper[(ushort)ch];
|
|
if (g == null)
|
|
{
|
|
g = NotDefGlyph;
|
|
}
|
|
return g;
|
|
}
|
|
|
|
public BDFGlyph[] getGlyphs()
|
|
{
|
|
return glyphs;
|
|
}
|
|
|
|
public String[] getProperties()
|
|
{
|
|
return properties;
|
|
}
|
|
|
|
public BDFParser.Dimension getResolution()
|
|
{
|
|
return resolution;
|
|
}
|
|
|
|
public BDFParser.Version getVersion()
|
|
{
|
|
return version;
|
|
}
|
|
|
|
public void setBoundingBox(int x, int y, int width, int height)
|
|
{
|
|
boundingBox.setBounds(x, y, width, height);
|
|
}
|
|
|
|
public void setBoundingBox(BDFParser.Rectangle boundingBox)
|
|
{
|
|
this.boundingBox = boundingBox;
|
|
}
|
|
|
|
public void setCharCount(int count)
|
|
{
|
|
glyphs = new BDFGlyph[count];
|
|
}
|
|
|
|
public void setComments(String[] comments)
|
|
{
|
|
this.comments = comments;
|
|
}
|
|
|
|
public void setContentVersion(int version)
|
|
{
|
|
this.contentVersion = version;
|
|
}
|
|
|
|
public void setDepth(int depth)
|
|
{
|
|
this.depth = depth;
|
|
}
|
|
|
|
public void setGlyphs(BDFGlyph[] glyphs)
|
|
{
|
|
this.glyphs = glyphs;
|
|
for (int i = 0; i < glyphs.Length; i++)
|
|
{
|
|
glyphs[i].init(this);
|
|
if (glyphs[i].encoding != -1)
|
|
{
|
|
glyphMapper[glyphs[i].encoding] = glyphs[i];
|
|
}
|
|
else
|
|
{
|
|
if (glyphs[i].name.ToLower() == ".notdef")
|
|
{
|
|
NotDefGlyph = glyphs[i];
|
|
}
|
|
else
|
|
{
|
|
UnknownGlyphs.Add(glyphs[i].name, glyphs[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void setMetricsSet(int set)
|
|
{
|
|
}
|
|
|
|
public void setProperties(String[] properties)
|
|
{
|
|
this.properties = properties;
|
|
}
|
|
|
|
public void setResolution(BDFParser.Dimension resolution)
|
|
{
|
|
this.resolution = resolution;
|
|
}
|
|
|
|
public void setResolution(int xres, int yres)
|
|
{
|
|
resolution.setSize(xres, yres);
|
|
}
|
|
|
|
public void setVersion(BDFParser.Version version)
|
|
{
|
|
this.version = version;
|
|
}
|
|
|
|
public void setVersion(int major, int minor)
|
|
{
|
|
version.setVersion(major, minor);
|
|
}
|
|
|
|
public static String GetPostScriptName(String[] str)
|
|
{
|
|
String strng = "";
|
|
for (int i = 0; i < str.Length; i++)
|
|
{
|
|
strng += "-";
|
|
strng += str[i];
|
|
}
|
|
return strng;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
String styleStr = ((style & FontStyle.Bold) != 0 ? "Bold " : "") + ((style & FontStyle.Italic) != 0 ? "Italic" : "");
|
|
|
|
if ("" == styleStr)
|
|
{
|
|
styleStr = "Normal";
|
|
}
|
|
|
|
return "BDFFontContainer [name=" + fontName[FAMILY] + ", style=" + styleStr + ", size=" + size + "pt, depth=" + depth + "bpp]";
|
|
}
|
|
}
|
|
}
|