]> git.cworth.org Git - apitrace/blobdiff - glws_wgl.cpp
Add a top-level apitrace program.
[apitrace] / glws_wgl.cpp
index 7e5807146375646500b723ce8f4ac819a2057519..1958b5fc22a193aa8f64cc116231631806768be9 100644 (file)
 namespace glws {
 
 
+static LRESULT CALLBACK
+WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    MINMAXINFO *pMMI;
+    switch (uMsg) {
+    case WM_GETMINMAXINFO:
+        // Allow to create a window bigger than the desktop
+        pMMI = (MINMAXINFO *)lParam;
+        pMMI->ptMaxSize.x = 60000;
+        pMMI->ptMaxSize.y = 60000;
+        pMMI->ptMaxTrackSize.x = 60000;
+        pMMI->ptMaxTrackSize.y = 60000;
+        break;
+    default:
+        break;
+    }
+
+    return DefWindowProc(hWnd, uMsg, wParam, lParam);
+}
+
+
 class WglDrawable : public Drawable
 {
 public:
@@ -40,8 +61,8 @@ public:
     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;
@@ -52,7 +73,7 @@ public:
             wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
             wc.hCursor = LoadCursor(NULL, IDC_ARROW);
             wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
-            wc.lpfnWndProc = DefWindowProc;
+            wc.lpfnWndProc = WndProc;
             wc.lpszClassName = "glretrace";
             wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
             RegisterClass(&wc);
@@ -60,9 +81,9 @@ public:
         }
 
         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;
@@ -75,8 +96,8 @@ public:
                               "glretrace", /* wc.lpszClassName */
                               NULL,
                               dwStyle,
-                              CW_USEDEFAULT, /* x */
-                              CW_USEDEFAULT, /* y */
+                              0, /* x */
+                              0, /* y */
                               rect.right - rect.left, /* width */
                               rect.bottom - rect.top, /* height */
                               NULL,
@@ -86,10 +107,13 @@ public:
         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;
         pfd.iLayerType = PFD_MAIN_PLANE;
         pfd.iPixelType = PFD_TYPE_RGBA;
@@ -111,14 +135,29 @@ public:
     }
     
     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;
-        MoveWindow(hWnd, rWindow.left, rWindow.top, w, h, TRUE);
+        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) {
@@ -131,10 +170,12 @@ class WglContext : public Context
 {
 public:
     HGLRC hglrc;
-    
-    WglContext(const Visual *vis) :
+    WglContext *shareContext;
+
+    WglContext(const Visual *vis, WglContext *share) :
         Context(vis),
-        hglrc(0)
+        hglrc(0),
+        shareContext(share)
     {}
 
     ~WglContext() {
@@ -145,61 +186,64 @@ public:
 };
 
 
-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 */