28 Commits
v2.7 ... main

Author SHA1 Message Date
6c860943a5 mctext lib fix 2025-07-19 09:02:49 +03:00
1852c697fc mctext lib update 2025-07-19 08:11:56 +03:00
Anton Mukhin
e76132cadb Update Readme.md 2025-07-18 17:57:19 +03:00
Anton Mukhin
5948948eee Update Readme.md 2025-07-18 17:55:37 +03:00
Anton Mukhin
c4067410c5 Little readme.md update 2025-07-18 17:39:23 +03:00
fe63d1bfab TODO features:
Application:
V Export comments now respects "Code in Hex" checkbox on the main form

Bugs:
V Frame modified flag persists when switching to another frame after rejected to save previous frame
V Ctrl-C, Ctrl-V doesn't work in the Note editbox because it tries to copy/paste the frame!
V Post "Backslash" instead of \ in comments
2025-07-17 02:21:41 +03:00
Anton Mukhin
dd3309d8ea Update TODO 2025-07-15 14:49:16 +03:00
Anton Mukhin
8efbd4da55 Updated TODO (found another bug) 2025-07-15 14:27:39 +03:00
Anton Mukhin
6a6d8f3e68 Update TODO (found a bug) 2025-07-15 14:23:47 +03:00
Anton Mukhin
a7d052e799 fonts.h and fonts.c example for the library 2025-07-14 17:31:11 +03:00
Anton Mukhin
ec9fbc4250 Update TODO.txt 2025-07-14 11:53:22 +03:00
Anton Mukhin
2e217c9a9e Remove old format examples 2025-07-11 10:14:56 +03:00
Anton Mukhin
d10da7cb20 My logo as example 2025-07-09 18:44:42 +03:00
Anton Mukhin
7db0b6d76e Merge branch 'dev' - v2.9
Changes:

Application:
- Special cursor to indicate baseline set
- Special cursor when dragging canvas with middle mouse button

Functionality:
- Show note field in Export comments
- When Rectangle selection tool is active hold Ctrl+Alt to temporary disable it to be able to draw
- Frame screenshot can be copied to clipboard with some limitations (no transparency)
- Besides Baseline, also make top and mid lines

Bugs:
- Fixed "Frame modified" check. It leaves modified flag if user refused to save changes.
- Middle mouse button tries to change selection while dragging canvas with rectSelection tool active
2025-07-08 17:20:35 +03:00
Anton Mukhin
2930c42260 Screenshots updated 2025-07-08 17:12:10 +03:00
Anton Mukhin
ace97302f2 Tooltip text for new buttons 2025-07-08 17:09:03 +03:00
Anton Mukhin
ad15f08233 TODO features:
Application:
- Special cursor to indicate baseline set
- Special cursor when dragging canvas with middle mouse button

Functionality:
- Beside Baseline, also make top and mid lines

Bugs:
- Middle mouse button tries to change selection while dragging canvas with rectSelection tool active
2025-07-08 17:00:55 +03:00
Anton Mukhin
64531aecf0 TODO update 2025-07-08 12:18:29 +03:00
Anton Mukhin
4dd4743b21 TODO feature: Frame screenshot can be copied to clipboard with some limitations (no transparency) 2025-07-08 12:11:46 +03:00
Anton Mukhin
686ff7b780 Bug fixed: Fixed "Frame modified" check. It leaves modified flag if user refused to save changes. 2025-07-08 10:56:17 +03:00
Anton Mukhin
30729aca2f TODO feature: When Rectangle selection tool is active hold Ctrl+Alt to temporary disable it to be able to draw 2025-07-08 10:49:26 +03:00
Anton Mukhin
6cbc206260 TODO feature: Show note field in Export comments 2025-07-08 10:10:35 +03:00
d70d8d8a3c DOTO update 2025-07-07 00:10:06 +03:00
e5a4baadb7 Merge branch 'dev' - v2.8
Changes:

Functionality:
- Screensot a frame function
- Frame note field to store a frame description
2025-07-03 01:13:05 +03:00
37abcf2c8e TODO feature: Frame note field to store a frame description 2025-07-03 01:03:12 +03:00
2c2a8d6158 Update examples 2025-07-02 23:58:54 +03:00
Anton Mukhin
4115455a54 TODO feature: Screensot a frame function 2025-07-02 20:06:14 +03:00
67be566605 Main window screenshot update 2025-07-01 00:29:39 +03:00
44 changed files with 1189 additions and 133 deletions

View File

@@ -233,7 +233,14 @@ namespace McBitFont {
if (com && lines != 1 && fcount > 1) {
// Comments enabled and other than "1 symbol per line" selected
// Print a symbol comment before its data
output += " // " + f.code.ToString() + " --> " + mainForm.DecodeSymbol(f.code) + "\n";
string character = f.code switch {
92 => "Backslash",
_ => mainForm.DecodeSymbol(f.code),
};
string code = mainForm.chkHexCodes.Checked ? "0x" + Convert.ToString(f.code, 16).PadLeft(2, '0').ToUpper() : f.code.ToString();
output += " // " + code + " --> " + character;
if (f.note != "" && f.note != null) output += " (" + f.note.ToString() + ")";
output += "\n";
}
if (lines == 1) {
// "1 symbol per line" - new line offset
@@ -369,7 +376,13 @@ namespace McBitFont {
if (!f.Equals(flast) && f.width > 0) output += ",";
if (com && fcount > 1) {
//...with a comment
output += " // " + f.code.ToString() + " --> " + mainForm.DecodeSymbol(f.code);
string character = f.code switch {
92 => "Backslash",
_ => mainForm.DecodeSymbol(f.code),
};
string code = mainForm.chkHexCodes.Checked ? "0x" + Convert.ToString(f.code, 16).PadLeft(2, '0').ToUpper() : f.code.ToString();
output += " // " + code + " --> " + character;
if (f.note != "" && f.note != null) output += " (" + f.note.ToString() + ")";
}
output += "\n";
}

View File

@@ -34,6 +34,7 @@
cbZoom = new System.Windows.Forms.ComboBox();
label4 = new System.Windows.Forms.Label();
panel1 = new System.Windows.Forms.Panel();
tbFrameNote = new System.Windows.Forms.TextBox();
btnFill = new System.Windows.Forms.Button();
btnClear = new System.Windows.Forms.Button();
btnMirrorY = new System.Windows.Forms.Button();
@@ -69,6 +70,7 @@
importImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
exportFontLayoutPNGToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
frameScreenshotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -122,6 +124,10 @@
pnlRightButtons = new System.Windows.Forms.Panel();
lblBrush = new System.Windows.Forms.Label();
pnlInfo = new System.Windows.Forms.Panel();
cmBaseline = new System.Windows.Forms.ContextMenuStrip(components);
tsmiTopline = new System.Windows.Forms.ToolStripMenuItem();
tsmiMidline = new System.Windows.Forms.ToolStripMenuItem();
tsmiBaseline = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)nudX).BeginInit();
((System.ComponentModel.ISupportInitialize)nudY).BeginInit();
panel1.SuspendLayout();
@@ -130,6 +136,7 @@
((System.ComponentModel.ISupportInitialize)nudBrush).BeginInit();
pnlRightButtons.SuspendLayout();
pnlInfo.SuspendLayout();
cmBaseline.SuspendLayout();
SuspendLayout();
//
// dotPanel
@@ -230,7 +237,7 @@
// panel1
//
panel1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right;
panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
panel1.Controls.Add(tbFrameNote);
panel1.Controls.Add(btnFill);
panel1.Controls.Add(btnClear);
panel1.Controls.Add(btnMirrorY);
@@ -240,17 +247,28 @@
panel1.Controls.Add(btnShiftUp);
panel1.Controls.Add(btnShiftRight);
panel1.Controls.Add(btnShiftLeft);
panel1.Location = new System.Drawing.Point(472, 31);
panel1.Location = new System.Drawing.Point(472, 24);
panel1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
panel1.Name = "panel1";
panel1.Size = new System.Drawing.Size(140, 139);
panel1.Size = new System.Drawing.Size(140, 154);
panel1.TabIndex = 9;
//
// tbFrameNote
//
tbFrameNote.Location = new System.Drawing.Point(7, 127);
tbFrameNote.Name = "tbFrameNote";
tbFrameNote.PlaceholderText = "Frame note";
tbFrameNote.Size = new System.Drawing.Size(119, 23);
tbFrameNote.TabIndex = 9;
toolTip1.SetToolTip(tbFrameNote, "Frame note");
tbFrameNote.WordWrap = false;
tbFrameNote.TextChanged += tbFrameNote_TextChanged;
//
// btnFill
//
btnFill.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnFill.Image = Properties.Resources.Canvas_Fill;
btnFill.Location = new System.Drawing.Point(92, 9);
btnFill.Location = new System.Drawing.Point(91, 3);
btnFill.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnFill.Name = "btnFill";
btnFill.Size = new System.Drawing.Size(35, 35);
@@ -263,7 +281,7 @@
//
btnClear.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnClear.Image = Properties.Resources.Canvas_Clear;
btnClear.Location = new System.Drawing.Point(8, 9);
btnClear.Location = new System.Drawing.Point(7, 3);
btnClear.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnClear.Name = "btnClear";
btnClear.Size = new System.Drawing.Size(35, 35);
@@ -276,7 +294,7 @@
//
btnMirrorY.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnMirrorY.Image = Properties.Resources.Famfamfam_Silk_Shape_flip_vertical_16;
btnMirrorY.Location = new System.Drawing.Point(92, 92);
btnMirrorY.Location = new System.Drawing.Point(91, 86);
btnMirrorY.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnMirrorY.Name = "btnMirrorY";
btnMirrorY.Size = new System.Drawing.Size(35, 35);
@@ -289,7 +307,7 @@
//
btnMirrorX.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnMirrorX.Image = Properties.Resources.Famfamfam_Silk_Shape_flip_horizontal_16;
btnMirrorX.Location = new System.Drawing.Point(50, 92);
btnMirrorX.Location = new System.Drawing.Point(49, 86);
btnMirrorX.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnMirrorX.Name = "btnMirrorX";
btnMirrorX.Size = new System.Drawing.Size(35, 35);
@@ -302,7 +320,7 @@
//
btnInvert.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnInvert.Image = Properties.Resources.z_contrast;
btnInvert.Location = new System.Drawing.Point(8, 92);
btnInvert.Location = new System.Drawing.Point(7, 86);
btnInvert.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnInvert.Name = "btnInvert";
btnInvert.Size = new System.Drawing.Size(35, 35);
@@ -315,7 +333,7 @@
//
btnShiftDown.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnShiftDown.Image = Properties.Resources.z_down;
btnShiftDown.Location = new System.Drawing.Point(50, 51);
btnShiftDown.Location = new System.Drawing.Point(49, 45);
btnShiftDown.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnShiftDown.Name = "btnShiftDown";
btnShiftDown.Size = new System.Drawing.Size(35, 35);
@@ -328,7 +346,7 @@
//
btnShiftUp.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnShiftUp.Image = Properties.Resources.z_uo;
btnShiftUp.Location = new System.Drawing.Point(50, 9);
btnShiftUp.Location = new System.Drawing.Point(49, 3);
btnShiftUp.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnShiftUp.Name = "btnShiftUp";
btnShiftUp.Size = new System.Drawing.Size(35, 35);
@@ -341,7 +359,7 @@
//
btnShiftRight.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnShiftRight.Image = Properties.Resources.z_right;
btnShiftRight.Location = new System.Drawing.Point(92, 51);
btnShiftRight.Location = new System.Drawing.Point(91, 45);
btnShiftRight.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnShiftRight.Name = "btnShiftRight";
btnShiftRight.Size = new System.Drawing.Size(35, 35);
@@ -354,7 +372,7 @@
//
btnShiftLeft.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);
btnShiftLeft.Image = Properties.Resources.z_left;
btnShiftLeft.Location = new System.Drawing.Point(8, 51);
btnShiftLeft.Location = new System.Drawing.Point(7, 45);
btnShiftLeft.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnShiftLeft.Name = "btnShiftLeft";
btnShiftLeft.Size = new System.Drawing.Size(35, 35);
@@ -391,6 +409,7 @@
miniList.MultiSelect = false;
miniList.Name = "miniList";
miniList.ShowGroups = false;
miniList.ShowItemToolTips = true;
miniList.Size = new System.Drawing.Size(427, 455);
miniList.SmallImageList = ilMiniatures;
miniList.Sorting = System.Windows.Forms.SortOrder.Ascending;
@@ -543,7 +562,7 @@
//
// fileToolStripMenuItem
//
fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, openToolStripMenuItem, saveToolStripMenuItem, saveAsToolStripMenuItem, toolStripSeparator1, importTextToolStripMenuItem1, importImageToolStripMenuItem, exportToolStripMenuItem, exportFontLayoutPNGToolStripMenuItem, toolStripSeparator2, exitToolStripMenuItem });
fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, openToolStripMenuItem, saveToolStripMenuItem, saveAsToolStripMenuItem, toolStripSeparator1, importTextToolStripMenuItem1, importImageToolStripMenuItem, exportToolStripMenuItem, exportFontLayoutPNGToolStripMenuItem, frameScreenshotToolStripMenuItem, toolStripSeparator2, exitToolStripMenuItem });
fileToolStripMenuItem.Name = "fileToolStripMenuItem";
fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
fileToolStripMenuItem.Text = "File";
@@ -628,13 +647,23 @@
//
// exportFontLayoutPNGToolStripMenuItem
//
exportFontLayoutPNGToolStripMenuItem.Image = Properties.Resources.picture_go;
exportFontLayoutPNGToolStripMenuItem.Image = Properties.Resources.picture_save;
exportFontLayoutPNGToolStripMenuItem.Name = "exportFontLayoutPNGToolStripMenuItem";
exportFontLayoutPNGToolStripMenuItem.Size = new System.Drawing.Size(224, 22);
exportFontLayoutPNGToolStripMenuItem.Text = "Export font layout PNG";
exportFontLayoutPNGToolStripMenuItem.ToolTipText = "Create an image with all a table showing all 256 symbols";
exportFontLayoutPNGToolStripMenuItem.Click += ExportPNG;
//
// frameScreenshotToolStripMenuItem
//
frameScreenshotToolStripMenuItem.Image = Properties.Resources.picture_go;
frameScreenshotToolStripMenuItem.Name = "frameScreenshotToolStripMenuItem";
frameScreenshotToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P;
frameScreenshotToolStripMenuItem.Size = new System.Drawing.Size(224, 22);
frameScreenshotToolStripMenuItem.Text = "Frame Screenshot";
frameScreenshotToolStripMenuItem.ToolTipText = "Make a screenshot of the current frame and save it to a file or copy to clipboard";
frameScreenshotToolStripMenuItem.Click += frameScreenshotToolStripMenuItem_Click;
//
// toolStripSeparator2
//
toolStripSeparator2.Name = "toolStripSeparator2";
@@ -997,18 +1026,18 @@
//
// btnBaseline
//
btnBaseline.Image = Properties.Resources.fam_base;
btnBaseline.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
btnBaseline.Image = Properties.Resources.fam_lines;
btnBaseline.Location = new System.Drawing.Point(94, 81);
btnBaseline.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
btnBaseline.Name = "btnBaseline";
btnBaseline.Size = new System.Drawing.Size(88, 27);
btnBaseline.TabIndex = 18;
btnBaseline.Text = " Baseline";
btnBaseline.Text = " Lines";
btnBaseline.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
toolTip1.SetToolTip(btnBaseline, "Set irtual base line for the font");
toolTip1.SetToolTip(btnBaseline, "Set irtual base lines for the font");
btnBaseline.UseVisualStyleBackColor = true;
btnBaseline.Click += btnBaseline_Click;
btnBaseline.Paint += btnBaseline_Paint;
//
// toolTip1
//
@@ -1183,6 +1212,39 @@
pnlInfo.Size = new System.Drawing.Size(103, 154);
pnlInfo.TabIndex = 28;
//
// cmBaseline
//
cmBaseline.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { tsmiTopline, tsmiMidline, tsmiBaseline });
cmBaseline.Name = "cmBaseline";
cmBaseline.Size = new System.Drawing.Size(121, 70);
//
// tsmiTopline
//
tsmiTopline.Image = Properties.Resources.fam_top;
tsmiTopline.Name = "tsmiTopline";
tsmiTopline.Size = new System.Drawing.Size(120, 22);
tsmiTopline.Text = "Top line";
tsmiTopline.ToolTipText = "Set top base line";
tsmiTopline.Click += tsmiTopline_Click;
//
// tsmiMidline
//
tsmiMidline.Image = Properties.Resources.fam_mid;
tsmiMidline.Name = "tsmiMidline";
tsmiMidline.Size = new System.Drawing.Size(120, 22);
tsmiMidline.Text = "Mid line";
tsmiMidline.ToolTipText = "Set middle base line";
tsmiMidline.Click += tsmiMidline_Click;
//
// tsmiBaseline
//
tsmiBaseline.Image = Properties.Resources.fam_base;
tsmiBaseline.Name = "tsmiBaseline";
tsmiBaseline.Size = new System.Drawing.Size(120, 22);
tsmiBaseline.Text = "Base line";
tsmiBaseline.ToolTipText = "Set bottom (base) line";
tsmiBaseline.Click += tsmiBaseline_Click;
//
// MainForm
//
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
@@ -1197,6 +1259,7 @@
Controls.Add(dotPanel);
Controls.Add(menuStrip1);
Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon");
KeyPreview = true;
MainMenuStrip = menuStrip1;
Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
MinimumSize = new System.Drawing.Size(931, 686);
@@ -1205,9 +1268,12 @@
Text = "McBitFont";
FormClosing += MainForm_FormClosing;
Load += Form1_Load;
KeyDown += MainForm_KeyDown;
KeyUp += MainForm_KeyUp;
((System.ComponentModel.ISupportInitialize)nudX).EndInit();
((System.ComponentModel.ISupportInitialize)nudY).EndInit();
panel1.ResumeLayout(false);
panel1.PerformLayout();
cmMinilist.ResumeLayout(false);
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
@@ -1216,6 +1282,7 @@
pnlRightButtons.PerformLayout();
pnlInfo.ResumeLayout(false);
pnlInfo.PerformLayout();
cmBaseline.ResumeLayout(false);
ResumeLayout(false);
PerformLayout();
@@ -1291,7 +1358,6 @@
private System.Windows.Forms.ToolStripMenuItem tsmiMakeVarWidth;
private System.Windows.Forms.ToolStripMenuItem importImageToolStripMenuItem;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.CheckBox chkHexCodes;
private System.Windows.Forms.Button btnFill;
private System.Windows.Forms.ToolStripMenuItem FillToolStripMenuItem;
private System.Windows.Forms.CheckBox chkRectSelect;
@@ -1320,6 +1386,13 @@
private System.Windows.Forms.ToolStripMenuItem zerofyWidthToolStripMenuItem;
public System.Windows.Forms.NumericUpDown nudBrush;
private System.Windows.Forms.Label lblBrush;
private System.Windows.Forms.ToolStripMenuItem frameScreenshotToolStripMenuItem;
private System.Windows.Forms.TextBox tbFrameNote;
private System.Windows.Forms.ContextMenuStrip cmBaseline;
private System.Windows.Forms.ToolStripMenuItem tsmiBaseline;
private System.Windows.Forms.ToolStripMenuItem tsmiMidline;
private System.Windows.Forms.ToolStripMenuItem tsmiTopline;
public System.Windows.Forms.CheckBox chkHexCodes;
}
}

View File

@@ -18,11 +18,12 @@ namespace McBitFont {
[Serializable]
[MessagePackObject]
public struct FrameMiniature {
public FrameMiniature(int cc, int ww, int hh) {
public FrameMiniature(int cc, int ww, int hh, string frameNote = "") {
code = cc;
width = ww;
height = hh;
data = new bool[ww, hh];
note = frameNote;
}
[Key(0)]
public int code;
@@ -32,6 +33,8 @@ namespace McBitFont {
public int height;
[Key(3)]
public bool[,] data;
[Key(8)]
public string note;
};
[Serializable]
@@ -42,14 +45,24 @@ namespace McBitFont {
[Key(5)]
public int codepage;
[Key(6)]
public int baseline;
public int baseline1;
[Key(9)]
public int baseline2;
[Key(10)]
public int baseline3;
[Key(7)]
public List<FrameMiniature> frames;
}
public enum SetLines {
SL_None = 0,
SL_Base,
SL_Mid,
SL_Top
}
public FrameMiniature f;
public List<FrameMiniature> frames = new List<FrameMiniature>();
//private CanvasHistory history = new();
private ChangeHistory history;
private int cellSize = 10;
public int dotWidth, dotHeight;
@@ -59,16 +72,17 @@ namespace McBitFont {
public bool monospaced = false;
private bool modified = false;
private bool prjModified = false;
public const string version = "2.7";
public const string version = "2.10";
public string prjName = "Untitled";
public string prjFileName = "";
public int codepage = 1251;
private FrameMiniature fbuf;
private readonly DataFormats.Format clpbFormat = DataFormats.GetFormat("McBitFontFrame");
private int baseline = 0;
private bool set_base = false;
private int baseline1 = 0, baseline2 = 0, baseline3 = 0;
private SetLines set_lines = SetLines.SL_None;
private Point selection1, selection2;
private Point[,] sidebarLocs = new Point[2, 3];
private bool frameClipboard = false;
public MainForm() {
@@ -112,12 +126,12 @@ namespace McBitFont {
// Remember sidebar panels locations
private void SideBarRecalc() {
sidebarLocs[0, 0] = new Point(this.Width - 459, 31);
sidebarLocs[0, 1] = new Point(this.Width - 316, 24);
sidebarLocs[0, 2] = new Point(this.Width - 487, 31);
sidebarLocs[1, 0] = new Point(this.Width - panel1.Width - 70, 180);
sidebarLocs[1, 1] = new Point(this.Width - pnlInfo.Width - 110, 320);
sidebarLocs[1, 2] = new Point(dotPanel.Width + 17, 31);
sidebarLocs[0, 0] = new Point(this.Width - 459, 24); // tool panel
sidebarLocs[0, 1] = new Point(this.Width - 316, 24); // info panel
sidebarLocs[0, 2] = new Point(this.Width - 487, 31); // vertical scroll
sidebarLocs[1, 0] = new Point(this.Width - panel1.Width - 70, 180); // tool panel
sidebarLocs[1, 1] = new Point(this.Width - pnlInfo.Width - 110, 340); // info panel
sidebarLocs[1, 2] = new Point(dotPanel.Width + 17, 31); // vertical scroll
}
@@ -170,7 +184,7 @@ namespace McBitFont {
SideBarRecalc();
// Create default cursor
dotPanel.Cursor = McCursor.GetCursor((int)nudBrush.Value, cellSize, gap);
SetPanelCursor();
}
@@ -191,8 +205,10 @@ namespace McBitFont {
for (int j = 0; j <= selection2.Y - selection1.Y; j++) {
ff.data[i, j] = frame.data[i + selection1.X, j + selection1.Y];
}
} else
} else {
Array.Copy(frame.data, ff.data, frame.data.Length);
ff.note = frame.note;
}
return ff;
}
@@ -346,7 +362,7 @@ namespace McBitFont {
vScroll.Enabled = true;
}
if (!chkRectSelect.Checked) dotPanel.Cursor = McCursor.GetCursor((int)nudBrush.Value, cellSize, gap);
SetPanelCursor();
dotPanel.Refresh();
}
@@ -459,6 +475,9 @@ namespace McBitFont {
var rectSel = chkRectSelect.Checked;
bool rectSelUpdated = false;
// Set input focus to minilist if any mouse button is held
if (!miniList.Focused && e.Button != MouseButtons.None) miniList.Focus();
// Drag with middle mouse button
if (vScroll.Enabled || hScroll.Enabled) {
if (mouseDownMiddle) {
@@ -485,16 +504,22 @@ namespace McBitFont {
mouseDownMiddle = true;
mouseX = e.X;
mouseY = e.Y;
SetPanelCursor();
}
if (mouseDownMiddle && e.Button == MouseButtons.None) {
mouseDownMiddle = false;
SetPanelCursor();
}
}
// Moving baseline
Rectangle rect1, rect2;
if (set_base) {
if (set_lines > SetLines.SL_None) {
int baseline = 0;
if (set_lines == SetLines.SL_Base) baseline = baseline1;
if (set_lines == SetLines.SL_Mid) baseline = baseline2;
if (set_lines == SetLines.SL_Top) baseline = baseline3;
int yy = pixelOffset + baseline * (cellSize + gap) - vScroll.Value - 1;
rect1 = new Rectangle(pixelOffset, yy, w, 2);
@@ -506,11 +531,17 @@ namespace McBitFont {
yy = pixelOffset + baseline * (cellSize + gap) - vScroll.Value - 1;
rect2 = new Rectangle(pixelOffset, yy, w, 2);
if (set_lines == SetLines.SL_Base) baseline1 = baseline;
if (set_lines == SetLines.SL_Mid) baseline2 = baseline;
if (set_lines == SetLines.SL_Top) baseline3 = baseline;
dotPanel.Invalidate(rect1);
dotPanel.Invalidate(rect2);
if (e.Button == MouseButtons.Left) {
set_base = false;
set_lines = SetLines.SL_None;
SetPanelCursor();
SetModified(true, true);
return;
}
}
@@ -529,7 +560,7 @@ namespace McBitFont {
selection2.Y = j;
}
}
if (e.Button != MouseButtons.None && !mouseDown) {
if ((e.Button == MouseButtons.Left || e.Button == MouseButtons.Right) && !mouseDown) {
// Started to move a mouse with button held
mouseDown = true;
if (rectSel) {
@@ -589,7 +620,7 @@ namespace McBitFont {
// Check for Shift / Ctrl keys for straight lines
if (ModifierKeys.HasFlag(Keys.Shift) && mouseDown) {
j = lastY;
} else if (ModifierKeys.HasFlag(Keys.Control) && mouseDown) {
} else if (ModifierKeys.HasFlag(Keys.Control) && mouseDown && !CAKeyDown) {
i = lastX;
}
lastX = i;
@@ -621,7 +652,7 @@ namespace McBitFont {
SetModified();
changed = true;
}
}
}
return changed;
@@ -717,6 +748,7 @@ namespace McBitFont {
string s = f.code.ToString().PadLeft(3, '0');
ilMiniatures.Images.RemoveByKey(s);
ilMiniatures.Images.Add(s, (Image)sizedBMP);
miniList.Items[miniList.Items.IndexOfKey(s)].ToolTipText = f.note;
sizedBMP.Dispose();
SetModified(false);
SetModified(true, true);
@@ -768,21 +800,36 @@ namespace McBitFont {
// Fill the cell with color
if (f.data[i, j]) sb = sbb;
else sb = sbw;
g.FillRectangle(sb, x, (baseline == j ? y + 1 : y), cellSize, (baseline == j ? cellSize - 1 : cellSize));
g.FillRectangle(sb, x, ((baseline1 == j || baseline2 == j || baseline3 == j) ? y + 1 : y), cellSize, ((baseline1 == j || baseline2 == j || baseline3 == j) ? cellSize - 1 : cellSize));
}
}
// Draw the baseline
if (baseline > 0 && gap > 0) {
// Draw the base lines
if (baseline1 > 0 || baseline2 > 0 || baseline3 > 0) {
x = pixelOffset - hScroll.Value;
y = pixelOffset + baseline * (cellSize + gap) - vScroll.Value;
Pen sbBase = new(Color.Blue, 2);
g.DrawLine(sbBase, x, y, w, y);
// Base line
if (baseline1 > 0) {
Pen sbBase = new(Color.Blue, gap > 0 ? 2 : 1);
y = pixelOffset + baseline1 * (cellSize + gap) - vScroll.Value;
g.DrawLine(sbBase, x, y, w, y);
}
// Mid line
if (baseline2 > 0) {
Pen sbBase = new(Color.MediumPurple, gap > 0 ? 2 : 1);
y = pixelOffset + baseline2 * (cellSize + gap) - vScroll.Value;
g.DrawLine(sbBase, x, y, w, y);
}
// Top line
if (baseline3 > 0) {
Pen sbBase = new(Color.FromArgb(0x16, 0x8b, 0x76), gap > 0 ? 2 : 1);
y = pixelOffset + baseline3 * (cellSize + gap) - vScroll.Value;
g.DrawLine(sbBase, x, y, w, y);
}
}
// Draw the Rect selection
if (chkRectSelect.Checked) {
if (chkRectSelect.Checked || CAKeyDown) {
Point p1 = new(selection1.X, selection1.Y);
Point p2 = new(selection2.X, selection2.Y);
NormPoints(ref p1, ref p2);
@@ -897,7 +944,9 @@ namespace McBitFont {
f = CopyFrame(frames.First());
form.Dispose();
baseline = 0;
baseline1 = 0;
baseline2 = 0;
baseline3 = 0;
prjName = "Untitled";
prjFileName = "";
@@ -935,6 +984,7 @@ namespace McBitFont {
nudX.Value = ff.width;
nudY.Value = ff.height;
f = ff;
tbFrameNote.Text = ff.note;
history.Add(code);
@@ -983,7 +1033,7 @@ namespace McBitFont {
var sHex = 'x' + Convert.ToString(f.code, 16).PadLeft(2, '0').ToUpper();
var sss = DecodeSymbol(f.code);
ilMiniatures.Images.Add(s, (Image)GetMiniPictue(f));
miniList.Items.Add(s, (chkHexCodes.Checked ? sHex : s) + ' ' + sss, s);
miniList.Items.Add(s, (chkHexCodes.Checked ? sHex : s) + ' ' + sss, s).ToolTipText = f.note;
}
}
@@ -997,7 +1047,9 @@ namespace McBitFont {
}
monospaced = sav.monospaced;
codepage = sav.codepage;
baseline = sav.baseline;
baseline1 = sav.baseline1;
baseline2 = sav.baseline2;
baseline3 = sav.baseline3;
lblType.Text = monospaced ? "Monospaced" : "Variable width / Single";
frames = sav.frames;
makeVarWidthToolStripMenuItem.Visible = monospaced;
@@ -1015,10 +1067,9 @@ namespace McBitFont {
nudX.ValueChanged += nudX_ValueChanged;
nudY.ValueChanged += nudY_ValueChanged;
f = CopyFrame(frames.First());
tbFrameNote.Text = frames.First().note;
dotPanel.Refresh();
miniList.Refresh();
SetModified(false);
SetModified(false, true);
prjFileName = filename;
prjName = Path.GetFileNameWithoutExtension(filename);
@@ -1037,6 +1088,8 @@ namespace McBitFont {
zerofyWidthToolStripMenuItem.Enabled = !monospaced;
tsmiCodeShift.Visible = frames.Count > 1;
CodeShiftToolStripMenuItem.Visible = frames.Count > 1;
SetModified(false);
SetModified(false, true);
Cursor.Current = Cursors.Default;
}
@@ -1045,7 +1098,9 @@ namespace McBitFont {
sav.monospaced = monospaced;
sav.frames = frames;
sav.codepage = codepage;
sav.baseline = baseline;
sav.baseline1 = baseline1;
sav.baseline2 = baseline2;
sav.baseline3 = baseline3;
using (Stream ms = File.OpenWrite(filename)) {
MessagePackSerializer.Serialize(ms, sav);
@@ -1130,47 +1185,58 @@ namespace McBitFont {
}
private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
var bb = MessagePackSerializer.Serialize(CopyFrame(f, true));
DataObject clpbObj = new DataObject(clpbFormat.Name, bb);
Clipboard.SetDataObject(clpbObj, true);
if (tbFrameNote.Focused) {
tbFrameNote.Copy();
frameClipboard = false;
} else {
var bb = MessagePackSerializer.Serialize(CopyFrame(f, true));
DataObject clpbObj = new DataObject(clpbFormat.Name, bb);
Clipboard.SetDataObject(clpbObj, true);
frameClipboard = true;
}
}
private void pasteToolStripMenuItem_Click(object sender, EventArgs e) {
// Try to read from clipboard
try {
IDataObject clpbObj = Clipboard.GetDataObject();
byte[] bb = (byte[])clpbObj.GetData(clpbFormat.Name);
fbuf = MessagePackSerializer.Deserialize<FrameMiniature>(bb);
}
catch {
return;
}
int di, dj, wmax, hmax, selw, selh;
if (chkRectSelect.Checked) {
di = selection1.X;
dj = selection1.Y;
selw = selection2.X - selection1.X + 1;
selh = selection2.Y - selection1.Y + 1;
wmax = fbuf.width > selw ? selw : fbuf.width;
hmax = fbuf.height > selh ? selh : fbuf.height;
} else {
di = 0;
dj = 0;
wmax = (fbuf.width > f.width) ? f.width : fbuf.width;
hmax = (fbuf.height > f.height) ? f.height : fbuf.height;
}
for (int i = 0; i < wmax; i++) {
for (int j = 0; j < hmax; j++) {
f.data[i + di, j + dj] = fbuf.data[i, j];
if (tbFrameNote.Focused) {
if (!frameClipboard) tbFrameNote.Paste();
} else if (frameClipboard) {
// Try to read from clipboard
try {
IDataObject clpbObj = Clipboard.GetDataObject();
byte[] bb = (byte[])clpbObj.GetData(clpbFormat.Name);
fbuf = MessagePackSerializer.Deserialize<FrameMiniature>(bb);
}
catch {
return;
}
}
history.Add(f);
CheckHistoryButtons();
dotPanel.Refresh();
SetModified();
int di, dj, wmax, hmax, selw, selh;
if (chkRectSelect.Checked) {
di = selection1.X;
dj = selection1.Y;
selw = selection2.X - selection1.X + 1;
selh = selection2.Y - selection1.Y + 1;
wmax = fbuf.width > selw ? selw : fbuf.width;
hmax = fbuf.height > selh ? selh : fbuf.height;
} else {
di = 0;
dj = 0;
wmax = (fbuf.width > f.width) ? f.width : fbuf.width;
hmax = (fbuf.height > f.height) ? f.height : fbuf.height;
}
for (int i = 0; i < wmax; i++) {
for (int j = 0; j < hmax; j++) {
f.data[i + di, j + dj] = fbuf.data[i, j];
}
}
history.Add(f);
CheckHistoryButtons();
dotPanel.Refresh();
SetModified();
}
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
@@ -1179,7 +1245,7 @@ namespace McBitFont {
}
private void btnBaseline_Click(object sender, EventArgs e) {
set_base = !set_base;
cmBaseline.Show(btnBaseline, new Point(0, btnBaseline.Height));
}
// Check modified / Save frame
@@ -1395,8 +1461,7 @@ namespace McBitFont {
lblSelection.Visible = lblSelectionLabel.Visible = chkRectSelect.Checked;
selectAllToolStripMenuItem.Enabled = chkRectSelect.Checked;
if (chkRectSelect.Checked) dotPanel.Cursor = McCursor.GetCursorSelect();
else dotPanel.Cursor = McCursor.GetCursor((int)nudBrush.Value, cellSize, gap);
SetPanelCursor();
dotPanel.Refresh();
}
@@ -1526,7 +1591,7 @@ namespace McBitFont {
}
private void TestFont_Click(object sender, EventArgs e) {
var tester = new FontTester(codepage, dotHeight, baseline, frames);
var tester = new FontTester(codepage, dotHeight, baseline1, frames);
tester.ShowDialog();
}
@@ -1692,7 +1757,78 @@ namespace McBitFont {
}
private void nudBrush_ValueChanged(object sender, EventArgs e) {
if (!chkRectSelect.Checked) dotPanel.Cursor = McCursor.GetCursor((int)nudBrush.Value, cellSize, gap);
SetPanelCursor();
}
private void frameScreenshotToolStripMenuItem_Click(object sender, EventArgs e) {
FrameScreenshot iform = new(f);
iform.ShowDialog();
iform.Dispose();
}
private void tbFrameNote_TextChanged(object sender, EventArgs e) {
if (tbFrameNote.Focused) {
f.note = tbFrameNote.Text;
SetModified();
}
}
static bool CAKeyDown = false;
private void MainForm_KeyDown(object sender, KeyEventArgs e) {
if (CAKeyDown) return;
if (chkRectSelect.Checked && e.Control && e.Alt) {
chkRectSelect.Checked = false;
CAKeyDown = true;
dotPanel.Invalidate();
e.Handled = true;
}
}
private void MainForm_KeyUp(object sender, KeyEventArgs e) {
if (CAKeyDown && !e.Control && !e.Alt) {
chkRectSelect.Checked = true;
CAKeyDown = false;
e.Handled = true;
}
}
private void btnBaseline_Paint(object sender, PaintEventArgs e) {
Button btn = (sender as Button);
int arrowX = btn.ClientRectangle.Width - btn.Padding.Right - 14;
int arrowY = btn.ClientRectangle.Height / 2 - 1;
Color color = btn.Enabled ? ForeColor : SystemColors.ControlDark;
using Brush brush = new SolidBrush(color);
using Pen pen = new Pen(color);
Point[] arrow = [new Point(arrowX, arrowY), new Point(arrowX + 7, arrowY), new Point(arrowX + 3, arrowY + 4)];
e.Graphics.FillPolygon(brush, arrow);
e.Graphics.DrawLine(pen, arrowX - 5, btn.ClientRectangle.Top + 4, arrowX - 5, btn.ClientRectangle.Bottom - 4);
}
private void tsmiBaseline_Click(object sender, EventArgs e) {
if (set_lines == SetLines.SL_Base) set_lines = SetLines.SL_None;
else set_lines = SetLines.SL_Base;
SetPanelCursor();
}
private void tsmiMidline_Click(object sender, EventArgs e) {
if (set_lines == SetLines.SL_Mid) set_lines = SetLines.SL_None;
else set_lines = SetLines.SL_Mid;
SetPanelCursor();
}
private void tsmiTopline_Click(object sender, EventArgs e) {
if (set_lines == SetLines.SL_Top) set_lines = SetLines.SL_None;
else set_lines = SetLines.SL_Top;
SetPanelCursor();
}
private void SetPanelCursor() {
if (mouseDownMiddle) dotPanel.Cursor = McCursor.GetCursorDrag();
else if (set_lines > SetLines.SL_None) dotPanel.Cursor = McCursor.GetCursorLines();
else if (chkRectSelect.Checked) dotPanel.Cursor = McCursor.GetCursorSelect();
else dotPanel.Cursor = McCursor.GetCursor((int)nudBrush.Value, cellSize, gap);
}
}
}

View File

@@ -138,6 +138,9 @@
<metadata name="dlgSavePNG.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>644, 17</value>
</metadata>
<metadata name="cmBaseline.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>763, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>

169
McBitFont/FrameScreenshot.Designer.cs generated Normal file
View File

@@ -0,0 +1,169 @@
namespace McBitFont {
partial class FrameScreenshot {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
components = new System.ComponentModel.Container();
btnClose = new System.Windows.Forms.Button();
btnOK = new System.Windows.Forms.Button();
toolTip1 = new System.Windows.Forms.ToolTip(components);
nudUpscale = new System.Windows.Forms.NumericUpDown();
chkTransparent = new System.Windows.Forms.CheckBox();
chkBlackBG = new System.Windows.Forms.CheckBox();
btnCopy = new System.Windows.Forms.Button();
dlgSaveImage = new System.Windows.Forms.SaveFileDialog();
lblUpscale = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)nudUpscale).BeginInit();
SuspendLayout();
//
// btnClose
//
btnClose.Location = new System.Drawing.Point(234, 67);
btnClose.Name = "btnClose";
btnClose.Size = new System.Drawing.Size(88, 27);
btnClose.TabIndex = 3;
btnClose.Text = "Close";
toolTip1.SetToolTip(btnClose, "Close the dialog");
btnClose.UseVisualStyleBackColor = true;
btnClose.Click += btnClose_Click;
//
// btnOK
//
btnOK.Image = Properties.Resources.Famfamfam_Silk_Disk_16;
btnOK.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
btnOK.Location = new System.Drawing.Point(12, 67);
btnOK.Name = "btnOK";
btnOK.Size = new System.Drawing.Size(88, 27);
btnOK.TabIndex = 1;
btnOK.Text = "Save";
btnOK.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
toolTip1.SetToolTip(btnOK, "Save to file");
btnOK.UseVisualStyleBackColor = true;
btnOK.Click += btnOK_Click;
//
// toolTip1
//
toolTip1.AutoPopDelay = 10000;
toolTip1.InitialDelay = 500;
toolTip1.ReshowDelay = 100;
//
// nudUpscale
//
nudUpscale.Location = new System.Drawing.Point(71, 27);
nudUpscale.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
nudUpscale.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
nudUpscale.Name = "nudUpscale";
nudUpscale.Size = new System.Drawing.Size(51, 23);
nudUpscale.TabIndex = 2;
toolTip1.SetToolTip(nudUpscale, "Pixel upscale factor (4 means that for each frame pixel there will be 4x4 pixels generated)");
nudUpscale.Value = new decimal(new int[] { 4, 0, 0, 0 });
//
// chkTransparent
//
chkTransparent.AutoSize = true;
chkTransparent.Location = new System.Drawing.Point(144, 18);
chkTransparent.Name = "chkTransparent";
chkTransparent.Size = new System.Drawing.Size(155, 19);
chkTransparent.TabIndex = 5;
chkTransparent.Text = "Transparent background";
toolTip1.SetToolTip(chkTransparent, "Make background transparent (Doesn't work with clipboard - background will be gray)");
chkTransparent.UseVisualStyleBackColor = true;
chkTransparent.CheckedChanged += chkTransparent_CheckedChanged;
//
// chkBlackBG
//
chkBlackBG.AutoSize = true;
chkBlackBG.Enabled = false;
chkBlackBG.Location = new System.Drawing.Point(144, 35);
chkBlackBG.Name = "chkBlackBG";
chkBlackBG.Size = new System.Drawing.Size(132, 19);
chkBlackBG.TabIndex = 6;
chkBlackBG.Text = "Background is black";
toolTip1.SetToolTip(chkBlackBG, "White color is considered as background by default. Check this to invert that");
chkBlackBG.UseVisualStyleBackColor = true;
//
// btnCopy
//
btnCopy.Image = Properties.Resources.Famfamfam_Silk_Page_copy_16;
btnCopy.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
btnCopy.Location = new System.Drawing.Point(122, 67);
btnCopy.Name = "btnCopy";
btnCopy.Size = new System.Drawing.Size(88, 27);
btnCopy.TabIndex = 7;
btnCopy.Text = "Copy";
btnCopy.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
toolTip1.SetToolTip(btnCopy, "Copy to clipboard");
btnCopy.UseVisualStyleBackColor = true;
btnCopy.Click += btnCopy_Click;
//
// dlgSaveImage
//
dlgSaveImage.DefaultExt = "png";
dlgSaveImage.Filter = "PNG Image|*.png;*.PNG";
//
// lblUpscale
//
lblUpscale.AutoSize = true;
lblUpscale.Location = new System.Drawing.Point(71, 9);
lblUpscale.Name = "lblUpscale";
lblUpscale.Size = new System.Drawing.Size(51, 15);
lblUpscale.TabIndex = 4;
lblUpscale.Text = "Upscale:";
//
// FrameScreenshot
//
AcceptButton = btnClose;
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
CancelButton = btnClose;
ClientSize = new System.Drawing.Size(334, 111);
Controls.Add(btnCopy);
Controls.Add(chkBlackBG);
Controls.Add(chkTransparent);
Controls.Add(nudUpscale);
Controls.Add(lblUpscale);
Controls.Add(btnClose);
Controls.Add(btnOK);
FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
Name = "FrameScreenshot";
StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
Text = "Frame Screenshot";
Load += FrameScreenshot_Load;
((System.ComponentModel.ISupportInitialize)nudUpscale).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.ToolTip toolTip1;
private System.Windows.Forms.SaveFileDialog dlgSaveImage;
private System.Windows.Forms.Label lblUpscale;
private System.Windows.Forms.NumericUpDown nudUpscale;
private System.Windows.Forms.CheckBox chkTransparent;
private System.Windows.Forms.CheckBox chkBlackBG;
private System.Windows.Forms.Button btnCopy;
}
}

View File

@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static McBitFont.MainForm;
namespace McBitFont {
public partial class FrameScreenshot : Form {
private FrameMiniature f;
public FrameScreenshot(FrameMiniature frame) {
InitializeComponent();
f = frame;
}
private Bitmap GenerateScreenshot() {
int upscale = (int)nudUpscale.Value;
int x, y;
bool transp = chkTransparent.Checked;
bool blackBG = chkBlackBG.Checked;
Bitmap bmp = new(f.width * upscale, f.height * upscale);
SolidBrush bb = new(Color.Black);
SolidBrush bw = new(Color.White);
using (Graphics g = Graphics.FromImage(bmp)) {
for (x = 0; x < f.width; x++) {
for (y = 0; y < f.height; y++) {
if (f.data[x, y]) {
if (!transp || (transp && !blackBG)) g.FillRectangle(bb, x * upscale, y * upscale, upscale, upscale);
} else
if (!transp || (transp && blackBG)) g.FillRectangle(bw, x * upscale, y * upscale, upscale, upscale);
}
}
}
return bmp;
}
private void btnOK_Click(object sender, EventArgs e) {
if (dlgSaveImage.ShowDialog() == DialogResult.OK) {
Bitmap bmp = GenerateScreenshot();
bool err = false;
try {
bmp.Save(dlgSaveImage.FileName, ImageFormat.Png);
}
catch (Exception ex) {
err = true;
MessageBox.Show("There was an error during image save: " + ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (!err) MessageBox.Show("Screenshot has been saved!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void FrameScreenshot_Load(object sender, EventArgs e) {
btnOK.Focus();
}
private void btnClose_Click(object sender, EventArgs e) {
DialogResult = DialogResult.OK;
}
private void chkTransparent_CheckedChanged(object sender, EventArgs e) {
chkBlackBG.Enabled = chkTransparent.Checked;
}
private void btnCopy_Click(object sender, EventArgs e) {
Bitmap bmp = GenerateScreenshot();
using MemoryStream stream = new();
bmp.Save(stream, ImageFormat.Png);
DataObject data = new("PNG", stream);
data.SetImage(bmp);
Clipboard.SetDataObject(data, true);
}
}
}

View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="dlgSaveImage.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>115, 17</value>
</metadata>
</root>

View File

@@ -20,9 +20,9 @@
<UseWindowsForms>true</UseWindowsForms>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<ApplicationIcon>icon_64.ico</ApplicationIcon>
<AssemblyVersion>2.7.0.0</AssemblyVersion>
<FileVersion>2.7.0.0</FileVersion>
<Version>$(VersionPrefix)2.7.0</Version>
<AssemblyVersion>2.10.0.0</AssemblyVersion>
<FileVersion>2.10.0.0</FileVersion>
<Version>$(VersionPrefix)2.10.0</Version>
<Copyright>Anton Mukhin</Copyright>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -127,5 +127,46 @@ namespace McBitFont {
return CreateCursorNoResize(bmp, 1, 1);
}
public static Cursor GetCursorLines() {
Point[] arrow = { new(1, 1), new(12, 12), new(11, 13), new(6, 13), new(2, 17), new(1, 16) };
Rectangle line = new(0, 18, 20, 5);
Bitmap bmp = new(21, 24);
Pen pb = new(Color.Black, 1);
Pen pw = new(Color.White, 1);
SolidBrush bw = new(Color.White);
SolidBrush bb = new(Color.Black);
using (Graphics g = Graphics.FromImage(bmp)) {
g.FillPolygon(bw, arrow);
g.DrawPolygon(pb, arrow);
g.FillRectangle(bb, line);
g.DrawRectangle(pw, line);
}
return CreateCursorNoResize(bmp, 1, 1);
}
public static Cursor GetCursorDrag() {
Point[] arrow1 = { new(11, 0), new(15, 4), new(13, 4), new(13, 7), new(9, 7), new(9, 4), new(7, 4) };
Point[] arrow2 = { new(22, 11), new(18, 15), new(18, 13), new(15, 13), new(15, 9), new(18, 9), new(18, 7) };
Point[] arrow3 = { new(11, 22), new(7, 18), new(9, 18), new(9, 15), new(13, 15), new(13, 18), new(15, 18) };
Point[] arrow4 = { new(0, 11), new(4, 7), new(4, 9), new(7, 9), new(7, 13), new(4, 13), new(4, 15) };
Bitmap bmp = new(23, 23);
Pen pb = new(Color.Black, 1);
SolidBrush bw = new(Color.White);
using (Graphics g = Graphics.FromImage(bmp)) {
g.FillPolygon(bw, arrow1);
g.DrawPolygon(pb, arrow1);
g.FillPolygon(bw, arrow2);
g.DrawPolygon(pb, arrow2);
g.FillPolygon(bw, arrow3);
g.DrawPolygon(pb, arrow3);
g.FillPolygon(bw, arrow4);
g.DrawPolygon(pb, arrow4);
}
return CreateCursorNoResize(bmp, 11, 11);
}
}
}

View File

@@ -180,6 +180,26 @@ namespace McBitFont.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap fam_lines {
get {
object obj = ResourceManager.GetObject("fam_lines", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap fam_mid {
get {
object obj = ResourceManager.GetObject("fam_mid", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -190,6 +210,16 @@ namespace McBitFont.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap fam_top {
get {
object obj = ResourceManager.GetObject("fam_top", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -340,6 +370,16 @@ namespace McBitFont.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap picture_save {
get {
object obj = ResourceManager.GetObject("picture_save", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@@ -118,6 +118,9 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="fam_mid" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\fam_mid.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="z_left" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\arrow_left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -130,6 +133,9 @@
<data name="Famfamfam-Silk-Page-paste.16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Famfamfam-Silk-Page-paste.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_table" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\folder_table.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_open" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\folder_open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -145,6 +151,9 @@
<data name="font" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\font.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="picture_save" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\picture_save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow_redo" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\redo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -190,6 +199,9 @@
<data name="icon_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="fam_lines" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\fam_lines.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="z_tick" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\tick.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -217,8 +229,8 @@
<data name="Famfamfam-Silk-Disk.16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Famfamfam-Silk-Disk.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_table" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\folder_table.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="text_letterspacing2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text_letterspacing2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Canvas_Fill" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Canvas_Fill.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -241,7 +253,7 @@
<data name="icon_64" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="text_letterspacing2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\text_letterspacing2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="fam_top" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\fam_top.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 B

View File

@@ -2,7 +2,11 @@
McFLY's Bit Font and Image Editor
Features:
Download in the [Releases](https://gitea.mcflyer.ru/McFLY/McBitFont/releases) section!
Library example instructions to implement to STM32 code: [mctext](STM32_HAL_Lib/README.md)
**Features:**
- Generate a project based on a font installed in the system
- Basic pixel manipulations: shift, flip, invert, etc...
- Import an image
@@ -12,24 +16,22 @@ Features:
- Export to a PNG image showing all the characters in a table
- Test your font in special dialog
Requires:
**Requires:**
- Windows 7+
- .NET 9
Some basic hints on the interface:
**Some basic hints on the interface:**
- Mouse 1 to mark a pixel black
- Mouse 2 to mark a pixel white
- Drag the mouse holding a button to draw pixels
- Hold middle mouse button to drag the canvas
- Hold Shift to constrain painting horizontally
- Hold Ctrl to constrain painting vertically
- Mouse Scroll to scroll up and down
- Shift + scroll to scroll left and right
- Crtl + scroll to zoom
- Alt + Scroll to change painting brush size
Download in the [Releases](https://gitea.mcflyer.ru/McFLY/McBitFont/releases) section!
Library example instructions to implement to STM32 code: [mctext](STM32_HAL_Lib/README.md)
- When Rectangle selection tool is active hold Ctrl+Alt to temporary disable it to be able to draw
#### Important:
**Since v2.0 new save file format is implemented. You can use [McBitFont v1.7](https://gitea.mcflyer.ru/McFLY/McBitFont/releases/tag/v1.7) to convert old saved files to the new format.**
@@ -64,3 +66,8 @@ Code Shift dialog
Font PNG export example
![PNG export example](/images/Font_Minecraft_Rus_5x7_vw.png)
Frame screenshot dialog
![Frame screenshot](/images/Screenshot_Frame-screenshot.png)

285
STM32_HAL_Lib/fonts.c Normal file
View File

@@ -0,0 +1,285 @@
/*
ST7565 LCD library
Anton Mukhin, 2023
*/
#include <fonts.h>
/* Font header map:
uint8_t packed; // Is it a packed font?
uint8_t width; // Font width in pixels
uint8_t height; // Font height in pixels
uint8_t space; // Space between characters
uint8_t first; // First character code
uint8_t last; // Last character code
*/
const uint8_t font_5x7_vw[] = {
// Meta header
1, // Is it a packed font?
0, // Font width in pixels; 0 - variable width
7, // Font height in pixels
1, // Font space (between symbols) in pixels
0, // First character code
255, // Last character code
// Data:
0x00, // 0 -->
0x05, 0xff, 0xff, 0xff, 0xff, 0x07, // 1 -->
0x05, 0xff, 0x60, 0x30, 0xf8, 0x07, // 2 -->
0x00, // 3 -->
0x00, // 4 -->
0x00, // 5 -->
0x00, // 6 -->
0x00, // 7 -->
0x05, 0x0c, 0x0f, 0xcf, 0xc3, 0x00, // 8 -->
0x05, 0x08, 0x96, 0x8f, 0x85, 0x00, // 9 -->
0x05, 0x08, 0xa4, 0x1f, 0x89, 0x00, // 10 -->
0x05, 0x22, 0x0a, 0x82, 0x22, 0x02, // 11 -->
0x05, 0x10, 0x0c, 0x07, 0x03, 0x01, // 12 -->
0x05, 0x3e, 0x9f, 0xcf, 0xe7, 0x03, // 13 -->
0x05, 0x08, 0x8e, 0x8f, 0x83, 0x00, // 14 -->
0x05, 0x1c, 0x9f, 0xcf, 0xc7, 0x01, // 15 -->
0x18, 0x1c, 0x0e, 0x87, 0xc3, 0xe1, 0xf8, 0xfe, 0xff, 0xbf, 0x48, 0x04, 0x00, 0xfc, 0xff, 0x7f, 0x1f, 0x87, 0xc3, 0xe1, 0x70, 0x38, // 16 --> Not connected
0x18, 0x1c, 0x0e, 0x87, 0xe3, 0xfb, 0xff, 0x83, 0xff, 0x60, 0xb7, 0x3b, 0xfe, 0x8f, 0xbb, 0xdd, 0xf5, 0xdf, 0xc7, 0xe1, 0x70, 0x38, // 17 --> IDC
0x18, 0x1c, 0xdf, 0x7f, 0xb8, 0xff, 0x5f, 0xa7, 0xeb, 0xff, 0x79, 0x1d, 0xfc, 0xaf, 0xab, 0xeb, 0x7f, 0xb4, 0xda, 0xfe, 0xfb, 0x38, // 18 --> RS485
0x0a, 0x0c, 0x06, 0x00, 0xc0, 0x60, 0x00, 0x00, 0x0c, 0x06, // 19 -->
0x00, // 20 -->
0x00, // 21 -->
0x00, // 22 -->
0x00, // 23 -->
0x09, 0xc2, 0x70, 0xd4, 0x09, 0xe0, 0x48, 0xfe, 0x10, // 24 -->
0x09, 0x00, 0xe1, 0x1f, 0x08, 0x38, 0x15, 0x8b, 0x39, // 25 -->
0x00, // 26 -->
0x00, // 27 -->
0x00, // 28 -->
0x00, // 29 -->
0x00, // 30 -->
0x00, // 31 -->
0x01, 0x00, // 32 -->
0x01, 0x5f, // 33 --> !
0x03, 0x07, 0xc0, 0x01, // 34 --> "
0x05, 0x94, 0x3f, 0xe5, 0x4f, 0x01, // 35 --> #
0x05, 0x24, 0xd5, 0x5f, 0x25, 0x01, // 36 --> $
0x05, 0xa3, 0x09, 0x82, 0x2c, 0x06, // 37 --> %
0x05, 0xb6, 0x64, 0x55, 0x04, 0x05, // 38 --> &
0x02, 0x85, 0x01, // 39 --> '
0x02, 0xbe, 0x20, // 40 --> (
0x02, 0x41, 0x1f, // 41 --> )
0x05, 0x14, 0x84, 0x0f, 0x41, 0x01, // 42 --> *
0x05, 0x08, 0x84, 0x0f, 0x81, 0x00, // 43 --> +
0x02, 0x50, 0x18, // 44 --> ,
0x05, 0x08, 0x04, 0x02, 0x81, 0x00, // 45 --> -
0x02, 0x60, 0x30, // 46 --> .
0x05, 0x20, 0x08, 0x82, 0x20, 0x00, // 47 --> /
0x05, 0xbe, 0x68, 0xb2, 0xe8, 0x03, // 48 --> 0
0x05, 0x00, 0xe1, 0x1f, 0x08, 0x00, // 49 --> 1
0x05, 0xc2, 0x70, 0x34, 0x69, 0x04, // 50 --> 2
0x05, 0xa1, 0x60, 0x71, 0x19, 0x03, // 51 --> 3
0x05, 0x18, 0x8a, 0xe4, 0x0f, 0x01, // 52 --> 4
0x05, 0xa7, 0x62, 0xb1, 0x98, 0x03, // 53 --> 5
0x05, 0x3c, 0x65, 0x32, 0x09, 0x03, // 54 --> 6
0x05, 0x83, 0x40, 0x3c, 0x71, 0x00, // 55 --> 7
0x05, 0xb6, 0x64, 0x32, 0x69, 0x03, // 56 --> 8
0x05, 0x86, 0x64, 0x32, 0xe5, 0x01, // 57 --> 9
0x02, 0x36, 0x1b, // 58 --> :
0x02, 0x56, 0x1b, // 59 --> ;
0x04, 0x08, 0x8a, 0x28, 0x08, // 60 --> <
0x05, 0x14, 0x0a, 0x85, 0x42, 0x01, // 61 --> =
0x04, 0x41, 0x11, 0x05, 0x01, // 62 --> >
0x05, 0x82, 0x40, 0x34, 0x61, 0x00, // 63 --> ?
0x05, 0xb2, 0x64, 0x3e, 0xe8, 0x03, // 64 --> @
0x05, 0xfe, 0x48, 0x24, 0xe2, 0x07, // 65 --> A
0x05, 0xff, 0x64, 0x32, 0x69, 0x03, // 66 --> B
0x05, 0xbe, 0x60, 0x30, 0x28, 0x02, // 67 --> C
0x05, 0xff, 0x60, 0x50, 0xc4, 0x01, // 68 --> D
0x05, 0xff, 0x64, 0x32, 0x19, 0x04, // 69 --> E
0x05, 0xff, 0x44, 0x22, 0x11, 0x00, // 70 --> F
0x05, 0xbe, 0x60, 0x32, 0xa9, 0x07, // 71 --> G
0x05, 0x7f, 0x04, 0x02, 0xf1, 0x07, // 72 --> H
0x03, 0xc1, 0x7f, 0x10, // 73 --> I
0x05, 0x20, 0x60, 0xf0, 0x17, 0x00, // 74 --> J
0x05, 0x7f, 0x04, 0x45, 0x14, 0x04, // 75 --> K
0x05, 0x7f, 0x20, 0x10, 0x08, 0x04, // 76 --> L
0x05, 0x7f, 0x01, 0x43, 0xf0, 0x07, // 77 --> M
0x05, 0x7f, 0x02, 0x02, 0xf2, 0x07, // 78 --> N
0x05, 0xbe, 0x60, 0x30, 0xe8, 0x03, // 79 --> O
0x05, 0xff, 0x44, 0x22, 0x61, 0x00, // 80 --> P
0x05, 0xbe, 0x60, 0x34, 0xe4, 0x05, // 81 --> Q
0x05, 0xff, 0x44, 0x26, 0x65, 0x04, // 82 --> R
0x05, 0xc6, 0x64, 0x32, 0x19, 0x03, // 83 --> S
0x05, 0x81, 0xc0, 0x3f, 0x10, 0x00, // 84 --> T
0x05, 0x3f, 0x20, 0x10, 0xf8, 0x03, // 85 --> U
0x05, 0x1f, 0x10, 0x10, 0xf4, 0x01, // 86 --> V
0x05, 0x3f, 0x20, 0x0e, 0xf8, 0x03, // 87 --> W
0x05, 0x63, 0x0a, 0x82, 0x32, 0x06, // 88 --> X
0x05, 0x07, 0x04, 0x1c, 0x71, 0x00, // 89 --> Y
0x05, 0xe1, 0x68, 0xb2, 0x38, 0x04, // 90 --> Z
0x02, 0xff, 0x20, // 91 --> [
0x05, 0x02, 0x02, 0x02, 0x02, 0x02, // 92 --> backslash
0x02, 0xc1, 0x3f, // 93 --> ]
0x03, 0x04, 0x01, 0x01, // 94 --> ^
0x05, 0x40, 0x20, 0x10, 0x08, 0x04, // 95 --> _
0x03, 0x01, 0x01, 0x01, // 96 --> `
0x04, 0x20, 0x2a, 0x15, 0x0f, // 97 --> a
0x04, 0x7f, 0x24, 0x11, 0x07, // 98 --> b
0x04, 0x38, 0x22, 0x11, 0x04, // 99 --> c
0x04, 0x38, 0x22, 0xf2, 0x0f, // 100 --> d
0x04, 0x38, 0x2a, 0x15, 0x03, // 101 --> e
0x04, 0x08, 0x7f, 0x42, 0x00, // 102 --> f
0x04, 0x0c, 0xa9, 0xd4, 0x07, // 103 --> g
0x04, 0x7f, 0x04, 0x01, 0x0f, // 104 --> h
0x03, 0xc4, 0x3e, 0x10, // 105 --> i
0x04, 0x20, 0x20, 0xb1, 0x07, // 106 --> j
0x04, 0x7f, 0x08, 0x8a, 0x08, // 107 --> k
0x03, 0xc1, 0x3f, 0x10, // 108 --> l
0x05, 0x7c, 0x02, 0x86, 0x80, 0x07, // 109 --> m
0x04, 0x7c, 0x04, 0x01, 0x0f, // 110 --> n
0x04, 0x38, 0x22, 0x11, 0x07, // 111 --> o
0x04, 0x7c, 0x0a, 0x05, 0x01, // 112 --> p
0x04, 0x08, 0x0a, 0x86, 0x0f, // 113 --> q
0x04, 0x7c, 0x04, 0x01, 0x01, // 114 --> r
0x04, 0x48, 0x2a, 0x15, 0x04, // 115 --> s
0x04, 0x84, 0x1f, 0x11, 0x04, // 116 --> t
0x04, 0x3c, 0x20, 0x88, 0x0f, // 117 --> u
0x05, 0x1c, 0x10, 0x10, 0xc4, 0x01, // 118 --> v
0x05, 0x3c, 0x20, 0x0e, 0xc8, 0x03, // 119 --> w
0x04, 0x6c, 0x08, 0x84, 0x0d, // 120 --> x
0x04, 0x0c, 0x28, 0x94, 0x07, // 121 --> y
0x04, 0x64, 0x3a, 0x97, 0x09, // 122 --> z
0x03, 0x08, 0x5b, 0x10, // 123 --> {
0x01, 0x7f, // 124 --> |
0x03, 0x41, 0x1b, 0x02, // 125 --> }
0x05, 0x08, 0x02, 0x03, 0x41, 0x00, // 126 --> ~
0x00, // 127 --> 
0x05, 0x81, 0x7f, 0x2a, 0x19, 0x03, // 128 --> <20>
0x00, // 129 --> <20>
0x00, // 130 --> <20>
0x00, // 131 --> <20>
0x03, 0x70, 0x00, 0x1c, // 132 --> <20>
0x05, 0x40, 0x00, 0x10, 0x00, 0x04, // 133 --> <20>
0x05, 0x04, 0xc2, 0x9f, 0x40, 0x00, // 134 --> <20>
0x05, 0x14, 0xca, 0x9f, 0x42, 0x01, // 135 --> <20>
0x05, 0xbe, 0x6a, 0x35, 0x28, 0x02, // 136 --> <20>
0x05, 0xa8, 0x7f, 0x2a, 0x65, 0x00, // 137 --> <20>
0x00, // 138 --> <20>
0x03, 0x10, 0x14, 0x11, // 139 --> <20>
0x00, // 140 --> <20>
0x05, 0x04, 0xc1, 0x47, 0x40, 0x00, // 141 --> <20>
0x05, 0x10, 0x10, 0x1f, 0x04, 0x01, // 142 --> <20>
0x05, 0x08, 0x8e, 0x0a, 0x81, 0x00, // 143 --> <20>
0x05, 0x08, 0x84, 0x8a, 0x83, 0x00, // 144 --> <20>
0x00, // 145 --> <20>
0x00, // 146 --> <20>
0x00, // 147 --> <20>
0x03, 0x07, 0xc0, 0x01, // 148 --> <20>
0x03, 0x14, 0x04, 0x05, // 149 --> <20>
0x03, 0x08, 0x04, 0x02, // 150 --> <20>
0x05, 0x08, 0x04, 0x02, 0x81, 0x00, // 151 --> <20>
0x00, // 152 -->
0x00, // 153 --> <20>
0x00, // 154 --> <20>
0x03, 0x22, 0x0a, 0x02, // 155 --> <20>
0x00, // 156 --> <20>
0x05, 0x78, 0x30, 0x14, 0x49, 0x00, // 157 --> <20>
0x05, 0x04, 0x24, 0x14, 0x8c, 0x07, // 158 --> <20>
0x05, 0x90, 0x44, 0x61, 0xf0, 0x00, // 159 --> <20>
0x05, 0x8f, 0x41, 0x21, 0x01, 0x01, // 160 --> <20>
0x00, // 161 --> <20>
0x00, // 162 --> <20>
0x00, // 163 --> <20>
0x05, 0x5d, 0x91, 0x48, 0xd4, 0x05, // 164 --> <20>
0x00, // 165 --> <20>
0x01, 0x77, // 166 --> <20>
0x00, // 167 --> <20>
0x05, 0xfe, 0xa5, 0x72, 0x29, 0x04, // 168 --> <20>
0x05, 0xbe, 0xf1, 0x7a, 0xed, 0x03, // 169 --> <20>
0x05, 0xbe, 0x64, 0x32, 0x29, 0x02, // 170 --> <20>
0x05, 0x08, 0x8a, 0x8a, 0x22, 0x02, // 171 --> <20>
0x05, 0x08, 0x04, 0x02, 0x81, 0x03, // 172 --> <20>
0x00, // 173 --> <20>
0x05, 0x9e, 0x50, 0x6d, 0xe5, 0x01, // 174 --> <20>
0x05, 0x80, 0x00, 0x3f, 0x00, 0x00, // 175 --> <20>
0x05, 0x83, 0x1d, 0x91, 0x88, 0x02, // 176 --> <20>
0x03, 0x24, 0x17, 0x09, // 177 --> <20>
0x00, // 178 --> <20>
0x00, // 179 --> <20>
0x00, // 180 --> <20>
0x05, 0x7c, 0x08, 0x08, 0xc4, 0x03, // 181 --> <20>
0x05, 0x86, 0x7f, 0xe0, 0x1f, 0x00, // 182 --> <20>
0x03, 0x1c, 0x0e, 0x07, // 183 --> <20>
0x04, 0x39, 0x6a, 0x15, 0x03, // 184 --> <20>
0x04, 0x7c, 0x0c, 0x8c, 0x0f, // 185 --> <20>
0x04, 0x38, 0x2a, 0x95, 0x08, // 186 --> <20>
0x05, 0x22, 0x8a, 0x8a, 0x82, 0x00, // 187 --> <20>
0x05, 0xc1, 0x60, 0x37, 0x18, 0x04, // 188 --> <20>
0x05, 0xc1, 0x6e, 0xb0, 0x1b, 0x04, // 189 --> <20>
0x05, 0xdd, 0x60, 0x37, 0xd8, 0x05, // 190 --> <20>
0x05, 0x00, 0x02, 0x9c, 0x00, 0x00, // 191 --> <20>
0x05, 0xfe, 0x48, 0x24, 0xe2, 0x07, // 192 --> <20>
0x05, 0xff, 0x64, 0x32, 0x39, 0x03, // 193 --> <20>
0x05, 0xff, 0x64, 0x32, 0x69, 0x03, // 194 --> <20>
0x05, 0xff, 0x40, 0x20, 0x30, 0x00, // 195 --> <20>
0x05, 0x60, 0x5f, 0xe8, 0x07, 0x06, // 196 --> <20>
0x05, 0xff, 0x64, 0x32, 0x19, 0x04, // 197 --> <20>
0x05, 0x77, 0xc4, 0x1f, 0x71, 0x07, // 198 --> <20>
0x05, 0xc1, 0x64, 0x32, 0x69, 0x03, // 199 --> <20>
0x05, 0x7f, 0x08, 0x82, 0xf0, 0x07, // 200 --> <20>
0x05, 0xfe, 0x90, 0x24, 0xe1, 0x07, // 201 --> <20>
0x05, 0x7f, 0x04, 0x45, 0x14, 0x04, // 202 --> <20>
0x05, 0x40, 0x5f, 0x20, 0xf0, 0x07, // 203 --> <20>
0x05, 0x7f, 0x01, 0x43, 0xf0, 0x07, // 204 --> <20>
0x05, 0x7f, 0x04, 0x02, 0xf1, 0x07, // 205 --> <20>
0x05, 0xbe, 0x60, 0x30, 0xe8, 0x03, // 206 --> <20>
0x05, 0xff, 0x40, 0x20, 0xf0, 0x07, // 207 --> <20>
0x05, 0xff, 0x44, 0x22, 0x61, 0x00, // 208 --> <20>
0x05, 0xbe, 0x60, 0x30, 0x28, 0x02, // 209 --> <20>
0x05, 0x81, 0xc0, 0x3f, 0x10, 0x00, // 210 --> <20>
0x05, 0x27, 0x24, 0x12, 0xf9, 0x03, // 211 --> <20>
0x05, 0x1c, 0xd1, 0x5f, 0xc4, 0x01, // 212 --> <20>
0x05, 0x63, 0x1a, 0x82, 0x32, 0x06, // 213 --> <20>
0x05, 0x3f, 0x10, 0xe8, 0x07, 0x06, // 214 --> <20>
0x05, 0x07, 0x04, 0x02, 0xf1, 0x07, // 215 --> <20>
0x05, 0x7f, 0xe0, 0x1f, 0xf8, 0x07, // 216 --> <20>
0x05, 0x3f, 0xd0, 0x0f, 0xf4, 0x07, // 217 --> <20>
0x05, 0x81, 0x3f, 0x12, 0x09, 0x03, // 218 --> <20>
0x05, 0x7f, 0x24, 0x12, 0xf6, 0x07, // 219 --> <20>
0x05, 0x7f, 0x24, 0x12, 0x09, 0x03, // 220 --> <20>
0x05, 0xa2, 0x60, 0x32, 0xe9, 0x03, // 221 --> <20>
0x05, 0x7f, 0x84, 0x2f, 0xe8, 0x03, // 222 --> <20>
0x05, 0xc6, 0x54, 0x26, 0xf1, 0x07, // 223 --> <20>
0x04, 0x20, 0x2a, 0x15, 0x0f, // 224 --> <20>
0x04, 0xbe, 0x62, 0x11, 0x07, // 225 --> <20>
0x04, 0x7c, 0x2a, 0x16, 0x04, // 226 --> <20>
0x03, 0x7c, 0x02, 0x01, // 227 --> <20>
0x05, 0x60, 0x1c, 0x89, 0x07, 0x06, // 228 --> <20>
0x04, 0x38, 0x2a, 0x15, 0x03, // 229 --> <20>
0x05, 0x6c, 0x08, 0x1f, 0xc2, 0x06, // 230 --> <20>
0x04, 0x44, 0x2a, 0x15, 0x05, // 231 --> <20>
0x04, 0x7c, 0x10, 0x84, 0x0f, // 232 --> <20>
0x04, 0x7c, 0x90, 0xa4, 0x0f, // 233 --> <20>
0x04, 0x7c, 0x08, 0x8a, 0x08, // 234 --> <20>
0x04, 0x40, 0x1c, 0x81, 0x0f, // 235 --> <20>
0x05, 0x7c, 0x04, 0x04, 0xc1, 0x07, // 236 --> <20>
0x04, 0x7c, 0x08, 0x84, 0x0f, // 237 --> <20>
0x04, 0x38, 0x22, 0x11, 0x07, // 238 --> <20>
0x04, 0x7c, 0x02, 0x81, 0x0f, // 239 --> <20>
0x04, 0x7c, 0x0a, 0x05, 0x01, // 240 --> <20>
0x04, 0x38, 0x22, 0x11, 0x04, // 241 --> <20>
0x03, 0x04, 0x3e, 0x01, // 242 --> <20>
0x04, 0x0c, 0x28, 0x94, 0x07, // 243 --> <20>
0x05, 0x10, 0x14, 0x1f, 0x05, 0x01, // 244 --> <20>
0x04, 0x6c, 0x08, 0x84, 0x0d, // 245 --> <20>
0x04, 0x3c, 0x10, 0x0f, 0x0c, // 246 --> <20>
0x04, 0x0c, 0x08, 0x84, 0x0f, // 247 --> <20>
0x05, 0x7c, 0x20, 0x1f, 0xc8, 0x07, // 248 --> <20>
0x05, 0x3c, 0x10, 0x0f, 0xc4, 0x07, // 249 --> <20>
0x04, 0x04, 0x3e, 0x14, 0x04, // 250 --> <20>
0x05, 0x7c, 0x28, 0x14, 0xc4, 0x07, // 251 --> <20>
0x04, 0x7c, 0x28, 0x14, 0x04, // 252 --> <20>
0x04, 0x44, 0x2a, 0x15, 0x07, // 253 --> <20>
0x05, 0x7c, 0x08, 0x8e, 0x88, 0x03, // 254 --> <20>
0x04, 0x48, 0x1a, 0x85, 0x0f // 255 --> <20>
};

27
STM32_HAL_Lib/fonts.h Normal file
View File

@@ -0,0 +1,27 @@
/*
ST7565 LCD Font library
Anton Mukhin, 2023
*/
#ifndef INC_FONTS_H_
#define INC_FONTS_H_
#include <stdint.h>
#define FONT_HEADER 6
/* Font header map:
uint8_t packed; // Is it a packed font?
uint8_t width; // Font width in pixels
uint8_t height; // Font height in pixels
uint8_t space; // Space between characters
uint8_t first; // First character code
uint8_t last; // Last character code
*/
extern const uint8_t font_5x7_vw[];
#endif /* INC_FONTS_H_ */

View File

@@ -2,7 +2,7 @@
* mctext.c
*
* Created on: May 16, 2025
* Author: User
* Author: Anton Mukhin
*/
@@ -15,8 +15,10 @@ void (*mct_SetPixel)(uint8_t, uint8_t, uint8_t) = ST7565_SetPixel;
//=================================================================================//
// Draw a single character. Returns width of drawn character
uint8_t mct_CharT(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uint8_t *font, uint8_t transp) {
uint8_t mct_CharTS(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uint8_t *font, uint8_t transp, uint8_t scale) {
uint8_t pk = font[0]; // Is it a packed font?
uint8_t w = font[1]; // Font char width
uint8_t h = font[2]; // Font char height
@@ -25,10 +27,11 @@ uint8_t mct_CharT(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const ui
uint8_t i, j, p, s, b, seg; // i-cur.column, j-cur.row of 8, p-rows of 8, s-height in cur.row of 8, b-cur.bit in cur.row, seg-byte.segment
uint8_t bps; // Bytes per symbol for packed fonts
uint16_t o; // Current offset
uint8_t sx, sy; // To paint scaled pixel
if (c < fc || c > lc) return 0;
if (x > LCDWIDTH) return 0;
if (y+h > LCDHEIGHT) return 0;
if (y + h * scale > LCDHEIGHT) return 0;
// Calc the offset for desired symbol
if (pk) { // The font is packed
@@ -51,11 +54,19 @@ uint8_t mct_CharT(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const ui
bps = w*h/8; // Bytes per current symbol
if ((w*h)%8 > 0) bps++; // Correction for the last byte
b = 0; // bit indexer in "current" byte
for (i=0; i<w; i++) { // Going through columns
for (i=0; i<w*scale; i+=scale) { // Going through columns
if (x+i > LCDWIDTH) return i-1; // Check if we're out of display size
for (j=0; j<h; j++) { // Going through rows in column [i]
for (j=0; j<h*scale; j+=scale) { // Going through rows in column [i]
if (b == 0) seg = font[o];
if ((seg>>b) & 1) mct_SetPixel(x+i, y+j, color); // Paint the pixel
if ((seg>>b) & 1) {
for (sx = 0; sx < scale; sx++)
for (sy = 0; sy < scale; sy++)
mct_SetPixel(x+i+sx, y+j+sy, color); // Paint the pixel
} else if (!transp) {
for (sx = 0; sx < scale; sx++)
for (sy = 0; sy < scale; sy++)
mct_SetPixel(x+i+sx, y+j+sy, !color); // Paint the background pixel
}
if (b < 7) b++; else {b = 0; o++;} // Track bits and bytes
}
}
@@ -74,22 +85,34 @@ uint8_t mct_CharT(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const ui
}
// Draw the symbol
for (i=0; i<w; i++) { // Going through columns
for (i=0; i<w*scale; i+=scale) { // Going through columns
if (x+i > LCDWIDTH) return i-1; // Check if we're out of display size
for (j=0; j<p; j++) { // Going through bytes in single column
s = (h - j*8 >= 8) ? 8 : (h - j*8) % 8; // Clac the amount of pixels in current byte
seg = font[o];
for (b=0; b<s; b++) { // Going through the byte and paint the pixel if the bit is 1
if ((seg>>b) & 1) mct_SetPixel(x+i, y+j*8+b, color);
else if (!transp) mct_SetPixel(x+i, y+j*8+b, !color);
if ((seg>>b) & 1) {
for (sx = 0; sx < scale; sx++)
for (sy = 0; sy < scale; sy++)
mct_SetPixel(x+i+sx, y+j*8*scale+b*scale+sy, color);
} else if (!transp) {
for (sx = 0; sx < scale; sx++)
for (sy = 0; sy < scale; sy++)
mct_SetPixel(x+i+sx, y+j*8*scale+b*scale+sy, !color);
}
}
o++;
}
//mct_SetPixel(x+i, y, color); // For testing purposes
}
}
return w;
return w*scale;
}
// Draw a single character. Not scaled
uint8_t mct_CharT(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uint8_t *font, uint8_t transp) {
return mct_CharTS(x, y, c, color, font, transp, 1);
}
// Draw a single character. Transparent background. Returns width of drawn character
@@ -97,17 +120,22 @@ uint8_t mct_Char(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uin
return mct_CharT(x, y, c, color, font, 1);
}
// Draw a string of characters
void mct_String(uint8_t x, uint8_t y, const char *c, uint8_t color, const uint8_t *font) {
// Draw a string of characters. Transparency, Scale
void mct_StringTS(uint8_t x, uint8_t y, const char *c, uint8_t color, const uint8_t *font, uint8_t transp, uint8_t scale) {
uint8_t w = font[1]; // Font char width
uint8_t h = font[2]; // Font char height
uint8_t s = font[3]; // Font space between characters
if (y+h > LCDHEIGHT) return;
if (y+h*scale > LCDHEIGHT) return;
while (c[0] != 0) {
if (x+w > LCDWIDTH) return;
w = mct_Char(x, y, (unsigned char)*c, color, font);
//if (x+w > LCDWIDTH) return;
w = mct_CharTS(x, y, (unsigned char)*c, color, font, transp, scale);
c++;
x += w + s;
x += w + s*scale;
}
}
// Draw a string of characters
void mct_String(uint8_t x, uint8_t y, const char *c, uint8_t color, const uint8_t *font) {
mct_StringTS(x, y, c, color, font, 1, 1);
}

View File

@@ -2,19 +2,27 @@
* mctext.h
*
* Created on: May 16, 2025
* Author: User
* Author: Anton Mukhin
*/
#ifndef INC_MCTEXT_H_
#define INC_MCTEXT_H_
#include "stm32f1xx_hal.h"
#include "stm32g0xx_hal.h"
// Draw a single character. Returns width of drawn character
uint8_t mct_CharTS(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uint8_t *font, uint8_t transp, uint8_t scale);
// Draw a single character. Not scaled
uint8_t mct_CharT(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uint8_t *font, uint8_t transp);
// Draw a single character. Transparent background. Returns width of drawn character
uint8_t mct_Char(uint8_t x, uint8_t y, unsigned char c, uint8_t color, const uint8_t *font);
// Draw a string of characters. Transparency, Scale
void mct_StringTS(uint8_t x, uint8_t y, const char *c, uint8_t color, const uint8_t *font, uint8_t transp, uint8_t scale);
// Draw a string of characters
void mct_String(uint8_t x, uint8_t y, const char *c, uint8_t color, const uint8_t *font);

View File

@@ -1,10 +1,11 @@
Application:
- Consider migrating to WPF in order to make DPI aware UI
V Cursor for rectangular selection tool
V Icons for tool buttons
V Tooltips now has keyboard shortcuts info
V Export comments now respects "Code in Hex" checkbox on the main form
Functionality:
Bugs:
V Fix selection info: change comma to x
V Frame modified flag persists when switching to another frame after rejected to save previous frame
V Ctrl-C, Ctrl-V doesn't work in the Note editbox because it tries to copy/paste the frame!
V Post "Backslash" instead of \ in comments

Binary file not shown.

BIN
examples/Cursors.mbfont Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

BIN
icons/famfamfam/fam_mid.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

BIN
icons/famfamfam/fam_top.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB