Esempio n. 1
0
 public ZtrFileTextPacker(Stream output, ZtrFileEntry[] input, ZtrFileHeader header, FFXIIITextEncoding encoding)
 {
     _output = output;
     _input = input;
     _header = header;
     _encoding = encoding;
 }
Esempio n. 2
0
        public unsafe void Pack(ZtrFileHeader header)
        {
            int uncompressedSize = 0;

            int index = 0;
            byte[] writeBuff = new byte[4096];
            byte[] codeBuff = new byte[256];

            fixed (byte* writeBuffPtr = &writeBuff[0])
            fixed (byte* codeBuffPtr = &codeBuff[0])
            {
                for (int e = 0; e < _input.Length; e++)
                {
                    ZtrFileEntry entry = _input[e];
                    int count = Encoding.ASCII.GetBytes(entry.Key, 0, entry.Key.Length, codeBuff, 0);

                    for (int b = 0; b < count; b++)
                    {
                        writeBuffPtr[index++] = codeBuffPtr[b];
                        if (index == writeBuff.Length)
                            WriteBlock(writeBuff, ref index, ref uncompressedSize);
                    }
                }
            }

            if (index > 0)
                WriteBlock(writeBuff, ref index, ref uncompressedSize);

            header.KeysUnpackedSize = uncompressedSize;
        }
Esempio n. 3
0
        private ZtrFileEntry[] ExtractBigEndianCompressedDictionary()
        {
            ZtrFileHeader header = new ZtrFileHeader();
            header.ReadFromStream(_input);

            ZtrFileEntry[] result = new ZtrFileEntry[header.Count];
            result.InitializeElements();

            ZtrFileKeysUnpacker keysUnpacker = new ZtrFileKeysUnpacker(_input, result);
            keysUnpacker.Unpack(header.KeysUnpackedSize);

            ZtrFileTextUnpacker textUnpacker = new ZtrFileTextUnpacker(_input, result, header.TextLinesTable, _encoding);
            textUnpacker.Unpack(header.TextBlockTable[header.TextBlockTable.Length - 1]);

            return result;
        }
Esempio n. 4
0
        private ZtrFileEntry[] ExtractBigEndianCompressedDictionary()
        {
            ZtrFileHeader header = new ZtrFileHeader();

            header.ReadFromStream(_input);

            ZtrFileEntry[] result = new ZtrFileEntry[header.Count];
            result.InitializeElements();

            ZtrFileKeysUnpacker keysUnpacker = new ZtrFileKeysUnpacker(_input, result);

            keysUnpacker.Unpack(header.KeysUnpackedSize);

            ZtrFileTextUnpacker textUnpacker = new ZtrFileTextUnpacker(_input, result, header.TextLinesTable, _encoding);

            textUnpacker.Unpack(header.TextBlockTable[header.TextBlockTable.Length - 1]);

            return(result);
        }
Esempio n. 5
0
        private void PackBigEndianCompressedDictionary(ZtrFileEntry[] entries)
        {
            _bw.Write((int)ZtrFileType.BigEndianCompressedDictionary);

            ZtrFileHeader header = new ZtrFileHeader
            {
                Version = 1,
                Count   = entries.Length
            };

            using (MemoryStream ms = new MemoryStream(32 * 1024))
            {
                ZtrFileKeysPacker keyPacker = new ZtrFileKeysPacker(ms, entries);
                keyPacker.Pack(header);

                ZtrFileTextPacker textPacker = new ZtrFileTextPacker(ms, entries, _encoding);
                textPacker.Pack(header);

                header.WriteToStream(_output);
                ms.Position = 0;
                ms.CopyTo(_output);
            }
        }
Esempio n. 6
0
        private void PackBigEndianCompressedDictionary(ZtrFileEntry[] entries)
        {
            if (entries.Length > 0)
                throw new NotImplementedException();

            _bw.Write((int)ZtrFileType.BigEndianCompressedDictionary);

            ZtrFileHeader header = new ZtrFileHeader();
            header.Version = 1;
            header.Count = entries.Length;

            using (MemoryStream ms = new MemoryStream(32 * 1024))
            {
                ZtrFileKeysPacker keyPacker = new ZtrFileKeysPacker(ms, entries);
                keyPacker.Pack(header);

                ZtrFileTextPacker textPacker = new ZtrFileTextPacker(ms, entries, header, _encoding);
                textPacker.Pack();
            }

            long headerPosition = _output.Position;

            //_output.Seek(entries.Length * 8)
        }
Esempio n. 7
0
        public unsafe void Pack(ZtrFileHeader header)
        {
            int uncompressedSize = 0;

            ushort index = 0;

            byte[] writeBuff = new byte[4096];
            byte[] codeBuff  = new byte[256];

            fixed(byte *writeBuffPtr = &writeBuff[0])
            fixed(byte *codeBuffPtr = &codeBuff[0])
            {
                for (int e = 0; e < _input.Length; e++)
                {
                    ZtrFileEntry entry = _input[e];
                    int          count = Encoding.ASCII.GetBytes(entry.Key, 0, entry.Key.Length, codeBuff, 0);
                    codeBuff[count++] = 0;

                    for (int b = 0; b < count; b++)
                    {
                        writeBuffPtr[index++] = codeBuffPtr[b];
                        if (index == writeBuff.Length)
                        {
                            WriteBlock(writeBuff, ref index, ref uncompressedSize);
                        }
                    }
                }
            }

            if (index > 0)
            {
                WriteBlock(writeBuff, ref index, ref uncompressedSize);
            }

            header.KeysUnpackedSize = uncompressedSize;
        }
Esempio n. 8
0
        public unsafe void Pack(ZtrFileHeader header)
        {
            _blockOffset = 0;
            _blockNumber = 0;
            _innerIndex  = 0;
            _innerCount  = 0;

            List <int> blockOffsets = new List <int>(256)
            {
                0
            };

            ZtrFileHeaderLineInfo[] lines = new ZtrFileHeaderLineInfo[_input.Length];
            ushort[,] innerOffsets = new ushort[_input.Length, 2];

            ushort writeIndex = 0;

            byte[] writeBuff = new byte[4096];
            byte[] codeBuff  = new byte[64 * 1024];

            fixed(byte *writeBuffPtr = &writeBuff[0])
            fixed(byte *codeBuffPtr = &codeBuff[0])
            {
                for (int e = 0; e < _input.Length; e++)
                {
                    _innerCount++;
                    innerOffsets[e, 0] = writeIndex;

                    ZtrFileEntry entry = _input[e];
                    int          count = _encoding.GetBytes(entry.Value, 0, entry.Value.Length, codeBuff, 0);
                    codeBuff[count++] = 0;
                    codeBuff[count++] = 0;

                    lines[e] = new ZtrFileHeaderLineInfo
                    {
                        Block       = _blockNumber,
                        BlockOffset = 0 // See below: lines[i].BlockOffset = checked ((byte)innerOffsets[i, 1]);
                    };

                    for (int b = 0; b < count; b++)
                    {
                        writeBuffPtr[writeIndex++] = codeBuffPtr[b];
                        if (writeIndex == writeBuff.Length)
                        {
                            WriteBlock(writeBuff, ref writeIndex, innerOffsets, blockOffsets);
                        }
                    }
                }
            }

            if (writeIndex > 0)
            {
                WriteBlock(writeBuff, ref writeIndex, innerOffsets, blockOffsets);
            }

            for (int i = 0; i < innerOffsets.Length / 2; i++)
            {
                lines[i].PackedOffset = innerOffsets[i, 0];
                lines[i].BlockOffset  = checked ((byte)innerOffsets[i, 1]);
            }

            if (blockOffsets.Count > _blockNumber)
            {
                _blockNumber++;
            }

            header.TextBlocksCount = _blockNumber;
            header.TextBlockTable  = blockOffsets.ToArray();
            header.TextLinesTable  = lines;
        }