summaryrefslogtreecommitdiff
path: root/script-editor/FontFile.cs
diff options
context:
space:
mode:
Diffstat (limited to 'script-editor/FontFile.cs')
-rw-r--r--script-editor/FontFile.cs117
1 files changed, 117 insertions, 0 deletions
diff --git a/script-editor/FontFile.cs b/script-editor/FontFile.cs
new file mode 100644
index 0000000..8bbf61e
--- /dev/null
+++ b/script-editor/FontFile.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Xml;
+
+namespace VPScriptEditor
+{
+ public class FontFile
+ {
+ private Dictionary<char, int> data;
+ private Symbol[] glyphs;
+ private Bitmap[] bitmaps;
+
+ private class Symbol
+ {
+ private bool[,] data;
+ private int width;
+ private char text;
+
+ public char getText()
+ {
+ return text;
+ }
+
+ public bool getXY(int x, int y)
+ {
+ return data[x, y];
+ }
+
+ public int getWidth()
+ {
+ return width;
+ }
+
+ public Symbol(XmlAttributeCollection attrs)
+ {
+ data = new bool[12, 12];
+
+ for (int i = 0; i < attrs.Count; i++)
+ {
+ switch (attrs[i].Name)
+ {
+ case "Width":
+ width = int.Parse(attrs[i].Value);
+ break;
+
+ case "Data":
+ byte[] bdata = Convert.FromBase64String(attrs[i].Value);
+
+ for (int y = 0; y < 12; y++)
+ {
+ int curr = bdata[y * 2 + 1] * 256 + bdata[y * 2];
+ for (int x = 0; x < 12; x++)
+ if ((curr & (0x8000 >> x)) > 0)
+ data[x, y] = true;
+ else
+ data[x, y] = false;
+ }
+
+ break;
+
+ case "Text":
+ if (attrs[i].Value.Length != 1)
+ throw new Exception("Invalid database");
+
+ text = attrs[i].Value[0];
+ break;
+
+ default:
+ throw new Exception(("Wrong Font XML Format - Unknown attribute: " + attrs[i].Name));
+ }
+
+ }
+ }
+ }
+
+ public FontFile(System.IO.StreamReader file, Color color)
+ {
+ XmlDocument fontXml = new XmlDocument();
+ fontXml.Load(file);
+ XmlNodeList fontNode = fontXml.GetElementsByTagName("Symbol");
+ glyphs = new Symbol[fontNode.Count + 1];
+ bitmaps = new Bitmap[fontNode.Count + 1];
+ data = new Dictionary<char, int>();
+ for (int i = 0; i < fontNode.Count; i++)
+ {
+ glyphs[i] = new Symbol(fontNode[i].Attributes);
+ data.Add(glyphs[i].getText(), i);
+ bitmaps[i] = new Bitmap(glyphs[i].getWidth(), 12);
+ for (int y = 0; y < 12; y++)
+ for (int x = 0; x < glyphs[i].getWidth(); x++)
+ if (glyphs[i].getXY(x, y))
+ bitmaps[i].SetPixel(x, y, color);
+ }
+ }
+
+ public bool containsSymbol(char symbol)
+ {
+ return data.ContainsKey(symbol);
+ }
+
+ public int getSymbolWidth(char symbol)
+ {
+ return glyphs[data[symbol]].getWidth();
+ }
+
+ public bool getSymbolXY(char symbol, int x, int y)
+ {
+ return glyphs[data[symbol]].getXY(x, y);
+ }
+
+ public Bitmap getBitmap(char symbol)
+ {
+ return bitmaps[data[symbol]];
+ }
+ }
+} \ No newline at end of file