- DescribePixelFormat(dc, pixfmt, sizeof pfd, &pfd);
- ctx_info.rsize = pfd.cRedBits;
- ctx_info.gsize = pfd.cGreenBits;
- ctx_info.bsize = pfd.cBlueBits;
- ctx_info.asize = pfd.cAlphaBits;
- ctx_info.zsize = pfd.cDepthBits;
- ctx_info.ssize = pfd.cStencilBits;
- ctx_info.dblbuf = pfd.dwFlags & PFD_DOUBLEBUFFER ? 1 : 0;
- ctx_info.samples = 1; /* TODO */
- ctx_info.srgb = 0; /* TODO */
+ GETATTR(WGL_RED_BITS, &ctx_info.rsize);
+ GETATTR(WGL_GREEN_BITS, &ctx_info.gsize);
+ GETATTR(WGL_BLUE_BITS, &ctx_info.bsize);
+ GETATTR(WGL_ALPHA_BITS, &ctx_info.asize);
+ GETATTR(WGL_DEPTH_BITS, &ctx_info.zsize);
+ GETATTR(WGL_STENCIL_BITS, &ctx_info.ssize);
+ GETATTR(WGL_DOUBLE_BUFFER, &ctx_info.dblbuf);
+ GETATTR(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, &ctx_info.srgb);
+ GETATTR(WGL_SAMPLES_ARB, &ctx_info.samples);
+ return 0;
+
+fail:
+ if(tmpctx) {
+ wglMakeCurrent(0, 0);
+ wglDeleteContext(tmpctx);
+ }
+ if(tmpwin) {
+ DestroyWindow(tmpwin);
+ }
+ UnregisterClass(TMPCLASS, hinst);
+ return -1;
+}
+
+
+static void create_window(const char *title)
+{
+ int pixfmt;
+ PIXELFORMATDESCRIPTOR pfd = {0};
+ RECT rect;
+ int width, height;
+
+ rect.left = init_x;
+ rect.top = init_y;
+ rect.right = init_x + init_width;
+ rect.bottom = init_y + init_height;
+ AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, 0);
+ width = rect.right - rect.left;
+ height = rect.bottom - rect.top;
+
+ if(create_window_wglext(title, width, height) == -1) {
+
+ if(!(win = CreateWindow("MiniGLUT", title, WS_OVERLAPPEDWINDOW,
+ rect.left, rect.top, width, height, 0, 0, hinst, 0))) {
+ panic("Failed to create window\n");
+ }
+ dc = GetDC(win);
+
+ pfd.nSize = sizeof pfd;
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
+ if(init_mode & GLUT_STEREO) {
+ pfd.dwFlags |= PFD_STEREO;
+ }
+ pfd.iPixelType = init_mode & GLUT_INDEX ? PFD_TYPE_COLORINDEX : PFD_TYPE_RGBA;
+ pfd.cColorBits = 24;
+ if(init_mode & GLUT_ALPHA) {
+ pfd.cAlphaBits = 8;
+ }
+ if(init_mode & GLUT_ACCUM) {
+ pfd.cAccumBits = 24;
+ }
+ if(init_mode & GLUT_DEPTH) {
+ pfd.cDepthBits = 24;
+ }
+ if(init_mode & GLUT_STENCIL) {
+ pfd.cStencilBits = 8;
+ }
+ pfd.iLayerType = PFD_MAIN_PLANE;
+
+ if(!(pixfmt = ChoosePixelFormat(dc, &pfd))) {
+ panic("Failed to find suitable pixel format\n");
+ }
+ if(!SetPixelFormat(dc, pixfmt, &pfd)) {
+ panic("Failed to set the selected pixel format\n");
+ }
+ if(!(ctx = wglCreateContext(dc))) {
+ panic("Failed to create the OpenGL context\n");
+ }
+ wglMakeCurrent(dc, ctx);
+
+ DescribePixelFormat(dc, pixfmt, sizeof pfd, &pfd);
+ ctx_info.rsize = pfd.cRedBits;
+ ctx_info.gsize = pfd.cGreenBits;
+ ctx_info.bsize = pfd.cBlueBits;
+ ctx_info.asize = pfd.cAlphaBits;
+ ctx_info.zsize = pfd.cDepthBits;
+ ctx_info.ssize = pfd.cStencilBits;
+ ctx_info.dblbuf = pfd.dwFlags & PFD_DOUBLEBUFFER ? 1 : 0;
+ ctx_info.samples = 0;
+ ctx_info.srgb = 0;
+ }