void WriteBackFontKF(KeepFont kf, RecycleAddress ra)
        {
            uint topaddress = FontForm.GetFontPointer(kf.IsItemFont);

            uint prevaddr;
            uint fontaddr = FontForm.FindFontData(topaddress, kf.MojiCode, out prevaddr, this.PriorityCode);

            if (fontaddr != U.NOT_FOUND)
            {//知ってるらしい
                return;
            }
            if (prevaddr == U.NOT_FOUND)
            {//追加不可能
                return;
            }

            byte[] newFontData = FontForm.MakeNewFontData(kf.MojiCode
                                                          , kf.Width
                                                          , kf.Data
                                                          , Program.ROM
                                                          , this.PriorityCode);

            U.write_u32(newFontData, 0, 0);   //NULL リストの末尾に追加するので.

            uint newaddr = ra.Write(newFontData, this.UndoData);

            if (newaddr == U.NOT_FOUND)
            {//エラー
                return;
            }

            //ひとつ前のフォントリストのポインタを、現在追加した最後尾にすげかえる.
            Program.ROM.write_u32(prevaddr + 0, U.toPointer(newaddr), this.UndoData);

            if (kf.rewitePointer != U.NOT_FOUND)
            {
                Program.ROM.write_u32(kf.rewitePointer, U.toPointer(newaddr), this.UndoData);
            }
        }
        void AddKeepFont(bool isItemFont, uint moji, uint rewitePointer = U.NOT_FOUND)
        {
            uint topaddress = FontForm.GetFontPointer(isItemFont);
            uint prevaddress;
            uint fontaddress = FontForm.FindFontData(topaddress
                                                     , moji
                                                     , out prevaddress
                                                     , PriorityCode);

            if (fontaddress == U.NOT_FOUND)
            {
                return;
            }
            KeepFont kf = new KeepFont();

            kf.IsItemFont    = isItemFont;
            kf.Moji          = "Code" + U.To0xHexString(moji);
            kf.MojiCode      = moji;
            kf.Width         = Program.ROM.u8(fontaddress + 5);
            kf.Data          = Program.ROM.getBinaryData(fontaddress + 8, 64);
            kf.rewitePointer = rewitePointer;
            KeepFontList.Add(kf);
        }
Exemplo n.º 3
0
        void FontImporterOne(string one, bool isItemFont)
        {
            uint moji = U.ConvertMojiCharToUnit(one, this.MyselfPriorityCode);

            if (moji < 0x20 || moji == 0x80)
            {//制御文字なので無視
                return;
            }

            uint topaddress_my;
            uint fontaddress_my;
            uint prevaddress_my;

            topaddress_my  = FontForm.GetFontPointer(isItemFont);
            fontaddress_my = FontForm.FindFontData(topaddress_my
                                                   , moji
                                                   , out prevaddress_my
                                                   , this.MyselfPriorityCode);
            if (fontaddress_my != U.NOT_FOUND)
            {//既存ROMに存在している
                return;
            }
            if (prevaddress_my == U.NOT_FOUND)
            {//このフォントはルールにより登録できない.日本語フォントで 0x100以下とか.
                return;
            }

            //既存ROMにはないフォント
            byte[] newFontData = null;
            if (this.YourROM != null)
            {//相手のROMにあるかどうか.
                uint your_moji = U.ConvertMojiCharToUnit(one, this.YourPriorityCode);
                if (your_moji < 0x20)
                {//制御文字なので無視
                    return;
                }

                //相手のROMにはあるかな?
                uint topaddress_your;
                uint fontaddress_your;
                uint prevaddress_your;

                topaddress_your  = FontForm.GetFontPointer(isItemFont, this.YourROM);
                fontaddress_your = FontForm.FindFontData(topaddress_your
                                                         , moji
                                                         , out prevaddress_your
                                                         , this.YourROM
                                                         , this.YourPriorityCode);
                if (fontaddress_your == U.NOT_FOUND)
                {//相手のROMにもない
                    newFontData = null;
                }
                else
                {
                    Log.Notify("Font Porting", one);

                    //fontデータの取得
                    newFontData = this.YourROM.getBinaryData(fontaddress_your, 8 * 64);

                    FontForm.TransportFontStruct(newFontData, moji, this.MyselfPriorityCode, this.YourPriorityCode);
                }
            }

            if (newFontData == null && //存在しないフォントで
                this.UseAutoGenFont != null    //自動生成する場合
                )
            {
                Log.Notify("Font Auto gen", one);

                //自動生成.
                int    font_width;
                Bitmap autogen = ImageUtil.AutoGenerateFont(one
                                                            , this.UseAutoGenFont
                                                            , isItemFont
                                                            , out font_width);
                if (autogen == null)
                {//ない
                    return;
                }
                byte[] fontimage = ImageUtil.Image4ToByte(autogen);

                newFontData = FontForm.MakeNewFontData(moji
                                                       , (uint)font_width
                                                       , fontimage
                                                       , Program.ROM
                                                       , this.MyselfPriorityCode);
            }

            if (newFontData == null)
            {//存在しない
                return;
            }

            U.write_u32(newFontData, 0, 0);   //NULL リストの末尾に追加するので.

            uint newaddr = InputFormRef.AppendBinaryData(newFontData, this.UndoData);

            if (newaddr == U.NOT_FOUND)
            {//エラー
                return;
            }

            //ひとつ前のフォントリストのポインタを、現在追加した最後尾にすげかえる.
            Program.ROM.write_u32(prevaddress_my + 0, U.toPointer(newaddr), this.UndoData);
        }
Exemplo n.º 4
0
        void AliasFontOne(string one_from, string one_to, bool isItemFont, bool isSquareFont)
        {
            uint moji_from = U.ConvertMojiCharToUnit(one_from, this.MyselfPriorityCode);

            if (moji_from < 0x20 || moji_from == 0x80)
            {//制御文字なので無視
                Debug.Assert(false);
                return;
            }
            uint moji_to = U.ConvertMojiCharToUnit(one_to, this.MyselfPriorityCode);

            if (moji_to < 0x20 || moji_to == 0x80)
            {//制御文字なので無視
                Debug.Assert(false);
                return;
            }

            uint topaddress;
            uint fontaddress_from;
            uint prevaddress_from;

            topaddress       = FontForm.GetFontPointer(isItemFont);
            fontaddress_from = FontForm.FindFontData(topaddress
                                                     , moji_from
                                                     , out prevaddress_from
                                                     , this.MyselfPriorityCode);
            if (fontaddress_from == U.NOT_FOUND)
            {
                Debug.Assert(false);
                return;
            }

            uint fontaddress_to;
            uint prevaddress_to;

            fontaddress_to = FontForm.FindFontData(topaddress
                                                   , moji_to
                                                   , out prevaddress_to
                                                   , this.MyselfPriorityCode);
            if (fontaddress_to == U.NOT_FOUND)
            {                           //ないならコピー
                byte[] bin = Program.ROM.getBinaryData(fontaddress_from, 72);
                U.write_u32(bin, 0, 0); //NULL リストの末尾に追加するので.

                uint moji2 = (moji_to & 0xff);
                U.write_u8(bin, 4, moji2);   //SJIS2バイト目

                uint newaddr = this.Recycle.Write(bin, this.UndoData);
                if (newaddr == U.NOT_FOUND)
                {
                    Debug.Assert(false);
                    return;
                }
                //ひとつ前のフォントリストのポインタを、現在追加した最後尾にすげかえる.
                Program.ROM.write_u32(prevaddress_to + 0, U.toPointer(newaddr), this.UndoData);
            }
            else
            {
                byte[] bin = Program.ROM.getBinaryData(fontaddress_from + 5, 72 - 5);
                Program.ROM.write_range(fontaddress_to + 5, bin, this.UndoData);
            }
        }
Exemplo n.º 5
0
        void AliasFontOne(string one_from, string one_to, bool isItemFont, bool isSquareFont)
        {
            uint moji_from = U.ConvertMojiCharToUnit(one_from, this.MyselfPriorityCode);

            if (moji_from < 0x20 || moji_from == 0x80)
            {//制御文字なので無視
                return;
            }
            uint moji_to = U.ConvertMojiCharToUnit(one_to, this.MyselfPriorityCode);

            if (moji_to < 0x20 || moji_to == 0x80)
            {//制御文字なので無視
                return;
            }

            uint topaddress;
            uint fontaddress_from;
            uint prevaddress_from;

            topaddress       = FontForm.GetFontPointer(isItemFont);
            fontaddress_from = FontForm.FindFontData(topaddress
                                                     , moji_from
                                                     , out prevaddress_from
                                                     , this.MyselfPriorityCode);
            if (fontaddress_from == U.NOT_FOUND)
            {
                return;
            }

            uint fontaddress_to;
            uint prevaddress_to;

            fontaddress_to = FontForm.FindFontData(topaddress
                                                   , moji_to
                                                   , out prevaddress_to
                                                   , this.MyselfPriorityCode);
            if (fontaddress_to == U.NOT_FOUND)
            {
                uint   font_width  = Program.ROM.u8(fontaddress_from + 5);
                byte[] fontimage   = Program.ROM.getBinaryData(fontaddress_from + 8, 72 - 8);
                byte[] newFontData = FontForm.MakeNewFontData(moji_to
                                                              , font_width
                                                              , fontimage
                                                              , Program.ROM
                                                              , this.MyselfPriorityCode);

                U.write_u32(newFontData, 0, 0);   //NULL リストの末尾に追加するので.

                uint newaddr = this.Recycle.Write(newFontData, this.UndoData);
                if (newaddr == U.NOT_FOUND)
                {//エラー
                    return;
                }
                //ひとつ前のフォントリストのポインタを、現在追加した最後尾にすげかえる.
                Program.ROM.write_u32(prevaddress_to + 0, U.toPointer(newaddr), this.UndoData);
            }
            else
            {
                byte[] bin = Program.ROM.getBinaryData(fontaddress_from + 5, 72 - 5);
                Program.ROM.write_range(fontaddress_to + 5, bin, this.UndoData);
            }
        }