/* private SizeF GetMaxGlyphSize(Font font) { Bitmap bmp = new Bitmap(256, 256, PixelFormat.Format24bppRgb); Graphics graph = Graphics.FromImage(bmp); SizeF maxSize = new SizeF(0f, 0f); for (int i = 0; i < charSet.Length; i++) { var charSize = graph.MeasureString("" + charSet[i], font); if (charSize.Width > maxSize.Width) maxSize.Width = charSize.Width; if (charSize.Height > maxSize.Height) maxSize.Height = charSize.Height; } graph.Dispose(); bmp.Dispose(); return maxSize; }*/ //The initial bitmap is simply a long thin strip of all glyphs in a row private Bitmap CreateInitialBitmap(Font font, SizeF maxSize, int initialMargin, out QFontGlyph[] glyphs, TextGenerationRenderHint renderHint) { glyphs = new QFontGlyph[charSet.Length]; int spacing = (int)Math.Ceiling(maxSize.Width) + 2 * initialMargin; Bitmap bmp = new Bitmap(spacing * charSet.Length, (int)Math.Ceiling(maxSize.Height) + 2 * initialMargin, PixelFormat.Format24bppRgb); Graphics graph = Graphics.FromImage(bmp); switch(renderHint){ case TextGenerationRenderHint.SizeDependent: graph.TextRenderingHint = font.Size <= 12.0f ? TextRenderingHint.ClearTypeGridFit : TextRenderingHint.AntiAlias; break; case TextGenerationRenderHint.AntiAlias: graph.TextRenderingHint = TextRenderingHint.AntiAlias; break; case TextGenerationRenderHint.AntiAliasGridFit: graph.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; break; case TextGenerationRenderHint.ClearTypeGridFit: graph.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; break; case TextGenerationRenderHint.SystemDefault: graph.TextRenderingHint = TextRenderingHint.SystemDefault; break; } int xOffset = initialMargin; for (int i = 0; i < charSet.Length; i++) { graph.DrawString("" + charSet[i], font, Brushes.White, xOffset, initialMargin); var charSize = graph.MeasureString("" + charSet[i], font); glyphs[i] = new QFontGlyph(0, new Rectangle(xOffset - initialMargin, 0, (int)charSize.Width + initialMargin * 2, (int)charSize.Height + initialMargin * 2), 0, charSet[i]); xOffset += (int)charSize.Width + initialMargin * 2; } graph.Flush(); graph.Dispose(); return bmp; }
/* * private SizeF GetMaxGlyphSize(Font font) * { * Bitmap bmp = new Bitmap(256, 256, PixelFormat.Format24bppRgb); * Graphics graph = Graphics.FromImage(bmp); * * SizeF maxSize = new SizeF(0f, 0f); * for (int i = 0; i < charSet.Length; i++) * { * var charSize = graph.MeasureString("" + charSet[i], font); * * if (charSize.Width > maxSize.Width) * maxSize.Width = charSize.Width; * * if (charSize.Height > maxSize.Height) * maxSize.Height = charSize.Height; * } * * graph.Dispose(); * bmp.Dispose(); * * return maxSize; * }*/ //The initial bitmap is simply a long thin strip of all glyphs in a row private Bitmap CreateInitialBitmap(Font font, SizeF maxSize, int initialMargin, out QFontGlyph[] glyphs, TextGenerationRenderHint renderHint) { glyphs = new QFontGlyph[charSet.Length]; int spacing = (int)Math.Ceiling(maxSize.Width) + 2 * initialMargin; Bitmap bmp = new Bitmap(spacing * charSet.Length, (int)Math.Ceiling(maxSize.Height) + 2 * initialMargin, PixelFormat.Format24bppRgb); Graphics graph = Graphics.FromImage(bmp); switch (renderHint) { case TextGenerationRenderHint.SizeDependent: graph.TextRenderingHint = font.Size <= 12.0f ? TextRenderingHint.ClearTypeGridFit : TextRenderingHint.AntiAlias; break; case TextGenerationRenderHint.AntiAlias: graph.TextRenderingHint = TextRenderingHint.AntiAlias; break; case TextGenerationRenderHint.AntiAliasGridFit: graph.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; break; case TextGenerationRenderHint.ClearTypeGridFit: graph.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; break; case TextGenerationRenderHint.SystemDefault: graph.TextRenderingHint = TextRenderingHint.SystemDefault; break; } int xOffset = initialMargin; for (int i = 0; i < charSet.Length; i++) { graph.DrawString("" + charSet[i], font, Brushes.White, xOffset, initialMargin); var charSize = graph.MeasureString("" + charSet[i], font); glyphs[i] = new QFontGlyph(0, new Rectangle(xOffset - initialMargin, 0, (int)charSize.Width + initialMargin * 2, (int)charSize.Height + initialMargin * 2), 0, charSet[i]); xOffset += (int)charSize.Width + initialMargin * 2; } graph.Flush(); graph.Dispose(); return(bmp); }
/// <summary> /// Creates the initial font bitmap. This is simply a long thin strip of all glyphs in a row /// </summary> /// <param name="font">The <see cref="IFont"/> object to build the initial bitmap from</param> /// <param name="maxSize">The maximum glyph size of the font</param> /// <param name="initialMargin">The initial bitmap margin (used for all four sides)</param> /// <param name="glyphs">A collection of <see cref="QFontGlyph"/>s corresponding to the initial bitmap</param> /// <param name="renderHint">The font rendering hint to use</param> /// <returns></returns> private Bitmap CreateInitialBitmap(IFont font, SizeF maxSize, int initialMargin, out QFontGlyph[] glyphs, TextGenerationRenderHint renderHint) { glyphs = new QFontGlyph[_charSet.Length]; int spacing = (int)Math.Ceiling(maxSize.Width) + 2 * initialMargin; Bitmap bmp = new Bitmap(spacing * _charSet.Length, (int)Math.Ceiling(maxSize.Height) + 2 * initialMargin, PixelFormat.Format24bppRgb); Graphics graph = Graphics.FromImage(bmp); switch (renderHint) { case TextGenerationRenderHint.SizeDependent: graph.TextRenderingHint = font.Size <= 12.0f ? TextRenderingHint.ClearTypeGridFit : TextRenderingHint.AntiAlias; break; case TextGenerationRenderHint.AntiAlias: graph.TextRenderingHint = TextRenderingHint.AntiAlias; break; case TextGenerationRenderHint.AntiAliasGridFit: graph.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; break; case TextGenerationRenderHint.ClearTypeGridFit: graph.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; break; case TextGenerationRenderHint.SystemDefault: graph.TextRenderingHint = TextRenderingHint.SystemDefault; break; } // enable high quality graphics graph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; graph.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; int xOffset = initialMargin; for (int i = 0; i < _charSet.Length; i++) { var offset = font.DrawString("" + _charSet[i], graph, Brushes.White, xOffset, initialMargin); var charSize = font.MeasureString("" + _charSet[i], graph); glyphs[i] = new QFontGlyph(0, new Rectangle(xOffset - initialMargin + offset.X, initialMargin + offset.Y, (int)charSize.Width + initialMargin * 2, (int)charSize.Height + initialMargin * 2), 0, _charSet[i]); xOffset += (int)charSize.Width + initialMargin * 2; } graph.Flush(); graph.Dispose(); return(bmp); }