public void RebuildHuffmanMap() { this.huffman_map = new Dictionary <uint, huffman_value_st>(); uint tree_data_base = Program.ROM.p32p(Program.ROM.RomInfo.mask_point_base_pointer()); this.tree_base = Program.ROM.p32(Program.ROM.RomInfo.mask_pointer()); make_huffman_map(tree_data_base, 1); if (!this.huffman_map.ContainsKey(0)) {//終端文字列が辞書に存在しない. throw new FETextDecode.FETextException(R._("text decoder table broken 0x{0}.this is broken rom.", U.ToHexString(tree_base))); } //EOF huffman_value_st huffman_value = this.huffman_map[0]; if (Program.ROM.RomInfo.is_multibyte()) { if (huffman_value.bitcount < 8) { huffman_value.bitcount = 8; this.huffman_map[0] = huffman_value; } } else { if (huffman_value.bitcount < 7) { huffman_value.bitcount = 7; this.huffman_map[0] = huffman_value; } } }
void make_huffman_map(uint tree_data, uint bit_deps) { if (!U.isSafetyOffset(this.tree_base)) { this.huffman_map[0] = new huffman_value_st(); R.Error("make_huffman_map: Can not Load tree_base:{0}", U.ToHexString(this.tree_base)); Debug.Assert(false); return; } if (!U.isSafetyOffset(tree_data)) { this.huffman_map[0] = new huffman_value_st(); R.Error("make_huffman_map: Can not Load tree_data:{0}", U.ToHexString(tree_data)); Debug.Assert(false); return; } for (uint i = 0; i < 2; i++) { uint tree_ = (uint)Program.ROM.u16(tree_data + (i * 2)); uint tree_next_data = this.tree_base + (tree_ * 4); uint bit = (bit_deps << 1) + i; uint src_data = Program.ROM.u32(tree_next_data); if ((src_data & 0x80000000) > 0) { uint code = src_data & 0xFFFF; byte bitcount = (byte)countBitMinus1(bit); huffman_value_st huffman_value = new huffman_value_st(); huffman_value.bit = revBit(bit, (int)bitcount); huffman_value.bitcount = bitcount; this.huffman_map[code] = huffman_value; } else { make_huffman_map(tree_next_data, bit); } } }