Files
McBitFont/McBitFont/FontTester.cs

206 lines
8.0 KiB
C#

using MessagePack;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace McBitFont {
public partial class FontTester : Form {
private int codepage = 1251;
private int height;
private List<MainForm.FrameMiniature> frames;
private int baseline;
private readonly int absentWidth = 5;
private readonly int pixelOffset = 5;
private int baselineThickness = 1;
private byte[] encoded = [];
private int cellSize;
private int width;
private readonly DataFormats.Format clpbFormat = DataFormats.GetFormat("McBitFontFrame");
public FontTester(int codepage, int height, int baseline, List<MainForm.FrameMiniature> frames) {
InitializeComponent();
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
this.codepage = codepage;
this.height = height;
this.baseline = baseline;
this.frames = frames;
}
private void FontTester_Load(object sender, EventArgs e) {
cbZoom.SelectedIndex = 2;
//cbZoom.SelectedIndexChanged += ZoomChanged;
dotPanel.MouseWheel += new MouseEventHandler(DotPanel_MouseWheel);
}
private void PaintPixels(object sender, PaintEventArgs e) {
Graphics g = dotPanel.CreateGraphics();
SolidBrush sbb = new SolidBrush(Color.Black);
SolidBrush sbw = new SolidBrush(Color.White);
SolidBrush sbp = new SolidBrush(Color.LightPink);
SolidBrush sb;
Pen blackPen = new(Color.Black);
Pen bluePen = new(Color.FromArgb(100, 20, 20, 200), baselineThickness);
int x, y, i, j;
// Sycle through ecoded bytes of test text
int space = (int)nudSpace.Value;
int index = 0;
for (int c = 0; c < encoded.Length; c++) {
// Check if we have such symbol
var f = frames.FindAll(x => x.code == encoded[c]);
if (f.Count == 1) {
// Draw the symbol
for (i = 0; i < f[0].width; i++) {
x = pixelOffset + (index + i) * cellSize - hScroll.Value;
for (j = 0; j < f[0].height; j++) {
y = pixelOffset + j * cellSize - vScroll.Value;
// Fill the cell with color
if (f[0].data[i, j]) sb = sbb;
else sb = sbw;
g.FillRectangle(sb, x, y, cellSize, cellSize);
}
}
index += (f[0].width > 0 ? f[0].width + space : 0);
} else {
blackPen.Width = cellSize;
blackPen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
x = pixelOffset + index * cellSize - hScroll.Value;
y = pixelOffset - vScroll.Value;
g.DrawRectangle(blackPen, x, y + cellSize, absentWidth * cellSize, (height - 2) * cellSize);
g.FillRectangle(sbp, x + cellSize, y + 2 * cellSize, (absentWidth - 2) * cellSize, (height - 4) * cellSize);
index += 5 + space;
}
}
// Draw baseline
if (chkBaseline.Checked && baseline > 0) {
x = pixelOffset - hScroll.Value;
y = pixelOffset + baseline * cellSize - vScroll.Value;
g.DrawLine(bluePen, x, y, dotPanel.Width - 2 * pixelOffset, y);
}
}
private void Text_Changed(object sender, EventArgs e) {
int space = (int)nudSpace.Value;
encoded = Encoding.GetEncoding(codepage).GetBytes(tbText.Text);
width = space > 0 ? space : 1;
for (int c = 0; c < encoded.Length; c++) {
var f = frames.FindAll(x => x.code == encoded[c]);
width += (f.Count == 1 ? f[0].width : absentWidth) + space;
}
dotPanel.Invalidate();
}
private void ZoomChanged(object sender, EventArgs e) {
cellSize = Convert.ToInt32(cbZoom.Text);
int w = pixelOffset + width * cellSize;
int h = pixelOffset + height * cellSize;
if (w <= dotPanel.Width) {
hScroll.Enabled = false;
hScroll.Value = 0;
} else {
hScroll.Maximum = w - dotPanel.Width + 12;
hScroll.Minimum = 0;
hScroll.Enabled = true;
}
if (h <= dotPanel.Height) {
vScroll.Enabled = false;
vScroll.Value = 0;
} else {
vScroll.Maximum = h - dotPanel.Height + 12;
vScroll.Minimum = 0;
vScroll.Enabled = true;
}
// Baseline thickness calc
baselineThickness = cellSize / 5;
if (baselineThickness > 5) baselineThickness = 5;
if (baselineThickness < 1) baselineThickness = 1;
dotPanel.Refresh();
}
private void DotPanel_MouseWheel(object sender, MouseEventArgs e) {
int t = e.Delta / 120;
if (e.Delta == 0) return;
if (ModifierKeys.HasFlag(Keys.Control)) {
t += cbZoom.SelectedIndex;
if (t > cbZoom.Items.Count - 1) return;
if (t < 0) return;
cbZoom.SelectedIndex = t;
} else if (ModifierKeys.HasFlag(Keys.Shift)) {
if (hScroll.Enabled) {
t = t * -1 * cellSize + hScroll.Value;
if (t < hScroll.Minimum) t = hScroll.Minimum;
if (t > hScroll.Maximum) t = hScroll.Maximum;
hScroll.Value = t;
}
} else {
if (vScroll.Enabled) {
t = t * -1 * cellSize + vScroll.Value;
if (t < vScroll.Minimum) t = vScroll.Minimum;
if (t > vScroll.Maximum) t = vScroll.Maximum;
vScroll.Value = t;
}
}
}
private void Scrolling(object sender, EventArgs e) {
dotPanel.Invalidate();
}
private void Form_Resize(object sender, EventArgs e) {
btnCopy.Left = this.Width / 2 - 40;
}
private void Copy_Click(object sender, MouseEventArgs e) {
if (encoded.Length < 1) {
MessageBox.Show("Nothing to copy! Type some symbols first.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// Sycle through ecoded bytes of test text
int space = (int)nudSpace.Value;
int index = 0;
int i, j;
MainForm.FrameMiniature ff = new(0, width, frames[0].height);
for (int c = 0; c < encoded.Length; c++) {
// Check if we have such symbol
var f = frames.FindAll(x => x.code == encoded[c]);
if (f.Count == 1) {
// Draw the symbol
for (i = 0; i < f[0].width; i++) {
for (j = 0; j < f[0].height; j++) {
// Fill the frame with data
ff.data[index + i, j] = f[0].data[i, j];
}
}
index += (f[0].width > 0 ? f[0].width + space : 0);
} else {
index += 5 + space;
}
}
// Copy the frame we made into Clipboard
var bb = MessagePackSerializer.Serialize(ChangeHistory.CopyFrameSimple(ff));
DataObject clpbObj = new DataObject(clpbFormat.Name, bb);
Clipboard.SetDataObject(clpbObj, true);
}
}
}