public PreviewControl() { InitializeComponent(); rom = null; currentMessage = null; System.Drawing.Text.InstalledFontCollection fontCollection = new System.Drawing.Text.InstalledFontCollection(); FontFamily jpnFontFamily = fontCollection.Families.FirstOrDefault(x => x.Name == "Meiryo"); if (jpnFontFamily != null) { txtMessage.Font = new Font(jpnFontFamily, 9.0f); } pbPreview.Paint += ((s, ev) => { if (currentMessage != null) { ev.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; ev.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; using (Bitmap img = rom.GetMessageImage(currentMessage, vsbPages.Value)) { ev.Graphics.DrawImage(img, new Rectangle(0, 0, img.Width * 2, img.Height * 2)); } } }); vsbPages.ValueChanged += ((s, ev) => { pbPreview.Refresh(); }); }
public static void DumpComparison(string filename, RomHandler romPrimary, RomHandler romSecondary) { TextWriter writer = File.CreateText(filename); using (HtmlTextWriter html = new HtmlTextWriter(writer)) { html.WriteLine("<!DOCTYPE html>"); html.RenderBeginTag(HtmlTextWriterTag.Html); { WriteHeader(html, string.Format("{0} Message Comparison", System.Windows.Forms.Application.ProductName)); html.RenderBeginTag(HtmlTextWriterTag.Body); { html.RenderBeginTag(HtmlTextWriterTag.H2); { if (romSecondary != null) { html.WriteEncodedText(string.Format("Comparison between {0} ({1}) and {2} ({3})", Path.GetFileName(romPrimary.FileName), romPrimary.Language, Path.GetFileName(romSecondary.FileName), romSecondary.Language)); } else { html.WriteEncodedText(string.Format("Dump of {0} ({1})", Path.GetFileName(romPrimary.FileName), romPrimary.Language)); } } html.RenderEndTag(); html.RenderBeginTag(HtmlTextWriterTag.H4); { Version ver = new Version(System.Windows.Forms.Application.ProductVersion); html.WriteEncodedText(string.Format("{0} v{1}.{2}", System.Windows.Forms.Application.ProductName, ver.Major, ver.Minor)); html.WriteEncodedText(" - "); html.WriteEncodedText(string.Format("{0}", (Assembly.GetExecutingAssembly().GetCustomAttribute(typeof(AssemblyCopyrightAttribute)) as AssemblyCopyrightAttribute).Copyright)); } html.RenderEndTag(); int numBanks = 0; if (romSecondary != null) { numBanks = (romPrimary.MessageBanks.Length == romSecondary.MessageBanks.Length ? romPrimary.MessageBanks.Length : Math.Max(romPrimary.MessageBanks.Length, romSecondary.MessageBanks.Length)); } else { numBanks = romPrimary.MessageBanks.Length; } for (int i = 0; i < numBanks; i++) { MessageBank[] langBanks = new MessageBank[] { (romPrimary != null && i < romPrimary.MessageBanks.Length ? romPrimary.MessageBanks[i] : null), (romSecondary != null && i < romSecondary.MessageBanks.Length ? romSecondary.MessageBanks[i] : null) }; string bankId = string.Format("bank-{0:D4}", i); html.AddAttribute(HtmlTextWriterAttribute.Class, "header"); html.RenderBeginTag(HtmlTextWriterTag.Div); { html.AddAttribute(HtmlTextWriterAttribute.Class, "header-text"); html.RenderBeginTag(HtmlTextWriterTag.Span); { if (romPrimary.MessageBanks[i].Number == -1) { html.Write("General"); } else { html.Write("Bank {0}", romPrimary.MessageBanks[i].Number); } } html.RenderEndTag(); html.AddAttribute(HtmlTextWriterAttribute.Class, "header-toggle"); html.RenderBeginTag(HtmlTextWriterTag.Span); { html.AddAttribute(HtmlTextWriterAttribute.Href, string.Format("javascript:toggle('{0}');", bankId), false); html.RenderBeginTag(HtmlTextWriterTag.A); { html.Write("+/-"); } html.RenderEndTag(); } html.RenderEndTag(); } html.RenderEndTag(); html.AddAttribute(HtmlTextWriterAttribute.Id, bankId); html.AddStyleAttribute(HtmlTextWriterStyle.Display, "table"); html.RenderBeginTag(HtmlTextWriterTag.Table); { html.RenderBeginTag(HtmlTextWriterTag.Tr); { html.AddAttribute(HtmlTextWriterAttribute.Class, "header-id"); html.RenderBeginTag(HtmlTextWriterTag.Th); { html.Write("ID"); } html.RenderEndTag(); html.AddAttribute(HtmlTextWriterAttribute.Class, "header-desc-text"); html.RenderBeginTag(HtmlTextWriterTag.Th); { html.Write("Primary ({0})", romPrimary.Language); } html.RenderEndTag(); if (romSecondary != null) { html.AddAttribute(HtmlTextWriterAttribute.Class, "header-desc-text"); html.RenderBeginTag(HtmlTextWriterTag.Th); { html.Write("Secondary ({0})", romSecondary.Language); } html.RenderEndTag(); } html.AddAttribute(HtmlTextWriterAttribute.Class, "header-desc-sim"); html.RenderBeginTag(HtmlTextWriterTag.Th); { html.Write("Primary ({0}; Sim)", romPrimary.Language); } html.RenderEndTag(); if (romSecondary != null) { html.AddAttribute(HtmlTextWriterAttribute.Class, "header-desc-sim"); html.RenderBeginTag(HtmlTextWriterTag.Th); { html.Write("Secondary ({0}; Sim)", romSecondary.Language); } html.RenderEndTag(); } } html.RenderEndTag(); int numMessages = 0; if (langBanks[1] != null) { numMessages = (langBanks[0].Messages.Count == langBanks[1].Messages.Count ? langBanks[0].Messages.Count : Math.Max(langBanks[0].Messages.Count, langBanks[1].Messages.Count)); } else { numMessages = langBanks[0].Messages.Count; } for (int j = 0; j < numMessages; j++) { html.RenderBeginTag(HtmlTextWriterTag.Tr); { html.AddAttribute(HtmlTextWriterAttribute.Class, "message-id"); html.RenderBeginTag(HtmlTextWriterTag.Th); { html.Write("#{0}", j + 1); } html.RenderEndTag(); string jpnMessage = (j < langBanks[0].Messages.Count ? langBanks[0].Messages[j].Text : string.Empty); for (int k = 0; k < langBanks.Length; k++) { if (langBanks[k] == null) { continue; } string message = (j < langBanks[k].Messages.Count ? langBanks[k].Messages[j].Text : string.Empty); if (k != 0 && jpnMessage.Equals(message) || message.StartsWith("エラー" + Environment.NewLine)) { html.AddAttribute(HtmlTextWriterAttribute.Class, "message-desc-suspicious"); } else { html.AddAttribute(HtmlTextWriterAttribute.Class, "message-desc-text"); } html.RenderBeginTag(HtmlTextWriterTag.Td); { message = message.Replace(" ", " "); message = message.Replace("<", "<"); message = message.Replace(">", ">"); message = message.Replace(Environment.NewLine, "<br />"); message = message.Replace("[Highlight:On]", "<span style=\"color:#ff0000;\">"); message = message.Replace("[Highlight:Off]", "</span>"); int numSpanStart = CountSubstrings(message, "<span "); int numSpanEnd = CountSubstrings(message, "</span>"); if (numSpanStart > numSpanEnd) { message += "</span>"; } else if (numSpanEnd > numSpanStart) { message = "<span>" + message; } html.Write(message); } html.RenderEndTag(); } for (int k = 0; k < langBanks.Length; k++) { if (langBanks[k] == null) { continue; } Message message = langBanks[k].Messages[j]; html.AddAttribute(HtmlTextWriterAttribute.Class, "message-desc-sim"); html.RenderBeginTag(HtmlTextWriterTag.Td); { string imgFile = string.Format("img\\{0}-{1}-{2}.png", i, j, k); string imgPath = Path.Combine(Path.GetDirectoryName(filename), imgFile); if (!Directory.Exists(Path.GetDirectoryName(imgPath))) { Directory.CreateDirectory(Path.GetDirectoryName(imgPath)); } Bitmap image = (k == 0 ? romPrimary.GetMessageImage(message) : romSecondary.GetMessageImage(message)); if (image == null) { continue; } image.Save(imgPath); html.AddAttribute(HtmlTextWriterAttribute.Src, imgFile.Replace('\\', '/')); html.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(imgFile)); html.RenderBeginTag(HtmlTextWriterTag.Img); html.RenderEndTag(); html.WriteBreak(); } html.RenderEndTag(); } } html.RenderEndTag(); } } html.RenderEndTag(); html.WriteBreak(); } } html.RenderEndTag(); } html.RenderEndTag(); } writer.Close(); }
private void Test() { if (Environment.MachineName != "NANAMI-X") { return; } if (false) { for (int i = 0; i < primaryRom.MessageStyles.Length; i++) { primaryRom.MessageStyles[i].StyleImage?.Save(@"E:\temp\mmz\" + i.ToString() + ".png"); } primaryRom.FontImage?.Save(@"E:\temp\mmz\font.png"); primaryRom.FontImageHighlighted?.Save(@"E:\temp\mmz\font-hilight.png"); primaryRom.GetMessageImage(primaryRom.MessageBanks[0].Messages[13], 0)?.Save(@"E:\temp\mmz\TEST.png"); System.Threading.Thread.CurrentThread.Abort(); } if (false) { string tmpxx = "ぁあぃいぅうぇえぉおかがきぎくぐ" + "けげこごさざしじすずせぜそぞただ" + "ちぢっつづてでとどなにぬねのはば" + "ぱひびぴふぶぷへべぺほぼぽまみむ" + "めもゃやゅゆょよらりるれろゎわを" + "んァアィイゥウェエォオカガキギク" + "グケゲコゴサザシジスズセゼソゾタ" + "ダチヂッツヅテデトドナニヌネノハ" + "バパヒビピフブプヘベペホボポマミ" + "ムメモャヤュユョヨラリルレロヮワ" + "ヲンヴヵヶ"; tmpxx = "思気力人間機械本当年月日伝説私〇" + //1 "自由平和〇存〇不安聞言知成功失敗" + //2 "理想郷新古旧全滅他最近遠〇方敵助" + //3 "未来過去生死科学同点口目大〇感地" + //4 "終長動止〇右左上下時列車都市転送" + //5 "工場信破壊高〇多少防御攻撃真回路" + //6 "所在軍彼〇出入街声必鉄型廃砂漠爆" + //7 "発底塔〇前後〇守現会基誰士作品団" + //8 "事無神聖域脱主救世戦〇手捕実〇涙" + //9 "名〇〇四天王赤青〇〇頼者内外〇〇" + //A "強弱数使用悪〇何〇呼以再々〇‥英" + //B "雄見消〇度女行分部形話体倍巨侵活" + //C "続界永処仲中隊室心明情報収集利向" + //D "〇配〇闘〇〇〇今系 ★☆ “・Σ"; //E StringBuilder tmp = new StringBuilder(); for (int i = 0; i < tmpxx.Length; i++) { if ((i % 16) == 0) { tmp.AppendFormat(" /* 0x{0:X2} */ ", i + 0x10); } tmp.AppendFormat("'{0}'", tmpxx[i]); if (((i + 1) % 16) == 0) { tmp.Append("," + Environment.NewLine); } else if (i != tmpxx.Length - 1) { tmp.Append(", "); } } Clipboard.SetText(tmp.ToString()); } }