mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 22:02:49 -06:00
98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
#include "PaintGL.h"
|
|
|
|
#pragma comment( lib, "opengl32.lib" ) // Search For OpenGL32.lib While Linking
|
|
#pragma comment( lib, "glu32.lib" ) // Search For GLu32.lib While Linking
|
|
#pragma comment( lib, "glaux.lib" ) // Search For GLaux.lib While Linking
|
|
|
|
PaintGL::PaintGL()
|
|
{
|
|
size = Null;
|
|
hbmp = ohbmp = NULL;
|
|
hdc = NULL;
|
|
hrc = NULL;
|
|
}
|
|
|
|
PaintGL::~PaintGL()
|
|
{
|
|
Free();
|
|
}
|
|
|
|
void PaintGL::Free()
|
|
{
|
|
if(hrc) {
|
|
wglMakeCurrent(NULL, NULL);
|
|
wglDeleteContext(hrc);
|
|
SelectObject(hdc, ohbmp);
|
|
DeleteDC(hdc);
|
|
DeleteObject(hbmp);
|
|
hrc = NULL;
|
|
hbmp = ohbmp = NULL;
|
|
hdc = NULL;
|
|
hbmp = NULL;
|
|
}
|
|
size = Null;
|
|
}
|
|
|
|
|
|
void PaintGL::Init(Size sz) {
|
|
Free();
|
|
|
|
size = sz;
|
|
|
|
BITMAPINFOHEADER bih;
|
|
memset(&bih, 0, sizeof(bih));
|
|
bih.biSize = sizeof(bih);
|
|
bih.biWidth = ((((int) sz.cx * 8) + 31) & ~31) >> 3;
|
|
bih.biHeight = sz.cy;
|
|
bih.biPlanes = 1;
|
|
bih.biBitCount = 32;
|
|
bih.biCompression = BI_RGB;
|
|
|
|
hdc = CreateCompatibleDC(NULL);
|
|
|
|
void *dummy;
|
|
|
|
hbmp = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_PAL_COLORS, &dummy, NULL, 0);
|
|
|
|
ohbmp = (HBITMAP)SelectObject(hdc, hbmp);
|
|
|
|
PIXELFORMATDESCRIPTOR pfd;
|
|
memset(&pfd, 0, sizeof(pfd));
|
|
pfd.nSize = sizeof(pfd);
|
|
pfd.nVersion = 1;
|
|
pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL/* | PFD_SUPPORT_GDI | PFD_ACCELERATED*/;
|
|
pfd.iPixelType = PFD_TYPE_RGBA;
|
|
pfd.cColorBits = 32;
|
|
pfd.cDepthBits = 32;
|
|
pfd.iLayerType = PFD_MAIN_PLANE;
|
|
|
|
GLuint PixelFormat = ChoosePixelFormat(hdc, &pfd);
|
|
SetPixelFormat(hdc, PixelFormat, &pfd);
|
|
hrc = wglCreateContext(hdc);
|
|
wglMakeCurrent(hdc, hrc);
|
|
|
|
glShadeModel(GL_SMOOTH);
|
|
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
|
|
glClearDepth(1.0f);
|
|
glEnable(GL_DEPTH_TEST);
|
|
glDepthFunc(GL_LEQUAL);
|
|
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
|
|
|
glViewport(0, 0, (GLsizei)sz.cx, (GLsizei)sz.cy);
|
|
glMatrixMode(GL_PROJECTION);
|
|
glLoadIdentity();
|
|
gluPerspective(45.0f, (GLfloat)(sz.cx)/(GLfloat)(sz.cy), 1.0f, 100.0f);
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glLoadIdentity();
|
|
}
|
|
|
|
void PaintGL::Paint(Draw& w, const Rect& r, Callback gl)
|
|
{
|
|
if(r.Size() != size)
|
|
Init(r.Size());
|
|
gl();
|
|
glFlush();
|
|
HDC whdc = w.BeginGdi();
|
|
BitBlt(whdc, 0, 0, size.cx, size.cy, hdc, r.left, r.top, SRCCOPY);
|
|
w.EndGdi();
|
|
}
|