Esempio n. 1
0
        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)
            };
        }
Esempio n. 2
0
        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);
            }
        }