diff --git a/CDSAE3_Lian_Lian_Kan/Boards/Board.cs b/CDSAE3_Lian_Lian_Kan/Boards/Board.cs index 1ebe695..9db1eb3 100644 --- a/CDSAE3_Lian_Lian_Kan/Boards/Board.cs +++ b/CDSAE3_Lian_Lian_Kan/Boards/Board.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Xml; -using CDSAE3_Lian_Lian_Kan; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar; +using CDSAE3_Lian_Lian_Kan.Forms.Interface; namespace CDSAE3_Lian_Lian_Kan.Boards { public partial class Board:IBoard @@ -24,7 +17,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards { total = value; if (Total == 0) - Etcs.game_mode_form?.Finished_Handler(this, new Forms.FinishArgs { finish_Type = Forms.FinishArgs.Finish_Type.All_done }); + Etcs.gameModeForm?.Finished_Handler(this, new FinishArgs { finish_Type = FinishArgs.Finish_Type.All_done }); } } private Board_funcs board_Funcs = new Board_funcs(); diff --git a/CDSAE3_Lian_Lian_Kan/Boards/Board_funcs.cs b/CDSAE3_Lian_Lian_Kan/Boards/Board_funcs.cs index 5c74545..e866398 100644 --- a/CDSAE3_Lian_Lian_Kan/Boards/Board_funcs.cs +++ b/CDSAE3_Lian_Lian_Kan/Boards/Board_funcs.cs @@ -9,7 +9,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards internal class Board_funcs { private Random random = new Random(); - internal int getval(ref int[] temp_val_per_Image,ref int last_val,int types) + internal int getval(ref int[] temp_val_per_Image, ref int last_val, int types) { int not_zero = 0; foreach (int x in temp_val_per_Image) @@ -45,14 +45,14 @@ namespace CDSAE3_Lian_Lian_Kan.Boards last_val = t; return t; } - internal int[] get_vals_per_image(int total,int type_num) + internal int[] get_vals_per_image(int total, int type_num) { - int[] vals_per_Image= new int[type_num]; + int[] vals_per_Image = new int[type_num]; int single = total / type_num; for (int k = total; k > 0; k -= 2) { int t = random.Next(0, type_num); - if (vals_per_Image[t] >= 1.5 * single) + if (vals_per_Image[t] >= 1.5 * single && single != 0) { k += 2; continue; diff --git a/CDSAE3_Lian_Lian_Kan/Boards/Graph_Board.cs b/CDSAE3_Lian_Lian_Kan/Boards/Graph_Board.cs index db1e986..c619847 100644 --- a/CDSAE3_Lian_Lian_Kan/Boards/Graph_Board.cs +++ b/CDSAE3_Lian_Lian_Kan/Boards/Graph_Board.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using CDSAE3_Lian_Lian_Kan.Forms.Interface; namespace CDSAE3_Lian_Lian_Kan.Boards { @@ -47,7 +48,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards { total = value; if (Total == 0) - Etcs.game_mode_form?.Finished_Handler(this, new Forms.FinishArgs { finish_Type = Forms.FinishArgs.Finish_Type.All_done }); + Etcs.gameModeForm?.Finished_Handler(this, new FinishArgs { finish_Type = FinishArgs.Finish_Type.All_done }); } } private int[] Vals_per_Image { get; set; } = Array.Empty(); @@ -103,9 +104,13 @@ namespace CDSAE3_Lian_Lian_Kan.Boards Index.Add((j, i), new Node(j, i, -1)); } + bool doSwap_causeByOddtotal = false; int sum = width * height; if (sum % 2 != 0) + { + doSwap_causeByOddtotal = true; sum--; + } total = sum; int types = Etcs.Images_size(); Vals_per_Image = board_Funcs.get_vals_per_image(Total, types); @@ -127,6 +132,8 @@ namespace CDSAE3_Lian_Lian_Kan.Boards cur_width = 1; } } + if (doSwap_causeByOddtotal) + (Bd[height, width], Bd[(height + 1) / 2, (width + 1) / 2]) = (Bd[(height + 1) / 2, (width + 1) / 2], Bd[height, width]); foreach(var (index,node)in Index) { if (Index.TryGetValue((node.x - 1, node.y), out var lnode)) diff --git a/CDSAE3_Lian_Lian_Kan/CDSAE3_Lian_Lian_Kan.csproj b/CDSAE3_Lian_Lian_Kan/CDSAE3_Lian_Lian_Kan.csproj index 043993c..2c6700a 100644 --- a/CDSAE3_Lian_Lian_Kan/CDSAE3_Lian_Lian_Kan.csproj +++ b/CDSAE3_Lian_Lian_Kan/CDSAE3_Lian_Lian_Kan.csproj @@ -1,13 +1,27 @@  - WinExe - net8.0-windows + Exe + net8.0-windows8.0 enable true enable + + + + + + + + PreserveNewest + + + Always + + + @@ -27,4 +41,6 @@ + + \ No newline at end of file diff --git a/CDSAE3_Lian_Lian_Kan/Etcs.cs b/CDSAE3_Lian_Lian_Kan/Etcs.cs index f00e8ce..e30fb81 100644 --- a/CDSAE3_Lian_Lian_Kan/Etcs.cs +++ b/CDSAE3_Lian_Lian_Kan/Etcs.cs @@ -4,26 +4,70 @@ using System.Globalization; using System.Linq; using System.Resources; using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Unicode; using System.Threading.Tasks; using CDSAE3_Lian_Lian_Kan.Boards; using CDSAE3_Lian_Lian_Kan.Forms; +using CDSAE3_Lian_Lian_Kan.Forms.Interface; using CDSAE3_Lian_Lian_Kan.Properties; using CDSAE3_Lian_Lian_Kan.Sound; namespace CDSAE3_Lian_Lian_Kan { public static class Etcs { + public class ThemeInfos + { + public IList? Themes { get; set; } + } + public class ThemeInfo + { + public string Name { get; set; } = ""; + public bool AnimationUseImage { get; set; } + public bool IsOutPicture { get; set; } + public string? PictureName { get; set; } + public bool PlayPanelUsePicture { get; set; } + public bool PlayPanelPictureIsOutPicture { get; set; } + public string? PlayPanelPictureName { get; set; } + public IList? ThemeColor { get; set; } + public IList? PlayAreaThemeColor { get; set; } + public IList? ButtonColor { get; set; } + public IList? ButtonSize { get; set; } + public IList? StartGamePos { get; set; } + public IList? ChallengeModePos { get; set; } + public IList? ScoreBoardPos { get; set; } + public IList? SettingsPos { get; set; } + public IList? FontBlockPos { get; set; } + public IList? FontBlockSize { get; set; } + public IList? FontColor { get; set; } + public string? Font { get; set; } + public string? FontSize { get; set; } + } + public class ScoreRecord + { + public IList? RecordInfos { get; set; } + } + public class RecordInfo + { + public string? Name { get; set; } + public DateTimeOffset? Time { get; set; } + public int? CostTime { get; set; } + public int? Score { get; set; } + public string? Difficulty { get; set; } + + } + public static int left_time { get; set; } = 180; public static int search_left_time { get; set; } = 20; - public enum Difficulty - { + { easy = 0, normal = 1, hard = 2, custom = 3 } - public enum Mode + public enum Theme { fruit = 0 } @@ -63,36 +107,45 @@ namespace CDSAE3_Lian_Lian_Kan {9,100.0/5 }, {10,100.0/3 }}; - static int cus_height = 1, cus_width = 1; + public static int cus_height = 1, cus_width = 1; + public static Dictionary themes { get; set; } = JsonSerializer.Deserialize(File.ReadAllText("Resources\\sources.json"), new JsonSerializerOptions() + {Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) + })!.Themes!.ToDictionary(x => x.Name); public static System.Timers.Timer hunderd_millsecond_timer { get; set; } = new System.Timers.Timer(100) { AutoReset = true, Enabled = true }; public static Difficulty current_difficulty { get; set; } = Difficulty.normal; - public static Mode current_mode { get; set; } + public static Theme current_block_theme { get; set; } + public static ThemeInfo currentThemeInfo { get; set; } = themes["Fruit"]; public static Image trans_Image { get; set; } = Resources.trans; - public static (int, int) get_length_width() => current_difficulty != Difficulty.custom ? (7 * (1 + (int)current_difficulty), 4 * (1 + (int)current_difficulty)) : (cus_width,cus_height); + public static (int, int) get_length_width() => current_difficulty != Difficulty.custom ? (7 * (1 + (int)current_difficulty), 4 * (1 + (int)current_difficulty)) : (cus_width, cus_height); public static List block_Images { get; set; } = new List { Resources.Apple, Resources.Banana, Resources.Beetroot, Resources.Cherry, Resources.Corn, Resources.Eggplant, Resources.Grape, Resources.Pear, Resources.Strawberry, Resources.Watermelon }; public static List disappear_Images { get; set; } = new List { Resources.Gapple, Resources.Gbanana, Resources.Gbeetroot, Resources.Gcherry, Resources.Gcorn, Resources.Geggplant, Resources.Ggrape, Resources.Gpear, Resources.Gstrawberry, Resources.Gwatermelon }; - public static List direction_Images { get; set; } = new List { Resources.trans, Resources.u, Resources.r , Resources.ur, Resources.d, Resources.ud, Resources.dr, Resources.udr, Resources.l, Resources.ul, Resources.lr, Resources.ulr, Resources.dl, Resources.udl, Resources.dlr, Resources.udlr}; + public static List direction_Images { get; set; } = new List { Resources.trans, Resources.u, Resources.r, Resources.ur, Resources.d, Resources.ud, Resources.dr, Resources.udr, Resources.l, Resources.ul, Resources.lr, Resources.ulr, Resources.dl, Resources.udl, Resources.dlr, Resources.udlr }; public static List tip_direction_Image { get; set; } = new List { Resources.trans, Resources.tip_u, Resources.tip_r, Resources.tip_ur, Resources.tip_d, Resources.tip_ud, Resources.tip_dr, Resources.tip_udr, Resources.tip_l, Resources.tip_ul, Resources.tip_lr, Resources.tip_ulr, Resources.tip_dl, Resources.tip_udl, Resources.tip_dlr, Resources.tip_udlr }; public static Image get_block_Image(int t) => block_Images[t]; public static Image get_disappear_Images(int t) => disappear_Images[t]; public static Image get_direction_Image(Direction direction) => direction_Images[(int)direction]; - public static int Images_size() => current_mode switch { Mode.fruit => 10, _ => 0, }; - internal static Image get_tip_direction_Image(Direction direction) => tip_direction_Image[(int)direction]; + public static int Images_size() => current_block_theme switch { Theme.fruit => 10, _ => 0, }; + public static Image get_tip_direction_Image(Direction direction) => tip_direction_Image[(int)direction]; public static LianLianKan? form { get; set; } - public static IGameControl? game_form{ get; set; }//gameBoard - public static IGameMode? game_mode_form { get; set; }//entireGame + public static IGameControl? gameForm { get; set; }//gameBoard + public static IGameMode? gameModeForm { get; set; }//entireGame + public static IMenuForm? gameMenuForm { get; set; }//MenuForm public static Board board { get; set; } = new Board(); public static Color def_Color { get; set; } = Color.FromArgb(0, 0, 0, 0); public static Color sel_Color { get; set; } = Color.FromArgb(0, 122, 204); public static Color mouse_upper_color { get; set; } = Color.FromArgb(97, 97, 108); - public static Dictionary> musics { get; set; } = new Dictionary> { { "C418", new List { "C418 - Beginning 2", "C418 - Floating Trees", "C418 - Moog City 2", "C418 - Mutation" } } }; + public static Dictionary> musics { get; set; } = new Dictionary> { { "C418", new List { "C418 - Beginning 2", "C418 - Floating Trees", "C418 - Moog City 2", "C418 - Mutation" } }, + {"Sea Power",new List{ "Sea Power - Advesperascit", "Sea Power - Burn, Baby, Burn", "Sea Power - Detective Arriving on the Scene", "Sea Power - Disco Elysium, Pt 1", "Sea Power - Disco Elysium, Pt 2", "Sea Power - Ecstatic Vibrations, Totally Transcendent", "Sea Power - Hope in Work and Joy in Leisure", "Sea Power - Ignus Nilsen Waltz", "Sea Power - Instrument of Surrender", "Sea Power - Krenel, Downwell, Somatosensor", "Sea Power - La Revacholiere", "Sea Power - Live With Me", "Sea Power - Martinaise, Terminal B", "Sea Power - Miss Oranje Disco Dancer", "Sea Power - Off We Go Into the Wild Pale Yonder", "Sea Power - Ployhedrons", "Sea Power - Precinct 41 Major Crime Unit", "Sea Power - Rue de Saint-Gislaine", "Sea Power - Saint-Brune 1147", "Sea Power - The Cryptozoologists", "Sea Power - The Doomed Commercial Area", "Sea Power - The Field Autopsy", "Sea Power - The Insulindian Miracle", "Sea Power - Tiger King", "Sea Power - We Are Not Checkmated", "Sea Power - Whirling In Rags 12Pm", "Sea Power - Whirling in Rags 8am", "Sea Power - Whirling in Rags 8pm", "Sea Power - Your Body Betrays Your Degeneracy", "Sea Power - Zaum" } } }; public static Audio_res_manager audio_Res_Manager { get; set; } = new Audio_res_manager(); public static Song_Audio_processer song_Audio_Processer { get; set; } = new Song_Audio_processer(); public static Info_Audio_processer info_Audio_Processer { get; set; } = new Info_Audio_processer(); public static ResourceManager res_Manager { get; set; } = new ResourceManager("CDSAE3_Lian_Lian_Kan.Properties.Resources", typeof(Resources).Assembly); public static CultureInfo res_Culture { get; set; } = new CultureInfo("en-US"); - public static int Song_Volume { get; set; } = 70; - public static int Info_Volume { get; set; } = 70; + public static Setting setting { get; set; } = new Setting(); + public static Charts charts { get; set; } = new Charts(); + public static int Song_Volume { get; set; } = 60; + public static int Info_Volume { get; set; } = 60; + public static bool loadFinished { get; set; } = true; } } diff --git a/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.Designer.cs b/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.Designer.cs new file mode 100644 index 0000000..e00a5ff --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.Designer.cs @@ -0,0 +1,63 @@ +namespace CDSAE3_Lian_Lian_Kan.Forms +{ + partial class BufferForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + loading = new Label(); + SuspendLayout(); + // + // loading + // + loading.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + loading.AutoSize = true; + loading.Font = new Font("Microsoft YaHei UI", 20F); + loading.ForeColor = Color.White; + loading.Location = new Point(711, 604); + loading.Name = "loading"; + loading.Size = new Size(208, 52); + loading.TabIndex = 0; + loading.Text = "Loading..."; + loading.Visible = false; + // + // BufferForm + // + AutoScaleDimensions = new SizeF(11F, 24F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = SystemColors.ActiveCaptionText; + Controls.Add(loading); + Name = "BufferForm"; + Size = new Size(1012, 710); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label loading; + } +} diff --git a/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.cs b/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.cs new file mode 100644 index 0000000..93511b0 --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CDSAE3_Lian_Lian_Kan.Forms +{ + public partial class BufferForm : UserControl + { + public BufferForm() + { + InitializeComponent(); + } + public void SetEffect(Color begin, Color end, bool havePicture, Image? picture) + { + BackColor = begin; + this.begin = begin; + this.Dock = DockStyle.Fill; + deltaRa = (0 - begin.R) / 5; + deltaGa = (0 - begin.G) / 5; + deltaBa = (0 - begin.B) / 5; + deltaRb = (end.R - 0) / 5; + deltaGb = (end.G - 0) / 5; + deltaBb = (end.B - 0) / 5; + this.end = Color.FromArgb(0, 0, 0); + } + Color begin; + Color end; + int deltaRa, deltaGa, deltaBa; + int deltaRb, deltaGb, deltaBb; + public async Task EffectAsync() + { + try + { + for (int i = 0; i < 5; i++) + { + begin = Color.FromArgb(begin.R + deltaRa, begin.G + deltaGa, begin.B + deltaBa); + SolidBrush brush = new SolidBrush(begin); + Graphics graphics = this.CreateGraphics(); + graphics.FillRectangle(brush, 0, 0, Width, Height); + //await System.Timers.Timer. + await Task.Delay(100); + } + loading.Text = ""; + BackColor = Color.FromArgb(0, 0, 0); + loading.Visible = true; + for (int i = 1; i < "Loading".Length; i++) + { + string s = "Loading".Substring(0, i); + s += GetRandomStr("", "Loading".Length - i); + loading.Text = s; + await Task.Delay(100); + } + while (!Etcs.loadFinished) + for (int i = 0; i < 4; i++) + { + await Console.Out.WriteLineAsync("等待完成"); + loading.Text = "Loading" + new string('.', i % 4); + await Task.Delay(100); + } + loading.Visible = false; + for (int i = 0; i < 5; i++) + { + end = Color.FromArgb(end.R + deltaRb, end.G + deltaGb, end.B + deltaBb); + SolidBrush brush = new SolidBrush(end); + Graphics graphics = this.CreateGraphics(); + graphics.FillRectangle(brush, 0, 0, Width, Height); + await Task.Delay(100); + } + Visible = false; + } + catch (Exception e) + { + e.InnerException?.ToString(); + } + } + private Random _random = new Random(); + /// + /// 随机字符串 + /// + /// + /// + /// + public string GetRandomStr(string chars, int length) + { + if (string.IsNullOrEmpty(chars)) + { + chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghizklmnopqrstuvwxyz0123456789"; + } + //const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + return new string(Enumerable.Repeat(chars, length) + .Select(s => s[_random.Next(s.Length)]).ToArray()); + } + + } +} diff --git a/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.resx b/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Forms/BufferForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Charts.Designer.cs b/CDSAE3_Lian_Lian_Kan/Forms/Charts.Designer.cs new file mode 100644 index 0000000..4d72824 --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Forms/Charts.Designer.cs @@ -0,0 +1,88 @@ +namespace CDSAE3_Lian_Lian_Kan.Forms +{ + partial class Charts + { + /// + /// 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() + { + 排行榜 = new Label(); + back = new PictureBox(); + tablePanel = new Panel(); + ((System.ComponentModel.ISupportInitialize)back).BeginInit(); + SuspendLayout(); + // + // 排行榜 + // + 排行榜.AutoSize = true; + 排行榜.Font = new Font("Microsoft YaHei UI", 20F); + 排行榜.Location = new Point(649, 18); + 排行榜.Name = "排行榜"; + 排行榜.Size = new Size(142, 52); + 排行榜.TabIndex = 1; + 排行榜.Text = "排行榜"; + // + // back + // + back.Image = Properties.Resources.left_arrow; + back.Location = new Point(37, 18); + back.Name = "back"; + back.Size = new Size(75, 75); + back.SizeMode = PictureBoxSizeMode.Zoom; + back.TabIndex = 3; + back.TabStop = false; + back.Click += back_Click; + // + // tablePanel + // + tablePanel.AutoScroll = true; + tablePanel.Location = new Point(37, 132); + tablePanel.Name = "tablePanel"; + tablePanel.Size = new Size(1323, 720); + tablePanel.TabIndex = 5; + // + // Charts + // + AutoScaleDimensions = new SizeF(11F, 24F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.FromArgb(249, 211, 171); + ClientSize = new Size(1418, 904); + Controls.Add(tablePanel); + Controls.Add(back); + Controls.Add(排行榜); + FormBorderStyle = FormBorderStyle.None; + Name = "Charts"; + Text = "charts"; + ((System.ComponentModel.ISupportInitialize)back).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + private Label 排行榜; + private PictureBox back; + private Panel tablePanel; + } +} \ No newline at end of file diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Charts.cs b/CDSAE3_Lian_Lian_Kan/Forms/Charts.cs new file mode 100644 index 0000000..8014739 --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Forms/Charts.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Unicode; +using System.Threading.Tasks; +using System.Windows.Forms; +using CDSAE3_Lian_Lian_Kan.Forms.Interface; +using static CDSAE3_Lian_Lian_Kan.Etcs; +namespace CDSAE3_Lian_Lian_Kan.Forms +{ + public partial class Charts : Form, IThemeChangeable + { + private int[] _width = { 504, 328, 156, 157, 178 }; + private int _top = 0, _left = 0; + public Charts() + { + InitializeComponent(); + scoreRecord = JsonSerializer.Deserialize(File.ReadAllText("Resources\\charts.json"), new JsonSerializerOptions() + { + Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) + })!; + } + private Label[] LabelsMaker(string[] info, int height, Color? color, Font? font) + { + int oriHeight = height; + color ??= Color.FromArgb(0, 0, 0, 0); + List