private Program() { fvi = Assembly.GetExecutingAssembly().GetVersionInfo(); sprite = new SpriteDescriptor(); charSets = new List<string>(); fontSize = 24.0f; spacing = 1; alignment = GlyphAlignment.BestFit; forceSpace = true; maxSize = 2048; // create services services = new object[] { new XmlDocCreator(), new CharSetProvider(), new AtlasBuilder(this) }; }
public void Save(string filename, IEnumerable<Image> images, GlyphDescriptorCollection glyphs, IAtlasDescriptor descriptor, SpriteDescriptor sprite) { // convert to fully qualified path var dir = Path.GetDirectoryName(filename); string path; if (String.IsNullOrWhiteSpace(dir)) { path = Directory.GetCurrentDirectory(); } else { DirectoryInfo di = new DirectoryInfo(dir); // ensure directory exists di.Create(); path = di.FullName; } string ext = Path.GetExtension(filename); string file = Path.GetFileNameWithoutExtension(filename); string atlasBase = file + (String.IsNullOrEmpty(ext) ? ".atlas" : ext); string dataFile = Path.Combine(path, atlasBase); string spriteFile = Path.Combine(path, file) + ".sprite"; // sort by code glyphs.Sort((a, b) => (int)a.CH - (int)b.CH); // save xml var docCreator = service.GetService<IXmlDocCreator>(); if (docCreator == null) { throw new InvalidOperationException("Xml Document Creator not defeind"); } var doc = docCreator.CreateDoc(); object root = doc.AddRoot("atlas"); doc.SetAttrib(root, "glyphs", glyphs.Count); if (descriptor.UseFonts) { doc.SetAttrib(root, "fontheight", descriptor.FontHeight); } // save images int count = 0; object xi = doc.AddNode(root, "images"); foreach (var image in images) { // don't number image when we have only one image var ifile = images.Count() > 1 ? file + (count++).ToString() + ".png" : file + ".png"; object node = doc.AddNode(xi, "image"); doc.SetAttrib(node, "src", ifile); doc.SetAttrib(node, "width", image.Width); doc.SetAttrib(node, "height", image.Height); image.Save(Path.Combine(path, ifile), ImageFormat.Png); } if (descriptor.Alignment == GlyphAlignment.Grid) { doc.SetAttrib(root, "cellwidth", descriptor.GridSize.X); doc.SetAttrib(root, "cellheight", descriptor.GridSize.Y); doc.SetAttrib(root, "gridcols", descriptor.GridCells.X); doc.SetAttrib(root, "gridrows", descriptor.GridCells.Y); } #region save glyphs object glyph = doc.AddNode(root, "glyphs"); foreach (var gi in glyphs) { object node = doc.AddNode(glyph, "glyph"); doc.SetAttrib(node, "ch", (int)gi.CH); doc.SetAttrib(node, "p", gi.Page); doc.SetAttrib(node, "x", gi.X + descriptor.Spacing); doc.SetAttrib(node, "y", gi.Y + descriptor.Spacing); doc.SetAttrib(node, "w", gi.Width - descriptor.Spacing * 2); doc.SetAttrib(node, "h", gi.Height - descriptor.Spacing * 2); doc.SetAttrib(node, "a", gi.ABC.abcA); doc.SetAttrib(node, "b", gi.ABC.abcB); doc.SetAttrib(node, "c", gi.ABC.abcC); doc.SetAttrib(node, "ox", gi.Offset.X); doc.SetAttrib(node, "oy", gi.Offset.Y); if (gi.ImageInfo != null) { doc.SetAttrib(node, "name", Path.GetFileNameWithoutExtension(gi.ImageInfo.FileInfo.Name)); } } #endregion save glyphs #region save editor info object editor = doc.AddNode(root, "info"); // save atlas info object info = doc.AddNode(editor, "common"); doc.SetAttrib(info, "usefonts", descriptor.UseFonts); doc.SetAttrib(info, "useimages", descriptor.UseImages); doc.SetAttrib(info, "alignment", descriptor.Alignment); doc.SetAttrib(info, "spacing", descriptor.Spacing); doc.SetAttrib(info, "powertwo", descriptor.PowerTwo); doc.SetAttrib(info, "maxsize", descriptor.MaxSize); doc.SetAttrib(info, "makesprite", descriptor.MakeSprite); // save font info object font = doc.AddNode(editor, "font"); doc.SetAttrib(font, "name", descriptor.FontName); doc.SetAttrib(font, "size", descriptor.FontSize); doc.SetAttrib(font, "bold", descriptor.FontBold); doc.SetAttrib(font, "italic", descriptor.FontItalic); object charset = doc.AddNode(font, "charsets"); foreach (var set in descriptor.CharSets) { var attrib = Reflect.GetAttribute<DataNameAttribute>(set); object node = doc.AddNode(charset, "charset"); doc.SetAttrib(node, "name", attrib != null ? attrib.Name : set.GetType().Name); } // save sprite info if (sprite != null && descriptor.MakeSprite) { object spr = doc.AddNode(editor, "sprite"); doc.SetAttrib(spr, "rate", sprite.Rate); doc.SetAttrib(spr, "overflow", sprite.Overflow); } // save image info object img = doc.AddNode(editor, "image"); doc.SetAttrib(img, "startcode", descriptor.StartCode); object imgNode = doc.AddNode(img, "images"); foreach (var ii in descriptor.Images) { object node = doc.AddNode(imgNode, "image"); string src = ii.FileInfo.GetRelativePath(path); doc.SetAttrib(node, "src", src); doc.SetAttrib(node, "ox", ii.Offset.X); doc.SetAttrib(node, "oy", ii.Offset.Y); doc.SetAttrib(node, "code", ii.Code); doc.SetAttrib(node, "usecode", ii.HasCustomCode); doc.SetAttrib(node, "loc", ii.Location); doc.SetAttrib(node, "angle", ii.Angle); } #endregion save editor info // save it doc.Save(dataFile); if (sprite != null && descriptor.MakeSprite) { var sdoc = docCreator.CreateDoc(); object sr = sdoc.AddRoot("sprite"); sdoc.SetAttrib(sr, "rate", sprite.Rate); sdoc.SetAttrib(sr, "overflow", sprite.Overflow); // string GetRelativePath object x0 = sdoc.AddNode(sr, "elements"); foreach (var gi in glyphs) { object x1 = sdoc.AddNode(x0, "element"); sdoc.SetAttrib(x1, "src", atlasBase); sdoc.SetAttrib(x1, "index", (int)gi.CH); } sdoc.Save(spriteFile); } }