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 charMapper = new Dictionary(); 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 UnknownGlyphs = new Dictionary(); 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]"; } } }