115 lines
3.8 KiB
C#
115 lines
3.8 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Drawing;
|
|||
|
using System.Drawing.Text;
|
|||
|
using System.Drawing.Drawing2D;
|
|||
|
using OpenTK;
|
|||
|
using OpenTK.Graphics.OpenGL;
|
|||
|
using OpenTK.Input;
|
|||
|
using System.Diagnostics;
|
|||
|
|
|||
|
namespace LayoutBXLYT
|
|||
|
{
|
|||
|
public class Textbox
|
|||
|
{
|
|||
|
public int GlyphsPerLine = 16;
|
|||
|
public int GlyphLineCount = 16;
|
|||
|
public int GlyphWidth = 11;
|
|||
|
public int GlyphHeight = 22;
|
|||
|
|
|||
|
public int CharXSpacing = 11;
|
|||
|
|
|||
|
public int AtlasOffsetX = -3, AtlassOffsetY = -1;
|
|||
|
public int FontSize = 14;
|
|||
|
public bool BitmapFont = false;
|
|||
|
public string FromFile; //= "joystix monospace.ttf";
|
|||
|
public string FontName = "Consolas";
|
|||
|
|
|||
|
public Textbox()
|
|||
|
{
|
|||
|
GenerateFontImage();
|
|||
|
}
|
|||
|
|
|||
|
void GenerateFontImage()
|
|||
|
{
|
|||
|
int bitmapWidth = GlyphsPerLine * GlyphWidth;
|
|||
|
int bitmapHeight = GlyphLineCount * GlyphHeight;
|
|||
|
|
|||
|
using (Bitmap bitmap = new Bitmap(bitmapWidth, bitmapHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
|
|||
|
{
|
|||
|
Font font;
|
|||
|
if (!String.IsNullOrWhiteSpace(FromFile))
|
|||
|
{
|
|||
|
var collection = new PrivateFontCollection();
|
|||
|
collection.AddFontFile(FromFile);
|
|||
|
var fontFamily = new FontFamily(Path.GetFileNameWithoutExtension(FromFile), collection);
|
|||
|
font = new Font(fontFamily, FontSize);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
font = new Font(new FontFamily(FontName), FontSize);
|
|||
|
}
|
|||
|
|
|||
|
using (var g = Graphics.FromImage(bitmap))
|
|||
|
{
|
|||
|
if (BitmapFont)
|
|||
|
{
|
|||
|
g.SmoothingMode = SmoothingMode.None;
|
|||
|
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g.SmoothingMode = SmoothingMode.HighQuality;
|
|||
|
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
|
|||
|
//g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
|
|||
|
}
|
|||
|
|
|||
|
for (int p = 0; p < GlyphLineCount; p++)
|
|||
|
{
|
|||
|
for (int n = 0; n < GlyphsPerLine; n++)
|
|||
|
{
|
|||
|
char c = (char)(n + p * GlyphsPerLine);
|
|||
|
g.DrawString(c.ToString(), font, Brushes.White,
|
|||
|
n * GlyphWidth + AtlasOffsetX, p * GlyphHeight + AtlassOffsetY);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// bitmap.Save(FontBitmapFilename);
|
|||
|
}
|
|||
|
// Process.Start(FontBitmapFilename);
|
|||
|
}
|
|||
|
|
|||
|
int TextureWidth;
|
|||
|
int TextureHeight;
|
|||
|
|
|||
|
public void DrawText(int x, int y, string text)
|
|||
|
{
|
|||
|
GL.Begin(PrimitiveType.Quads);
|
|||
|
|
|||
|
float u_step = (float)GlyphWidth / (float)TextureWidth;
|
|||
|
float v_step = (float)GlyphHeight / (float)TextureHeight;
|
|||
|
|
|||
|
for (int n = 0; n < text.Length; n++)
|
|||
|
{
|
|||
|
char idx = text[n];
|
|||
|
float u = (float)(idx % GlyphsPerLine) * u_step;
|
|||
|
float v = (float)(idx / GlyphsPerLine) * v_step;
|
|||
|
|
|||
|
GL.TexCoord2(u, v);
|
|||
|
GL.Vertex2(x, y);
|
|||
|
GL.TexCoord2(u + u_step, v);
|
|||
|
GL.Vertex2(x + GlyphWidth, y);
|
|||
|
GL.TexCoord2(u + u_step, v + v_step);
|
|||
|
GL.Vertex2(x + GlyphWidth, y + GlyphHeight);
|
|||
|
GL.TexCoord2(u, v + v_step);
|
|||
|
GL.Vertex2(x, y + GlyphHeight);
|
|||
|
|
|||
|
x += CharXSpacing;
|
|||
|
}
|
|||
|
|
|||
|
GL.End();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|