--- np2/common/bmpdata.c 2003/10/16 17:57:11 1.1.1.1 +++ np2/common/bmpdata.c 2005/02/07 14:46:08 1.4 @@ -85,7 +85,7 @@ bdsi_exit: return(ret); } -BOOL bmpdata_getinfo(const BMPINFO *bi, BMPDATA *inf) { +BRESULT bmpdata_getinfo(const BMPINFO *bi, BMPDATA *inf) { UINT tmp; int width; @@ -107,8 +107,8 @@ BOOL bmpdata_getinfo(const BMPINFO *bi, if (tmp != 0) { goto bdgi_err; } - width = LOADINTELDWORD(bi->biWidth); - height = LOADINTELDWORD(bi->biHeight); + width = (SINT32)LOADINTELDWORD(bi->biWidth); + height = (SINT32)LOADINTELDWORD(bi->biHeight); if ((width <= 0) || (height == 0)) { goto bdgi_err; } @@ -121,3 +121,67 @@ bdgi_err: return(FAILURE); } +UINT8 *bmpdata_lzx(int level, int dstsize, const UINT8 *dat) { + + UINT8 *ret; + UINT8 *ptr; + UINT8 ctrl; + UINT8 bit; + UINT mask; + UINT tmp; + int pos; + int leng; + + ret = NULL; + if (dat == NULL) { + return(NULL); + } + ret = (UINT8 *)_MALLOC(dstsize, "res"); + if (ret == NULL) { + goto lxz_err; + } + ptr = ret; + + ctrl = 0; + bit = 0; + mask = (1 << level) - 1; + while(dstsize > 0) { + if (!bit) { + ctrl = *dat++; + bit = 0x80; + } + if (ctrl & bit) { + tmp = *dat++; + tmp <<= 8; + tmp |= *dat++; + pos = -1 - (tmp >> level); + leng = (tmp & mask) + 1; + leng = min(leng, dstsize); + dstsize -= leng; + while(leng--) { + *ptr = *(ptr + pos); + ptr++; + } + } + else { + *ptr++ = *dat++; + dstsize--; + } + bit >>= 1; + } + +lxz_err: + return(ret); +} + +UINT8 *bmpdata_solvedata(const UINT8 *dat) { + + int dstsize; + + if (dat == NULL) { + return(NULL); + } + dstsize = dat[0] + (dat[1] << 8) + (dat[2] << 16); + return(bmpdata_lzx(dat[3], dstsize, dat + 4)); +} +