コード例 #1
0
        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;
                }
            }
        }
コード例 #2
0
ファイル: ctrlTextHooker.cs プロジェクト: doragasu/Mesen
        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);
            }
        }