Exemplo n.º 1
0
        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;
                }
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }