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

📄 about.cpp

📁 mpq文件查看器
💻 CPP
字号:
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <shellapi.h>
#include "resource.h"
#include "About.h"
#include <gl/gl.h>
#include <gl/glu.h>
#include <math.h>
#include "blp.h"

extern "C" DWORD IJGRead (unsigned char *buf, unsigned long buflen, long *w, long *h, long *bpp, unsigned char *destbuf);
extern void *malloc_func(const size_t size);
extern void free_func(void* ptr);
extern void HorizFlip(char *bufsrc, long rowsize, long numlines);
extern void RGB2BGR(char *bufsrc, DWORD srcsize);
extern void RGBA2BGRA(char *bufsrc, DWORD srcsize);
extern DWORD ResizePicture(char* srcBuf, long width, long height, long bpp, char* destBuf, long newwidth, long newheight);
extern void RGB2BGR(char *bufsrc, DWORD srcsize);
extern MyMPQ gmpq;
extern long gLoadedItem;
extern DWORD currentlanguage;
extern BOOL bActive;
extern char szAppName[];


#define FLAGWIDTH  33
#define FLAGHEIGHT 25

#define FLAGWIDTHf  33.0f
#define FLAGHEIGHTf 25.0f

#define EEGGS 44711


char *aboutJPEGPic=NULL;
long pwidth, pheight, pbpp;
float flagPoints[FLAGWIDTH+1][FLAGHEIGHT+1][3];
float wrapValue;
unsigned int texture;
HDC g_HDC;
HGLRC hRC;
BOOL bfloating = FALSE, bDispEgg = FALSE;


void aboutInitializeFlag()
{
	int xIdx;
	int yIdx;

	for (xIdx = 0; xIdx < FLAGWIDTH; xIdx++)
	{
		for (yIdx = 0; yIdx < FLAGHEIGHT; yIdx++)
		{
			flagPoints[xIdx][yIdx][0] = (float)xIdx;
			flagPoints[xIdx][yIdx][1] = (float)yIdx;
			flagPoints[xIdx][yIdx][2] = float(sin((((float)xIdx*FLAGWIDTHf)/360.0f)*3.14159f*2.0f)); 
		}
	}
}


void aboutDrawFlag()
{
	int xIdx;
	int yIdx;
	float texLeft;
	float texBottom;
	float texTop;
	float texRight;

	glPushMatrix();
		glBindTexture(GL_TEXTURE_2D, texture);
		glBegin(GL_QUADS);

		for (xIdx = 0; xIdx < FLAGWIDTH; xIdx++)
		{
			for (yIdx = 0; yIdx < (FLAGHEIGHT-2); yIdx++)
			{
				texLeft = float(xIdx) / (FLAGWIDTHf-1.0f);
				texBottom = float(yIdx) / (FLAGHEIGHTf-2.0f);
				texRight = float(xIdx+1) / (FLAGWIDTHf-1.0f);
				texTop = float(yIdx+1) / (FLAGHEIGHTf-2.0f);

				glTexCoord2f( texLeft, texBottom);
				glVertex3f( flagPoints[xIdx][yIdx][0], flagPoints[xIdx][yIdx][1], flagPoints[xIdx][yIdx][2] );

				glTexCoord2f( texRight, texBottom );
				glVertex3f( flagPoints[xIdx+1][yIdx][0], flagPoints[xIdx+1][yIdx][1], flagPoints[xIdx+1][yIdx][2] );

				glTexCoord2f( texRight, texTop );
				glVertex3f( flagPoints[xIdx+1][yIdx+1][0], flagPoints[xIdx+1][yIdx+1][1], flagPoints[xIdx+1][yIdx+1][2] );

				glTexCoord2f( texLeft, texTop );
				glVertex3f( flagPoints[xIdx][yIdx+1][0], flagPoints[xIdx][yIdx+1][1], flagPoints[xIdx][yIdx+1][2] );
			}
		}
		glEnd();

		for( yIdx = 0; yIdx < FLAGHEIGHT-1; yIdx++ )
		{
			wrapValue = flagPoints[FLAGWIDTH-1][yIdx][2];
			
			for( xIdx = FLAGWIDTH-1; xIdx >= 0; xIdx--)
			{
				flagPoints[xIdx][yIdx][2] = flagPoints[xIdx-1][yIdx][2];
			}

			flagPoints[0][yIdx][2] = wrapValue;
		}

	glPopMatrix();
}


void aboutInitialize()
{
	glViewport(0, 0, pwidth, pheight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(54.0f,(GLfloat)pwidth/(GLfloat)pheight,1.0f,1000.0f);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

	glShadeModel(GL_SMOOTH);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
	glFrontFace(GL_CCW);

	glEnable(GL_TEXTURE_2D);

	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

	DWORD nn = ResizePicture(aboutJPEGPic, pwidth, pheight, pbpp, NULL, 512, 512);
	unsigned char *texdata = (unsigned char*)malloc_func(nn);
	ResizePicture(aboutJPEGPic, pwidth, pheight, pbpp, (char*)texdata, 512, 512);
	glTexImage2D(GL_TEXTURE_2D, 0, 3, 512,
				 512, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, texdata);

	free_func(texdata);

	aboutInitializeFlag();
}


void aboutRender()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		
	glLoadIdentity();

	glTranslatef(-16.0f, -12.0f, -27.0f);

	aboutDrawFlag();

	glFlush();
	SwapBuffers(g_HDC);
}


void aboutSetupPixelFormat(HDC hDC)
{
	int nPixelFormat;

	static PIXELFORMATDESCRIPTOR pfd = {
		sizeof(PIXELFORMATDESCRIPTOR),	// size of structure
		1,								// default version
		PFD_DRAW_TO_WINDOW |			// window drawing support
		PFD_SUPPORT_OPENGL |			// OpenGL support
		PFD_DOUBLEBUFFER,				// double buffering support
		PFD_TYPE_RGBA,					// RGBA color mode
		32,								// 32 bit color mode
		0, 0, 0, 0, 0, 0,				// ignore color bits, non-palettized mode
		0,								// no alpha buffer
		0,								// ignore shift bit
		0,								// no accumulation buffer
		0, 0, 0, 0,						// ignore accumulation bits
		16,								// 16 bit z-buffer size
		0,								// no stencil buffer
		0,								// no auxiliary buffer
		PFD_MAIN_PLANE,					// main drawing plane
		0,								// reserved
		0, 0, 0 };						// layer masks ignored

	nPixelFormat = ChoosePixelFormat(hDC, &pfd);

	SetPixelFormat(hDC, nPixelFormat, &pfd);
}




LRESULT CALLBACK DialogProcAbout(
    HWND hwnd,	
    UINT uMsg,	
    WPARAM wParam,	
    LPARAM lParam 	
   )
{	

	switch(uMsg)
	{
	case WM_ACTIVATE:
		if( (LOWORD(wParam) == WA_INACTIVE)||((BOOL)HIWORD(wParam) == TRUE))
			bActive = FALSE;
		else
			bActive = TRUE;
		
		return 0;
		break;


	case WM_TIMER:
		if((wParam == 10087)&&(bfloating == TRUE))
		{
			wglMakeCurrent(g_HDC, hRC);
			aboutRender();
			return 0;
		}

		if((wParam == 10088)&&(bfloating == FALSE))
		{
			KillTimer(dlgabout, 10088);
			bfloating = TRUE;
			SetTimer(dlgabout, 10087, 50, NULL);
			return 0;
		}
		return 0;


	case WM_INITDIALOG:
		bfloating = FALSE;
		dlgabout = hwnd;

		{
			char tmp[255];
			GetWindowText(dlgabout, tmp, 255);
			lstrcat(tmp, szAppName);
			SetWindowText(dlgabout, tmp);
		}
		
		g_HDC = GetDC(GetDlgItem(dlgabout, IDC_PIC1));
		aboutSetupPixelFormat(g_HDC);
		hRC = wglCreateContext(g_HDC);
		wglMakeCurrent(g_HDC, hRC);		
		if(aboutJPEGPic==NULL)
		{			
			HRSRC hr;
			hr = FindResourceEx(NULL, RT_RCDATA, MAKEINTRESOURCE(IDR_DATA1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));

			HGLOBAL hg = LoadResource(NULL, hr);
			LockResource(hr);

			DWORD ss = SizeofResource(NULL, hr);
			DWORD nn=IJGRead((unsigned char*)hg, ss, &pwidth, &pheight, &pbpp, NULL);
			aboutJPEGPic = (char*)malloc_func(nn);
			if(gLoadedItem < 1)
				IJGRead((unsigned char*)hg, ss, &pwidth, &pheight, &pbpp, (unsigned char*)aboutJPEGPic);
			else
			{
				if(lstrcmpi(gmpq.filename_table[gLoadedItem-1], "Units\\Human\\Arthas\\Arthas.mdx")==0)
				{
					IJGRead((unsigned char*)hg+EEGGS, ss, &pwidth, &pheight, &pbpp, (unsigned char*)aboutJPEGPic);
					bDispEgg = TRUE;
				}
				else
					IJGRead((unsigned char*)hg, ss, &pwidth, &pheight, &pbpp, (unsigned char*)aboutJPEGPic);
			}

			HorizFlip(aboutJPEGPic, pwidth*pbpp/8, pheight);
			switch(pbpp)
			{
				case 24:
					RGB2BGR(aboutJPEGPic, pwidth*pheight*pbpp/8);
					break;

				case 32:
					RGBA2BGRA(aboutJPEGPic, pwidth*pheight*pbpp/8);
					break;

				default:
					break;
			}
		}
		
		switch(currentlanguage)
		{
			case LANG_FRENCH:
				SetDlgItemText(hwnd, IDC_EDIT1, "David (programmeur) : \r\nTheProphet@wanadoo.fr\r\n\r\nMarcelo : \r\nKDEWolf@web.de\r\n\r\nhttp://www.wc3campaigns.com\r\nhttp://www.Xeberon.net\r\net Jean-Fran鏾is Roy (bahamut@macstorm.org, http://www.macstorm.org) : d閏ompression RLE des TGA et portage pour Mac OS X\r\nEt un 閚orme merci 

⌨️ 快捷键说明

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