📄 wilfile.cpp
字号:
/*
* name: wilfile.h
*
* desc: 这是传奇地图文件格式封装文件
*
*/
#include "stdafx.h"
#include ".\wilfile.h"
namespace shaker_utility
{
/*
================
sWixHead
Wix文件头
================
*/
//struct sWixHead
typedef struct tag_TWIXHEAD
{
char Title[44];
DWORD IndexCount;
}_TWIXHEAD,*_LPTWIXHEAD;
/*
================
sWilHead
Wil文件头
================
*/
//struct sWilHead
typedef struct tag_TWILHEAD
{
char Title[44];
DWORD ImageCount;
DWORD ColorCount;
DWORD PaletteSize;
}_TWILHEAD,*_LPTWILHEAD;
/*
================
sImageInfo
图片信息
================
*/
//struct sImageInfo
typedef struct tag_TIMAGEINFO
{
WORD Width;
WORD Height;
BYTE unknow[4];
}_TIMAGEINFO,*_LPTIMAGEINFO;
/*
=======================================================================
函数名 : LoadBitmapWil
功能描述 : 导入位图文件
参数 : void
返回值 : NULL
=======================================================================
*/
bool LoadBitmapWil(LPCTSTR name, DWORD index, CDC& dc/*, CBitmap& Bitmap*/ )
{
char szWilFileName[MAX_PATH];
char szWixFileName[MAX_PATH];
char szModuleFileName[MAX_PATH];
GetModuleFileName(0,szModuleFileName,MAX_PATH);
long nPos=strlen(szModuleFileName);
while(nPos>0)
{
if(szModuleFileName[nPos]=='\\')
{
szModuleFileName[nPos]=(char)0;
strcat(szModuleFileName,"\\data\\");
break;
}
nPos--;
}
strcpy(szWilFileName,szModuleFileName);
strcat(szWilFileName,name);
strcat(szWilFileName,".wil");
strcpy(szWixFileName,szModuleFileName);
strcat(szWixFileName,name);
strcat(szWixFileName,".wix");
_TWIXHEAD WixHead;
_TWILHEAD WilHead;
BYTE* lpPal=NULL;
DWORD* lpOffs=NULL;
_TIMAGEINFO Image;
BYTE* pImage=NULL;
BYTE* pb=NULL;
FILE*fp;
fp=fopen(szWixFileName,"rb");
if(fp!=NULL)
{
fread(&WixHead,sizeof(WixHead),1,fp);
if ( !(index<WixHead.IndexCount) )
{
fclose(fp);
return false;
}
std::auto_ptr<DWORD> lpOffs_auto(new DWORD[WixHead.IndexCount]);
lpOffs=lpOffs_auto.get();
ZeroMemory(lpOffs,sizeof(DWORD)*WixHead.IndexCount);
fread(lpOffs,sizeof(DWORD),WixHead.IndexCount,fp);
fclose(fp);
fp=fopen(szWilFileName,"rb");
if(fp!=NULL)
{
fread(&WilHead,sizeof(WilHead),1,fp);
std::auto_ptr<BYTE> lpPal_auto(new BYTE[WilHead.ColorCount*4]);
lpPal=lpPal_auto.get();
ZeroMemory(lpPal,sizeof(DWORD)*WilHead.ColorCount);
fread(lpPal,WilHead.PaletteSize,1,fp);
fseek(fp,lpOffs[index],SEEK_SET);
fread(&Image,sizeof(Image),1,fp);
std::auto_ptr<BYTE> pImage_auto(new BYTE[Image.Height*Image.Width]);
pImage=pImage_auto.get();
ZeroMemory(pImage,Image.Height*Image.Width);
fseek(fp,lpOffs[index]+8,SEEK_SET);
fread(pImage,Image.Height*Image.Width,1,fp);
fclose(fp);
for(WORD i=0;i<Image.Width;i++)
{
for(WORD j=0;j<Image.Height;j++)
{
pb=&lpPal[pImage[j*Image.Width+i]*4];
dc.SetPixel(i,Image.Height-j-1,RGB(pb[2],pb[1],pb[0]));
}
}
return true;
}
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -