📄 pack.cpp
字号:
{
memcpy(Buffer, pbuffer, linesize);
pbuffer += linesize;
Offset = bmp->bit + i * bmpinfo.biWidth;
for (int j = 0; j < bmpinfo.biWidth; j++)
Offset[j] = true_to_hi((*(DWORD *)(Buffer + j * 3)));
}
delete filebuffer;
delete Buffer;
Offset = NULL;
return bmp;
}
}
// 装入位图文件
BMP *load_pack_bmp_file(char *filename)
{
BOOL find_ok = FALSE;
seek_to_first(data_file->pack_file_list);
PACK_FILE *pf;
for (DWORD c = 0; c < data_file->file_count; c++)
{
pf = (PACK_FILE *)get_data(data_file->pack_file_list);
if (strcmp(pf->filename, filename) == 0)
{
find_ok = TRUE;
break;
}
seek_to_next(data_file->pack_file_list);
}
if (!find_ok)
return NULL;
BMP *bmp;
fseek(data_file->fp, pf->pos, SEEK_SET);
bmp = new BMP;
put_message(bmp == NULL, "错误,没有足够的内存空间。");
if (!pf->compress)
{
// 处理没有压缩的
fread(bmp, sizeof(BMP), 1, data_file->fp);
char *buffer = new char [bmp->surface_byte];
fread(buffer, bmp->surface_byte, 1, data_file->fp);
bmp->bit = (WORD *)buffer;
return bmp;
}
else
{
// 处理压缩过的
char *cbuffer = new char [pf->filesize];
put_message(cbuffer == NULL, "错误,没有足够的内存空间。");
fread(cbuffer, pf->filesize, 1, data_file->fp);
char *filebuffer = new char [pf->oldsize], *pbuffer;
put_message(filebuffer == NULL, "错误,没有足够的内存空间。");
decompress(cbuffer, pf->filesize, filebuffer);
delete cbuffer;
pbuffer = filebuffer;
memcpy(bmp, pbuffer, sizeof(BMP));
pbuffer += sizeof(BMP);
char *buffer = new char [bmp->surface_byte];
memcpy(buffer, pbuffer, bmp->surface_byte);
bmp->bit = (WORD *)buffer;
delete filebuffer;
return bmp;
}
}
// 装入数据文件
void *load_pack_file(char *filename)
{
BOOL find_ok = FALSE;
seek_to_first(data_file->pack_file_list);
PACK_FILE *pf;
for (DWORD c = 0; c < data_file->file_count; c++)
{
pf = (PACK_FILE *)get_data(data_file->pack_file_list);
if (strcmp(pf->filename, filename) == 0)
{
find_ok = TRUE;
break;
}
seek_to_next(data_file->pack_file_list);
}
if (!find_ok)
return NULL;
fseek(data_file->fp, pf->pos, SEEK_SET);
if (!pf->compress)
{
// 处理没有压缩的
char *buffer = new char [pf->filesize];
fread(buffer, pf->filesize, 1, data_file->fp);
return buffer;
}
else
{
// 处理压缩过的
char *cbuffer = new char [pf->filesize];
fread(cbuffer, pf->filesize, 1, data_file->fp);
char *buffer = new char [pf->oldsize];
decompress(cbuffer, pf->filesize, buffer);
delete cbuffer;
return buffer;
}
}
// 读取音效文件
SAMPLE *load_pack_sample(char *filename)
{
BOOL find_ok = FALSE;
seek_to_first(data_file->pack_file_list);
PACK_FILE *pf;
for (DWORD c = 0; c < data_file->file_count; c++)
{
pf = (PACK_FILE *)get_data(data_file->pack_file_list);
if (strcmp(pf->filename, filename) == 0)
{
find_ok = TRUE;
break;
}
seek_to_next(data_file->pack_file_list);
}
if (!find_ok)
return NULL;
fseek(data_file->fp, pf->pos, SEEK_SET);
SAMPLE *sample;
sample = new SAMPLE;
put_message(sample == NULL, "错误,没有足够的内存。");
if (!pf->compress)
{
// 处理没有压缩的
sample->number = -1;
DWORD riff = 0, size = 0, type = 0, entry = 0, filesize = 0, data_size = 0;
filesize = pf->filesize;
fread(&riff, sizeof(DWORD), 1, data_file->fp);
fread(&size, sizeof(DWORD), 1, data_file->fp);
fread(&type, sizeof(DWORD), 1, data_file->fp);
BOOL format_read = FALSE, data_read = FALSE;
if (riff != mmioFOURCC('R', 'I', 'F', 'F') ||
type != mmioFOURCC('W', 'A', 'V', 'E'))
return NULL;
entry += 12;
while(entry < filesize)
{
fread(&type, sizeof(DWORD), 1, data_file->fp);
fread(&size, sizeof(DWORD), 1, data_file->fp);
entry += 8;
switch(type)
{
case mmioFOURCC('f', 'm', 't', ' '):
if (size < sizeof(WAVEFORMAT))
return NULL;
fseek(data_file->fp, sizeof(WAVEFORMAT), SEEK_CUR);
entry += sizeof(WAVEFORMAT);
if (format_read && data_read)
return sample;
format_read = TRUE;
break;
case mmioFOURCC('d', 'a', 't', 'a'):
sample->bit = new char [size];
put_message(sample->bit == NULL, "错误,没有足够的内存。");
fread(sample->bit, size, 1, data_file->fp);
entry += size;
sample->size = size;
if (format_read)
return sample;
break;
}
}
return sample;
}
else
{
// 处理压缩过的
char *cbuffer, *filebuffer, *pbuffer;
cbuffer = new char [pf->filesize];
put_message(cbuffer == NULL, "错误,没有足够的内存空间。");
fread(cbuffer, pf->filesize, 1, data_file->fp);
filebuffer = new char [pf->oldsize];
put_message(filebuffer == NULL, "错误,没有足够的内存空间。");
decompress(cbuffer, pf->filesize, filebuffer);
delete cbuffer;
pbuffer = filebuffer;
sample->number = -1;
DWORD riff = 0, size = 0, type = 0, entry = 0, filesize = 0, data_size = 0;
filesize = pf->oldsize;
memcpy(&riff, pbuffer, sizeof(DWORD));
pbuffer += sizeof(DWORD);
memcpy(&size, pbuffer, sizeof(DWORD));
pbuffer += sizeof(DWORD);
memcpy(&type, pbuffer, sizeof(DWORD));
pbuffer += sizeof(DWORD);
BOOL format_read = FALSE, data_read = FALSE;
if (riff != mmioFOURCC('R', 'I', 'F', 'F') ||
type != mmioFOURCC('W', 'A', 'V', 'E'))
{
delete filebuffer;
return NULL;
}
entry += 12;
while(entry < filesize)
{
memcpy(&type, pbuffer, sizeof(DWORD));
pbuffer += sizeof(DWORD);
memcpy(&size, pbuffer, sizeof(DWORD));
pbuffer += sizeof(DWORD);
entry += 8;
switch(type)
{
case mmioFOURCC('f', 'm', 't', ' '):
if (size < sizeof(WAVEFORMAT))
{
delete filebuffer;
return NULL;
}
pbuffer += sizeof(WAVEFORMAT);
entry += sizeof(WAVEFORMAT);
if (format_read && data_read)
{
delete filebuffer;
return sample;
}
format_read = TRUE;
break;
case mmioFOURCC('d', 'a', 't', 'a'):
sample->bit = new char [size];
put_message(sample->bit == NULL, "错误,没有足够的内存。");
memcpy(sample->bit, pbuffer, size);
pbuffer += size;
entry += size;
sample->size = size;
if (format_read)
{
delete filebuffer;
return sample;
}
break;
}
}
return sample;
}
}
// 读取音乐文件
MUSIC *load_pack_music(char *filename)
{
BOOL find_ok = FALSE;
seek_to_first(data_file->pack_file_list);
PACK_FILE *pf;
for (DWORD c = 0; c < data_file->file_count; c++)
{
pf = (PACK_FILE *)get_data(data_file->pack_file_list);
if (strcmp(pf->filename, filename) == 0)
{
find_ok = TRUE;
break;
}
seek_to_next(data_file->pack_file_list);
}
if (!find_ok)
return NULL;
fseek(data_file->fp, pf->pos, SEEK_SET);
MUSIC *music;
music = new MUSIC;
put_message(music == NULL, "错误,没有足够的内存。");
music->source = MUSIC_IN_PACKFILE;
put_message(music->fp == NULL, "错误,读取文件%s失败。", filename);
DWORD riff = 0, size = 0, type = 0, entry = 0, filesize = 0, data_size = 0;
filesize = pf->filesize;
fread(&riff, sizeof(DWORD), 1, data_file->fp);
fread(&size, sizeof(DWORD), 1, data_file->fp);
fread(&type, sizeof(DWORD), 1, data_file->fp);
BOOL format_read = FALSE, data_read = FALSE;
if (riff != mmioFOURCC('R', 'I', 'F', 'F') ||
type != mmioFOURCC('W', 'A', 'V', 'E'))
return NULL;
entry += 12;
while(entry < filesize)
{
fread(&type, sizeof(DWORD), 1, data_file->fp);
fread(&size, sizeof(DWORD), 1, data_file->fp);
entry += 8;
switch(type)
{
case mmioFOURCC('f', 'm', 't', ' '):
if (size < sizeof(WAVEFORMAT))
return NULL;
fseek(data_file->fp, sizeof(WAVEFORMAT), SEEK_CUR);
entry += sizeof(WAVEFORMAT);
if (format_read && data_read)
return music;
format_read = TRUE;
break;
case mmioFOURCC('d', 'a', 't', 'a'):
music->size = size;
music->pack_offset = music->pos = ftell(data_file->fp);
data_read = TRUE;
if (format_read)
return music;
break;
}
}
return music;
}
// 写数据包内子文件到磁盘文件
BOOL write_pack_file(char *filename, char *destfile)
{
BOOL find_ok = FALSE;
seek_to_first(data_file->pack_file_list);
PACK_FILE *pf;
for (DWORD c = 0; c < data_file->file_count; c++)
{
pf = (PACK_FILE *)get_data(data_file->pack_file_list);
if (strcmp(pf->filename, filename) == 0)
{
find_ok = TRUE;
break;
}
seek_to_next(data_file->pack_file_list);
}
if (!find_ok)
return NULL;
fseek(data_file->fp, pf->pos, SEEK_SET);
char *buffer = new char [pf->filesize];
if (buffer == NULL)
return FALSE;
fread(buffer, pf->filesize, 1, data_file->fp);
FILE *fp;
fp = fopen(destfile, "wb+");
if (fp == NULL)
{
delete buffer;
return FALSE;
}
fwrite(buffer, pf->filesize, 1, fp);
fclose(fp);
delete buffer;
return TRUE;
}
// 写全部数据包文件到磁盘文件
BOOL write_all_pack_file()
{
PACK_FILE *pf;
seek_to_first(data_file->pack_file_list);
for (DWORD c = 0; c < data_file->file_count; c++)
{
pf = (PACK_FILE *)get_data(data_file->pack_file_list);
fseek(data_file->fp, pf->pos, SEEK_SET);
char *buffer = new char [pf->filesize];
if (buffer == NULL)
return FALSE;
fread(buffer, pf->filesize, 1, data_file->fp);
FILE *fp;
fp = fopen(pf->filename, "wb+");
if (fp == NULL)
{
delete buffer;
return FALSE;
}
fwrite(buffer, pf->filesize, 1, fp);
fclose(fp);
delete buffer;
seek_to_next(data_file->pack_file_list);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -