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 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); }
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); } }