From 519720f2efe881187c194c8f5df7c70214cc595c Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Wed, 28 May 2025 02:42:24 +0300 Subject: [PATCH 1/9] One more fint to the examples --- examples/Font_4x6_vw.mbfont | Bin 0 -> 7515 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/Font_4x6_vw.mbfont diff --git a/examples/Font_4x6_vw.mbfont b/examples/Font_4x6_vw.mbfont new file mode 100644 index 0000000000000000000000000000000000000000..6ba64103f9d9806c1acb38eaf69c58731d85fd7d GIT binary patch literal 7515 zcmdT}RkR#M6nr7c=ASRVI7qPI?(XjH?(XhxfxUzP!QI_0?BaBACqN)L#2q5ss@u1_ zXWz@2{BfAKneFMSTUGbY%pT5R@K8Nk!}^TuJG^Uz%r{q~Iagyyt2ku-UX5n2#-Mh) z-DW~@5b=1x%Dy~ww49^Hky4En^%d7Y6XC9Yw7PA22vR;CCfs68qGecF%K)% zLBI0}jD?*MmGc+#XvRf6F*an;*i#GxF_LR`|&B1r`wkdXg0! zLqq6_HR`E#D>}wpWo1iNa?CQJ%t}>rWyc^$NmZkIOIC5r>9Gn~RxPl?4VAK5oS3dP z+3G&Al(;2pq-tg4ee%~#812m4&a#$csG@u}0qH1=L73>dq)s(96cosOE@D z=w%aUSPmw%iLzN`Z0heMdX>$5wvogy)T-O&J!&y7Cacw3c(uD_KiSfMgCd3!R;3ed zWUCIBf@hVowKJ++(@QCubQ@<_g-?`HJju4s=+FSF657jl&gfACv)bMnO4m>I4|}ph zng?2q6K8;y?C90dCyWxX$kXbbQgtE_Q;zIhOp{ei-JQ2f)&K+Q$bpaST42;b5RzK5 zTf&TvRK&DycYDu$F3^-ce9yz^-kx!fuEv(VT$e%YWT9HJcfwc!C7+1wleK(X_RV~z zRx&>5LiTgad>agOfEr)m1F##fI-4T^H`AC04%+ZLIwdo(_ialUQCrm-MN*S!>n1opi zoL`*qu?Z{d$dlvBNm(j6zTjg^4JZen6XKo6XfSO3$cc$>yAi;JoK#@C4+uplmXnK_ z5XxAEcS_cvrInlasTosI$TAcRrGK-M;^n|epwN|d!8I?PCrZXXKG+U{|S#f&Q zuxxU6SEJe07%1T!|4C74`obWVav|Yd=bmSljNg`UzI$SWrc8%o2^W+gl>KOH<%Mac zx?5l!YY7)66|yv7v)eVeyH4KgqK8J0!5^iWT znhpK0@cvPZccZfA1^dC3NpvMqf)!_6*pi!W~V#cjU0 z-4}QG;?A;16)SE4Qb72wMBxTFjE8fi-0gDr_)7wkgnQF?^-}-rLjei*dC~nPD{7ju zN<84K2a7?_9~3_<5q2azl;k4Act|bbVV8TvS?pMurNpDoddyh`%!JT-yadr2MN|i^ zKj9#+p$`KxBs|#x#zHV8Jmuz3I}6e*M+z<_Jd;5T!Ej(Of7X9EOz}Bad_FyyBtnkG zCIAcl=Vu8oc-@O>_Jq+#I*J_$FL}kwzIeqKulizWex8ul>RrY1zvdLgG)g|hTtaL1 z6qA(D_7S;?_lo-0Q%l~wwT@z%lB~a-Z_M5ZQ^2_2?AK`a(-(e#ZJ56e$+b8zHt9ug zrF2xW{yh5IRns_d6Ja_D?>I%l7&z&3N5Z>K$%N>oJ{J8wr|31z^@wIsRYLGdMHQxq zq)MV;u2r!!D+)_^-ziWx4Tc7ZI}$!{im8}eJV%ueJ1Kxohi-aHK5|M=Mj%P}xV!BI_ zX0%W%$0U$aChf9gD`4u*D#sN5Yrq)xY)l>4jnQnh|q3>qB%Jh25jC#t Date: Wed, 28 May 2025 03:04:42 +0300 Subject: [PATCH 2/9] One more fint to the examples --- examples/Font_3x5_Latin.mbfont | Bin 0 -> 2126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/Font_3x5_Latin.mbfont diff --git a/examples/Font_3x5_Latin.mbfont b/examples/Font_3x5_Latin.mbfont new file mode 100644 index 0000000000000000000000000000000000000000..4fbc854a0aa0caa9b85f49d34130e81e23ec789f GIT binary patch literal 2126 zcmZ{lN0L)P5JVZHd*HqI-h1z1u!HyB`$H&+AlPsfqP6A*?6?S(Syiq66Y!<^Qoqj1 z$}WX8-+tOvevSVb|2=II(?@#!k>1zB3p0E%7?eT5%&}g7toOqfap@gq1vW{EKYNGS zRc*y~*_Pcfr>aA)9n2l=^+$W()7k3h)z-F{AKUDxCl)w~wY^|rb?)R?!vZ{c;-n-Q z8JqbE_I0qraFY8QET!i@5Lh8RyzS!PKd^Zp>X>*-Qy*?|a zZ0BSRj(4z|SdtSJD|wontXTELJkF`aIS%d?oDN(=_yo_Snwe#;;d=CULT7cmk=-N|wi|9v#U?gIJg}+Tr~!Ze5a~y z!^D0<+;uERRz#9}@jFc=?l(UTD#L@eN@X;}!)DMP=27jcGp7CH4z69Fba9U5=@2V- zWPCQnJh-a|c;3azVdsAlm{LufuLUnt?a{br54=j8WAzW{b;Zo=PG<6^VtTSfAJE&x zYNaiDzf0_y4N3hzu_ADf4}2J6>d1&c=08$?K%ZQr9cd^k_#CBLktiCzBqo`9{b% Date: Wed, 28 May 2025 03:22:20 +0300 Subject: [PATCH 3/9] One more fint to the examples --- examples/Font_3x3_mono_Latin.mbfont | Bin 0 -> 1573 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/Font_3x3_mono_Latin.mbfont diff --git a/examples/Font_3x3_mono_Latin.mbfont b/examples/Font_3x3_mono_Latin.mbfont new file mode 100644 index 0000000000000000000000000000000000000000..98444f3ed5a20b5ed9c2e3deba0c7fbdc919a651 GIT binary patch literal 1573 zcmZ9MS8^0V5JZKBgMbj;dk?~U?}Zb>2?;B_Kg4Dba2ulgn;Y=QMaXhJQq68`Oux#^ zs-EfCpTBvPKMVg2{T-UXq6OW6-%<(|+ik5CBV9M>x?h#J6#im~0bR=vMl)EN!LkgN zdp_MOhP%OV_k+>=V5O~eQLxG)&ot!@dk8Val(NQT5-~VC2|;?nrC5`(>;(T6=xcdwzQn>fo<-b z0qLn9obMH4DY!6SQE_puLb_aXg-=>=*%k8mWdFF*EQWA3fKI_K*8=FAob-BR_++>d z3Qxs&D5Q(bans+lEGurcvOEid+wCAwfIC*!O|x2X*MX=tZX)zrz87U?$%V-b?q~2I zgNGSB%HVMZQyDzTU^;`D44!82EQ9A6yvX2X2Cp)h&ERzgZ!&nB!MhCJXYe6|j~RT* f;IjieSv&||{GWuU;H%Z5RPZf;oP9YK-&5RwKkh29 literal 0 HcmV?d00001 From 2a4b36d3684f025f0449ef68e983289916a19c24 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Wed, 28 May 2025 17:15:57 +0300 Subject: [PATCH 4/9] WIP: - Working on Alagard_cyr font - +Minecraft font - TODO update --- TODO.txt | 12 ++---------- examples/Font_9x17_Alagard_cyr_vw.mbfont | Bin 0 -> 36211 bytes examples/Font_Minecraft_Rus_5x7_vw.mbfont | Bin 0 -> 11075 bytes 3 files changed, 2 insertions(+), 10 deletions(-) create mode 100644 examples/Font_9x17_Alagard_cyr_vw.mbfont create mode 100644 examples/Font_Minecraft_Rus_5x7_vw.mbfont diff --git a/TODO.txt b/TODO.txt index 2ef9d56..aead405 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,15 +1,7 @@ Application: -V Move Select and Baseline buttons right -V Display RectSelection width and width -V Indicate modified project by adding "*" to window caption Functionality: -V Copy/Paste should be aware of rectangle selection -V Select All function -V Select and Select All shortcuts +- Type a string to see the result (test the font) Bugs: -V EncodingProvider hotfix -V Check if frame changed before exit application -V Hostory does not record pastes from clipboard -V Undo/Redo menu availability recalculation does not happen sometimes +- In some cases after switching to a symbol dotPanel mouse move causes "Out of range" exception (history.Pre after width change?) diff --git a/examples/Font_9x17_Alagard_cyr_vw.mbfont b/examples/Font_9x17_Alagard_cyr_vw.mbfont new file mode 100644 index 0000000000000000000000000000000000000000..a180d290315b89f2f2121f8aa4be64025a596054 GIT binary patch literal 36211 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 literal 0 HcmV?d00001 diff --git a/examples/Font_Minecraft_Rus_5x7_vw.mbfont b/examples/Font_Minecraft_Rus_5x7_vw.mbfont new file mode 100644 index 0000000000000000000000000000000000000000..0a05b5efc84d2f0f7ddd50a52221315899502727 GIT binary patch literal 11075 zcmcgyRiGtD5#1!4?9CsadkQLu*qIJltq)n9 zxEEvEJK32JTdfas;%3-+cT|`$c^JRg`38l_&fh5r)OC+O zera-cOl4%1D4pFWC}%iG=IsKNAtj#HkukX29Q=-5ureqf{Te-J01tlbLL)! zZde&aKPR;qhz8Q5RkVU_l(@ErS(KwILU5O8O|poj*Jx~5jepGdAn)P zNCX4(EGL%ovzrYJM^Gz-eTsGNkm4RUukTzG%6u)wS9Xg*6NYe((I#y+*)6LkQF$zQ zr-$82ns7=`AL_OycI(C%fb!jlcANQcjDpy02Q6-Qonb{B{`G>b| zvfGORNHlDY)Y>I{YIoQ_1Guh>cihIH7$rkL)?S0}*`4%rIO>ktP+p>Hv^x*lgok-f zxd=FWGTB|k7<=R%4vV3fUA=4k2IAfrlif`UL`Tyw6|KdfOm=sjr}Gp%j|7ry-=jVa zVMYsP?%7?~@shB6dcVl2jnwZQ#k+=IaMx2dMF^3pc+I<@%cBnl= z#!*7i?$;PPxsFQOaB|da_iqd!fkKv)780q0)asi8K!j1FE z9@cr^0+G6Bl6v%m3R4(VhW)s1u5F2+V9g8O-*?S*J3F7y?*qr)q2QC2qHEv}FvR0m< zMn6-NXKC_mO-|6{IaMcGR86crx2AG45pLms?UH}k8qDA?h#w(?r}aF0eQS^cU7-L1T?esf|gt-M}-Z)jpsWN3h=nN(xX${Y3liUjW{ zO#;qUBceE8#qjgKNw#lpwzKo4ZTd3+VdX7bD4vM15q-nTTV?mQ11Q-UaTJzcOMbgF z-mz!3-s2DJv7Vx7pq-U#)EZOdH$PV1*&Sib({7Vv&F>}57X$_Cq#)I9+#wG zwlxp$n^vX+rl5bM?A=0vU^aI%TKS|X#6c%(c0m$Vu<}+uC5lq>GjwZ8Sow5Efk8+k z8KYk_Z{;(hsH3$Y9;546J^p7!=~P(&5GY=AElDe16eUlWh2%MWrKT%y z z3!3PCq`y;s)F^mpnvo2<$h?&wca%5;G2-?y$W~6>MnR1{@|I}jCyhd1m*t-=QD^z- zKtUY~g`uBTe%2^{c%EM+v8`Qck+<^mjzWhe7u0O!7afInowCSr^f6qm{BlQ1Jr}rG zi1MqE5~{s6@ks~O%C8%RI+9G~ZdqM^(&RRATSv*-VMS_2xpCjWt^d8JU=yP!w6)Ii zkDlV2q^Q7gEy`*7M(Z$){ZayeAB_L(+(eUv>rhIOt+n#6EpCD+>MjhDR{q_&?c_2@ zSou$*cr~7kqAOsLOTp4u$?k-%0w{rp4rL1&s zXScsFwbH+x3&55d-p;nYG#lQ|C1A^qZ)e+Im Date: Wed, 28 May 2025 17:34:37 +0300 Subject: [PATCH 5/9] TODO updated --- TODO.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.txt b/TODO.txt index aead405..fd91232 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,7 +1,9 @@ Application: +- Consider migrating to WPF in order to make DPI aware UI Functionality: - Type a string to see the result (test the font) +- Export image with All characers table Bugs: - In some cases after switching to a symbol dotPanel mouse move causes "Out of range" exception (history.Pre after width change?) From f9c9d440ec07848df3421415fb1139f749a6e605 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Wed, 28 May 2025 22:05:52 +0300 Subject: [PATCH 6/9] TODO feature: Allow to add frames to Single-frame "fonts" --- McBitFont/Form1.cs | 12 ++++++------ TODO.txt | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index e3cb3ed..3466d6c 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -136,7 +136,7 @@ namespace McBitFont { tsmiCodeShift.Visible = frames.Count > 1; CodeShiftToolStripMenuItem.Visible = frames.Count > 1; - + CheckForAdd(); } [DllImport("user32.dll")] @@ -863,17 +863,17 @@ namespace McBitFont { tsmiRemoveSymbol.Enabled = false; } //copyToolStripMenuItem.Enabled = true; - if (ff.Equals(frames.First())) { + if (frames.Count > 1 && ff.Equals(frames.First())) { removeBeforeToolStripMenuItem.Enabled = false; removeAfterToolStripMenuItem.Enabled = true; tsmiRemoveBefore.Enabled = false; tsmiRemoveAfter.Enabled = true; - } else if (ff.Equals(frames.Last())) { + } else if (frames.Count > 1 && ff.Equals(frames.Last())) { removeBeforeToolStripMenuItem.Enabled = true; removeAfterToolStripMenuItem.Enabled = false; tsmiRemoveBefore.Enabled = true; tsmiRemoveAfter.Enabled = false; - } else { + } else if (frames.Count > 1) { removeBeforeToolStripMenuItem.Enabled = true; removeAfterToolStripMenuItem.Enabled = true; tsmiRemoveBefore.Enabled = true; @@ -1031,9 +1031,9 @@ namespace McBitFont { } } else { prependSymbolToolStripMenuItem.Enabled = false; - appendSymbolToolStripMenuItem.Enabled = false; + appendSymbolToolStripMenuItem.Enabled = true; tsmiPrepensSymbol.Enabled = false; - tsmiAppendSymbol.Enabled = false; + tsmiAppendSymbol.Enabled = true; } } diff --git a/TODO.txt b/TODO.txt index fd91232..5e7f31a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -2,6 +2,7 @@ Application: - Consider migrating to WPF in order to make DPI aware UI Functionality: +V Allow to add frames to Single-frame "fonts" - Type a string to see the result (test the font) - Export image with All characers table From 6c32edac6e0c354caada0522e42acb63c76d9889 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Thu, 29 May 2025 03:02:42 +0300 Subject: [PATCH 7/9] TODO feature: Type a string to see the result (test the font) --- McBitFont/About.Designer.cs | 2 +- McBitFont/CodeShift.Designer.cs | 2 +- McBitFont/Export.Designer.cs | 2 +- McBitFont/FontTester.Designer.cs | 189 ++++++ McBitFont/FontTester.cs | 160 +++++ McBitFont/FontTester.resx | 123 ++++ McBitFont/Form1.Designer.cs | 12 +- McBitFont/Form1.cs | 9 +- McBitFont/ImageImporter.Designer.cs | 2 +- McBitFont/ImageImporter.resx | 3 - McBitFont/New.Designer.cs | 686 ++++++++++----------- McBitFont/New.resx | 54 +- McBitFont/Properties/Resources.Designer.cs | 10 + McBitFont/Properties/Resources.resx | 15 +- McBitFont/Resources/font.png | Bin 0 -> 567 bytes TODO.txt | 2 +- icons/famfamfam/font.png | Bin 0 -> 567 bytes 17 files changed, 860 insertions(+), 411 deletions(-) create mode 100644 McBitFont/FontTester.Designer.cs create mode 100644 McBitFont/FontTester.cs create mode 100644 McBitFont/FontTester.resx create mode 100644 McBitFont/Resources/font.png create mode 100644 icons/famfamfam/font.png diff --git a/McBitFont/About.Designer.cs b/McBitFont/About.Designer.cs index e7fe392..7279f6b 100644 --- a/McBitFont/About.Designer.cs +++ b/McBitFont/About.Designer.cs @@ -124,7 +124,7 @@ MinimizeBox = false; Name = "About"; ShowInTaskbar = false; - StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "About McBitFont"; Load += About_Load; ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); diff --git a/McBitFont/CodeShift.Designer.cs b/McBitFont/CodeShift.Designer.cs index 1ded990..6f1493e 100644 --- a/McBitFont/CodeShift.Designer.cs +++ b/McBitFont/CodeShift.Designer.cs @@ -164,7 +164,7 @@ Name = "CodeShift"; ShowIcon = false; ShowInTaskbar = false; - StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Code Shift"; Load += CodeShift_Load; ((System.ComponentModel.ISupportInitialize)nudValue).EndInit(); diff --git a/McBitFont/Export.Designer.cs b/McBitFont/Export.Designer.cs index d258383..410b405 100644 --- a/McBitFont/Export.Designer.cs +++ b/McBitFont/Export.Designer.cs @@ -343,7 +343,7 @@ Name = "Export"; ShowIcon = false; ShowInTaskbar = false; - StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Export"; Load += Export_Load; gbScan.ResumeLayout(false); diff --git a/McBitFont/FontTester.Designer.cs b/McBitFont/FontTester.Designer.cs new file mode 100644 index 0000000..7aaeb34 --- /dev/null +++ b/McBitFont/FontTester.Designer.cs @@ -0,0 +1,189 @@ +namespace McBitFont { + partial class FontTester { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + components = new System.ComponentModel.Container(); + lblSpace = new System.Windows.Forms.Label(); + nudSpace = new System.Windows.Forms.NumericUpDown(); + lblText = new System.Windows.Forms.Label(); + tbText = new System.Windows.Forms.TextBox(); + dotPanel = new System.Windows.Forms.Panel(); + vScroll = new System.Windows.Forms.VScrollBar(); + hScroll = new System.Windows.Forms.HScrollBar(); + lblZoom = new System.Windows.Forms.Label(); + cbZoom = new System.Windows.Forms.ComboBox(); + toolTip1 = new System.Windows.Forms.ToolTip(components); + chkBaseline = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)nudSpace).BeginInit(); + SuspendLayout(); + // + // lblSpace + // + lblSpace.AutoSize = true; + lblSpace.Location = new System.Drawing.Point(12, 9); + lblSpace.Name = "lblSpace"; + lblSpace.Size = new System.Drawing.Size(41, 15); + lblSpace.TabIndex = 0; + lblSpace.Text = "Space:"; + // + // nudSpace + // + nudSpace.Location = new System.Drawing.Point(59, 6); + nudSpace.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + nudSpace.Name = "nudSpace"; + nudSpace.Size = new System.Drawing.Size(40, 23); + nudSpace.TabIndex = 1; + toolTip1.SetToolTip(nudSpace, "Space between symbols in pixels"); + nudSpace.Value = new decimal(new int[] { 1, 0, 0, 0 }); + nudSpace.ValueChanged += Scrolling; + // + // lblText + // + lblText.AutoSize = true; + lblText.Location = new System.Drawing.Point(12, 37); + lblText.Name = "lblText"; + lblText.Size = new System.Drawing.Size(138, 15); + lblText.TabIndex = 2; + lblText.Text = "Text to test the font with:"; + // + // tbText + // + tbText.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + tbText.Location = new System.Drawing.Point(12, 55); + tbText.Name = "tbText"; + tbText.Size = new System.Drawing.Size(220, 23); + tbText.TabIndex = 3; + toolTip1.SetToolTip(tbText, "Text to test the font with"); + tbText.TextChanged += Text_Changed; + // + // dotPanel + // + dotPanel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + dotPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + dotPanel.BackColor = System.Drawing.Color.White; + dotPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + dotPanel.Location = new System.Drawing.Point(12, 84); + dotPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + dotPanel.Name = "dotPanel"; + dotPanel.Size = new System.Drawing.Size(198, 104); + dotPanel.TabIndex = 4; + dotPanel.Paint += PaintPixels; + dotPanel.Resize += ZoomChanged; + // + // vScroll + // + vScroll.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + vScroll.LargeChange = 25; + vScroll.Location = new System.Drawing.Point(211, 84); + vScroll.Name = "vScroll"; + vScroll.Size = new System.Drawing.Size(21, 125); + vScroll.TabIndex = 17; + vScroll.ValueChanged += Scrolling; + // + // hScroll + // + hScroll.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + hScroll.Location = new System.Drawing.Point(12, 188); + hScroll.Name = "hScroll"; + hScroll.Size = new System.Drawing.Size(198, 21); + hScroll.TabIndex = 16; + hScroll.ValueChanged += Scrolling; + // + // lblZoom + // + lblZoom.AutoSize = true; + lblZoom.Location = new System.Drawing.Point(133, 9); + lblZoom.Name = "lblZoom"; + lblZoom.Size = new System.Drawing.Size(42, 15); + lblZoom.TabIndex = 18; + lblZoom.Text = "Zoom:"; + // + // cbZoom + // + cbZoom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + cbZoom.FormattingEnabled = true; + cbZoom.Items.AddRange(new object[] { "2", "3", "5", "10", "15", "20", "25", "30", "35", "40", "45", "50" }); + cbZoom.Location = new System.Drawing.Point(182, 6); + cbZoom.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + cbZoom.Name = "cbZoom"; + cbZoom.Size = new System.Drawing.Size(50, 23); + cbZoom.TabIndex = 19; + cbZoom.TabStop = false; + toolTip1.SetToolTip(cbZoom, "Zoom level"); + cbZoom.SelectedIndexChanged += ZoomChanged; + // + // chkBaseline + // + chkBaseline.AutoSize = true; + chkBaseline.Location = new System.Drawing.Point(163, 36); + chkBaseline.Name = "chkBaseline"; + chkBaseline.Size = new System.Drawing.Size(69, 19); + chkBaseline.TabIndex = 20; + chkBaseline.Text = "Baseline"; + chkBaseline.UseVisualStyleBackColor = true; + // + // FontTester + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(244, 221); + Controls.Add(chkBaseline); + Controls.Add(cbZoom); + Controls.Add(lblZoom); + Controls.Add(vScroll); + Controls.Add(hScroll); + Controls.Add(dotPanel); + Controls.Add(tbText); + Controls.Add(lblText); + Controls.Add(nudSpace); + Controls.Add(lblSpace); + MaximizeBox = false; + MinimizeBox = false; + MinimumSize = new System.Drawing.Size(260, 260); + Name = "FontTester"; + ShowIcon = false; + ShowInTaskbar = false; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "Font Tester"; + Load += FontTester_Load; + ((System.ComponentModel.ISupportInitialize)nudSpace).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.Label lblSpace; + private System.Windows.Forms.NumericUpDown nudSpace; + private System.Windows.Forms.Label lblText; + private System.Windows.Forms.TextBox tbText; + private System.Windows.Forms.Panel dotPanel; + private System.Windows.Forms.VScrollBar vScroll; + private System.Windows.Forms.HScrollBar hScroll; + private System.Windows.Forms.Label lblZoom; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.ComboBox cbZoom; + private System.Windows.Forms.CheckBox chkBaseline; + } +} \ No newline at end of file diff --git a/McBitFont/FontTester.cs b/McBitFont/FontTester.cs new file mode 100644 index 0000000..0533962 --- /dev/null +++ b/McBitFont/FontTester.cs @@ -0,0 +1,160 @@ +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 frames; + private int baseline; + private readonly int absentWidth = 5; + private readonly int pixelOffset = 5; + + private byte[] encoded = []; + private int cellSize; + private int width; + + public FontTester(int codepage, int height, int baseline, List 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), 1); + 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 suck 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 - 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; + } + + 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(); + } + } + + +} diff --git a/McBitFont/FontTester.resx b/McBitFont/FontTester.resx new file mode 100644 index 0000000..dcfd08d --- /dev/null +++ b/McBitFont/FontTester.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/McBitFont/Form1.Designer.cs b/McBitFont/Form1.Designer.cs index d8815be..edc507f 100644 --- a/McBitFont/Form1.Designer.cs +++ b/McBitFont/Form1.Designer.cs @@ -107,6 +107,7 @@ lblSelectionLabel = new System.Windows.Forms.Label(); lblSelection = new System.Windows.Forms.Label(); lblModified = new System.Windows.Forms.Label(); + testFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)nudX).BeginInit(); ((System.ComponentModel.ISupportInitialize)nudY).BeginInit(); panel1.SuspendLayout(); @@ -687,7 +688,7 @@ // // fontToolStripMenuItem // - fontToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { makeVarWidthToolStripMenuItem, prependSymbolToolStripMenuItem, appendSymbolToolStripMenuItem, removeSymbolToolStripMenuItem, removeBeforeToolStripMenuItem, removeAfterToolStripMenuItem, CodeShiftToolStripMenuItem }); + fontToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { makeVarWidthToolStripMenuItem, prependSymbolToolStripMenuItem, appendSymbolToolStripMenuItem, removeSymbolToolStripMenuItem, removeBeforeToolStripMenuItem, removeAfterToolStripMenuItem, CodeShiftToolStripMenuItem, testFontToolStripMenuItem }); fontToolStripMenuItem.Name = "fontToolStripMenuItem"; fontToolStripMenuItem.Size = new System.Drawing.Size(43, 20); fontToolStripMenuItem.Text = "Font"; @@ -1023,6 +1024,14 @@ lblModified.Text = "Frame modified"; lblModified.Visible = false; // + // testFontToolStripMenuItem + // + testFontToolStripMenuItem.Image = Properties.Resources.font; + testFontToolStripMenuItem.Name = "testFontToolStripMenuItem"; + testFontToolStripMenuItem.Size = new System.Drawing.Size(215, 22); + testFontToolStripMenuItem.Text = "Test font"; + testFontToolStripMenuItem.Click += TestFont_Click; + // // MainForm // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -1157,6 +1166,7 @@ private System.Windows.Forms.Label lblSelection; private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; private System.Windows.Forms.Label lblModified; + private System.Windows.Forms.ToolStripMenuItem testFontToolStripMenuItem; } } diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index 3466d6c..5c628f4 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -60,7 +60,7 @@ namespace McBitFont { public const string version = "2.2"; public string prjName = "Untitled"; public string prjFileName = ""; - private int codepage = 1251; + public int codepage = 1251; private FrameMiniature fbuf; private bool fbuffer = false; private int baseline = 0; @@ -961,7 +961,7 @@ namespace McBitFont { MessagePackSerializer.Serialize(ms, sav); ms.Close(); } - + prjName = Path.GetFileNameWithoutExtension(filename); prjFileName = filename; SetModified(false, true); @@ -1424,5 +1424,10 @@ namespace McBitFont { selection2.Y = dotHeight - 1; dotPanel.Refresh(); } + + private void TestFont_Click(object sender, EventArgs e) { + var tester = new FontTester(codepage, dotHeight, baseline, frames); + tester.ShowDialog(); + } } } diff --git a/McBitFont/ImageImporter.Designer.cs b/McBitFont/ImageImporter.Designer.cs index ff4c113..a2d4948 100644 --- a/McBitFont/ImageImporter.Designer.cs +++ b/McBitFont/ImageImporter.Designer.cs @@ -377,7 +377,7 @@ Name = "ImageImporter"; ShowIcon = false; ShowInTaskbar = false; - StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; Text = "Import Image"; Paint += ImageImporter_Paint; ((System.ComponentModel.ISupportInitialize)pbOriginal).EndInit(); diff --git a/McBitFont/ImageImporter.resx b/McBitFont/ImageImporter.resx index d3fcd46..75130fa 100644 --- a/McBitFont/ImageImporter.resx +++ b/McBitFont/ImageImporter.resx @@ -123,7 +123,4 @@ 17, 17 - - 147, 17 - \ No newline at end of file diff --git a/McBitFont/New.Designer.cs b/McBitFont/New.Designer.cs index 9587429..f514a1d 100644 --- a/McBitFont/New.Designer.cs +++ b/McBitFont/New.Designer.cs @@ -23,469 +23,421 @@ /// the contents of this method with the code editor. /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.nudNewX = new System.Windows.Forms.NumericUpDown(); - this.nudNewY = new System.Windows.Forms.NumericUpDown(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.rbMono = new System.Windows.Forms.RadioButton(); - this.rbVar = new System.Windows.Forms.RadioButton(); - this.cbNotPrintable = new System.Windows.Forms.CheckBox(); - this.cbLatin = new System.Windows.Forms.CheckBox(); - this.cbExtended = new System.Windows.Forms.CheckBox(); - this.btnOK = new System.Windows.Forms.Button(); - this.btnCancel = new System.Windows.Forms.Button(); - this.cbSingle = new System.Windows.Forms.CheckBox(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.cbEncoding = new System.Windows.Forms.ComboBox(); - this.panel1 = new System.Windows.Forms.Panel(); - this.pbChar2 = new System.Windows.Forms.PictureBox(); - this.pbChar1 = new System.Windows.Forms.PictureBox(); - this.btnFont = new System.Windows.Forms.Button(); - this.dlgFont = new System.Windows.Forms.FontDialog(); - this.cbFontBased = new System.Windows.Forms.CheckBox(); - this.lblFont = new System.Windows.Forms.Label(); - this.nudShiftX = new System.Windows.Forms.NumericUpDown(); - this.nudShiftY = new System.Windows.Forms.NumericUpDown(); - this.lblShiftX = new System.Windows.Forms.Label(); - this.lblShiftY = new System.Windows.Forms.Label(); - this.pnlFont = new System.Windows.Forms.Panel(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.nudChar2 = new System.Windows.Forms.NumericUpDown(); - this.nudChar1 = new System.Windows.Forms.NumericUpDown(); - this.cbDigits = new System.Windows.Forms.CheckBox(); - ((System.ComponentModel.ISupportInitialize)(this.nudNewX)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudNewY)).BeginInit(); - this.panel1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pbChar2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pbChar1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudShiftX)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudShiftY)).BeginInit(); - this.pnlFont.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudChar2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudChar1)).BeginInit(); - this.SuspendLayout(); + components = new System.ComponentModel.Container(); + nudNewX = new System.Windows.Forms.NumericUpDown(); + nudNewY = new System.Windows.Forms.NumericUpDown(); + label1 = new System.Windows.Forms.Label(); + label2 = new System.Windows.Forms.Label(); + rbMono = new System.Windows.Forms.RadioButton(); + rbVar = new System.Windows.Forms.RadioButton(); + cbNotPrintable = new System.Windows.Forms.CheckBox(); + cbLatin = new System.Windows.Forms.CheckBox(); + cbExtended = new System.Windows.Forms.CheckBox(); + btnOK = new System.Windows.Forms.Button(); + btnCancel = new System.Windows.Forms.Button(); + cbSingle = new System.Windows.Forms.CheckBox(); + toolTip1 = new System.Windows.Forms.ToolTip(components); + cbEncoding = new System.Windows.Forms.ComboBox(); + panel1 = new System.Windows.Forms.Panel(); + pbChar2 = new System.Windows.Forms.PictureBox(); + pbChar1 = new System.Windows.Forms.PictureBox(); + btnFont = new System.Windows.Forms.Button(); + dlgFont = new System.Windows.Forms.FontDialog(); + cbFontBased = new System.Windows.Forms.CheckBox(); + lblFont = new System.Windows.Forms.Label(); + nudShiftX = new System.Windows.Forms.NumericUpDown(); + nudShiftY = new System.Windows.Forms.NumericUpDown(); + lblShiftX = new System.Windows.Forms.Label(); + lblShiftY = new System.Windows.Forms.Label(); + pnlFont = new System.Windows.Forms.Panel(); + label4 = new System.Windows.Forms.Label(); + label3 = new System.Windows.Forms.Label(); + nudChar2 = new System.Windows.Forms.NumericUpDown(); + nudChar1 = new System.Windows.Forms.NumericUpDown(); + cbDigits = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)nudNewX).BeginInit(); + ((System.ComponentModel.ISupportInitialize)nudNewY).BeginInit(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pbChar2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)pbChar1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)nudShiftX).BeginInit(); + ((System.ComponentModel.ISupportInitialize)nudShiftY).BeginInit(); + pnlFont.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)nudChar2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)nudChar1).BeginInit(); + SuspendLayout(); // // nudNewX // - this.nudNewX.Location = new System.Drawing.Point(68, 32); - this.nudNewX.Maximum = new decimal(new int[] { - 255, - 0, - 0, - 0}); - this.nudNewX.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.nudNewX.Name = "nudNewX"; - this.nudNewX.Size = new System.Drawing.Size(57, 20); - this.nudNewX.TabIndex = 0; - this.nudNewX.Value = new decimal(new int[] { - 32, - 0, - 0, - 0}); - this.nudNewX.ValueChanged += new System.EventHandler(this.nudNewX_ValueChanged); - this.nudNewX.Enter += new System.EventHandler(this.nudFocus); + nudNewX.Location = new System.Drawing.Point(68, 32); + nudNewX.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + nudNewX.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + nudNewX.Name = "nudNewX"; + nudNewX.Size = new System.Drawing.Size(57, 23); + nudNewX.TabIndex = 0; + nudNewX.Value = new decimal(new int[] { 32, 0, 0, 0 }); + nudNewX.ValueChanged += nudNewX_ValueChanged; + nudNewX.Enter += nudFocus; // // nudNewY // - this.nudNewY.Location = new System.Drawing.Point(68, 58); - this.nudNewY.Maximum = new decimal(new int[] { - 255, - 0, - 0, - 0}); - this.nudNewY.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.nudNewY.Name = "nudNewY"; - this.nudNewY.Size = new System.Drawing.Size(57, 20); - this.nudNewY.TabIndex = 1; - this.nudNewY.Value = new decimal(new int[] { - 32, - 0, - 0, - 0}); - this.nudNewY.ValueChanged += new System.EventHandler(this.nudNewX_ValueChanged); - this.nudNewY.Enter += new System.EventHandler(this.nudFocus); + nudNewY.Location = new System.Drawing.Point(68, 58); + nudNewY.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + nudNewY.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + nudNewY.Name = "nudNewY"; + nudNewY.Size = new System.Drawing.Size(57, 23); + nudNewY.TabIndex = 1; + nudNewY.Value = new decimal(new int[] { 32, 0, 0, 0 }); + nudNewY.ValueChanged += nudNewX_ValueChanged; + nudNewY.Enter += nudFocus; // // label1 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(24, 34); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(38, 13); - this.label1.TabIndex = 2; - this.label1.Text = "Width:"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(24, 34); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(42, 15); + label1.TabIndex = 2; + label1.Text = "Width:"; + label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label2 // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(21, 60); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(41, 13); - this.label2.TabIndex = 3; - this.label2.Text = "Height:"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(21, 60); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(46, 15); + label2.TabIndex = 3; + label2.Text = "Height:"; + label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // rbMono // - this.rbMono.AutoSize = true; - this.rbMono.Checked = true; - this.rbMono.Location = new System.Drawing.Point(24, 84); - this.rbMono.Name = "rbMono"; - this.rbMono.Size = new System.Drawing.Size(87, 17); - this.rbMono.TabIndex = 4; - this.rbMono.TabStop = true; - this.rbMono.Text = "Monospaced"; - this.rbMono.UseVisualStyleBackColor = true; + rbMono.AutoSize = true; + rbMono.Checked = true; + rbMono.Location = new System.Drawing.Point(24, 84); + rbMono.Name = "rbMono"; + rbMono.Size = new System.Drawing.Size(94, 19); + rbMono.TabIndex = 4; + rbMono.TabStop = true; + rbMono.Text = "Monospaced"; + rbMono.UseVisualStyleBackColor = true; // // rbVar // - this.rbVar.AutoSize = true; - this.rbVar.Location = new System.Drawing.Point(24, 107); - this.rbVar.Name = "rbVar"; - this.rbVar.Size = new System.Drawing.Size(91, 17); - this.rbVar.TabIndex = 5; - this.rbVar.Text = "Variable width"; - this.rbVar.UseVisualStyleBackColor = true; + rbVar.AutoSize = true; + rbVar.Location = new System.Drawing.Point(24, 107); + rbVar.Name = "rbVar"; + rbVar.Size = new System.Drawing.Size(99, 19); + rbVar.TabIndex = 5; + rbVar.Text = "Variable width"; + rbVar.UseVisualStyleBackColor = true; // // cbNotPrintable // - this.cbNotPrintable.AutoSize = true; - this.cbNotPrintable.Location = new System.Drawing.Point(140, 77); - this.cbNotPrintable.Name = "cbNotPrintable"; - this.cbNotPrintable.Size = new System.Drawing.Size(116, 17); - this.cbNotPrintable.TabIndex = 7; - this.cbNotPrintable.Text = "0-31 (Not printable)"; - this.cbNotPrintable.UseVisualStyleBackColor = true; - this.cbNotPrintable.CheckedChanged += new System.EventHandler(this.checkboxChanged); + cbNotPrintable.AutoSize = true; + cbNotPrintable.Location = new System.Drawing.Point(140, 77); + cbNotPrintable.Name = "cbNotPrintable"; + cbNotPrintable.Size = new System.Drawing.Size(130, 19); + cbNotPrintable.TabIndex = 7; + cbNotPrintable.Text = "0-31 (Not printable)"; + cbNotPrintable.UseVisualStyleBackColor = true; + cbNotPrintable.CheckedChanged += checkboxChanged; // // cbLatin // - this.cbLatin.AutoSize = true; - this.cbLatin.Checked = true; - this.cbLatin.CheckState = System.Windows.Forms.CheckState.Checked; - this.cbLatin.Location = new System.Drawing.Point(140, 100); - this.cbLatin.Name = "cbLatin"; - this.cbLatin.Size = new System.Drawing.Size(91, 17); - this.cbLatin.TabIndex = 8; - this.cbLatin.Text = "32-127 (Latin)"; - this.cbLatin.UseVisualStyleBackColor = true; - this.cbLatin.CheckedChanged += new System.EventHandler(this.checkboxChanged); + cbLatin.AutoSize = true; + cbLatin.Checked = true; + cbLatin.CheckState = System.Windows.Forms.CheckState.Checked; + cbLatin.Location = new System.Drawing.Point(140, 100); + cbLatin.Name = "cbLatin"; + cbLatin.Size = new System.Drawing.Size(98, 19); + cbLatin.TabIndex = 8; + cbLatin.Text = "32-127 (Latin)"; + cbLatin.UseVisualStyleBackColor = true; + cbLatin.CheckedChanged += checkboxChanged; // // cbExtended // - this.cbExtended.AutoSize = true; - this.cbExtended.Location = new System.Drawing.Point(140, 123); - this.cbExtended.Name = "cbExtended"; - this.cbExtended.Size = new System.Drawing.Size(119, 17); - this.cbExtended.TabIndex = 9; - this.cbExtended.Text = "128-255 (Extended)"; - this.cbExtended.UseVisualStyleBackColor = true; - this.cbExtended.CheckedChanged += new System.EventHandler(this.checkboxChanged); + cbExtended.AutoSize = true; + cbExtended.Location = new System.Drawing.Point(140, 123); + cbExtended.Name = "cbExtended"; + cbExtended.Size = new System.Drawing.Size(126, 19); + cbExtended.TabIndex = 9; + cbExtended.Text = "128-255 (Extended)"; + cbExtended.UseVisualStyleBackColor = true; + cbExtended.CheckedChanged += checkboxChanged; // // btnOK // - this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnOK.Location = new System.Drawing.Point(47, 178); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 10; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + btnOK.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + btnOK.Location = new System.Drawing.Point(47, 178); + btnOK.Name = "btnOK"; + btnOK.Size = new System.Drawing.Size(75, 23); + btnOK.TabIndex = 10; + btnOK.Text = "OK"; + btnOK.UseVisualStyleBackColor = true; + btnOK.Click += btnOK_Click; // // btnCancel // - this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(140, 178); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 11; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + btnCancel.Location = new System.Drawing.Point(140, 178); + btnCancel.Name = "btnCancel"; + btnCancel.Size = new System.Drawing.Size(75, 23); + btnCancel.TabIndex = 11; + btnCancel.Text = "Cancel"; + btnCancel.UseVisualStyleBackColor = true; + btnCancel.Click += btnCancel_Click; // // cbSingle // - this.cbSingle.AutoSize = true; - this.cbSingle.Location = new System.Drawing.Point(140, 31); - this.cbSingle.Name = "cbSingle"; - this.cbSingle.Size = new System.Drawing.Size(84, 17); - this.cbSingle.TabIndex = 12; - this.cbSingle.Text = "Single frame"; - this.cbSingle.UseVisualStyleBackColor = true; - this.cbSingle.CheckedChanged += new System.EventHandler(this.checkboxChanged); + cbSingle.AutoSize = true; + cbSingle.Location = new System.Drawing.Point(140, 31); + cbSingle.Name = "cbSingle"; + cbSingle.Size = new System.Drawing.Size(92, 19); + cbSingle.TabIndex = 12; + cbSingle.Text = "Single frame"; + cbSingle.UseVisualStyleBackColor = true; + cbSingle.CheckedChanged += checkboxChanged; // // toolTip1 // - this.toolTip1.AutoPopDelay = 10000; - this.toolTip1.InitialDelay = 500; - this.toolTip1.ReshowDelay = 100; - this.toolTip1.ToolTipTitle = "Info"; + toolTip1.AutoPopDelay = 10000; + toolTip1.InitialDelay = 500; + toolTip1.ReshowDelay = 100; + toolTip1.ToolTipTitle = "Info"; // // cbEncoding // - this.cbEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cbEncoding.Enabled = false; - this.cbEncoding.FormattingEnabled = true; - this.cbEncoding.Location = new System.Drawing.Point(140, 146); - this.cbEncoding.Name = "cbEncoding"; - this.cbEncoding.Size = new System.Drawing.Size(121, 21); - this.cbEncoding.TabIndex = 13; + cbEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + cbEncoding.Enabled = false; + cbEncoding.FormattingEnabled = true; + cbEncoding.Location = new System.Drawing.Point(140, 146); + cbEncoding.Name = "cbEncoding"; + cbEncoding.Size = new System.Drawing.Size(121, 23); + cbEncoding.TabIndex = 13; // // panel1 // - this.panel1.Controls.Add(this.pbChar2); - this.panel1.Controls.Add(this.pbChar1); - this.panel1.Location = new System.Drawing.Point(6, 24); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(200, 124); - this.panel1.TabIndex = 14; + panel1.Controls.Add(pbChar2); + panel1.Controls.Add(pbChar1); + panel1.Location = new System.Drawing.Point(6, 24); + panel1.Name = "panel1"; + panel1.Size = new System.Drawing.Size(200, 124); + panel1.TabIndex = 14; // // pbChar2 // - this.pbChar2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.pbChar2.Location = new System.Drawing.Point(100, 0); - this.pbChar2.Name = "pbChar2"; - this.pbChar2.Size = new System.Drawing.Size(100, 124); - this.pbChar2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pbChar2.TabIndex = 1; - this.pbChar2.TabStop = false; + pbChar2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + pbChar2.Location = new System.Drawing.Point(100, 0); + pbChar2.Name = "pbChar2"; + pbChar2.Size = new System.Drawing.Size(100, 124); + pbChar2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + pbChar2.TabIndex = 1; + pbChar2.TabStop = false; // // pbChar1 // - this.pbChar1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.pbChar1.Location = new System.Drawing.Point(0, 0); - this.pbChar1.Name = "pbChar1"; - this.pbChar1.Size = new System.Drawing.Size(100, 124); - this.pbChar1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pbChar1.TabIndex = 0; - this.pbChar1.TabStop = false; + pbChar1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + pbChar1.Location = new System.Drawing.Point(0, 0); + pbChar1.Name = "pbChar1"; + pbChar1.Size = new System.Drawing.Size(100, 124); + pbChar1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + pbChar1.TabIndex = 0; + pbChar1.TabStop = false; // // btnFont // - this.btnFont.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnFont.Location = new System.Drawing.Point(6, 178); - this.btnFont.Name = "btnFont"; - this.btnFont.Size = new System.Drawing.Size(71, 23); - this.btnFont.TabIndex = 15; - this.btnFont.Text = "Font ..."; - this.btnFont.UseVisualStyleBackColor = true; - this.btnFont.Click += new System.EventHandler(this.btnFont_Click); + btnFont.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + btnFont.Location = new System.Drawing.Point(6, 178); + btnFont.Name = "btnFont"; + btnFont.Size = new System.Drawing.Size(71, 23); + btnFont.TabIndex = 15; + btnFont.Text = "Font ..."; + btnFont.UseVisualStyleBackColor = true; + btnFont.Click += btnFont_Click; // // dlgFont // - this.dlgFont.Font = new System.Drawing.Font("Courier New", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); - this.dlgFont.ShowEffects = false; + dlgFont.Font = new System.Drawing.Font("Courier New", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204); + dlgFont.ShowEffects = false; // // cbFontBased // - this.cbFontBased.AutoSize = true; - this.cbFontBased.Location = new System.Drawing.Point(24, 130); - this.cbFontBased.Name = "cbFontBased"; - this.cbFontBased.Size = new System.Drawing.Size(101, 17); - this.cbFontBased.TabIndex = 16; - this.cbFontBased.Text = "Based on a font"; - this.cbFontBased.UseVisualStyleBackColor = true; - this.cbFontBased.CheckedChanged += new System.EventHandler(this.checkboxChanged); + cbFontBased.AutoSize = true; + cbFontBased.Location = new System.Drawing.Point(24, 130); + cbFontBased.Name = "cbFontBased"; + cbFontBased.Size = new System.Drawing.Size(108, 19); + cbFontBased.TabIndex = 16; + cbFontBased.Text = "Based on a font"; + cbFontBased.UseVisualStyleBackColor = true; + cbFontBased.CheckedChanged += checkboxChanged; // // lblFont // - this.lblFont.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.lblFont.Location = new System.Drawing.Point(83, 183); - this.lblFont.Name = "lblFont"; - this.lblFont.Size = new System.Drawing.Size(123, 18); - this.lblFont.TabIndex = 17; - this.lblFont.Text = "font"; + lblFont.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left; + lblFont.Location = new System.Drawing.Point(83, 183); + lblFont.Name = "lblFont"; + lblFont.Size = new System.Drawing.Size(123, 18); + lblFont.TabIndex = 17; + lblFont.Text = "font"; // // nudShiftX // - this.nudShiftX.Location = new System.Drawing.Point(61, 2); - this.nudShiftX.Minimum = new decimal(new int[] { - 100, - 0, - 0, - -2147483648}); - this.nudShiftX.Name = "nudShiftX"; - this.nudShiftX.Size = new System.Drawing.Size(45, 20); - this.nudShiftX.TabIndex = 18; - this.nudShiftX.ValueChanged += new System.EventHandler(this.nudNewX_ValueChanged); + nudShiftX.Location = new System.Drawing.Point(61, 2); + nudShiftX.Minimum = new decimal(new int[] { 100, 0, 0, int.MinValue }); + nudShiftX.Name = "nudShiftX"; + nudShiftX.Size = new System.Drawing.Size(45, 23); + nudShiftX.TabIndex = 18; + nudShiftX.ValueChanged += nudNewX_ValueChanged; // // nudShiftY // - this.nudShiftY.Location = new System.Drawing.Point(161, 2); - this.nudShiftY.Minimum = new decimal(new int[] { - 100, - 0, - 0, - -2147483648}); - this.nudShiftY.Name = "nudShiftY"; - this.nudShiftY.Size = new System.Drawing.Size(45, 20); - this.nudShiftY.TabIndex = 19; - this.nudShiftY.ValueChanged += new System.EventHandler(this.nudNewX_ValueChanged); + nudShiftY.Location = new System.Drawing.Point(161, 2); + nudShiftY.Minimum = new decimal(new int[] { 100, 0, 0, int.MinValue }); + nudShiftY.Name = "nudShiftY"; + nudShiftY.Size = new System.Drawing.Size(45, 23); + nudShiftY.TabIndex = 19; + nudShiftY.ValueChanged += nudNewX_ValueChanged; // // lblShiftX // - this.lblShiftX.AutoSize = true; - this.lblShiftX.Location = new System.Drawing.Point(14, 4); - this.lblShiftX.Name = "lblShiftX"; - this.lblShiftX.Size = new System.Drawing.Size(41, 13); - this.lblShiftX.TabIndex = 20; - this.lblShiftX.Text = "Shift X:"; - this.lblShiftX.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + lblShiftX.AutoSize = true; + lblShiftX.Location = new System.Drawing.Point(14, 4); + lblShiftX.Name = "lblShiftX"; + lblShiftX.Size = new System.Drawing.Size(44, 15); + lblShiftX.TabIndex = 20; + lblShiftX.Text = "Shift X:"; + lblShiftX.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // lblShiftY // - this.lblShiftY.AutoSize = true; - this.lblShiftY.Location = new System.Drawing.Point(114, 4); - this.lblShiftY.Name = "lblShiftY"; - this.lblShiftY.Size = new System.Drawing.Size(41, 13); - this.lblShiftY.TabIndex = 21; - this.lblShiftY.Text = "Shift Y:"; - this.lblShiftY.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + lblShiftY.AutoSize = true; + lblShiftY.Location = new System.Drawing.Point(114, 4); + lblShiftY.Name = "lblShiftY"; + lblShiftY.Size = new System.Drawing.Size(44, 15); + lblShiftY.TabIndex = 21; + lblShiftY.Text = "Shift Y:"; + lblShiftY.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // pnlFont // - this.pnlFont.Controls.Add(this.label4); - this.pnlFont.Controls.Add(this.label3); - this.pnlFont.Controls.Add(this.nudChar2); - this.pnlFont.Controls.Add(this.nudChar1); - this.pnlFont.Controls.Add(this.lblShiftX); - this.pnlFont.Controls.Add(this.lblShiftY); - this.pnlFont.Controls.Add(this.panel1); - this.pnlFont.Controls.Add(this.btnFont); - this.pnlFont.Controls.Add(this.nudShiftY); - this.pnlFont.Controls.Add(this.lblFont); - this.pnlFont.Controls.Add(this.nudShiftX); - this.pnlFont.Dock = System.Windows.Forms.DockStyle.Right; - this.pnlFont.Location = new System.Drawing.Point(270, 0); - this.pnlFont.Name = "pnlFont"; - this.pnlFont.Size = new System.Drawing.Size(214, 211); - this.pnlFont.TabIndex = 22; - this.pnlFont.Visible = false; + pnlFont.Controls.Add(label4); + pnlFont.Controls.Add(label3); + pnlFont.Controls.Add(nudChar2); + pnlFont.Controls.Add(nudChar1); + pnlFont.Controls.Add(lblShiftX); + pnlFont.Controls.Add(lblShiftY); + pnlFont.Controls.Add(panel1); + pnlFont.Controls.Add(btnFont); + pnlFont.Controls.Add(nudShiftY); + pnlFont.Controls.Add(lblFont); + pnlFont.Controls.Add(nudShiftX); + pnlFont.Dock = System.Windows.Forms.DockStyle.Right; + pnlFont.Location = new System.Drawing.Point(270, 0); + pnlFont.Name = "pnlFont"; + pnlFont.Size = new System.Drawing.Size(214, 211); + pnlFont.TabIndex = 22; + pnlFont.Visible = false; // // label4 // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(112, 152); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(45, 13); - this.label4.TabIndex = 25; - this.label4.Text = "Sample:"; - this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(112, 152); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(49, 15); + label4.TabIndex = 25; + label4.Text = "Sample:"; + label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label3 // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(14, 152); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(45, 13); - this.label3.TabIndex = 24; - this.label3.Text = "Sample:"; - this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(14, 152); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(49, 15); + label3.TabIndex = 24; + label3.Text = "Sample:"; + label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // nudChar2 // - this.nudChar2.Location = new System.Drawing.Point(161, 149); - this.nudChar2.Maximum = new decimal(new int[] { - 255, - 0, - 0, - 0}); - this.nudChar2.Name = "nudChar2"; - this.nudChar2.Size = new System.Drawing.Size(45, 20); - this.nudChar2.TabIndex = 23; - this.nudChar2.Value = new decimal(new int[] { - 97, - 0, - 0, - 0}); - this.nudChar2.ValueChanged += new System.EventHandler(this.nudNewX_ValueChanged); + nudChar2.Location = new System.Drawing.Point(161, 149); + nudChar2.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + nudChar2.Name = "nudChar2"; + nudChar2.Size = new System.Drawing.Size(45, 23); + nudChar2.TabIndex = 23; + nudChar2.Value = new decimal(new int[] { 97, 0, 0, 0 }); + nudChar2.ValueChanged += nudNewX_ValueChanged; // // nudChar1 // - this.nudChar1.Location = new System.Drawing.Point(61, 149); - this.nudChar1.Maximum = new decimal(new int[] { - 255, - 0, - 0, - 0}); - this.nudChar1.Name = "nudChar1"; - this.nudChar1.Size = new System.Drawing.Size(45, 20); - this.nudChar1.TabIndex = 22; - this.nudChar1.Value = new decimal(new int[] { - 65, - 0, - 0, - 0}); - this.nudChar1.ValueChanged += new System.EventHandler(this.nudNewX_ValueChanged); + nudChar1.Location = new System.Drawing.Point(61, 149); + nudChar1.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + nudChar1.Name = "nudChar1"; + nudChar1.Size = new System.Drawing.Size(45, 23); + nudChar1.TabIndex = 22; + nudChar1.Value = new decimal(new int[] { 65, 0, 0, 0 }); + nudChar1.ValueChanged += nudNewX_ValueChanged; // // cbDigits // - this.cbDigits.AutoSize = true; - this.cbDigits.Location = new System.Drawing.Point(140, 54); - this.cbDigits.Name = "cbDigits"; - this.cbDigits.Size = new System.Drawing.Size(74, 17); - this.cbDigits.TabIndex = 23; - this.cbDigits.Text = "Digits only"; - this.cbDigits.UseVisualStyleBackColor = true; - this.cbDigits.CheckedChanged += new System.EventHandler(this.checkboxChanged); + cbDigits.AutoSize = true; + cbDigits.Location = new System.Drawing.Point(140, 54); + cbDigits.Name = "cbDigits"; + cbDigits.Size = new System.Drawing.Size(82, 19); + cbDigits.TabIndex = 23; + cbDigits.Text = "Digits only"; + cbDigits.UseVisualStyleBackColor = true; + cbDigits.CheckedChanged += checkboxChanged; // // New // - this.AcceptButton = this.btnOK; - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.CancelButton = this.btnCancel; - this.ClientSize = new System.Drawing.Size(484, 211); - this.Controls.Add(this.cbDigits); - this.Controls.Add(this.pnlFont); - this.Controls.Add(this.cbFontBased); - this.Controls.Add(this.cbEncoding); - this.Controls.Add(this.cbSingle); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnOK); - this.Controls.Add(this.cbExtended); - this.Controls.Add(this.cbLatin); - this.Controls.Add(this.cbNotPrintable); - this.Controls.Add(this.rbVar); - this.Controls.Add(this.rbMono); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.nudNewY); - this.Controls.Add(this.nudNewX); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(300, 220); - this.Name = "New"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "New"; - this.Load += new System.EventHandler(this.New_Load); - ((System.ComponentModel.ISupportInitialize)(this.nudNewX)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudNewY)).EndInit(); - this.panel1.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pbChar2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pbChar1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudShiftX)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudShiftY)).EndInit(); - this.pnlFont.ResumeLayout(false); - this.pnlFont.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nudChar2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.nudChar1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); + AcceptButton = btnOK; + AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + CancelButton = btnCancel; + ClientSize = new System.Drawing.Size(484, 211); + Controls.Add(cbDigits); + Controls.Add(pnlFont); + Controls.Add(cbFontBased); + Controls.Add(cbEncoding); + Controls.Add(cbSingle); + Controls.Add(btnCancel); + Controls.Add(btnOK); + Controls.Add(cbExtended); + Controls.Add(cbLatin); + Controls.Add(cbNotPrintable); + Controls.Add(rbVar); + Controls.Add(rbMono); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(nudNewY); + Controls.Add(nudNewX); + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + MinimumSize = new System.Drawing.Size(300, 220); + Name = "New"; + ShowIcon = false; + ShowInTaskbar = false; + StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + Text = "New"; + Load += New_Load; + ((System.ComponentModel.ISupportInitialize)nudNewX).EndInit(); + ((System.ComponentModel.ISupportInitialize)nudNewY).EndInit(); + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)pbChar2).EndInit(); + ((System.ComponentModel.ISupportInitialize)pbChar1).EndInit(); + ((System.ComponentModel.ISupportInitialize)nudShiftX).EndInit(); + ((System.ComponentModel.ISupportInitialize)nudShiftY).EndInit(); + pnlFont.ResumeLayout(false); + pnlFont.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)nudChar2).EndInit(); + ((System.ComponentModel.ISupportInitialize)nudChar1).EndInit(); + ResumeLayout(false); + PerformLayout(); } diff --git a/McBitFont/New.resx b/McBitFont/New.resx index 5f989c5..4baa590 100644 --- a/McBitFont/New.resx +++ b/McBitFont/New.resx @@ -1,17 +1,17 @@  - diff --git a/McBitFont/Properties/Resources.Designer.cs b/McBitFont/Properties/Resources.Designer.cs index 4f5dce3..b19e4f2 100644 --- a/McBitFont/Properties/Resources.Designer.cs +++ b/McBitFont/Properties/Resources.Designer.cs @@ -270,6 +270,16 @@ namespace McBitFont.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap font { + get { + object obj = ResourceManager.GetObject("font", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/McBitFont/Properties/Resources.resx b/McBitFont/Properties/Resources.resx index caf2781..063342b 100644 --- a/McBitFont/Properties/Resources.resx +++ b/McBitFont/Properties/Resources.resx @@ -142,9 +142,6 @@ ..\Resources\redo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\Famfamfam-Silk-Disk.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -205,6 +202,9 @@ ..\Resources\Famfamfam-Silk-Page-white.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Famfamfam-Silk-Disk.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\folder_table.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -223,10 +223,13 @@ ..\Resources\undo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\arrow_out.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\font.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/McBitFont/Resources/font.png b/McBitFont/Resources/font.png new file mode 100644 index 0000000000000000000000000000000000000000..b7960db9dae7d1da77ef3acc46d0a6a9da584267 GIT binary patch literal 567 zcmV-70?7S|P)(R5;6H z`2YVu10|S&W(GL4-*9m5zR~L0cWa7s=goeHmKzfsTW-vJJns=rXO>fi=YdvYp=OyIuL^83ysEIf(LtP34vHf@P1syLa4L>s)tjLDRY?|E+S*&m<}gEDA3wCC|S1 zC~n%F`=*)aLx8xUX62**Ryh}!5;VXx>jJY=!}V2J^Y4E*NjsaSAA6F^IPpwJ<+6wW zU8=5LQujKb`Z+F#fckUgU8t^YpU|s(=Orx83-p>b9R3rvXOE zXGG&B-+ooO{Lz1}<{Ou-vd(X^%s98zwd(4P#ubnMhqc}OsqDB<8mj>Yv8NgBOD@j_ z`PDq_3`$^`C!g6^zTp1k={a?|3Z-|`5HYOAUEHcimi|xPlFJZ#%{{hX{-)aXO=~Z^xE1+b* zM@!rH@FJ(e3$Fs}uKo9|x%%HQ^w?fm%Wa0V&kJ-j001RVucl)dd}jav002ovPDHLk FV1mw881w)D literal 0 HcmV?d00001 diff --git a/TODO.txt b/TODO.txt index 5e7f31a..06f8ced 100644 --- a/TODO.txt +++ b/TODO.txt @@ -3,7 +3,7 @@ Application: Functionality: V Allow to add frames to Single-frame "fonts" -- Type a string to see the result (test the font) +V Type a string to see the result (test the font) - Export image with All characers table Bugs: diff --git a/icons/famfamfam/font.png b/icons/famfamfam/font.png new file mode 100644 index 0000000000000000000000000000000000000000..b7960db9dae7d1da77ef3acc46d0a6a9da584267 GIT binary patch literal 567 zcmV-70?7S|P)(R5;6H z`2YVu10|S&W(GL4-*9m5zR~L0cWa7s=goeHmKzfsTW-vJJns=rXO>fi=YdvYp=OyIuL^83ysEIf(LtP34vHf@P1syLa4L>s)tjLDRY?|E+S*&m<}gEDA3wCC|S1 zC~n%F`=*)aLx8xUX62**Ryh}!5;VXx>jJY=!}V2J^Y4E*NjsaSAA6F^IPpwJ<+6wW zU8=5LQujKb`Z+F#fckUgU8t^YpU|s(=Orx83-p>b9R3rvXOE zXGG&B-+ooO{Lz1}<{Ou-vd(X^%s98zwd(4P#ubnMhqc}OsqDB<8mj>Yv8NgBOD@j_ z`PDq_3`$^`C!g6^zTp1k={a?|3Z-|`5HYOAUEHcimi|xPlFJZ#%{{hX{-)aXO=~Z^xE1+b* zM@!rH@FJ(e3$Fs}uKo9|x%%HQ^w?fm%Wa0V&kJ-j001RVucl)dd}jav002ovPDHLk FV1mw881w)D literal 0 HcmV?d00001 From 92027a0ee36c80ff7cb0e451dc2f124169c70ae8 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Thu, 29 May 2025 10:40:13 +0300 Subject: [PATCH 8/9] Font tester screenshot; Font tester UI fixes --- McBitFont/FontTester.Designer.cs | 20 +++++++++++--------- McBitFont/FontTester.cs | 10 ++++++++-- README.md | 4 ++++ images/Screenshot_Font-tester.png | Bin 0 -> 11583 bytes 4 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 images/Screenshot_Font-tester.png diff --git a/McBitFont/FontTester.Designer.cs b/McBitFont/FontTester.Designer.cs index 7aaeb34..a1d2b70 100644 --- a/McBitFont/FontTester.Designer.cs +++ b/McBitFont/FontTester.Designer.cs @@ -70,9 +70,10 @@ // tbText // tbText.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + tbText.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204); tbText.Location = new System.Drawing.Point(12, 55); tbText.Name = "tbText"; - tbText.Size = new System.Drawing.Size(220, 23); + tbText.Size = new System.Drawing.Size(260, 29); tbText.TabIndex = 3; toolTip1.SetToolTip(tbText, "Text to test the font with"); tbText.TextChanged += Text_Changed; @@ -83,10 +84,10 @@ dotPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; dotPanel.BackColor = System.Drawing.Color.White; dotPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - dotPanel.Location = new System.Drawing.Point(12, 84); + dotPanel.Location = new System.Drawing.Point(12, 90); dotPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); dotPanel.Name = "dotPanel"; - dotPanel.Size = new System.Drawing.Size(198, 104); + dotPanel.Size = new System.Drawing.Size(238, 98); dotPanel.TabIndex = 4; dotPanel.Paint += PaintPixels; dotPanel.Resize += ZoomChanged; @@ -95,7 +96,7 @@ // vScroll.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; vScroll.LargeChange = 25; - vScroll.Location = new System.Drawing.Point(211, 84); + vScroll.Location = new System.Drawing.Point(251, 84); vScroll.Name = "vScroll"; vScroll.Size = new System.Drawing.Size(21, 125); vScroll.TabIndex = 17; @@ -106,14 +107,14 @@ hScroll.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; hScroll.Location = new System.Drawing.Point(12, 188); hScroll.Name = "hScroll"; - hScroll.Size = new System.Drawing.Size(198, 21); + hScroll.Size = new System.Drawing.Size(238, 21); hScroll.TabIndex = 16; hScroll.ValueChanged += Scrolling; // // lblZoom // lblZoom.AutoSize = true; - lblZoom.Location = new System.Drawing.Point(133, 9); + lblZoom.Location = new System.Drawing.Point(173, 9); lblZoom.Name = "lblZoom"; lblZoom.Size = new System.Drawing.Size(42, 15); lblZoom.TabIndex = 18; @@ -124,7 +125,7 @@ cbZoom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; cbZoom.FormattingEnabled = true; cbZoom.Items.AddRange(new object[] { "2", "3", "5", "10", "15", "20", "25", "30", "35", "40", "45", "50" }); - cbZoom.Location = new System.Drawing.Point(182, 6); + cbZoom.Location = new System.Drawing.Point(222, 6); cbZoom.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); cbZoom.Name = "cbZoom"; cbZoom.Size = new System.Drawing.Size(50, 23); @@ -136,18 +137,19 @@ // chkBaseline // chkBaseline.AutoSize = true; - chkBaseline.Location = new System.Drawing.Point(163, 36); + chkBaseline.Location = new System.Drawing.Point(203, 36); chkBaseline.Name = "chkBaseline"; chkBaseline.Size = new System.Drawing.Size(69, 19); chkBaseline.TabIndex = 20; chkBaseline.Text = "Baseline"; chkBaseline.UseVisualStyleBackColor = true; + chkBaseline.CheckedChanged += Scrolling; // // FontTester // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - ClientSize = new System.Drawing.Size(244, 221); + ClientSize = new System.Drawing.Size(284, 221); Controls.Add(chkBaseline); Controls.Add(cbZoom); Controls.Add(lblZoom); diff --git a/McBitFont/FontTester.cs b/McBitFont/FontTester.cs index 0533962..e30cf02 100644 --- a/McBitFont/FontTester.cs +++ b/McBitFont/FontTester.cs @@ -19,6 +19,7 @@ namespace McBitFont { private readonly int absentWidth = 5; private readonly int pixelOffset = 5; + private int baselineThickness = 1; private byte[] encoded = []; private int cellSize; private int width; @@ -45,7 +46,7 @@ namespace McBitFont { SolidBrush sbp = new SolidBrush(Color.LightPink); SolidBrush sb; Pen blackPen = new(Color.Black); - Pen bluePen = new(Color.FromArgb(100, 20, 20, 200), 1); + Pen bluePen = new(Color.FromArgb(100, 20, 20, 200), baselineThickness); int x, y, i, j; // Sycle through ecoded bytes of test text @@ -82,7 +83,7 @@ namespace McBitFont { if (chkBaseline.Checked && baseline > 0) { x = pixelOffset - hScroll.Value; y = pixelOffset + baseline * cellSize - vScroll.Value; - g.DrawLine(bluePen, x, y, dotPanel.Width - pixelOffset, y); + g.DrawLine(bluePen, x, y, dotPanel.Width - 2 * pixelOffset, y); } } @@ -123,6 +124,11 @@ namespace McBitFont { vScroll.Enabled = true; } + // Baseline thickness calc + baselineThickness = cellSize / 5; + if (baselineThickness > 5) baselineThickness = 5; + if (baselineThickness < 1) baselineThickness = 1; + dotPanel.Refresh(); } diff --git a/README.md b/README.md index b2a4122..6892589 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,10 @@ New project dialog ![New project](/images/Screenshot_New.png) +Font test dialog + +![Font tester](/images/Screenshot_Font-tester.png) + Export dialog ![Export](/images/Screenshot_Export.png) diff --git a/images/Screenshot_Font-tester.png b/images/Screenshot_Font-tester.png new file mode 100644 index 0000000000000000000000000000000000000000..18822f6588fc9e45f65fae2b6f25ca55d8270abc GIT binary patch literal 11583 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 literal 0 HcmV?d00001 From 8d34e34326089eb7d087cdc82b062f31eb19e0a0 Mon Sep 17 00:00:00 2001 From: Anton Mukhin Date: Thu, 29 May 2025 16:49:25 +0300 Subject: [PATCH 9/9] Some small UI changes and TODO feature: Export image with All characers table --- .gitignore | 1 + McBitFont/FontTester.Designer.cs | 6 ++ McBitFont/Form1.Designer.cs | 75 ++++++++++++---- McBitFont/Form1.cs | 100 ++++++++++++++++++++- McBitFont/Form1.resx | 3 + McBitFont/McBitFont.csproj | 6 +- McBitFont/Properties/Resources.Designer.cs | 10 +++ McBitFont/Properties/Resources.resx | 13 +-- McBitFont/Resources/picture_go.png | Bin 0 -> 758 bytes README.md | 4 + TODO.txt | 2 +- icons/famfamfam/picture_go.png | Bin 0 -> 758 bytes images/Font_Minecraft_Rus_5x7_vw.png | Bin 0 -> 44051 bytes 13 files changed, 194 insertions(+), 26 deletions(-) create mode 100644 McBitFont/Resources/picture_go.png create mode 100644 icons/famfamfam/picture_go.png create mode 100644 images/Font_Minecraft_Rus_5x7_vw.png diff --git a/.gitignore b/.gitignore index f635fe4..75316d1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore examples/tests/32x32/ +examples/tests/PNGout/ # User-specific files *.rsuser diff --git a/McBitFont/FontTester.Designer.cs b/McBitFont/FontTester.Designer.cs index a1d2b70..4fc6680 100644 --- a/McBitFont/FontTester.Designer.cs +++ b/McBitFont/FontTester.Designer.cs @@ -134,6 +134,12 @@ toolTip1.SetToolTip(cbZoom, "Zoom level"); cbZoom.SelectedIndexChanged += ZoomChanged; // + // toolTip1 + // + toolTip1.AutoPopDelay = 10000; + toolTip1.InitialDelay = 500; + toolTip1.ReshowDelay = 100; + // // chkBaseline // chkBaseline.AutoSize = true; diff --git a/McBitFont/Form1.Designer.cs b/McBitFont/Form1.Designer.cs index edc507f..cec5515 100644 --- a/McBitFont/Form1.Designer.cs +++ b/McBitFont/Form1.Designer.cs @@ -67,6 +67,7 @@ importTextToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); importImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + exportFontLayoutPNGToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -83,6 +84,7 @@ removeBeforeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); removeAfterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); CodeShiftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + testFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); canvasToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ClearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); FillToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -107,7 +109,10 @@ lblSelectionLabel = new System.Windows.Forms.Label(); lblSelection = new System.Windows.Forms.Label(); lblModified = new System.Windows.Forms.Label(); - testFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + dlgSavePNG = new System.Windows.Forms.SaveFileDialog(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); ((System.ComponentModel.ISupportInitialize)nudX).BeginInit(); ((System.ComponentModel.ISupportInitialize)nudY).BeginInit(); panel1.SuspendLayout(); @@ -528,9 +533,9 @@ // // fileToolStripMenuItem // - fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, openToolStripMenuItem, saveToolStripMenuItem, saveAsToolStripMenuItem, importTextToolStripMenuItem1, importImageToolStripMenuItem, exportToolStripMenuItem, exitToolStripMenuItem }); + fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, openToolStripMenuItem, saveToolStripMenuItem, saveAsToolStripMenuItem, toolStripSeparator1, importTextToolStripMenuItem1, importImageToolStripMenuItem, exportToolStripMenuItem, exportFontLayoutPNGToolStripMenuItem, toolStripSeparator2, exitToolStripMenuItem }); fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + fileToolStripMenuItem.Size = new System.Drawing.Size(122, 20); fileToolStripMenuItem.Text = "File"; // // newToolStripMenuItem @@ -583,6 +588,7 @@ importTextToolStripMenuItem1.Name = "importTextToolStripMenuItem1"; importTextToolStripMenuItem1.Size = new System.Drawing.Size(224, 22); importTextToolStripMenuItem1.Text = "Import text file (very limited)"; + importTextToolStripMenuItem1.ToolTipText = "Import a font from a C array in a file"; importTextToolStripMenuItem1.Click += importTextToolStripMenuItem1_Click; // // importImageToolStripMenuItem @@ -605,6 +611,15 @@ exportToolStripMenuItem.ToolTipText = "Configure and export data"; exportToolStripMenuItem.Click += button1_Click; // + // exportFontLayoutPNGToolStripMenuItem + // + exportFontLayoutPNGToolStripMenuItem.Image = Properties.Resources.picture_go; + 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; + // // exitToolStripMenuItem // exitToolStripMenuItem.Image = Properties.Resources.Famfamfam_Silk_Door_out_16; @@ -629,7 +644,7 @@ undoToolStripMenuItem.Image = Properties.Resources.arrow_undo; undoToolStripMenuItem.Name = "undoToolStripMenuItem"; undoToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z; - undoToolStripMenuItem.Size = new System.Drawing.Size(164, 22); + undoToolStripMenuItem.Size = new System.Drawing.Size(180, 22); undoToolStripMenuItem.Text = "Undo"; undoToolStripMenuItem.ToolTipText = "Undo last canvas change"; undoToolStripMenuItem.Click += undoToolStripMenuItem_Click; @@ -639,7 +654,7 @@ redoToolStripMenuItem.Image = Properties.Resources.arrow_redo; redoToolStripMenuItem.Name = "redoToolStripMenuItem"; redoToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y; - redoToolStripMenuItem.Size = new System.Drawing.Size(164, 22); + redoToolStripMenuItem.Size = new System.Drawing.Size(180, 22); redoToolStripMenuItem.Text = "Redo"; redoToolStripMenuItem.ToolTipText = "Redo canvas change"; redoToolStripMenuItem.Click += redoToolStripMenuItem_Click; @@ -650,7 +665,7 @@ copyToolStripMenuItem.Name = "copyToolStripMenuItem"; copyToolStripMenuItem.ShortcutKeyDisplayString = ""; copyToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C; - copyToolStripMenuItem.Size = new System.Drawing.Size(164, 22); + copyToolStripMenuItem.Size = new System.Drawing.Size(180, 22); copyToolStripMenuItem.Text = "Copy"; copyToolStripMenuItem.ToolTipText = "Copy current symbol to clipboard"; copyToolStripMenuItem.Click += copyToolStripMenuItem_Click; @@ -662,7 +677,7 @@ pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; pasteToolStripMenuItem.ShortcutKeyDisplayString = ""; pasteToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V; - pasteToolStripMenuItem.Size = new System.Drawing.Size(164, 22); + pasteToolStripMenuItem.Size = new System.Drawing.Size(180, 22); pasteToolStripMenuItem.Text = "Paste"; pasteToolStripMenuItem.ToolTipText = "Paste from clipboard to current symbol"; pasteToolStripMenuItem.Click += pasteToolStripMenuItem_Click; @@ -672,8 +687,9 @@ selectToolStripMenuItem.Image = Properties.Resources.fam_rectt; selectToolStripMenuItem.Name = "selectToolStripMenuItem"; selectToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R; - selectToolStripMenuItem.Size = new System.Drawing.Size(164, 22); + selectToolStripMenuItem.Size = new System.Drawing.Size(180, 22); selectToolStripMenuItem.Text = "Select"; + selectToolStripMenuItem.ToolTipText = "Toggle Rectangle selection tool"; selectToolStripMenuItem.Click += selectToolStripMenuItem_Click; // // selectAllToolStripMenuItem @@ -682,13 +698,14 @@ selectAllToolStripMenuItem.Image = Properties.Resources.arrow_out; selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; selectAllToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A; - selectAllToolStripMenuItem.Size = new System.Drawing.Size(164, 22); + selectAllToolStripMenuItem.Size = new System.Drawing.Size(180, 22); selectAllToolStripMenuItem.Text = "Select All"; + selectAllToolStripMenuItem.ToolTipText = "Select entire canvas"; selectAllToolStripMenuItem.Click += selectAllToolStripMenuItem_Click; // // fontToolStripMenuItem // - fontToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { makeVarWidthToolStripMenuItem, prependSymbolToolStripMenuItem, appendSymbolToolStripMenuItem, removeSymbolToolStripMenuItem, removeBeforeToolStripMenuItem, removeAfterToolStripMenuItem, CodeShiftToolStripMenuItem, testFontToolStripMenuItem }); + fontToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { makeVarWidthToolStripMenuItem, prependSymbolToolStripMenuItem, appendSymbolToolStripMenuItem, removeSymbolToolStripMenuItem, removeBeforeToolStripMenuItem, removeAfterToolStripMenuItem, CodeShiftToolStripMenuItem, toolStripSeparator3, testFontToolStripMenuItem }); fontToolStripMenuItem.Name = "fontToolStripMenuItem"; fontToolStripMenuItem.Size = new System.Drawing.Size(43, 20); fontToolStripMenuItem.Text = "Font"; @@ -768,6 +785,15 @@ CodeShiftToolStripMenuItem.ToolTipText = "Shift the font on the code line"; CodeShiftToolStripMenuItem.Click += CodeShiftToolStripMenuItem_Click; // + // testFontToolStripMenuItem + // + testFontToolStripMenuItem.Image = Properties.Resources.font; + testFontToolStripMenuItem.Name = "testFontToolStripMenuItem"; + testFontToolStripMenuItem.Size = new System.Drawing.Size(215, 22); + testFontToolStripMenuItem.Text = "Test font"; + testFontToolStripMenuItem.ToolTipText = "Open dialog where you can test the font with any text you type"; + testFontToolStripMenuItem.Click += TestFont_Click; + // // canvasToolStripMenuItem // canvasToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { ClearToolStripMenuItem, FillToolStripMenuItem, shiftUpToolStripMenuItem, shiftDownToolStripMenuItem, shiftLeftToolStripMenuItem, shiftRightToolStripMenuItem, invertToolStripMenuItem, mirrorXToolStripMenuItem, mirrorYToolStripMenuItem, applyToolStripMenuItem }); @@ -1024,13 +1050,25 @@ lblModified.Text = "Frame modified"; lblModified.Visible = false; // - // testFontToolStripMenuItem + // dlgSavePNG // - testFontToolStripMenuItem.Image = Properties.Resources.font; - testFontToolStripMenuItem.Name = "testFontToolStripMenuItem"; - testFontToolStripMenuItem.Size = new System.Drawing.Size(215, 22); - testFontToolStripMenuItem.Text = "Test font"; - testFontToolStripMenuItem.Click += TestFont_Click; + dlgSavePNG.DefaultExt = "png"; + dlgSavePNG.Filter = "PNG Image|*.png;*.PNG"; + // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(221, 6); + // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(221, 6); + // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(212, 6); // // MainForm // @@ -1167,6 +1205,11 @@ private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; private System.Windows.Forms.Label lblModified; private System.Windows.Forms.ToolStripMenuItem testFontToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportFontLayoutPNGToolStripMenuItem; + private System.Windows.Forms.SaveFileDialog dlgSavePNG; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; } } diff --git a/McBitFont/Form1.cs b/McBitFont/Form1.cs index 5c628f4..3977053 100644 --- a/McBitFont/Form1.cs +++ b/McBitFont/Form1.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; +using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -57,7 +58,7 @@ namespace McBitFont { public bool monospaced = false; private bool modified = false; private bool prjModified = false; - public const string version = "2.2"; + public const string version = "2.3"; public string prjName = "Untitled"; public string prjFileName = ""; public int codepage = 1251; @@ -932,6 +933,8 @@ namespace McBitFont { prjFileName = filename; prjName = Path.GetFileNameWithoutExtension(filename); + dlgSavePNG.FileName = prjName + ".png"; + dlgSave.FileName = prjName + ".mbfont"; SetWindowCap(); miniList.Items[0].Selected = true; @@ -1429,5 +1432,100 @@ namespace McBitFont { var tester = new FontTester(codepage, dotHeight, baseline, frames); tester.ShowDialog(); } + + private void ExportPNG(object sender, EventArgs e) { + CheckModifiedFrame(); + CheckModifiedProject(); + + if (dlgSavePNG.ShowDialog() == DialogResult.OK) { + int pixelSize = 3; + int symbolMargin = 2 * pixelSize; + int headerHeight = 100; + int maxWidth = 0; + int i, j, v, h, x, y; + string s; + + foreach (FrameMiniature f in frames) { + if (f.width > maxWidth) maxWidth = f.width; + } + + int cellWidth = (pixelSize * maxWidth + 2 * symbolMargin); + int cellHeight = (pixelSize * dotHeight + 2 * symbolMargin); + if (cellWidth < 10) cellWidth = 10; + if (cellHeight < 10) cellHeight = 10; + + int width = cellWidth * 16 + 17 + 50; + int height = cellHeight * 16 + 17 + 25 + headerHeight; + + Bitmap bmp = new(width > 450 ? width : 450, height); + Graphics g = Graphics.FromImage(bmp); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; + Font font = new("Consolas", 14, FontStyle.Bold); + Brush tb = Brushes.Black; + + + // Draw basic information + g.DrawString("Font project name: " + prjName, font, tb, 10, 10); + + g.DrawString("Font height: " + dotHeight, font, tb, 10, 38); + g.DrawString("Font max width: " + maxWidth, font, tb, 10, 62); + g.DrawString("Symbols count: " + frames.Count, font, tb, 10, 86); + + g.DrawString("First code: " + frames.First().code.ToString(), font, tb, 250, 38); + g.DrawString("Last code: " + frames.Last().code.ToString(), font, tb, 250, 62); + g.DrawString("Codepage: " + codepage.ToString(), font, tb, 250, 86); + + + // Draw grid + Pen p = new(Color.FromArgb(64, 0, 0, 0), 1); + SolidBrush b = new SolidBrush(Color.FromArgb(160, Color.Black)); + //Brush b = Brushes.Black; + + int xCapOffset = cellWidth / 2 - 8; + int yCapOffset = cellHeight / 2 - 10; + for (i = 0; i < 17; i++) { + x = 50 + 17 + i * cellWidth - 1; + y = headerHeight + 17 + 25 + i * cellHeight - 1; + g.DrawLine(p, 1, y, width - 1, y); + g.DrawLine(p, x, headerHeight + 20, x, headerHeight + height - 20); + + if (i != 16) { + s = Convert.ToString(i, 16).ToUpper(); + g.DrawString(s, font, b, x + xCapOffset, headerHeight + 20); + s = "0x" + Convert.ToString(i * 16, 16).PadLeft(2, '0').ToUpper(); + g.DrawString(s, font, b, 10, y + yCapOffset); + } + } + + // Draw symbols + int code; + List ff; + Rectangle rect; + // Cycle through grid cells + for (v = 0; v < 16; v++) { + for (h = 0; h < 16; h++) { + // Check if the font has a symbol with the code + code = 16 * v + h; + ff = frames.FindAll(x => x.code == code); + if (ff.Count == 1) { + x = 50 + 17 + h * cellWidth + symbolMargin; + y = headerHeight + 17 + 25 + v * cellHeight + symbolMargin; + // Cycly through symbol's pixels and draw the black ones + for (i = 0; i < ff[0].width; i++) { + for (j = 0; j < ff[0].height; j++) { + if (ff[0].data[i, j]) { + rect = new Rectangle(x + i * pixelSize, y + j * pixelSize, pixelSize, pixelSize); + g.FillRectangle(tb, rect); + } + } + } + } + } + } + + bmp.Save(dlgSavePNG.FileName, ImageFormat.Png); + } + + } } } diff --git a/McBitFont/Form1.resx b/McBitFont/Form1.resx index fb11a13..5800d67 100644 --- a/McBitFont/Form1.resx +++ b/McBitFont/Form1.resx @@ -135,6 +135,9 @@ 336, 17 + + 644, 17 + diff --git a/McBitFont/McBitFont.csproj b/McBitFont/McBitFont.csproj index 591cff5..5f7f705 100644 --- a/McBitFont/McBitFont.csproj +++ b/McBitFont/McBitFont.csproj @@ -20,9 +20,9 @@ true true icon_64.ico - 2.2.0.0 - 2.2.0.0 - $(VersionPrefix)2.2.0 + 2.3.0.0 + 2.3.0.0 + $(VersionPrefix)2.3.0 Anton Mukhin diff --git a/McBitFont/Properties/Resources.Designer.cs b/McBitFont/Properties/Resources.Designer.cs index b19e4f2..99698dd 100644 --- a/McBitFont/Properties/Resources.Designer.cs +++ b/McBitFont/Properties/Resources.Designer.cs @@ -310,6 +310,16 @@ namespace McBitFont.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap picture_go { + get { + object obj = ResourceManager.GetObject("picture_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/McBitFont/Properties/Resources.resx b/McBitFont/Properties/Resources.resx index 063342b..a99b88d 100644 --- a/McBitFont/Properties/Resources.resx +++ b/McBitFont/Properties/Resources.resx @@ -136,12 +136,18 @@ ..\Resources\Famfamfam-Silk-Page-copy.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\font.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\arrow_inout.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\redo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Famfamfam-Silk-Disk.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -202,9 +208,6 @@ ..\Resources\Famfamfam-Silk-Page-white.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\Famfamfam-Silk-Disk.16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\folder_table.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -229,7 +232,7 @@ ..\Resources\icon_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\font.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\picture_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/McBitFont/Resources/picture_go.png b/McBitFont/Resources/picture_go.png new file mode 100644 index 0000000000000000000000000000000000000000..27c63c5afe358c8e22801de541b73e0f98961575 GIT binary patch literal 758 zcmVmBR~*Li@40hl?wvRqnZ(Ao1QJ1rZCaJSDB{Laap9suT~%lorMMMz>qEQ4lo5g<`B}Oj2V=n8e9sGWVQ&&hO_UijFU(&+eSXhr@Fo^Xu=UKZ=+y zSDmER^Ln)XSd1Yp^2;}$?>z+&i<%Qh5A<$I)6^JK;J=ay1fO&1%7d?gHDJ|Bk|e1) ze|3qB8Vxf}f6qMSVjZu-;&Pcg4?5}4L1MZ%eY~F_#ym%3=OKy;L-P9AJKpf3Z(ci39q!_wFi{`Mq{ zJ*0SVfxfPfu_0%B_aJ93?kA`cBW^;RWZPkwP68J7<$6(vG4fo-LD8L1PKVrY<-5I?FU$KEpAQ! zS%3drRE^CW_8Q6?$-E<|Fjf1TTs&TK@{qG^8|>~q$V$E%-IyGy#c9#hk-YPRo_%1< zGfK&Ph7X>e4SjeC1Qj0Fr>RypGdgpPYZD_2&U4uO{M+dFqGrDfI`r}vU#Wf3nK_3O zN9G+nx_7Z};4n9*uQM`neYIg%KAIiYyXMtlye;pYi<%$y9qPDx|Bpvb_;hwy#{vE~ oFmTp1gA_Vi5(egnb@KWBQ*sVbcJX$M%m4rY07*qoM6N<$f(SNMBme*a literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 6892589..70829fa 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,7 @@ Import Image dialog Code Shift dialog ![Code Shift](/images/Screenshot_Code-shift.png) + +Font PNG export example + +![PNG export example](/images/Font_Minecraft_Rus_5x7_vw.png) diff --git a/TODO.txt b/TODO.txt index 06f8ced..4e808ca 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,7 +4,7 @@ Application: Functionality: V Allow to add frames to Single-frame "fonts" V Type a string to see the result (test the font) -- Export image with All characers table +V Export image with All characers table Bugs: - In some cases after switching to a symbol dotPanel mouse move causes "Out of range" exception (history.Pre after width change?) diff --git a/icons/famfamfam/picture_go.png b/icons/famfamfam/picture_go.png new file mode 100644 index 0000000000000000000000000000000000000000..27c63c5afe358c8e22801de541b73e0f98961575 GIT binary patch literal 758 zcmVmBR~*Li@40hl?wvRqnZ(Ao1QJ1rZCaJSDB{Laap9suT~%lorMMMz>qEQ4lo5g<`B}Oj2V=n8e9sGWVQ&&hO_UijFU(&+eSXhr@Fo^Xu=UKZ=+y zSDmER^Ln)XSd1Yp^2;}$?>z+&i<%Qh5A<$I)6^JK;J=ay1fO&1%7d?gHDJ|Bk|e1) ze|3qB8Vxf}f6qMSVjZu-;&Pcg4?5}4L1MZ%eY~F_#ym%3=OKy;L-P9AJKpf3Z(ci39q!_wFi{`Mq{ zJ*0SVfxfPfu_0%B_aJ93?kA`cBW^;RWZPkwP68J7<$6(vG4fo-LD8L1PKVrY<-5I?FU$KEpAQ! zS%3drRE^CW_8Q6?$-E<|Fjf1TTs&TK@{qG^8|>~q$V$E%-IyGy#c9#hk-YPRo_%1< zGfK&Ph7X>e4SjeC1Qj0Fr>RypGdgpPYZD_2&U4uO{M+dFqGrDfI`r}vU#Wf3nK_3O zN9G+nx_7Z};4n9*uQM`neYIg%KAIiYyXMtlye;pYi<%$y9qPDx|Bpvb_;hwy#{vE~ oFmTp1gA_Vi5(egnb@KWBQ*sVbcJX$M%m4rY07*qoM6N<$f(SNMBme*a literal 0 HcmV?d00001 diff --git a/images/Font_Minecraft_Rus_5x7_vw.png b/images/Font_Minecraft_Rus_5x7_vw.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ef3984fdae613e6f199eb6eb2852c55ebd3dd3 GIT binary patch literal 44051 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 OFU+Toix@M1{eJ=D1)X64 literal 0 HcmV?d00001