⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgrap.cpp

📁 成熟的RPG引擎,Flysky发布. 斜视角引擎.
💻 CPP
字号:
#include "../GameH.h"
#include <math.h>
//位图函数
//小飞侠 制作
//一部分来自 金点时空

//============================================================
//函数:LoadBitmapS(IDirectDrawSurface7 *pdds, LPCSTR szBitmap,
//                 RECT FanWei,RECT KaoH)
//功能:将位图文件缩放到页面(GDI)
//参数:窗口句柄,位图文件名,拷贝的范围,拷贝后的位置大小
//============================================================
HRESULT LoadBitmapSG(IDirectDrawSurface7 *pdds, LPCSTR szBitmap,LPRECT FanWei,LPRECT KaoH)
{
    HBITMAP                 hbm;
    HRESULT                 hr;
	HDC                     hdcImage;
    HDC                     hdc;
    BITMAP                  bm;
    DDSURFACEDESC2          ddsd;
    int x,y,dx,dy,x1,y1,sx,sy;  //各种临时变量
	if (FanWei!=NULL) {x=FanWei->left;y=FanWei->top; dx=FanWei->right; dy=FanWei->bottom;} //拷贝的范围
	else {x=0;y=0; LoadBitmapFileInfo(szBitmap,dx,dy);}
	if (KaoH!=NULL){x1=KaoH->left;	y1=KaoH->top; sx=KaoH->right; sy=KaoH->bottom;}  //拷贝后的位置大小
	else {x1=0;	y1=0;sx=dx; sy=dy;}

    hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, sx,sy, LR_CREATEDIBSECTION); //从资源文件
    if (hbm == NULL) hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, sx,sy,LR_LOADFROMFILE | LR_CREATEDIBSECTION); //从位图文件
	if (hbm == NULL)
	{
		char Temp[MAX_LOADSTRING];
		sprintf(Temp,"%s\nError:%s","BMP Image load ERROR!",szBitmap);
		_ERROR_OK(Temp); //返回错误
		return E_FAIL;
	}
    if (hbm == NULL || pdds == NULL) return E_FAIL;
    hdcImage = CreateCompatibleDC(NULL); //设定一个DC
    if (!hdcImage) 
	{
		char Temp[MAX_LOADSTRING];
		sprintf(Temp,"%s\nError:%s","BMP Image load ERROR!",szBitmap);
		_ERROR_OK(Temp); //返回错误
		return E_FAIL;
	}
    SelectObject(hdcImage, hbm);
    GetObject(hbm, sizeof(bm), &bm); //获取文件大小
    dx = dx == 0 ? bm.bmWidth : dx;     //缺省使用键入的大小, 默认为0
    dy = dy == 0 ? bm.bmHeight : dy;
    ddsd.dwSize = sizeof(ddsd); //获取一个表面
    ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
    pdds->GetSurfaceDesc(&ddsd);
    if ((hr = pdds->GetDC(&hdc)) == DD_OK)
    {
        StretchBlt(hdc, x1, y1, sx, sy, hdcImage, x, y,
                   dx, dy, SRCCOPY);  //Copy位图
        pdds->ReleaseDC(hdc);
    }
    DeleteDC(hdcImage); //删除DC
    if (hr != DD_OK)
	{
		char Temp[MAX_LOADSTRING];
		sprintf(Temp,"%s\nError:%s","BMP Image Show ERROR!",szBitmap);
		_ERROR_OK(Temp); //返回错误
		return E_FAIL;
	}
    DeleteObject(hbm);
    return hr;
}
//============================================================
//函数:LoadBitmapFileInfo(HWND hwnd, LPCTSTR filename
//             , int &dx, int &dy)
//功能:获得位图文件的尺寸大小
//参数:窗口句柄,位图文件名,返回位图宽度,返回位图高度(引用参数)
//============================================================
BOOL LoadBitmapFileInfo(LPCTSTR filename, int &dx, int &dy)
{
	FILE *fp;
	if( (fp=fopen(filename, "rb"))==NULL ){	return FALSE;}
	//读入文件头
	BITMAPFILEHEADER bmpFileHeader;		
	fread(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp);
	//检查BM标志
	char *ptr=(char*)&bmpFileHeader.bfType;
	if(*ptr!='B' || *++ptr!='M'){return FALSE;}
	//信息头
	BITMAPINFOHEADER bmpInfoHeader;
	fread(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, fp);
	fclose(fp);
	//宽度,高度
	dx=bmpInfoHeader.biWidth;
	dy=bmpInfoHeader.biHeight;
	return TRUE;
}

//***********************
//*      Load JPEG      *
//*  使用IJL库读取JPG   *
//*   Intel CopyRight   *
//**********************
bool LoadJPEG(bool DZ,LPDIRECTDRAWSURFACE7 Surface,LPCTSTR FileName)
{
IJLERR jerr;
JPEG_CORE_PROPERTIES jcprops;
   //Initialize the JPEG object
   jerr = ijlInit(&jcprops);
   if (jerr != IJL_OK)      return false;
   jcprops.JPGFile = FileName;
   jerr = ijlRead(&jcprops, IJL_JFILE_READPARAMS);
   if (jerr != IJL_OK)      return false;
   //Prepare a 24Bit buffer to receive image data
   BYTE *buffer24;
   //Determine the required size
   long szbuff24 = ((jcprops.JPGWidth *24 + 7) * jcprops.JPGHeight)>>3;
   //Resize the buffer and check for null
switch(jcprops.JPGChannels)
{
    case 1: 
		jcprops.JPGColor = IJL_G;
		jcprops.DIBChannels = 3;
		jcprops.DIBColor    = IJL_BGR;
        break;

    case 3:
		jcprops.JPGColor = IJL_YCBCR;
		jcprops.DIBChannels = 3;
		jcprops.DIBColor    = IJL_BGR;
        break;
	case 4:
		jcprops.JPGColor    = IJL_YCBCRA_FPX;
		jcprops.DIBChannels = 4;
		jcprops.DIBColor    = IJL_RGBA_FPX;
		break;
    default:
        jcprops.DIBColor = (IJL_COLOR)IJL_OTHER;
        jcprops.JPGColor = (IJL_COLOR)IJL_OTHER;
		jcprops.DIBChannels = jcprops.JPGChannels;
        break;
}
   buffer24 = new BYTE [szbuff24];
   if (buffer24 == NULL) return false;
   jcprops.DIBWidth    = jcprops.JPGWidth;
   DZ==true?jcprops.DIBHeight   = -jcprops.JPGHeight:jcprops.DIBHeight   = jcprops.JPGHeight; //Implies a bottom-up DIB.
   jcprops.DIBPadBytes = IJL_DIB_PAD_BYTES(jcprops.JPGWidth,jcprops.DIBChannels);
   jcprops.DIBBytes    = reinterpret_cast<BYTE*>(buffer24);      
	jerr = ijlRead(&jcprops, IJL_JFILE_READWHOLEIMAGE);
      if (jerr != IJL_OK) return false;
      WORD *buffer16;
      long szbuff16;     
      //determine the size of our buffer
      szbuff16 = ((jcprops.JPGWidth *16 + 7) >>3)* jcprops.JPGHeight;
      //resize the buffer and make sure resize works
      buffer16 = new WORD [szbuff16];
      if (buffer16 == NULL)        return false;
      //Start at the beginning of the buffer
      long j = 0;
      //Step through the 24bit buffer
      //Retrieve 3 channels at a time and convert their values to 16bit
      for (long i = 0; i < szbuff24; i += 3)   
      {
         //Check the pixel format and write the color data
         //to the 16bit buffer. After the write, advance the
         //16bit buffer by one.
		 buffer16[j++]=RGB16(buffer24[i],buffer24[i+1],buffer24[i+2]);
      }
BeginDraw(Surface);
BYTE *pSrc=(BYTE *)GraphBuffer; //源页面
int srcPitch=GraphPitch <<1;
Qmemcpy(pSrc,buffer16,szbuff16); //拷贝内存 
EndDraw(Surface);
_DELETE_ARRAY(buffer16);
_DELETE_ARRAY(buffer24);
      //Create the bitmap using the new 16bit buffer   
    // hbm = CreateBitmap (jcprops.JPGWidth, jcprops.JPGHeight, 1,16, buffer16);
     // if(hbm == NULL)         return false;
	 //    DDCopyBitmap(*Surface, hbm, 0, 0, 0, 0);
   ijlFree(&jcprops);

   return true;
}

bool LoadFMhPic(LPDIRECTDRAWSURFACE7 Surface,LPCTSTR FileName)
{
MHPICHEADER mhsjh;
RGBP *rp;
FILE *fp=NULL;
RGBD *Rgbd;
int BitSize;
fopen(FileName,"rb");//以二进制方式打开
char Hd[sizeof(MhPicH)];
fread(&Hd,sizeof(Hd),1,fp);
if (Hd==MhPicH)
{
  fread(&mhsjh,sizeof(MHPICHEADER),1,fp);
  BitSize=mhsjh.bcWidth*mhsjh.bcHeight;
  rp=new RGBP[mhsjh.PaletteL];
  fread(&rp,sizeof(RGBP),mhsjh.PaletteL,fp);
  Rgbd=new RGBD[BitSize];//分配内存 
  if (mhsjh.RLES==1)
  {
	RLED *rd;
	rd=new RLED[mhsjh.RLElength];
	fread(&rd,sizeof(RLED),mhsjh.RLElength,fp); //全部数据读入
	for(int i=0;i<mhsjh.RLElength;i++)
	{
		int T=0;
		for (int d=0;i<rd[i].length;d++)
		{
			Rgbd[T].rgbRed=rp[rd[i].is_solid].rgbRed;
			Rgbd[T].rgbGreen=rp[rd[i].is_solid].rgbGreen;
			Rgbd[T].rgbBlue=rp[rd[i].is_solid].rgbBlue;
			T++;
		}
	}
	_DELETE_ARRAY(rd);
  }
  else fread(&Rgbd,sizeof(RGBD),BitSize,fp); //全部数据读入
  WORD *buffer16;
  buffer16=new WORD[BitSize];
  for (int p=0;p<BitSize;p++)
  {
	  buffer16[p]=RGB16(Rgbd[p].rgbRed,Rgbd[p].rgbGreen,Rgbd[p].rgbBlue);
  }
  BeginDraw(Surface);
  BYTE *pSrc=(BYTE *)GraphBuffer; //源页面
  int srcPitch=GraphPitch <<1;
  Qmemcpy(pSrc,buffer16,BitSize); //拷贝内存 
  EndDraw(Surface);
  _DELETE_ARRAY(rp);
  _DELETE_ARRAY(Rgbd);
}
else return false;
fclose(fp);
return true;
}

bool LoadJPEGFInfo(LPCTSTR FileName,int &dx, int &dy)
{
IJLERR jerr;
JPEG_CORE_PROPERTIES jcprops;
   //Initialize the JPEG object
   jerr = ijlInit(&jcprops);
   if (jerr != IJL_OK)      return false;
   jcprops.JPGFile = FileName;
   jerr = ijlRead(&jcprops, IJL_JFILE_READPARAMS);
   if (jerr != IJL_OK)      return false;
   dx=jcprops.JPGWidth;
   dy=jcprops.JPGHeight;
   return true;
}

BOOL LoadFMhPicInfo(LPCTSTR filename, int &dx, int &dy)
{
MHPICHEADER mhsjh;
FILE *fp=NULL;
fopen(filename,"rb");//以二进制方式打开
char Hd[sizeof(MhPicH)];
fread(&Hd,sizeof(Hd),1,fp);
if (Hd==MhPicH)
{
	fread(&mhsjh,sizeof(MHPICHEADER),1,fp);
	dx=mhsjh.bcWidth;
	dy=mhsjh.bcHeight;
}
else return FALSE;
fclose(fp);
return TRUE;
}

//图片的判断,用来选择函数的
void LoadPic(bool DZ,LPDIRECTDRAWSURFACE7 Surface,LPCSTR FileName)
{
	if (stricmp(FileName+(strlen(FileName)-3),"bmp")==0) LoadBitmapSG(Surface,FileName,NULL,NULL);
	else if (stricmp(FileName+(strlen(FileName)-3),"jpg")==0) LoadJPEG(DZ,Surface,FileName);
	else if (stricmp(FileName+(strlen(FileName)-4),"jpeg")==0) LoadJPEG(DZ,Surface,FileName);
	else if (stricmp(FileName+(strlen(FileName)-3),"mhp")==0) LoadFMhPic(Surface,FileName);
//hdm的方法[已经不用]
/*
char* FI=strchr(FileName,'.');
FI++;
if (strcmp(FI,"bmp")==0) LoadBitmapS(Surface,FileName,NULL,NULL);
else if (strcmp(FI,"jpg")==0) LoadJPEG(DZ,Surface,FileName);
else if (strcmp(FI,"jpeg")==0) LoadJPEG(DZ,Surface,FileName);
else if (strcmp(FI,"mhp")==0) LoadFMhPic(Surface,FileName);
*/
}

//图片信息读取的判断,用来选择函数的
bool LoadPicInfo(LPCSTR FileName,int &dx,int &dy)
{
if (stricmp(FileName+(strlen(FileName)-3),"bmp")==0) if (LoadBitmapFileInfo(FileName,dx,dy)==TRUE) return true;
else if (stricmp(FileName+(strlen(FileName)-3),"jpg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (stricmp(FileName+(strlen(FileName)-4),"jpeg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (stricmp(FileName+(strlen(FileName)-3),"mhp")==0) if (LoadFMhPicInfo(FileName,dx,dy)==TRUE) return true;
//hdm的方法[已经不用]
/*
char* FI=strchr(FileName,'.');
FI++;
if (strcmp(FI,"bmp")==0)if (LoadBitmapFileInfo(FileName,dx,dy)==TRUE) return true;
else if (strcmp(FI,"jpg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (strcmp(FI,"jpeg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (strcmp(FI,"mhp")==0) if (LoadFMhPicInfo(FileName,dx,dy)==TRUE) return true;
*/
return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -