PHP源码:
void * unzipbmpex(MJ * mj, char *res_file, uint16 id, int *w, int *h)
{
uint32 nTmp, size, l;
byte *buf, *tmpbuf;
void * pbmSource = NULL;
byte *pDataBytes;
void *bmp;
AEEImageInfo imageInfo;
boolean bVal = TRUE;
if(NULL == (pbmSource=ISHELL_LoadResDataEx (mj->a.m_pIShell, res_file,
id, RESTYPE_IMAGE, NULL, &size)))
{
return NULL;
}
tmpbuf= (byte *)MALLOC(size-*((byte *)(pbmSource)));
MEMCPY(tmpbuf,(byte *)pbmSource+*((byte *)(pbmSource)),size-*((byte *)(pbmSource)));
IMEMASTREAM_Set(mj->pMemStream, tmpbuf, size-*((byte *)(pbmSource)), 0, FALSE);
l = (*((byte *)pbmSource+size-4))
+((*((byte *)pbmSource+size-3))<<8)
+((*((byte *)pbmSource+size-2))<<16)
+((*((byte *)pbmSource+size-1))<<24);
ISHELL_FreeResData (mj->a.m_pIShell, pbmSource);
buf= (byte *)MALLOC(l);
IUNZIPASTREAM_SetStream(mj->pIUnzipAStream, (IAStream *)mj->pMemStream);
nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)buf, l);
if(nTmp>0)
{
while(nTmp<l)
{
nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)(byte *)(buf+nTmp), l-nTmp)+nTmp;
}
pDataBytes = (byte *)(buf);
bmp = CONVERTBMP (pDataBytes, &imageInfo, &bVal);
*w = imageInfo.cx;
*h = imageInfo.cy;
FREE(buf);
return bmp;
}
else if((nTmp == AEE_STREAM_WOULDBLOCK)||(nTmp == 0))
{
FREE(buf);
return NULL;
}
return NULL;
}
由于很晚了,有些细节就靠大家自己补齐了。
当然了,大的数据文件也可以这样用(包括MIDI,WAV等),不过注意,加进资源里也要是设成图片类型,文件的后缀也要是.bmp。下面是解数据文件的代码:
void *unzipex(MJ * mj, char *res_file, uint16 id, uint32 *xsize)
{
uint32 nTmp, size, l;
byte *buf, *tmpbuf;
void * pbmSource = NULL;
byte *pDataBytes;
boolean bVal = TRUE;
if(NULL == (pbmSource=ISHELL_LoadResDataEx (mj->a.m_pIShell, res_file,
id, RESTYPE_IMAGE, NULL, &size)))
{
return NULL;
}
tmpbuf= (byte *)MALLOC(size-*((byte *)(pbmSource)));
MEMCPY(tmpbuf,(byte *)pbmSource+*((byte *)(pbmSource)),size-*((byte *)(pbmSource)));
IMEMASTREAM_Set(mj->pMemStream, tmpbuf, size-*((byte *)(pbmSource)), 0, FALSE);
l = (*((byte *)pbmSource+size-4))
+((*((byte *)pbmSource+size-3))<<8)
+((*((byte *)pbmSource+size-2))<<16)
+((*((byte *)pbmSource+size-1))<<24);
ISHELL_FreeResData (mj->a.m_pIShell, pbmSource);
buf= (byte *)MALLOC(l);
IUNZIPASTREAM_SetStream(mj->pIUnzipAStream, (IAStream *)mj->pMemStream);
nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)buf, l);
if(nTmp>0)
{
//*xsize = nTmp;
while(nTmp<l)
{
nTmp = IUNZIPASTREAM_Read(mj->pIUnzipAStream, (void*)(byte *)(buf+nTmp), l-nTmp)+nTmp;
}
*xsize = l>nTmp?nTmp:l;
pDataBytes = (byte *)(buf);
return buf;
}
else if((nTmp == AEE_STREAM_WOULDBLOCK)||(nTmp == 0))
{
FREE(buf);
return NULL;
}
return NULL;
}