module FontRendering // Converted to F# from the original C#. // ---- AngelCode BmFont XML serializer ---------------------- // ---- By DeadlyDan @ deadlydan@gmail.com ------------------- // ---- There's no license restrictions, use as you will. ---- // ---- Credits to http://www.angelcode.com/ ----------------- open System open System.Collections.Generic open System.IO open System.Xml.Serialization open Microsoft.Xna.Framework open Microsoft.Xna.Framework.Graphics [] type FontInfo() = let mutable _padding = Rectangle() let mutable _spacing = Point() [] member val Face = "" with get, set [] member val Size = 0 with get, set [] member val Bold = 0 with get, set [] member val Italic = 0 with get, set [] member val CharSet = "" with get, set [] member val Unicode = 0 with get, set [] member val StretchHeight = 0 with get, set [] member val Smooth = 0 with get, set [] member val SuperSampling = 0 with get, set [] member x.Padding with get() = sprintf "%d,%d,%d,%d" _padding.X _padding.Y _padding.Width _padding.Height and set(value : string) = let padding = value.Split(',') _padding <- Rectangle(Convert.ToInt32(padding.[0]), Convert.ToInt32(padding.[1]), Convert.ToInt32(padding.[2]), Convert.ToInt32(padding.[3])) [] member x.Spacing with get() = sprintf "%d,%d" _spacing.X _spacing.Y and set(value : string) = let spacing = value.Split(',') _spacing <- Point(Convert.ToInt32(spacing.[0]), Convert.ToInt32(spacing.[1])) [] member val OutLine = 0 with get, set [] type FontCommon() = [] member val LineHeight = 0 with get, set [] member val Base = 0 with get, set [] member val ScaleW = 0 with get, set [] member val ScaleH = 0 with get, set [] member val Pages = 0 with get, set [] member val Packed = 0 with get, set [] member val AlphaChannel = 0 with get, set [] member val RedChannel = 0 with get, set [] member val GreenChannel = 0 with get, set [] member val BlueChannel = 0 with get, set [] type FontPage() = [] member val ID = 0 with get, set [] member val File = "" with get, set [] type FontChar() = [] member val ID = 0 with get, set [] member val X = 0 with get, set [] member val Y = 0 with get, set [] member val Width = 0 with get, set [] member val Height = 0 with get, set [] member val XOffset = 0 with get, set [] member val YOffset = 0 with get, set [] member val XAdvance = 0 with get, set [] member val Page = 0 with get, set [] member val Channel = 0 with get, set [] type FontKerning() = [] member val First = 0 with get, set [] member val Second = 0 with get, set [] member val Amount = 0 with get, set [] [] type FontFile() = [] member val Info = Unchecked.defaultof with get, set [] member val Common = Unchecked.defaultof with get, set [] [] member val Pages = Unchecked.defaultof> with get, set [] [] member val Chars = Unchecked.defaultof> with get, set [] [] member val Kernings = Unchecked.defaultof> with get, set module FontLoader = let Load(filename : string) = let deserializer = new XmlSerializer(typeof) let textReader = new StreamReader(filename) let file = deserializer.Deserialize(textReader) :?> FontFile textReader.Close() file type FontRenderer(fontFile : FontFile, fontTexture : Texture2D) = let createCharacterMap() = let result = new Dictionary() for fontCharacter in fontFile.Chars do let c = (char) fontCharacter.ID result.Add(c, fontCharacter) result let characterMap = createCharacterMap() member this.DrawText(spriteBatch : SpriteBatch, x : int, y : int, text) = let mutable dx = x let mutable dy = y for c in text do match characterMap.TryGetValue(c) with | (true, fc) -> let sourceRectangle = Rectangle(fc.X, fc.Y, fc.Width, fc.Height) let position = Vector2(single(dx + fc.XOffset), single(dy + fc.YOffset)) spriteBatch.Draw(fontTexture, position, Nullable(sourceRectangle), Color.White) dx <- dx + fc.XAdvance | (false, _) -> ()