📄 about.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 + -