|
|
如果转载或者使用本代码请在显要位置著名:原作者 kid
/*
SD0 for Kidou Senshi Gundam Giren no Yabou Axis no Kyou(PSP)
Version: v0.1 2008.2.9
Author: kid
*/
#include "File.h"
UCHAR* uncompress0(UCHAR *src,unsigned long size, unsigned long dstsize)
{
UCHAR *dst = new UCHAR[dstsize];
memset(dst, 0,dstsize);
UCHAR *p = dst;
unsigned char flag;
for (unsigned int i = 0; i < size - 1;)
{
flag = src[i++];
for (int t = 0; t < 8; t++)
{
if (i >= size - 1)
break;
if (flag & 1)
{
unsigned char f = src[i++];
switch (f & 0xf)
{
case 1: //XY ZZ X+3 数量, ZZ RLE字符(Y=1)
{
unsigned int num = ((f & 0xf0) >> 4) + 3;
char s = src[i++];
for (unsigned int j = 0; j < num; j++)
*p++ = s;
}
break;
case 2:
{
unsigned int num = (src[i++] + 1) * 16;
num += ((f & 0xf0) >> 4) + 2;
for (unsigned int j = 0; j < num; j++)
*p++ = src[i++];
}
break;
default: //XY ZZ Y 数量,ZZX窗口位置(Y!=1,2)
{
unsigned int num = f & 0xf;
unsigned int pos = (src[i++] << 4) | ((f & 0xf0) >> 4);
if (num == 0)
num = 16 + src[i++];
for (unsigned int j = 0; j < num; j++)
*p++ = *(p - pos);
}
}
}
else
{
*p++ = src[i++];
}
flag>>=1;
}
}
#ifdef _DEBUG
if (p-dst != dstsize)
{
printf("Uncompress error! %xt%xn",dstsize,p-dst);
exit(-1);
}
#endif
return dst;
} |
|