PIXELFORMATDESCRIPTOR pfd;
int iPixelFormat;
- WglDrawable(const Visual *vis) :
- Drawable(vis)
+ WglDrawable(const Visual *vis, int width, int height) :
+ Drawable(vis, width, height)
{
static bool first = TRUE;
RECT rect;
}
dwExStyle = 0;
- dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE | WS_OVERLAPPEDWINDOW;
+ dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW;
- int x = 0, y = 0, width = 256, height = 256;
+ int x = 0, y = 0;
rect.left = x;
rect.top = y;
hDC = GetDC(hWnd);
memset(&pfd, 0, sizeof pfd);
- pfd.cColorBits = 3;
+ pfd.cColorBits = 4;
pfd.cRedBits = 1;
pfd.cGreenBits = 1;
pfd.cBlueBits = 1;
+ pfd.cAlphaBits = 1;
pfd.cDepthBits = 1;
pfd.cStencilBits = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
}
void
- resize(unsigned w, unsigned h) {
- Drawable::resize(w, h);
+ resize(int w, int h) {
+ if (w == width && h == height) {
+ return;
+ }
+
RECT rClient, rWindow;
GetClientRect(hWnd, &rClient);
GetWindowRect(hWnd, &rWindow);
w += (rWindow.right - rWindow.left) - rClient.right;
h += (rWindow.bottom - rWindow.top) - rClient.bottom;
SetWindowPos(hWnd, NULL, rWindow.left, rWindow.top, w, h, SWP_NOMOVE);
+
+ Drawable::resize(w, h);
+ }
+
+ void show(void) {
+ if (visible) {
+ return;
+ }
+
+ ShowWindow(hWnd, SW_SHOW);
+
+ Drawable::show();
}
void swapBuffers(void) {
{
public:
HGLRC hglrc;
-
- WglContext(const Visual *vis) :
+ WglContext *shareContext;
+
+ WglContext(const Visual *vis, WglContext *share) :
Context(vis),
- hglrc(0)
+ hglrc(0),
+ shareContext(share)
{}
~WglContext() {
};
-class WglWindowSystem : public WindowSystem
-{
-public:
- Visual *
- createVisual(bool doubleBuffer) {
- Visual *visual = new Visual();
+void
+init(void) {
+}
- visual->doubleBuffer = doubleBuffer;
+void
+cleanup(void) {
+}
- return visual;
- }
-
- Drawable *
- createDrawable(const Visual *visual)
- {
- return new WglDrawable(visual);
- }
+Visual *
+createVisual(bool doubleBuffer) {
+ Visual *visual = new Visual();
- Context *
- createContext(const Visual *visual)
- {
- return new WglContext(visual);
- }
+ visual->doubleBuffer = doubleBuffer;
- bool
- makeCurrent(Drawable *drawable, Context *context)
- {
- if (!drawable || !context) {
- return wglMakeCurrent(NULL, NULL);
- } else {
- WglDrawable *wglDrawable = dynamic_cast<WglDrawable *>(drawable);
- WglContext *wglContext = dynamic_cast<WglContext *>(context);
+ return visual;
+}
+
+Drawable *
+createDrawable(const Visual *visual, int width, int height)
+{
+ return new WglDrawable(visual, width, height);
+}
+
+Context *
+createContext(const Visual *visual, Context *shareContext)
+{
+ return new WglContext(visual, dynamic_cast<WglContext *>(shareContext));
+}
+bool
+makeCurrent(Drawable *drawable, Context *context)
+{
+ if (!drawable || !context) {
+ return wglMakeCurrent(NULL, NULL);
+ } else {
+ WglDrawable *wglDrawable = dynamic_cast<WglDrawable *>(drawable);
+ WglContext *wglContext = dynamic_cast<WglContext *>(context);
+
+ if (!wglContext->hglrc) {
+ wglContext->hglrc = wglCreateContext(wglDrawable->hDC);
if (!wglContext->hglrc) {
- wglContext->hglrc = wglCreateContext(wglDrawable->hDC);
- if (!wglContext->hglrc) {
- return false;
- }
+ return false;
+ }
+ if (wglContext->shareContext) {
+ wglShareLists(wglContext->shareContext->hglrc,
+ wglContext->hglrc);
}
-
- return wglMakeCurrent(wglDrawable->hDC, wglContext->hglrc);
}
- }
- bool
- processEvents(void) {
- // TODO
- return true;
+ return wglMakeCurrent(wglDrawable->hDC, wglContext->hglrc);
}
-};
-
+}
-WindowSystem *createNativeWindowSystem(void) {
- return new WglWindowSystem();
+bool
+processEvents(void) {
+ // TODO
+ return true;
}
-} /* namespace glretrace */
+} /* namespace glws */