ultimatepp/uppsrc/PaintGL/PaintGL.cpp
mdelfede 263ff5f895 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

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();
}