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; }
+ }
+}