#region --- License --- /* Licensed under the MIT/X11 license. * Copyright (c) 2006-2008 the OpenTK Team. * This notice may not be removed from any source distribution. * See license.txt for licensing details. */ #endregion using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Text.RegularExpressions; using System.Runtime.InteropServices; using System.Diagnostics; using OpenTK.Math; using OpenTK.Graphics; using OpenTK.Graphics.Text; using OpenTK.Platform; namespace OpenTK.Fonts { } namespace OpenTK.Graphics { /// /// Provides methods to perform layout and print hardware accelerated text. /// public sealed class TextPrinter : ITextPrinter { #region Fields IGlyphRasterizer glyph_rasterizer; ITextOutputProvider text_output; TextQuality text_quality; bool disposed; #endregion #region Constructors /// /// Constructs a new TextPrinter instance. /// public TextPrinter() : this(null, null, TextQuality.Default) { } /// /// Constructs a new TextPrinter instance with the specified TextQuality level. /// /// The desired TextQuality of this TextPrinter. public TextPrinter(TextQuality quality) : this(null, null, quality) { } TextPrinter(IGlyphRasterizer rasterizer, ITextOutputProvider output, TextQuality quality) { glyph_rasterizer = rasterizer; text_output = output; text_quality = quality; } #endregion #region ITextPrinter Members #region Print /// /// Prints text using the specified color and layout options. /// /// The System.String to print. /// The System.Drawing.Font that will be used to print text. /// The System.Drawing.Color that will be used to print text. public void Print(string text, Font font, Color color) { Print(text, font, color, RectangleF.Empty, TextPrinterOptions.Default, TextAlignment.Near, TextDirection.LeftToRight); } /// /// Prints text using the specified color and layout options. /// /// The System.String to print. /// The System.Drawing.Font that will be used to print text. /// The System.Drawing.Color that will be used to print text. /// The System.Drawing.Rectangle that defines the bounds for text layout. public void Print(string text, Font font, Color color, RectangleF rect) { Print(text, font, color, rect, TextPrinterOptions.Default, TextAlignment.Near, TextDirection.LeftToRight); } /// /// Prints text using the specified color and layout options. /// /// The System.String to print. /// The System.Drawing.Font that will be used to print text. /// The System.Drawing.Color that will be used to print text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// The OpenTK.Graphics.TextPrinterOptions that will be used to print text. public void Print(string text, Font font, Color color, RectangleF rect, TextPrinterOptions options) { Print(text, font, color, rect, options, TextAlignment.Near, TextDirection.LeftToRight); } /// /// Prints text using the specified color and layout options. /// /// The System.String to print. /// The System.Drawing.Font that will be used to print text. /// The System.Drawing.Color that will be used to print text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// The OpenTK.Graphics.TextPrinterOptions that will be used to print text. /// The OpenTK.Graphics.TextAlignment that will be used to print text. public void Print(string text, Font font, Color color, RectangleF rect, TextPrinterOptions options, TextAlignment alignment) { Print(text, font, color, rect, options, alignment, TextDirection.LeftToRight); } /// /// Prints text using the specified color and layout options. /// /// The System.String to print. /// The System.Drawing.Font that will be used to print text. /// The System.Drawing.Color that will be used to print text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// The OpenTK.Graphics.TextPrinterOptions that will be used to print text. /// The OpenTK.Graphics.TextAlignment that will be used to print text. /// The OpenTK.Graphics.TextDirection that will be used to print text. public void Print(string text, Font font, Color color, RectangleF rect, TextPrinterOptions options, TextAlignment alignment, TextDirection direction) { if (disposed) throw new ObjectDisposedException(this.GetType().ToString()); if (!ValidateParameters(text, font, rect)) return; TextOutput.Print(new TextBlock(text, font, rect, options, alignment, direction), color, Rasterizer); } #endregion #region Measure /// /// Measures text using the specified layout options. /// /// The System.String to measure. /// The System.Drawing.Font that will be used to measure text. /// An OpenTK.Graphics.TextExtents instance that contains the results of the measurement. public TextExtents Measure(string text, Font font) { return Measure(text, font, RectangleF.Empty, TextPrinterOptions.Default, TextAlignment.Near, TextDirection.LeftToRight); } /// /// Measures text using the specified layout options. /// /// The System.String to measure. /// The System.Drawing.Font that will be used to measure text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// An OpenTK.Graphics.TextExtents instance that contains the results of the measurement. public TextExtents Measure(string text, Font font, RectangleF rect) { return Measure(text, font, rect, TextPrinterOptions.Default, TextAlignment.Near, TextDirection.LeftToRight); } /// /// Measures text using the specified layout options. /// /// The System.String to measure. /// The System.Drawing.Font that will be used to measure text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// The OpenTK.Graphics.TextPrinterOptions that will be used to measure text. /// An OpenTK.Graphics.TextExtents instance that contains the results of the measurement. public TextExtents Measure(string text, Font font, RectangleF rect, TextPrinterOptions options) { return Measure(text, font, rect, options, TextAlignment.Near, TextDirection.LeftToRight); } /// /// Measures text using the specified layout options. /// /// The System.String to measure. /// The System.Drawing.Font that will be used to measure text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// The OpenTK.Graphics.TextPrinterOptions that will be used to measure text. /// The OpenTK.Graphics.TextAlignment that will be used to measure text. /// An OpenTK.Graphics.TextExtents instance that contains the results of the measurement. public TextExtents Measure(string text, Font font, RectangleF rect, TextPrinterOptions options, TextAlignment alignment) { return Measure(text, font, rect, options, alignment, TextDirection.LeftToRight); } /// /// Measures text using the specified layout options. /// /// The System.String to measure. /// The System.Drawing.Font that will be used to measure text. /// The System.Drawing.Rectangle that defines the bounds for text layout. /// The OpenTK.Graphics.TextPrinterOptions that will be used to measure text. /// The OpenTK.Graphics.TextAlignment that will be used to measure text. /// The OpenTK.Graphics.TextDirection that will be used to measure text. /// An OpenTK.Graphics.TextExtents instance that contains the results of the measurement. public TextExtents Measure(string text, Font font, RectangleF rect, TextPrinterOptions options, TextAlignment alignment, TextDirection direction) { if (disposed) throw new ObjectDisposedException(this.GetType().ToString()); if (!ValidateParameters(text, font, rect)) return TextExtents.Empty; return Rasterizer.MeasureText(new TextBlock(text, font, rect, options, alignment, direction)); } #endregion #region Clear() public void Clear() { if (disposed) throw new ObjectDisposedException(this.GetType().ToString()); TextOutput.Clear(); Rasterizer.Clear(); } #endregion #region Obsolete /// /// Sets up OpenGL state for drawing text. /// [Obsolete] public void Begin() { if (disposed) throw new ObjectDisposedException(this.GetType().ToString()); GraphicsContext.Assert(); float[] viewport = new float[4]; GL.GetFloat(GetPName.Viewport, viewport); // Prepare to draw text. We want pixel perfect precision, so we setup a 2D mode, // with size equal to the window (in pixels). // While we could also render text in 3D mode, it would be very hard to get // pixel-perfect precision. GL.MatrixMode(MatrixMode.Projection); GL.PushMatrix(); GL.LoadIdentity(); GL.Ortho(viewport[0], viewport[2], viewport[3], viewport[1], -1.0, 1.0); GL.MatrixMode(MatrixMode.Modelview); GL.PushMatrix(); GL.LoadIdentity(); } /// /// Restores OpenGL state. /// [Obsolete] public void End() { if (disposed) throw new ObjectDisposedException(this.GetType().ToString()); GraphicsContext.Assert(); GL.MatrixMode(MatrixMode.Modelview); GL.PopMatrix(); GL.MatrixMode(MatrixMode.Projection); GL.PopMatrix(); } [Obsolete("Use TextPrinter.Print instead")] public void Draw(TextHandle handle) { Print(handle.Text, handle.GdiPFont, Color.White); } [Obsolete("Use TextPrinter.Print instead")] public void Draw(string text, TextureFont font) { Print(text, font.font, Color.White); } [Obsolete("Use TextPrinter.Print instead")] public void Prepare(string text, TextureFont font, out TextHandle handle) { handle = new TextHandle(text, font.font); } #endregion #endregion #region Private Members IGlyphRasterizer Rasterizer { get { if (glyph_rasterizer == null) glyph_rasterizer = new GdiPlusGlyphRasterizer(); return glyph_rasterizer; } } ITextOutputProvider TextOutput { get { if (text_output == null) text_output = GL1TextOutputProvider.Create(text_quality); return text_output; } } #endregion #region Static Members static bool ValidateParameters(string text, Font font, RectangleF rect) { if (String.IsNullOrEmpty(text)) return false; if (font == null) throw new ArgumentNullException("font"); if (rect.Width < 0 || rect.Height < 0) throw new ArgumentOutOfRangeException("size"); return true; } #endregion #region IDisposable Members /// /// Frees the resources consumed by this TextPrinter object. /// public void Dispose() { if (!disposed) { TextOutput.Dispose(); disposed = true; } } #endregion } }