diff --git a/Source/OpenTK/Fonts/Glyph.cs b/Source/OpenTK/Fonts/Glyph.cs new file mode 100644 index 00000000..d4008761 --- /dev/null +++ b/Source/OpenTK/Fonts/Glyph.cs @@ -0,0 +1,141 @@ +#region --- License --- +/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos + * See license.txt for license info + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; + +namespace OpenTK.Fonts +{ + /// + /// Represents a single character of a specific Font. + /// + public class Glyph : IPackable + { + char character; + Font font; + int width; + static Bitmap bmp = new Bitmap(1, 1); + object obj = new object(); + + #region --- Constructors --- + + /// + /// Constructs a new Glyph that represents the given character and Font. + /// + /// The character to represent. + /// The Font of the character. + public Glyph(char c, Font f) + { + if (f == null) + throw new ArgumentNullException("f", "You must specify a valid font"); + character = c; + font = f; + } + + #endregion + + #region public char Character + + /// + /// Gets the character represented by this Glyph. + /// + public char Character + { + get { return character; } + private set { character = value; } + } + + #endregion + + #region public Font Font + + /// + /// Gets the Font of this Glyph. + /// + public Font Font + { + get { return font; } + private set + { + if (value == null) + throw new ArgumentNullException("Font", "Glyph font cannot be null"); + + font = value; + } + } + + #endregion + + #region IPackable Members + + /// + /// Gets an integer representing the width of the Glyph in pixels. + /// + public int Width + { + get + { + if (width == 0) + { + lock (obj) + using (Graphics gfx = Graphics.FromImage(bmp)) + { + float w = gfx.MeasureString(Character.ToString(), font).Width; + width = (int)System.Math.Ceiling(w); + } + } + + return width; + } + } + + /// + /// Gets an integer representing the height of the Glyph in pixels. + /// + public int Height + { + get + { + return font.Height; + } + } + + #endregion + + public override bool Equals(object obj) + { + if (obj is Glyph) + return this.Equals((Glyph)obj); + return base.Equals(obj); + } + + public override string ToString() + { + return String.Format("'{0}', {1} {2}, {3} {4}", Character, Font.Name, font.Style, font.Size, font.Unit); + } + + public override int GetHashCode() + { + return character.GetHashCode() ^ font.Style.GetHashCode() ^ font.Size.GetHashCode() ^ font.Unit.GetHashCode(); + } + + #region IEquatable Members + + /// + /// Compares the current Glyph with the given Glyph. + /// + /// The Glyph to compare to. + /// True if both Glyphs represent the same character of the same Font, false otherwise. + public bool Equals(Glyph other) + { + return Character == other.Character && Font == other.Font; + } + + #endregion + } +} diff --git a/Source/OpenTK/IPackable.cs b/Source/OpenTK/IPackable.cs new file mode 100644 index 00000000..15b04931 --- /dev/null +++ b/Source/OpenTK/IPackable.cs @@ -0,0 +1,22 @@ +#region --- License --- +/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos + * See license.txt for license info + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenTK +{ + /// + /// Represents an item that can be packed with the TexturePacker. + /// + /// The type of the packable item. + interface IPackable : IEquatable + { + int Width { get; } + int Height { get; } + } +}