mirror of
https://github.com/mangosfour/server.git
synced 2025-12-23 16:37:03 +00:00
1120 lines
42 KiB
C++
1120 lines
42 KiB
C++
/*****************************************************************************/
|
|
/* huffman.cpp Copyright (c) Ladislav Zezula 1998-2003 */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* This module contains Huffmann (de)compression methods */
|
|
/* */
|
|
/* Authors : Ladislav Zezula (ladik@zezula.net) */
|
|
/* ShadowFlare (BlakFlare@hotmail.com) */
|
|
/* */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Date Ver Who Comment */
|
|
/* -------- ---- --- ------- */
|
|
/* xx.xx.xx 1.00 Lad The first version of dcmp.cpp */
|
|
/* 03.05.03 1.00 Lad Added compression methods */
|
|
/* 19.11.03 1.01 Dan Big endian handling */
|
|
/* 08.12.03 2.01 Dan High-memory handling (> 0x80000000) */
|
|
/*****************************************************************************/
|
|
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
#include "huff.h"
|
|
|
|
THTreeItem * gcpFirst, * gpFirst, * gcpItem3054, * gpItem3054;
|
|
|
|
#define PTR_VALID(ptr) ((ptr) != gcpFirst && (ptr) != gcpItem3054)
|
|
#define PTR_INVALID(ptr) (!PTR_VALID(ptr))
|
|
#define PTR_INVALID_OR_NULL(ptr) (0 == (ptr) || PTR_INVALID(ptr))
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Methods of the THTreeItem struct
|
|
|
|
// 1501DB70
|
|
THTreeItem * THTreeItem::Call1501DB70(THTreeItem * pLast)
|
|
{
|
|
if(pLast == NULL)
|
|
pLast = this + 1;
|
|
return pLast;
|
|
}
|
|
|
|
// Gets previous Huffman tree item (?)
|
|
THTreeItem * THTreeItem::GetPrevItem(SIntPtr value)
|
|
{
|
|
if(PTR_INVALID(prev))
|
|
return PTR_NOT(prev);
|
|
|
|
if(value == -1 || PTR_INVALID((THTreeItem *) value))
|
|
value = (SIntPtr)(this - next->prev);
|
|
return prev + value;
|
|
}
|
|
|
|
// 1500F5E0
|
|
void THTreeItem::ClearItemLinks()
|
|
{
|
|
next = prev = NULL;
|
|
}
|
|
|
|
// 1500BC90
|
|
void THTreeItem::RemoveItem()
|
|
{
|
|
THTreeItem * pTemp; // EDX
|
|
|
|
if(next != NULL)
|
|
{
|
|
pTemp = prev;
|
|
|
|
if(PTR_INVALID(pTemp))
|
|
pTemp = PTR_NOT(pTemp);
|
|
else
|
|
pTemp += (this - next->prev);
|
|
|
|
pTemp->next = next;
|
|
next->prev = prev;
|
|
next = prev = NULL;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// TOutputStream functions
|
|
|
|
void TOutputStream::PutBits(unsigned long dwBuff, unsigned int nPutBits)
|
|
{
|
|
dwBitBuff |= (dwBuff << nBits);
|
|
nBits += nPutBits;
|
|
|
|
// Flush completed bytes
|
|
while(nBits >= 8)
|
|
{
|
|
if(cbOutSize != 0)
|
|
{
|
|
*pbOutPos++ = (unsigned char)dwBitBuff;
|
|
cbOutSize--;
|
|
}
|
|
|
|
dwBitBuff >>= 8;
|
|
nBits -= 8;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// TInputStream functions
|
|
|
|
// Gets one bit from input stream
|
|
unsigned long TInputStream::GetBit()
|
|
{
|
|
unsigned long dwOneBit = 0;
|
|
|
|
// Ensure that the input stream is reloaded, if there are no bits left
|
|
if(BitCount == 0)
|
|
{
|
|
// Refill the bit buffer
|
|
BitBuffer = *pbInBuffer++;
|
|
BitCount = 8;
|
|
}
|
|
|
|
// Copy the bit from bit buffer to the variable
|
|
dwOneBit = (BitBuffer & 0x01);
|
|
BitBuffer >>= 1;
|
|
BitCount--;
|
|
|
|
return dwOneBit;
|
|
}
|
|
|
|
// Gets 7 bits from the stream. DOES NOT remove the bits from input stream
|
|
unsigned long TInputStream::Get7Bits()
|
|
{
|
|
unsigned long dwReloadByte = 0;
|
|
|
|
// If there is not enough bits to get the value,
|
|
// we have to add 8 more bits from the input buffer
|
|
if(BitCount < 7)
|
|
{
|
|
dwReloadByte = *pbInBuffer++;
|
|
BitBuffer |= dwReloadByte << BitCount;
|
|
BitCount += 8;
|
|
}
|
|
|
|
// Return the first available 7 bits. DO NOT remove them from the input stream
|
|
return (BitBuffer & 0x7F);
|
|
}
|
|
|
|
// Gets the whole byte from the input stream.
|
|
unsigned long TInputStream::Get8Bits()
|
|
{
|
|
unsigned long dwReloadByte = 0;
|
|
unsigned long dwOneByte = 0;
|
|
|
|
// If there is not enough bits to get the value,
|
|
// we have to add 8 more bits from the input buffer
|
|
if(BitCount < 8)
|
|
{
|
|
dwReloadByte = *pbInBuffer++;
|
|
BitBuffer |= dwReloadByte << BitCount;
|
|
BitCount += 8;
|
|
}
|
|
|
|
// Return the lowest 8 its
|
|
dwOneByte = (BitBuffer & 0xFF);
|
|
BitBuffer >>= 8;
|
|
BitCount -= 8;
|
|
return dwOneByte;
|
|
}
|
|
|
|
void TInputStream::SkipBits(unsigned int dwBitsToSkip)
|
|
{
|
|
unsigned long dwReloadByte = 0;
|
|
|
|
// If there is not enough bits in the buffer,
|
|
// we have to add 8 more bits from the input buffer
|
|
if(BitCount < dwBitsToSkip)
|
|
{
|
|
dwReloadByte = *pbInBuffer++;
|
|
BitBuffer |= dwReloadByte << BitCount;
|
|
BitCount += 8;
|
|
}
|
|
|
|
// Skip the remaining bits
|
|
BitBuffer >>= dwBitsToSkip;
|
|
BitCount -= dwBitsToSkip;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Functions for huffmann tree items
|
|
|
|
// Inserts item into the tree (?)
|
|
static void InsertItem(THTreeItem ** itemPtr, THTreeItem * item, unsigned long where, THTreeItem * item2)
|
|
{
|
|
THTreeItem * next = item->next; // EDI - next to the first item
|
|
THTreeItem * prev = item->prev; // ESI - prev to the first item
|
|
THTreeItem * prev2; // Pointer to previous item
|
|
THTreeItem * next2; // Pointer to the next item
|
|
|
|
// The same code like in RemoveItem(item);
|
|
if(next != 0) // If the first item already has next one
|
|
{
|
|
if(PTR_INVALID(prev))
|
|
prev = PTR_NOT(prev);
|
|
else
|
|
prev += (item - next->prev);
|
|
|
|
// 150083C1
|
|
// Remove the item from the tree
|
|
prev->next = next;
|
|
next->prev = prev;
|
|
|
|
// Invalidate 'prev' and 'next' pointer
|
|
item->next = 0;
|
|
item->prev = 0;
|
|
}
|
|
|
|
if(item2 == NULL) // EDX - If the second item is not entered,
|
|
item2 = PTR_PTR(&itemPtr[1]); // take the first tree item
|
|
|
|
switch(where)
|
|
{
|
|
case SWITCH_ITEMS : // Switch the two items
|
|
item->next = item2->next; // item2->next (Pointer to pointer to first)
|
|
item->prev = item2->next->prev;
|
|
item2->next->prev = item;
|
|
item2->next = item; // Set the first item
|
|
return;
|
|
|
|
case INSERT_ITEM: // Insert as the last item
|
|
item->next = item2; // Set next item (or pointer to pointer to first item)
|
|
item->prev = item2->prev; // Set prev item (or last item in the tree)
|
|
|
|
next2 = itemPtr[0];// Usually NULL
|
|
prev2 = item2->prev; // Prev item to the second (or last tree item)
|
|
|
|
if(PTR_INVALID(prev2))
|
|
{
|
|
prev2 = PTR_NOT(prev);
|
|
|
|
prev2->next = item;
|
|
item2->prev = item; // Next after last item
|
|
return;
|
|
}
|
|
|
|
if(PTR_INVALID(next2))
|
|
next2 = (THTreeItem *)(item2 - item2->next->prev);
|
|
|
|
prev2 += (long) next2;
|
|
prev2->next = item;
|
|
item2->prev = item; // Set the next/last item
|
|
return;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// THuffmannTree class functions
|
|
|
|
THuffmannTree::THuffmannTree()
|
|
{
|
|
}
|
|
|
|
void THuffmannTree::InitTree(bool bCompression)
|
|
{
|
|
THTreeItem * pItem;
|
|
unsigned int nCount;
|
|
|
|
// Clear links for all the items in the tree
|
|
for(pItem = items0008, nCount = 0x203; nCount != 0; pItem++, nCount--)
|
|
pItem->ClearItemLinks();
|
|
|
|
gcpItem3054 = (THTreeItem *) &gcpItem3054;
|
|
pItem3050 = NULL;
|
|
pItem3054 = PTR_PTR(&pItem3054);
|
|
pItem3058 = gcpItem3054;
|
|
gpItem3054 = pItem3054;
|
|
|
|
gcpFirst = (THTreeItem *) &gcpFirst;
|
|
pItem305C = NULL;
|
|
pFirst = PTR_PTR(&pFirst);
|
|
pLast = gcpFirst;
|
|
gpFirst = pFirst;
|
|
|
|
offs0004 = 1;
|
|
nItems = 0;
|
|
|
|
// Clear all TQDecompress items. Do this only if preparing for decompression
|
|
if(bCompression == false)
|
|
{
|
|
for(nCount = 0; nCount < sizeof(qd3474) / sizeof(TQDecompress); nCount++)
|
|
qd3474[nCount].offs00 = 0;
|
|
}
|
|
}
|
|
|
|
// Builds Huffman tree. Called with the first 8 bits loaded from input stream
|
|
void THuffmannTree::BuildTree(unsigned int nCmpType)
|
|
{
|
|
unsigned long maxByte; // [ESP+10] - The greatest character found in table
|
|
THTreeItem ** itemPtr; // [ESP+14] - Pointer to Huffman tree item pointer array
|
|
unsigned char * byteArray; // [ESP+1C] - Pointer to unsigned char in Table1502A630
|
|
THTreeItem * child1;
|
|
unsigned long i; // egcs in linux doesn't like multiple for loops without an explicit i
|
|
|
|
// Loop while pointer has a valid value
|
|
while(PTR_VALID(pLast)) // ESI - Last entry
|
|
{
|
|
THTreeItem * temp; // EAX
|
|
|
|
if(pLast->next != NULL) // ESI->next
|
|
pLast->RemoveItem();
|
|
// EDI = &offs3054
|
|
pItem3058 = PTR_PTR(&pItem3054); // [EDI+4]
|
|
pLast->prev = pItem3058; // EAX
|
|
|
|
temp = PTR_PTR(&pItem3054)->GetPrevItem((SIntPtr)(&pItem3050));
|
|
|
|
temp->next = pLast;
|
|
pItem3054 = pLast;
|
|
}
|
|
|
|
// Clear all pointers in HTree item array
|
|
memset(items306C, 0, sizeof(items306C));
|
|
|
|
maxByte = 0; // Greatest character found init to zero.
|
|
itemPtr = (THTreeItem **)&items306C; // Pointer to current entry in HTree item pointer array
|
|
|
|
// Ensure we have low 8 bits only
|
|
nCmpType &= 0xFF;
|
|
byteArray = Table1502A630 + nCmpType * 258; // EDI also
|
|
|
|
for(i = 0; i < 0x100; i++, itemPtr++)
|
|
{
|
|
THTreeItem * item = pItem3058; // Item to be created
|
|
THTreeItem * pItem3 = pItem3058;
|
|
unsigned char oneByte = byteArray[i];
|
|
|
|
// Skip all the bytes which are zero.
|
|
if(byteArray[i] == 0)
|
|
continue;
|
|
|
|
// If not valid pointer, take the first available item in the array
|
|
if(PTR_INVALID_OR_NULL(item))
|
|
item = &items0008[nItems++];
|
|
|
|
// Insert this item as the top of the tree
|
|
InsertItem(&pItem305C, item, SWITCH_ITEMS, NULL);
|
|
|
|
item->parent = NULL; // Invalidate child and parent
|
|
item->child = NULL;
|
|
*itemPtr = item; // Store pointer into pointer array
|
|
|
|
item->dcmpByte = i; // Store counter
|
|
item->byteValue = oneByte; // Store byte value
|
|
if(oneByte >= maxByte)
|
|
{
|
|
maxByte = oneByte;
|
|
continue;
|
|
}
|
|
|
|
// Find the first item which has byte value greater than current one byte
|
|
if(PTR_VALID(pItem3 = pLast)) // EDI - Pointer to the last item
|
|
{
|
|
// 15006AF7
|
|
if(pItem3 != NULL)
|
|
{
|
|
do // 15006AFB
|
|
{
|
|
if(pItem3->byteValue >= oneByte)
|
|
goto _15006B09;
|
|
pItem3 = pItem3->prev;
|
|
}
|
|
while(PTR_VALID(pItem3));
|
|
}
|
|
}
|
|
pItem3 = NULL;
|
|
|
|
// 15006B09
|
|
_15006B09:
|
|
if(item->next != NULL)
|
|
item->RemoveItem();
|
|
|
|
// 15006B15
|
|
if(pItem3 == NULL)
|
|
pItem3 = PTR_PTR(&pFirst);
|
|
|
|
// 15006B1F
|
|
item->next = pItem3->next;
|
|
item->prev = pItem3->next->prev;
|
|
pItem3->next->prev = item;
|
|
pItem3->next = item;
|
|
}
|
|
|
|
// 15006B4A
|
|
for(; i < 0x102; i++)
|
|
{
|
|
THTreeItem ** itemPtr = &items306C[i]; // EDI
|
|
|
|
// 15006B59
|
|
THTreeItem * item = pItem3058; // ESI
|
|
if(PTR_INVALID_OR_NULL(item))
|
|
item = &items0008[nItems++];
|
|
|
|
InsertItem(&pItem305C, item, INSERT_ITEM, NULL);
|
|
|
|
// 15006B89
|
|
item->dcmpByte = i;
|
|
item->byteValue = 1;
|
|
item->parent = NULL;
|
|
item->child = NULL;
|
|
*itemPtr++ = item;
|
|
}
|
|
|
|
// 15006BAA
|
|
if(PTR_VALID(child1 = pLast)) // EDI - last item (first child to item
|
|
{
|
|
THTreeItem * child2; // EBP
|
|
THTreeItem * item; // ESI
|
|
|
|
// 15006BB8
|
|
while(PTR_VALID(child2 = child1->prev))
|
|
{
|
|
if(PTR_INVALID_OR_NULL(item = pItem3058))
|
|
item = &items0008[nItems++];
|
|
|
|
// 15006BE3
|
|
InsertItem(&pItem305C, item, SWITCH_ITEMS, NULL);
|
|
|
|
// 15006BF3
|
|
item->parent = NULL;
|
|
item->child = NULL;
|
|
|
|
//EDX = child2->byteValue + child1->byteValue;
|
|
//EAX = child1->byteValue;
|
|
//ECX = maxByte; // The greatest character (0xFF usually)
|
|
|
|
item->byteValue = child1->byteValue + child2->byteValue; // 0x02
|
|
item->child = child1; // Prev item in the
|
|
child1->parent = item;
|
|
child2->parent = item;
|
|
|
|
// EAX = item->byteValue;
|
|
if(item->byteValue >= maxByte)
|
|
maxByte = item->byteValue;
|
|
else
|
|
{
|
|
THTreeItem * pItem2 = child2->prev; // EDI
|
|
|
|
// 15006C2D
|
|
while(PTR_VALID(pItem2))
|
|
{
|
|
if(pItem2->byteValue >= item->byteValue)
|
|
goto _15006C3B;
|
|
pItem2 = pItem2->prev;
|
|
}
|
|
pItem2 = NULL;
|
|
|
|
_15006C3B:
|
|
if(item->next != 0)
|
|
{
|
|
THTreeItem * temp4 = item->GetPrevItem(-1);
|
|
|
|
temp4->next = item->next; // The first item changed
|
|
item->next->prev = item->prev; // First->prev changed to negative value
|
|
item->next = NULL;
|
|
item->prev = NULL;
|
|
}
|
|
|
|
// 15006C62
|
|
if(pItem2 == NULL)
|
|
pItem2 = PTR_PTR(&pFirst);
|
|
|
|
item->next = pItem2->next; // Set item with 0x100 byte value
|
|
item->prev = pItem2->next->prev; // Set item with 0x17 byte value
|
|
pItem2->next->prev = item; // Changed prev of item with
|
|
pItem2->next = item;
|
|
}
|
|
|
|
// 15006C7B
|
|
if(PTR_INVALID_OR_NULL(child1 = child2->prev))
|
|
break;
|
|
}
|
|
}
|
|
// 15006C88
|
|
offs0004 = 1;
|
|
}
|
|
|
|
THTreeItem * THuffmannTree::Call1500E740(unsigned int nValue)
|
|
{
|
|
THTreeItem * pItem1 = pItem3058; // EDX
|
|
THTreeItem * pItem2; // EAX
|
|
THTreeItem * pNext;
|
|
THTreeItem * pPrev;
|
|
THTreeItem ** ppItem;
|
|
|
|
if(PTR_INVALID_OR_NULL(pItem1) || (pItem2 = pItem1) == NULL)
|
|
{
|
|
if((pItem2 = &items0008[nItems++]) != NULL)
|
|
pItem1 = pItem2;
|
|
else
|
|
pItem1 = pFirst;
|
|
}
|
|
else
|
|
pItem1 = pItem2;
|
|
|
|
pNext = pItem1->next;
|
|
if(pNext != NULL)
|
|
{
|
|
pPrev = pItem1->prev;
|
|
if(PTR_INVALID(pPrev))
|
|
pPrev = PTR_NOT(pPrev);
|
|
else
|
|
pPrev += (pItem1 - pItem1->next->prev);
|
|
|
|
pPrev->next = pNext;
|
|
pNext->prev = pPrev;
|
|
pItem1->next = NULL;
|
|
pItem1->prev = NULL;
|
|
}
|
|
|
|
ppItem = &pFirst; // esi
|
|
if(nValue > 1)
|
|
{
|
|
// ecx = pFirst->next;
|
|
pItem1->next = *ppItem;
|
|
pItem1->prev = (*ppItem)->prev;
|
|
|
|
(*ppItem)->prev = pItem2;
|
|
*ppItem = pItem1;
|
|
|
|
pItem2->parent = NULL;
|
|
pItem2->child = NULL;
|
|
}
|
|
else
|
|
{
|
|
pItem1->next = (THTreeItem *)ppItem;
|
|
pItem1->prev = ppItem[1];
|
|
// edi = pItem305C;
|
|
pPrev = ppItem[1]; // ecx
|
|
if(PTR_INVALID(pPrev))
|
|
{
|
|
pPrev = PTR_NOT(pPrev);
|
|
pPrev->next = pItem1;
|
|
pPrev->prev = pItem2;
|
|
|
|
pItem2->parent = NULL;
|
|
pItem2->child = NULL;
|
|
}
|
|
else
|
|
{
|
|
if(PTR_INVALID(pItem305C))
|
|
pPrev += (THTreeItem *)ppItem - (*ppItem)->prev;
|
|
else
|
|
pPrev += (long)pItem305C;
|
|
|
|
pPrev->next = pItem1;
|
|
ppItem[1] = pItem2;
|
|
pItem2->parent = NULL;
|
|
pItem2->child = NULL;
|
|
}
|
|
}
|
|
return pItem2;
|
|
}
|
|
|
|
void THuffmannTree::Call1500E820(THTreeItem * pItem)
|
|
{
|
|
THTreeItem * pItem1; // edi
|
|
THTreeItem * pItem2 = NULL; // eax
|
|
THTreeItem * pItem3; // edx
|
|
THTreeItem * pPrev; // ebx
|
|
|
|
for(; pItem != NULL; pItem = pItem->parent)
|
|
{
|
|
pItem->byteValue++;
|
|
|
|
for(pItem1 = pItem; ; pItem1 = pPrev)
|
|
{
|
|
pPrev = pItem1->prev;
|
|
if(PTR_INVALID_OR_NULL(pPrev))
|
|
{
|
|
pPrev = NULL;
|
|
break;
|
|
}
|
|
|
|
if(pPrev->byteValue >= pItem->byteValue)
|
|
break;
|
|
}
|
|
|
|
if(pItem1 == pItem)
|
|
continue;
|
|
|
|
if(pItem1->next != NULL)
|
|
{
|
|
pItem2 = pItem1->GetPrevItem(-1);
|
|
pItem2->next = pItem1->next;
|
|
pItem1->next->prev = pItem1->prev;
|
|
pItem1->next = NULL;
|
|
pItem1->prev = NULL;
|
|
}
|
|
|
|
pItem2 = pItem->next;
|
|
pItem1->next = pItem2;
|
|
pItem1->prev = pItem2->prev;
|
|
pItem2->prev = pItem1;
|
|
pItem->next = pItem1;
|
|
if((pItem2 = pItem1) != NULL)
|
|
{
|
|
pItem2 = pItem->GetPrevItem(-1);
|
|
pItem2->next = pItem->next;
|
|
pItem->next->prev = pItem->prev;
|
|
pItem->next = NULL;
|
|
pItem->prev = NULL;
|
|
}
|
|
|
|
if(pPrev == NULL)
|
|
pPrev = PTR_PTR(&pFirst);
|
|
|
|
pItem2 = pPrev->next;
|
|
pItem->next = pItem2;
|
|
pItem->prev = pItem2->prev;
|
|
pItem2->prev = pItem;
|
|
pPrev->next = pItem;
|
|
|
|
pItem3 = pItem1->parent->child;
|
|
pItem2 = pItem->parent;
|
|
if(pItem2->child == pItem)
|
|
pItem2->child = pItem1;
|
|
if(pItem3 == pItem1)
|
|
pItem1->parent->child = pItem;
|
|
|
|
pItem2 = pItem->parent;
|
|
pItem->parent = pItem1->parent;
|
|
pItem1->parent = pItem2;
|
|
offs0004++;
|
|
}
|
|
}
|
|
|
|
// 1500E920
|
|
unsigned int THuffmannTree::DoCompression(TOutputStream * os, unsigned char * pbInBuffer, int nInLength, int nCmpType)
|
|
{
|
|
THTreeItem * pItem1;
|
|
THTreeItem * pItem2;
|
|
THTreeItem * pItem3;
|
|
THTreeItem * pTemp;
|
|
unsigned long dwBitBuff;
|
|
unsigned int nBits;
|
|
unsigned int nBit;
|
|
|
|
BuildTree(nCmpType);
|
|
bIsCmp0 = (nCmpType == 0);
|
|
|
|
// Store the compression type into output buffer
|
|
os->dwBitBuff |= (nCmpType << os->nBits);
|
|
os->nBits += 8;
|
|
|
|
// Flush completed bytes
|
|
while(os->nBits >= 8)
|
|
{
|
|
if(os->cbOutSize != 0)
|
|
{
|
|
*os->pbOutPos++ = (unsigned char)os->dwBitBuff;
|
|
os->cbOutSize--;
|
|
}
|
|
|
|
os->dwBitBuff >>= 8;
|
|
os->nBits -= 8;
|
|
}
|
|
|
|
for(; nInLength != 0; nInLength--)
|
|
{
|
|
unsigned char bOneByte = *pbInBuffer++;
|
|
|
|
if((pItem1 = items306C[bOneByte]) == NULL)
|
|
{
|
|
pItem2 = items306C[0x101]; // ecx
|
|
pItem3 = pItem2->parent; // eax
|
|
dwBitBuff = 0;
|
|
nBits = 0;
|
|
|
|
for(; pItem3 != NULL; pItem3 = pItem3->parent)
|
|
{
|
|
nBit = (pItem3->child != pItem2) ? 1 : 0;
|
|
dwBitBuff = (dwBitBuff << 1) | nBit;
|
|
nBits++;
|
|
pItem2 = pItem3;
|
|
}
|
|
os->PutBits(dwBitBuff, nBits);
|
|
|
|
// Store the loaded byte into output stream
|
|
os->dwBitBuff |= (bOneByte << os->nBits);
|
|
os->nBits += 8;
|
|
|
|
// Flush the whole byte(s)
|
|
while(os->nBits >= 8)
|
|
{
|
|
if(os->cbOutSize != 0)
|
|
{
|
|
*os->pbOutPos++ = (unsigned char)os->dwBitBuff;
|
|
os->cbOutSize--;
|
|
}
|
|
os->dwBitBuff >>= 8;
|
|
os->nBits -= 8;
|
|
}
|
|
|
|
pItem1 = (PTR_INVALID_OR_NULL(pLast)) ? NULL : pLast;
|
|
pItem2 = Call1500E740(1);
|
|
pItem2->dcmpByte = pItem1->dcmpByte;
|
|
pItem2->byteValue = pItem1->byteValue;
|
|
pItem2->parent = pItem1;
|
|
items306C[pItem2->dcmpByte] = pItem2;
|
|
|
|
pItem2 = Call1500E740(1);
|
|
pItem2->dcmpByte = bOneByte;
|
|
pItem2->byteValue = 0;
|
|
pItem2->parent = pItem1;
|
|
items306C[pItem2->dcmpByte] = pItem2;
|
|
pItem1->child = pItem2;
|
|
|
|
Call1500E820(pItem2);
|
|
|
|
if(bIsCmp0 != 0)
|
|
{
|
|
Call1500E820(items306C[bOneByte]);
|
|
continue;
|
|
}
|
|
|
|
for(pItem1 = items306C[bOneByte]; pItem1 != NULL; pItem1 = pItem1->parent)
|
|
{
|
|
pItem1->byteValue++;
|
|
pItem2 = pItem1;
|
|
|
|
for(;;)
|
|
{
|
|
pItem3 = pItem2->prev;
|
|
if(PTR_INVALID_OR_NULL(pItem3))
|
|
{
|
|
pItem3 = NULL;
|
|
break;
|
|
}
|
|
if(pItem3->byteValue >= pItem1->byteValue)
|
|
break;
|
|
pItem2 = pItem3;
|
|
}
|
|
|
|
if(pItem2 != pItem1)
|
|
{
|
|
InsertItem(&pItem305C, pItem2, SWITCH_ITEMS, pItem1);
|
|
InsertItem(&pItem305C, pItem1, SWITCH_ITEMS, pItem3);
|
|
|
|
pItem3 = pItem2->parent->child;
|
|
if(pItem1->parent->child == pItem1)
|
|
pItem1->parent->child = pItem2;
|
|
|
|
if(pItem3 == pItem2)
|
|
pItem2->parent->child = pItem1;
|
|
|
|
pTemp = pItem1->parent;
|
|
pItem1->parent = pItem2->parent;
|
|
pItem2->parent = pTemp;
|
|
offs0004++;
|
|
}
|
|
}
|
|
}
|
|
// 1500EB62
|
|
else
|
|
{
|
|
dwBitBuff = 0;
|
|
nBits = 0;
|
|
for(pItem2 = pItem1->parent; pItem2 != NULL; pItem2 = pItem2->parent)
|
|
{
|
|
nBit = (pItem2->child != pItem1) ? 1 : 0;
|
|
dwBitBuff = (dwBitBuff << 1) | nBit;
|
|
nBits++;
|
|
pItem1 = pItem2;
|
|
}
|
|
os->PutBits(dwBitBuff, nBits);
|
|
}
|
|
|
|
// 1500EB98
|
|
if(bIsCmp0 != 0)
|
|
Call1500E820(items306C[bOneByte]); // 1500EB9D
|
|
// 1500EBAF
|
|
} // for(; nInLength != 0; nInLength--)
|
|
|
|
// 1500EBB8
|
|
pItem1 = items306C[0x100];
|
|
dwBitBuff = 0;
|
|
nBits = 0;
|
|
for(pItem2 = pItem1->parent; pItem2 != NULL; pItem2 = pItem2->parent)
|
|
{
|
|
nBit = (pItem2->child != pItem1) ? 1 : 0;
|
|
dwBitBuff = (dwBitBuff << 1) | nBit;
|
|
nBits++;
|
|
pItem1 = pItem2;
|
|
}
|
|
|
|
// 1500EBE6
|
|
os->PutBits(dwBitBuff, nBits);
|
|
|
|
// 1500EBEF
|
|
// Flush the remaining bits
|
|
while(os->nBits != 0)
|
|
{
|
|
if(os->cbOutSize != 0)
|
|
{
|
|
*os->pbOutPos++ = (unsigned char)os->dwBitBuff;
|
|
os->cbOutSize--;
|
|
}
|
|
os->dwBitBuff >>= 8;
|
|
os->nBits -= ((os->nBits > 8) ? 8 : os->nBits);
|
|
}
|
|
|
|
return (unsigned int)(os->pbOutPos - os->pbOutBuffer);
|
|
}
|
|
|
|
// Decompression using Huffman tree (1500E450)
|
|
unsigned int THuffmannTree::DoDecompression(unsigned char * pbOutBuffer, unsigned int dwOutLength, TInputStream * is)
|
|
{
|
|
TQDecompress * qd;
|
|
THTreeItem * pItem1;
|
|
THTreeItem * pItem2;
|
|
unsigned char * pbOutPos = pbOutBuffer;
|
|
unsigned long nBitCount;
|
|
unsigned int nDcmpByte = 0;
|
|
unsigned int n8Bits; // 8 bits loaded from input stream
|
|
unsigned int n7Bits; // 7 bits loaded from input stream
|
|
bool bHasQdEntry;
|
|
|
|
// Test the output length. Must not be NULL.
|
|
if(dwOutLength == 0)
|
|
return 0;
|
|
|
|
// Get the compression type from the input stream
|
|
n8Bits = is->Get8Bits();
|
|
|
|
// Build the Huffman tree
|
|
BuildTree(n8Bits);
|
|
bIsCmp0 = (n8Bits == 0) ? 1 : 0;
|
|
|
|
for(;;)
|
|
{
|
|
// Security check: If we are at the end of the input buffer,
|
|
// it means that the data are corrupt.
|
|
if(is->pbInBuffer > is->pbInBufferEnd)
|
|
return 0;
|
|
|
|
// Get 7 bits from input stream
|
|
n7Bits = is->Get7Bits();
|
|
|
|
// Try to use quick decompression. Check TQDecompress array for corresponding item.
|
|
// If found, ise the result byte instead.
|
|
qd = &qd3474[n7Bits];
|
|
|
|
// If there is a quick-pass possible (ebx)
|
|
bHasQdEntry = (qd->offs00 >= offs0004) ? true : false;
|
|
|
|
// If we can use quick decompress, use it.
|
|
if(bHasQdEntry)
|
|
{
|
|
if(qd->nBits > 7)
|
|
{
|
|
is->SkipBits(7);
|
|
pItem1 = qd->pItem;
|
|
goto _1500E549;
|
|
}
|
|
is->SkipBits(qd->nBits);
|
|
nDcmpByte = qd->dcmpByte;
|
|
}
|
|
else
|
|
{
|
|
pItem1 = pFirst->next->prev;
|
|
if(PTR_INVALID_OR_NULL(pItem1))
|
|
pItem1 = NULL;
|
|
_1500E549:
|
|
nBitCount = 0;
|
|
pItem2 = NULL;
|
|
|
|
do
|
|
{
|
|
pItem1 = pItem1->child; // Move down by one level
|
|
if(is->GetBit()) // If current bit is set, move to previous
|
|
pItem1 = pItem1->prev;
|
|
|
|
if(++nBitCount == 7) // If we are at 7th bit, save current HTree item.
|
|
pItem2 = pItem1;
|
|
}
|
|
while(pItem1->child != NULL); // Walk until tree has no deeper level
|
|
|
|
if(bHasQdEntry == false)
|
|
{
|
|
if(nBitCount > 7)
|
|
{
|
|
qd->offs00 = offs0004;
|
|
qd->nBits = nBitCount;
|
|
qd->pItem = pItem2;
|
|
}
|
|
else
|
|
{
|
|
unsigned long nIndex = n7Bits & (0xFFFFFFFF >> (32 - nBitCount));
|
|
unsigned long nAdd = (1 << nBitCount);
|
|
|
|
for(qd = &qd3474[nIndex]; nIndex <= 0x7F; nIndex += nAdd, qd += nAdd)
|
|
{
|
|
qd->offs00 = offs0004;
|
|
qd->nBits = nBitCount;
|
|
qd->dcmpByte = pItem1->dcmpByte;
|
|
}
|
|
}
|
|
}
|
|
nDcmpByte = pItem1->dcmpByte;
|
|
}
|
|
|
|
if(nDcmpByte == 0x101) // Huffman tree needs to be modified
|
|
{
|
|
n8Bits = is->Get8Bits();
|
|
pItem1 = (PTR_INVALID_OR_NULL(pLast)) ? NULL : pLast;
|
|
|
|
pItem2 = Call1500E740(1);
|
|
pItem2->parent = pItem1;
|
|
pItem2->dcmpByte = pItem1->dcmpByte;
|
|
pItem2->byteValue = pItem1->byteValue;
|
|
items306C[pItem2->dcmpByte] = pItem2;
|
|
|
|
pItem2 = Call1500E740(1);
|
|
pItem2->parent = pItem1;
|
|
pItem2->dcmpByte = n8Bits;
|
|
pItem2->byteValue = 0;
|
|
items306C[pItem2->dcmpByte] = pItem2;
|
|
|
|
pItem1->child = pItem2;
|
|
Call1500E820(pItem2);
|
|
if(bIsCmp0 == 0)
|
|
Call1500E820(items306C[n8Bits]);
|
|
|
|
nDcmpByte = n8Bits;
|
|
}
|
|
|
|
if(nDcmpByte == 0x100)
|
|
break;
|
|
|
|
*pbOutPos++ = (unsigned char)nDcmpByte;
|
|
if(--dwOutLength == 0)
|
|
break;
|
|
|
|
if(bIsCmp0)
|
|
Call1500E820(items306C[nDcmpByte]);
|
|
}
|
|
|
|
return (unsigned int)(pbOutPos - pbOutBuffer);
|
|
}
|
|
|
|
|
|
// Table for (de)compression. Every compression type has 258 entries
|
|
unsigned char THuffmannTree::Table1502A630[] =
|
|
{
|
|
// Data for compression type 0x00
|
|
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x01
|
|
0x54, 0x16, 0x16, 0x0D, 0x0C, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x04, 0x04, 0x03, 0x05,
|
|
0x0E, 0x0B, 0x14, 0x13, 0x13, 0x09, 0x0B, 0x06, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02,
|
|
0x0D, 0x07, 0x09, 0x06, 0x06, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02,
|
|
0x09, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04,
|
|
0x08, 0x03, 0x04, 0x07, 0x09, 0x05, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02,
|
|
0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02,
|
|
0x06, 0x0A, 0x08, 0x08, 0x06, 0x07, 0x04, 0x03, 0x04, 0x04, 0x02, 0x02, 0x04, 0x02, 0x03, 0x03,
|
|
0x04, 0x03, 0x07, 0x07, 0x09, 0x06, 0x04, 0x03, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02,
|
|
0x0A, 0x02, 0x02, 0x03, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x03, 0x05, 0x02, 0x03,
|
|
0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01,
|
|
0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x09, 0x08, 0x0C, 0x02,
|
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03,
|
|
0x04, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
|
|
0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x4B,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x02
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x00, 0x00, 0x23, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x06, 0x0E, 0x10, 0x04,
|
|
0x06, 0x08, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01,
|
|
0x01, 0x04, 0x02, 0x04, 0x02, 0x02, 0x02, 0x01, 0x01, 0x04, 0x01, 0x01, 0x02, 0x03, 0x03, 0x02,
|
|
0x03, 0x01, 0x03, 0x06, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01,
|
|
0x01, 0x29, 0x07, 0x16, 0x12, 0x40, 0x0A, 0x0A, 0x11, 0x25, 0x01, 0x03, 0x17, 0x10, 0x26, 0x2A,
|
|
0x10, 0x01, 0x23, 0x23, 0x2F, 0x10, 0x06, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x03
|
|
0xFF, 0x0B, 0x07, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x06, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x03,
|
|
0x09, 0x01, 0x01, 0x01, 0x03, 0x04, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
|
|
0x05, 0x01, 0x01, 0x01, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x02, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
|
|
0x0A, 0x04, 0x02, 0x01, 0x06, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01,
|
|
0x05, 0x02, 0x03, 0x04, 0x03, 0x03, 0x03, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03,
|
|
0x01, 0x03, 0x01, 0x01, 0x02, 0x05, 0x01, 0x01, 0x04, 0x03, 0x05, 0x01, 0x03, 0x01, 0x03, 0x03,
|
|
0x02, 0x01, 0x04, 0x03, 0x0A, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x02, 0x02, 0x01, 0x0A, 0x02, 0x05, 0x01, 0x01, 0x02, 0x07, 0x02, 0x17, 0x01, 0x05, 0x01, 0x01,
|
|
0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x06, 0x02, 0x01, 0x04, 0x05, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
|
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
|
|
0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x11,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x04
|
|
0xFF, 0xFB, 0x98, 0x9A, 0x84, 0x85, 0x63, 0x64, 0x3E, 0x3E, 0x22, 0x22, 0x13, 0x13, 0x18, 0x17,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x05
|
|
0xFF, 0xF1, 0x9D, 0x9E, 0x9A, 0x9B, 0x9A, 0x97, 0x93, 0x93, 0x8C, 0x8E, 0x86, 0x88, 0x80, 0x82,
|
|
0x7C, 0x7C, 0x72, 0x73, 0x69, 0x6B, 0x5F, 0x60, 0x55, 0x56, 0x4A, 0x4B, 0x40, 0x41, 0x37, 0x37,
|
|
0x2F, 0x2F, 0x27, 0x27, 0x21, 0x21, 0x1B, 0x1C, 0x17, 0x17, 0x13, 0x13, 0x10, 0x10, 0x0D, 0x0D,
|
|
0x0B, 0x0B, 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x19, 0x18,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x06
|
|
0xC3, 0xCB, 0xF5, 0x41, 0xFF, 0x7B, 0xF7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0xBF, 0xCC, 0xF2, 0x40, 0xFD, 0x7C, 0xF7, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x7A, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x07
|
|
0xC3, 0xD9, 0xEF, 0x3D, 0xF9, 0x7C, 0xE9, 0x1E, 0xFD, 0xAB, 0xF1, 0x2C, 0xFC, 0x5B, 0xFE, 0x17,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0xBD, 0xD9, 0xEC, 0x3D, 0xF5, 0x7D, 0xE8, 0x1D, 0xFB, 0xAE, 0xF0, 0x2C, 0xFB, 0x5C, 0xFF, 0x18,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x70, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
|
|
// Data for compression type 0x08
|
|
0xBA, 0xC5, 0xDA, 0x33, 0xE3, 0x6D, 0xD8, 0x18, 0xE5, 0x94, 0xDA, 0x23, 0xDF, 0x4A, 0xD1, 0x10,
|
|
0xEE, 0xAF, 0xE4, 0x2C, 0xEA, 0x5A, 0xDE, 0x15, 0xF4, 0x87, 0xE9, 0x21, 0xF6, 0x43, 0xFC, 0x12,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0xB0, 0xC7, 0xD8, 0x33, 0xE3, 0x6B, 0xD6, 0x18, 0xE7, 0x95, 0xD8, 0x23, 0xDB, 0x49, 0xD0, 0x11,
|
|
0xE9, 0xB2, 0xE2, 0x2B, 0xE8, 0x5C, 0xDD, 0x15, 0xF1, 0x87, 0xE7, 0x20, 0xF7, 0x44, 0xFF, 0x13,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x5F, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00
|
|
};
|