public void RefreshViewer() { using (Graphics gNametable = Graphics.FromImage(_nametableImage)) { for (int i = 0; i < 4; i++) { GCHandle handle = GCHandle.Alloc(_nametablePixelData[i], GCHandleType.Pinned); Bitmap source = new Bitmap(256, 240, 4 * 256, PixelFormat.Format32bppPArgb, handle.AddrOfPinnedObject()); try { gNametable.DrawImage(source, new Rectangle(i % 2 == 0 ? 0 : 256, i <= 1 ? 0 : 240, 256, 240), new Rectangle(0, 0, 256, 240), GraphicsUnit.Pixel); } finally { handle.Free(); } } } using (Graphics g = Graphics.FromImage(_outputImage)) { if (chkUseScrollOffsets.Checked) { g.DrawImage(_nametableImage, -_xScroll, -_yScroll); g.DrawImage(_nametableImage, -_xScroll + 512, -_yScroll + 480); g.DrawImage(_nametableImage, -_xScroll + 512, -_yScroll); g.DrawImage(_nametableImage, -_xScroll, -_yScroll + 480); } else { g.DrawImage(_nametableImage, 0, 0); } } picNametable.Image = _outputImage; StringBuilder output = new StringBuilder(); DakutenType[] previousLineDakutenType = new DakutenType[32]; for (int nt = 0; nt < 4; nt++) { for (int y = 0; y < 30; y++) { StringBuilder lineOutput = new StringBuilder(); for (int x = 0; x < 32; x++) { string value = GetCharacter(nt, y, x); DakutenType dakutenType = GetDakutenType(value); if (dakutenType == DakutenType.None) { bool isKana = ( (value[0] >= '\x3041' && value[0] <= '\x3096') || //hiragana (value[0] >= '\x30A1' && value[0] <= '\x30FA') //katakana ); DakutenType effectiveDakuten = DakutenType.None; if (previousLineDakutenType[x] != DakutenType.None) { effectiveDakuten = previousLineDakutenType[x]; } else if (isKana) { effectiveDakuten = GetDakutenType(GetCharacter(nt, y, x + 1)); if (effectiveDakuten != DakutenType.None && x < 31) { //Skip next character, to avoid using it for the line below previousLineDakutenType[x + 1] = DakutenType.None; x++; } } if (isKana && effectiveDakuten == DakutenType.Dakuten) { lineOutput.Append((char)(value[0] + 1)); } else if (isKana && effectiveDakuten == DakutenType.Handakuten) { lineOutput.Append((char)(value[0] + 2)); } else { lineOutput.Append(value); } } previousLineDakutenType[x] = dakutenType; } string rowString = lineOutput.ToString().Trim(); if (rowString.Length > 0) { output.AppendLine(rowString); } } } string newText = output.ToString(); if (newText != _prevText) { txtSelectedText.Text = newText; if (chkAutoCopyToClipboard.Checked && !string.IsNullOrWhiteSpace(newText)) { try { Clipboard.SetText(newText); _prevText = newText; } catch { //This can sometime fail if another program is trying to use the clipboard at the same time } } else { _prevText = newText; } } }
public void RefreshViewer() { using (Graphics gNametable = Graphics.FromImage(_nametableImage)) { for (int i = 0; i < 4; i++) { GCHandle handle = GCHandle.Alloc(_nametablePixelData[i], GCHandleType.Pinned); Bitmap source = new Bitmap(256, 240, 4 * 256, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); try { gNametable.DrawImage(source, new Rectangle(i % 2 == 0 ? 0 : 256, i <= 1 ? 0 : 240, 256, 240), new Rectangle(0, 0, 256, 240), GraphicsUnit.Pixel); } finally { handle.Free(); } } } using (Graphics g = Graphics.FromImage(_outputImage)) { if (chkUseScrollOffsets.Checked) { g.DrawImage(_nametableImage, -_xScroll, -_yScroll); g.DrawImage(_nametableImage, -_xScroll + 512, -_yScroll + 480); g.DrawImage(_nametableImage, -_xScroll + 512, -_yScroll); g.DrawImage(_nametableImage, -_xScroll, -_yScroll + 480); } else { g.DrawImage(_nametableImage, 0, 0); } } picNametable.Image = _outputImage; DakutenMode dakutenMode = cboDakutenMode.GetEnumValue <DakutenMode>(); StringBuilder output = new StringBuilder(); DakutenType[] previousLineDakutenType = new DakutenType[32]; for (int nt = 0; nt < 4; nt++) { for (int y = 0; y < 30; y++) { StringBuilder lineOutput = new StringBuilder(); for (int x = 0; x < 32; x++) { int outNt, outY, outX; GetIndexes(nt, y, x, out outNt, out outY, out outX); if (IgnoreTile(outNt)) { continue; } string key = GetTileKey(outNt, (outY << 5) + outX); string value = GetMappedCharacter(key); DakutenType dakutenType = GetDakutenType(value); if (dakutenType != DakutenType.None) { previousLineDakutenType[x] = dakutenType; } else { DakutenType effectiveDakuten = dakutenMode == DakutenMode.OnTop ? previousLineDakutenType[x] : DakutenType.None; previousLineDakutenType[x] = DakutenType.None; if (effectiveDakuten == DakutenType.None && dakutenMode == DakutenMode.OnTheRight) { GetIndexes(nt, y, x + 1, out outNt, out outY, out outX); string nextTileKey = GetTileKey(outNt, (outY << 5) + outX); string nextTileValue = GetMappedCharacter(nextTileKey); effectiveDakuten = GetDakutenType(nextTileValue); } bool isKana = ( (value[0] >= '\x3041' && value[0] <= '\x3096') || //hiragana (value[0] >= '\x30A1' && value[0] <= '\x30FA') //katakana ); if (isKana && effectiveDakuten == DakutenType.Dakuten) { lineOutput.Append((char)(value[0] + 1)); } else if (isKana && effectiveDakuten == DakutenType.Handakuten) { lineOutput.Append((char)(value[0] + 2)); } else { lineOutput.Append(value); } } } string rowString = lineOutput.ToString().Trim(); if (rowString.Length > 0) { output.AppendLine(rowString); } } } txtSelectedText.Text = output.ToString(); if (chkAutoCopyToClipboard.Checked) { Clipboard.SetText(txtSelectedText.Text); } }