/** * @RDE_HEADER@ * Small wrapper to automatically start thp_viewer * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-02-29 */ #include #include #include static void* getGLExtensionFuncPtr(const char *funcName, const char *fallbackFuncName) { void* ptr = wglGetProcAddress(funcName); if (ptr) return ptr; return wglGetProcAddress(fallbackFuncName); } static int checkOpenGL(HWND hWnd) { HDC hDC = GetDC( hWnd ); PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_SWAP_EXCHANGE; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cRedBits = 8; pfd.cGreenBits = 8; pfd.cBlueBits = 8; pfd.cAlphaBits = 8; pfd.cDepthBits = 0; pfd.iLayerType = PFD_MAIN_PLANE; int iFormat = ChoosePixelFormat( hDC, &pfd ); if( !SetPixelFormat( hDC, iFormat, &pfd ) ) { DWORD dw = GetLastError(); int ret = MessageBox(NULL, L"Your system does not support some mandatory OpenGL Functions.\nThe THP-Viewer may not display all things correct!\nDo you really want to start the THP-viewer?", L"THP-Viewer startup", MB_ICONWARNING|MB_YESNO); if(ret == IDNO) { ReleaseDC( hWnd, hDC ); return 1; } } HGLRC hRC = wglCreateContext( hDC ); DWORD dw = wglMakeCurrent( hDC, hRC ); void *_glCompressedTexImage2D = getGLExtensionFuncPtr( "glCompressedTexImage2D", "glCompressedTexImage2DARB" ); if(!_glCompressedTexImage2D) { int ret = MessageBox(NULL, L"Your system does not support the mandatory OpenGL Function glCompressedTexImage2D.\nThe THP-Viewer may not display all things correct!\nDo you really want to start the THP-viewer?", L"THP-Viewer startup", MB_ICONWARNING|MB_YESNO); if(ret == IDNO) { wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); return 1; } } wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); return 0; } static int startThpViewer(HINSTANCE hInstance) { TCHAR fn[MAX_PATH*10]; DWORD len = GetModuleFileName(hInstance, fn, sizeof(fn)); for(int i = len - 1; i >= 0; --i) { if(fn[i] == '\\') break; fn[i] = '\0'; } wcscat(fn, L"thp\\thp_viewer.exe"); STARTUPINFO si; ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); DWORD ret = CreateProcess(fn, NULL, // lpCommandLine NULL, // lpProcessAttributes NULL, // lpThreadAttributes NULL, // bInheritHandles 0, // dwCreationFlags NULL, // lpEnvironment NULL, // lpCurrentDirectory &si, // lpStartupInfo &pi); // lpProcessInformation if(ret == 0) { MessageBox(NULL, L"Error starting the THP-Viewer!", L"THP-Viewer startup", MB_ICONWARNING|MB_OK); return 1; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return DefWindowProc( hWnd, message, wParam, lParam ); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; ZeroMemory( &wc, sizeof(wc) ); // register window class wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = L"THP_Viewer_startup"; RegisterClass( &wc ); // create main window HWND hWnd = CreateWindow(L"THP_Viewer_startup", L"THP-Viewer startup", WS_CAPTION | WS_POPUPWINDOW, 0, 0, 256, 256, NULL, NULL, hInstance, NULL ); int iRet = checkOpenGL(hWnd); if(iRet != 0) return iRet; return startThpViewer(hInstance); }