Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
1de7a351fThis file is pinned to the selected release. Download the original to open it in your design tool.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
namespace MikroPic.EdaTools.v1.Base.Geometry.Fonts {
public sealed class Font {
private readonly Dictionary<char, Glyph> _glyphs = new Dictionary<char, Glyph>();
private readonly string _name;
private readonly int _ascendent;
private readonly int _height;
/// <summary>
/// Constructor privat de l'objecte
/// </summary>
/// <param name="name">Nom del font.</param>
/// <param name="height">Alçada del font.</param>
/// <param name="ascendent">Ascendent del font.</param>
/// <param name="glyphs">Llista de figures.</param>
///
private Font(string name, int height, int ascendent, IEnumerable<Glyph> glyphs) {
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException(nameof(name));
_name = name;
_height = height;
_ascendent = ascendent;
foreach (var glyph in glyphs)
_glyphs.Add(glyph.Code, glyph);
}
/// <summary>
/// Crea un font des d'un arxiu.
/// </summary>
/// <param name="fileName">Nom del fitxer.</param>
/// <returns>L'objecte 'VectorFont' creat</returns>
///
public static Font Load(string fileName) {
using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
return Load(stream);
}
/// <summary>
/// Carrega un font des d'un stream.
/// </summary>
/// <param name="stream">En stream.</param>
/// <returns>L'objecte 'VectorFont'</returns>
///
public static Font Load(Stream stream) {
var doc = new XmlDocument();
doc.Load(stream);
XmlNode fontNode = doc.SelectSingleNode("/resources/fontResource/font");
string name = fontNode.Attributes["name"].Value;
int height = XmlConvert.ToInt32(fontNode.Attributes["height"].Value);
int ascendent = XmlConvert.ToInt32(fontNode.Attributes["ascent"].Value);
int descendent = XmlConvert.ToInt32(fontNode.Attributes["descent"].Value);
var glyphs = new List<Glyph>();
foreach (XmlNode charNode in fontNode.SelectNodes("char")) {
string codeStr = charNode.Attributes["code"].Value;
char code;
if (codeStr.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase))
code = Convert.ToChar(UInt16.Parse(codeStr.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture));
else
code = Convert.ToChar(UInt16.Parse(codeStr));
int advance = XmlConvert.ToInt32(charNode.Attributes["advance"].Value);
List<GlyphTrace> traces = new List<GlyphTrace>();
foreach (XmlNode strokeNode in charNode.SelectNodes("glyph/*")) {
string positionStr = strokeNode.Attributes["position"].Value;
string[] s = positionStr.Split(',');
int x = XmlConvert.ToInt32(s[0]);
int y = XmlConvert.ToInt32(s[1]);
EdaPoint position = new EdaPoint(x, y);
switch (strokeNode.Name) {
case "moveTo":
traces.Add(new GlyphTrace(position, false));
break;
case "lineTo":
traces.Add(new GlyphTrace(position, true));
break;
}
}
glyphs.Add(new Glyph(code, advance, traces.ToArray()));
}
return new Font(name, height, ascendent, glyphs);
}
/// <summary>
/// Salva el font en un fitxer
/// </summary>
/// <param name="fileName">Nom del fitxer.</param>
///
public void Save(string fileName) {
using (Stream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
Save(stream);
}
/// <summary>
/// Salva el font en un stream.
/// </summary>
/// <param name="stream">El stream.</param>
///
public void Save(Stream stream) {
XmlWriterSettings settings = new XmlWriterSettings();
XmlWriter writer = XmlWriter.Create(stream, settings);
writer.WriteStartDocument();
writer.WriteStartElement("resources");
writer.WriteStartElement("fontResource");
writer.WriteAttributeString("version", "2.1");
writer.WriteAttributeString("resourceId", "Eda-Tools default stroke font");
writer.WriteStartElement("font");
writer.WriteAttributeString("name", "");
writer.WriteAttributeString("height", "");
writer.WriteAttributeString("ascend", "");
writer.WriteAttributeString("descend", "");
foreach (KeyValuePair<char, Glyph> kv in _glyphs) {
Glyph glyph = kv.Value;
writer.WriteStartElement("char");
writer.WriteAttributeString("code", XmlConvert.ToString(glyph.Code));
writer.WriteAttributeString("advance", XmlConvert.ToString(glyph.Advance));
writer.WriteStartElement("glyph");
bool first = true;
foreach (GlyphTrace trace in glyph.Traces) {
if (first || !trace.Stroke)
writer.WriteStartElement("moveTo");
else
writer.WriteStartElement("lineTo");
writer.WriteAttributeString("position", String.Format("{0}, {1}", XmlConvert.ToString(trace.Position.X), XmlConvert.ToString(trace.Position.Y)));
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
/// <summary>
/// Obte la figura d'un caracter concret.
/// </summary>
/// <param name="code">Codi del caracter.</param>
/// <returns>La figura.</returns>
///
public Glyph GetGlyph(char code) {
Glyph glyph;
if (_glyphs.TryGetValue(code, out glyph))
return glyph;
else
return null;
}
/// <summary>
/// Obte el nom del font.
/// </summary>
///
public string Name {
get {
return _name;
}
}
/// <summary>
/// Obte l'alçada del font.
/// </summary>
///
public int Height {
get {
return _height;
}
}
/// <summary>
/// Obte l'ascendent del font.
/// </summary>
///
public int Ascendent {
get {
return _ascendent;
}
}
}
}