diff --git a/panda/src/wcrdisplay/config_wcrdisplay.cxx b/panda/src/wcrdisplay/config_wcrdisplay.cxx deleted file mode 100644 index 7ae4ed1abf..0000000000 --- a/panda/src/wcrdisplay/config_wcrdisplay.cxx +++ /dev/null @@ -1,91 +0,0 @@ -// Filename: config_wcrdisplay.cxx -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#include "config_wcrdisplay.h" -#include "wcrGraphicsPipe.h" -#include "wcrGraphicsWindow.h" - -#include "dconfig.h" - -Configure(config_wcrdisplay); -NotifyCategoryDef(wcrdisplay, "display"); - -ConfigureFn(config_wcrdisplay) { - init_libwcrdisplay(); -} - -// Configure this true to force the rendering to sync to the video -// refresh, or false to let your frame rate go as high as it can, -// irrespective of the video refresh. (if this capability is available in the ICD) -bool gl_sync_video = config_wcrdisplay.GetBool("sync-video", true); - -bool gl_show_fps_meter = config_wcrdisplay.GetBool("show-fps-meter", false); -float gl_fps_meter_update_interval = max(0.5,config_wcrdisplay.GetFloat("fps-meter-update-interval", 1.7)); -int gl_forced_pixfmt=config_wcrdisplay.GetInt("gl-force-pixfmt", 0); - -bool bResponsive_minimized_fullscreen_window = config_wcrdisplay.GetBool("responsive-minimized-fullscreen-window",false); - -// Set this true to not attempt to use any of the function calls that -// will crab out WireGL. -bool support_wiregl = config_wcrdisplay.GetBool("support-wiregl", false); - -extern void AtExitFn(); - -//////////////////////////////////////////////////////////////////// -// Function: init_libwcrdisplay -// Description: Initializes the library. This must be called at -// least once before any of the functions or classes in -// this library can be used. Normally it will be -// called by the static initializers and need not be -// called explicitly, but special cases exist. -//////////////////////////////////////////////////////////////////// -void -init_libwcrdisplay() { - static bool initialized = false; - if (initialized) { - return; - } - initialized = true; - - wcrGraphicsPipe::init_type(); - GraphicsPipe::get_factory().register_factory( - wcrGraphicsPipe::get_class_type(), - wcrGraphicsPipe::make_wcrGraphicsPipe); - wcrGraphicsWindow::init_type(); - GraphicsWindow::get_factory().register_factory( - wcrGraphicsWindow::get_class_type(), - wcrGraphicsWindow::make_wcrGraphicsWindow); - - atexit(AtExitFn); -} - -// cant use global var cleanly because global var static init executed after init_libwcr(), incorrectly reiniting var -Filename get_icon_filename_2() { - string iconname = config_wcrdisplay.GetString("win32-window-icon",""); - return ExecutionEnvironment::expand_string(iconname); -} - -Filename get_color_cursor_filename_2() { - string cursorname = config_wcrdisplay.GetString("win32-color-cursor",""); - return ExecutionEnvironment::expand_string(cursorname); -} - -Filename get_mono_cursor_filename_2() { - string cursorname = config_wcrdisplay.GetString("win32-mono-cursor",""); - return ExecutionEnvironment::expand_string(cursorname); -} diff --git a/panda/src/wcrdisplay/config_wcrdisplay.h b/panda/src/wcrdisplay/config_wcrdisplay.h deleted file mode 100644 index 172b0cffea..0000000000 --- a/panda/src/wcrdisplay/config_wcrdisplay.h +++ /dev/null @@ -1,43 +0,0 @@ -// Filename: config_wcrdisplay.h -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#ifndef __CONFIG_WCRDISPLAY_H__ -#define __CONFIG_WCRDISPLAY_H__ - -#include "pandabase.h" -#include "filename.h" -#include "notifyCategoryProxy.h" - -NotifyCategoryDecl(wcrdisplay, EXPCL_PANDACR, EXPTP_PANDACR); - -// for some reason there is a conflict with the pandadx versions of get_icon_filename during linking, -// so appended '_2' to name -extern Filename get_icon_filename_2(); -extern Filename get_color_cursor_filename_2(); -extern Filename get_mono_cursor_filename_2(); - -extern bool gl_show_fps_meter; -extern float gl_fps_meter_update_interval; -extern bool gl_sync_video; -extern int gl_forced_pixfmt; -extern bool bResponsive_minimized_fullscreen_window; -extern bool support_wiregl; - -extern EXPCL_PANDACR void init_libwcrdisplay(); - -#endif /* __CONFIG_WCRDISPLAY_H__ */ diff --git a/panda/src/wcrdisplay/index.html b/panda/src/wcrdisplay/index.html deleted file mode 100644 index 15e7b449a5..0000000000 --- a/panda/src/wcrdisplay/index.html +++ /dev/null @@ -1,9 +0,0 @@ -

wcrdisplay

-Windows Chromium Display -

-This directory contains pipe and window creation code for using -chromium within -panda. -

-The plan is that chromium (network gl) and gl (local gl) will -run together. \ No newline at end of file diff --git a/panda/src/wcrdisplay/test_wcr.cxx b/panda/src/wcrdisplay/test_wcr.cxx deleted file mode 100644 index f2da19ef23..0000000000 --- a/panda/src/wcrdisplay/test_wcr.cxx +++ /dev/null @@ -1,78 +0,0 @@ -// Filename: test_wcr.cxx -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#include "graphicsPipe.h" -#include "interactiveGraphicsPipe.h" -#include "notify.h" -#include "pt_NamedNode.h" - -#include "wcrGraphicsWindow.h" - -PT(GraphicsPipe) main_pipe; -PT(GraphicsWindow) main_win; -PT_NamedNode render; - -void render_frame(GraphicsPipe *pipe) { - GraphicsPipe::wins_iterator wi; - for (wi = pipe->get_win_begin(); - wi != pipe->get_win_end(); - ++wi) { - (*wi)->get_gsg()->render_frame(); - } -} - -void display_func() { - render_frame(main_pipe); -} - -int main() { - - GraphicsPipe::resolve_modules(); - - cout << "Known pipe types:" << endl; - GraphicsPipe::PipeFactory::FactoryTypesIter pti; - for (pti = GraphicsPipe::_factory.get_types_begin(); - pti != GraphicsPipe::_factory.get_types_end(); ++pti) { - cout << " " << (*pti) << endl; - } - cout << "after Known pipe types" << endl; - - GraphicsPipe::PipeFactory& factory = GraphicsPipe::_factory; - GraphicsPipe::PipePrioritiesIter pribegin = - GraphicsPipe::get_priorities_begin(); - GraphicsPipe::PipePrioritiesIter priend = GraphicsPipe::get_priorities_end(); - - GraphicsPipe::PipeParams ps1; - if (pribegin == priend) - main_pipe = factory.instance(InteractiveGraphicsPipe::get_class_type(), - ps1.begin(), ps1.end()); - else - main_pipe = factory.instance(InteractiveGraphicsPipe::get_class_type(), - ps1.begin(), ps1.end(), pribegin, priend); - nassertr(main_pipe != (GraphicsPipe*)0L, 0); - cout << "Opened a '" << main_pipe->get_type().get_name() - << "' interactive graphics pipe." << endl; - - main_win = new wcrGraphicsWindow(main_pipe); -#if 0 - main_win->register_draw_function(display_func); - main_win->main_loop(); -#endif - - return 0; -} diff --git a/panda/src/wcrdisplay/wcrGraphicsPipe.cxx b/panda/src/wcrdisplay/wcrGraphicsPipe.cxx deleted file mode 100644 index 045fb5f939..0000000000 --- a/panda/src/wcrdisplay/wcrGraphicsPipe.cxx +++ /dev/null @@ -1,82 +0,0 @@ -// Filename: wcrGraphicsPipe.cxx -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// -#include "wcrGraphicsPipe.h" -#include "config_wcrdisplay.h" - -//////////////////////////////////////////////////////////////////// -// Static variables -//////////////////////////////////////////////////////////////////// -TypeHandle wcrGraphicsPipe::_type_handle; - -wcrGraphicsPipe::wcrGraphicsPipe(const PipeSpecifier& spec) - : InteractiveGraphicsPipe(spec) -{} - -//////////////////////////////////////////////////////////////////// -// Function: wcrGraphicsPipe::get_window_type -// Access: Published, Virtual -// Description: Returns the TypeHandle of the kind of window -// preferred by this kind of pipe. -//////////////////////////////////////////////////////////////////// -TypeHandle wcrGraphicsPipe:: -get_window_type() const { - return wcrGraphicsWindow::get_class_type(); -} - -GraphicsPipe *wcrGraphicsPipe:: -make_wcrGraphicsPipe(const FactoryParams ¶ms) { - GraphicsPipe::PipeSpec *pipe_param; - if (!get_param_into(pipe_param, params)) { - return new wcrGraphicsPipe(PipeSpecifier()); - } else { - return new wcrGraphicsPipe(pipe_param->get_specifier()); - } -} - - -TypeHandle wcrGraphicsPipe::get_class_type() { - return _type_handle; -} - -const char *pipe_type_name="wcrGraphicsPipe"; - -void wcrGraphicsPipe::init_type() { - InteractiveGraphicsPipe::init_type(); - register_type(_type_handle, pipe_type_name, - InteractiveGraphicsPipe::get_class_type()); -} - -TypeHandle wcrGraphicsPipe::get_type() const { - return get_class_type(); -} - -wcrGraphicsPipe::wcrGraphicsPipe() { - wcrdisplay_cat.error() - << pipe_type_name <<"s should not be created with the default constructor" << endl; -} - -wcrGraphicsPipe::wcrGraphicsPipe(const wcrGraphicsPipe&) { - wcrdisplay_cat.error() - << pipe_type_name << "s should not be copied" << endl; -} - -wcrGraphicsPipe& wcrGraphicsPipe::operator=(const wcrGraphicsPipe&) { - wcrdisplay_cat.error() - << pipe_type_name << "s should not be assigned" << endl; - return *this; -} diff --git a/panda/src/wcrdisplay/wcrGraphicsPipe.h b/panda/src/wcrdisplay/wcrGraphicsPipe.h deleted file mode 100644 index ca096543e9..0000000000 --- a/panda/src/wcrdisplay/wcrGraphicsPipe.h +++ /dev/null @@ -1,63 +0,0 @@ -// Filename: wcrGraphicsPipe.h -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// -#ifndef WCRGRAPHICSPIPE_H -#define WCRGRAPHICSPIPE_H -// -//////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////// -#include "pandabase.h" - -#include -#include "interactiveGraphicsPipe.h" -//#include "wcrGraphicsWindow.h" -#define WINDOWS_LEAN_AND_MEAN -#include -#undef WINDOWS_LEAN_AND_MEAN - -//////////////////////////////////////////////////////////////////// -// Class : wcrGraphicsPipe -// Description : -//////////////////////////////////////////////////////////////////// -class EXPCL_PANDACR wcrGraphicsPipe : public InteractiveGraphicsPipe { -PUBLISHED: - wcrGraphicsPipe(const PipeSpecifier&); - - virtual TypeHandle get_window_type() const; - -public: - - static GraphicsPipe* make_wcrGraphicsPipe(const FactoryParams ¶ms); - - static TypeHandle get_class_type(); - static void init_type(); - virtual TypeHandle get_type() const; - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} - -private: - - static TypeHandle _type_handle; - -protected: - - wcrGraphicsPipe(); - wcrGraphicsPipe(const wcrGraphicsPipe&); - wcrGraphicsPipe& operator=(const wcrGraphicsPipe&); -}; - -#endif diff --git a/panda/src/wcrdisplay/wcrGraphicsWindow.cxx b/panda/src/wcrdisplay/wcrGraphicsWindow.cxx deleted file mode 100644 index b52f65917e..0000000000 --- a/panda/src/wcrdisplay/wcrGraphicsWindow.cxx +++ /dev/null @@ -1,1887 +0,0 @@ -// Filename: wcrGraphicsWindow.cxx -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// - -#include "wcrGraphicsWindow.h" -#include "wcrGraphicsPipe.h" -#include "config_wcrdisplay.h" -#include "keyboardButton.h" -#include "mouseButton.h" -#include "crGraphicsStateGuardian.h" -#include -#include -#include -#include -#include -#include "throw_event.h" -//#include "eventQueue.h" -#include -#include "../wgldisplay/Win32Defs.h" - -//#include "ChromiumOpenGL.h" - -#ifdef DO_PSTATS -#include "pStatTimer.h" -#endif - -#define WCR_WCREXT_PROTOTYPES -#include "wcrext.h" - -//////////////////////////////////////////////////////////////////// -// Static variables -//////////////////////////////////////////////////////////////////// -TypeHandle wcrGraphicsWindow::_type_handle; - -static bool wc_registered = false; - -#define MOUSE_ENTERED 0 -#define MOUSE_EXITED 1 - -#define FONT_BITMAP_OGLDISPLAYLISTNUM 1000 // an arbitrary ID # - -#define LAST_ERROR 0 -#define ERRORBOX_TITLE "Panda3D Error" -#define WCR_WINDOWCLASSNAME "wcrDisplay" - -#define PAUSED_TIMER_ID 7 // completely arbitrary choice - -typedef map HWND_PANDAWIN_MAP; - -HWND_PANDAWIN_MAP hwnd_pandawin_map; -wcrGraphicsWindow *global_wcrwinptr=NULL; // need this for temporary windproc - -typedef enum {Software, MCD, ICD} OGLDriverType; -static char *OGLDrvStrings[3] = {"Software","MCD","ICD"}; - -LONG WINAPI static_window_proc(HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam); - -// because we dont have access to ModifierButtons, as a hack just synchronize state of these -// keys on get/lose keybd focus -#define NUM_MODIFIER_KEYS 16 -unsigned int hardcoded_modifier_buttons[NUM_MODIFIER_KEYS]={VK_SHIFT,VK_MENU,VK_CONTROL,VK_SPACE,VK_TAB, - VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,VK_PRIOR,VK_NEXT,VK_HOME,VK_END, - VK_INSERT,VK_DELETE,VK_ESCAPE}; - -// dont pick any video modes < MIN_REFRESH_RATE Hz -#define MIN_REFRESH_RATE 60 -// EnumDisplaySettings may indicate 0 or 1 for refresh rate, which means use driver default rate (assume its >min_refresh_rate) -#define ACCEPTABLE_REFRESH_RATE(RATE) ((RATE >= MIN_REFRESH_RATE) || (RATE==0) || (RATE==1)) - -void PrintErrorMessage(DWORD msgID) { - LPTSTR pMessageBuffer; - - if (msgID==LAST_ERROR) - msgID=GetLastError(); - - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL,msgID, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language - (LPTSTR) &pMessageBuffer, // the weird ptrptr->ptr cast is intentional, see FORMAT_MESSAGE_ALLOCATE_BUFFER - 1024, NULL); - MessageBox(GetDesktopWindow(),pMessageBuffer,_T(ERRORBOX_TITLE),MB_OK); - wcrdisplay_cat.fatal() << "System error msg: " << pMessageBuffer << endl; - LocalFree(pMessageBuffer); -} - -// fn exists so AtExitFn can call it without refcntr blowing up since its !=0 -void wcrGraphicsWindow::DestroyMe(bool bAtExitFnCalled) { - - _exiting_window = true; // needed before DestroyWindow call - - // several GL drivers (voodoo,ATI, not nvidia) crash if we call these wcr deletion routines from - // an atexit() fn. Possible that GL has already unloaded itself. So we just wont call them for now - // for that case, we're exiting the app anyway. - if (!bAtExitFnCalled) { - // to do gl releases, we need to have the context be current - #if 0 //[ TODO:skyler - if ((_hdc!=NULL)&&(_context!=NULL)) { - // need to bypass make_current() since it checks _window_inactive - // which we need to ignore - HGLRC current_context = GetCurrentContext(); - //TODO: HDC current_dc = chromium.GetCurrentDC(); - HDC current_dc = NULL; - - if ((current_context != _context) || (current_dc != _hdc)) { - if (!chromium.MakeCurrent(_hdc, 0, _context)) { - PrintErrorMessage(LAST_ERROR); - } - } - report_errors(); - } - #endif //] - - if (gl_show_fps_meter) - chromium.DeleteLists(FONT_BITMAP_OGLDISPLAYLISTNUM, 128); - - report_errors(); - - // implicitly calls gsg destructors which release GL objects (textures, display lists, etc) - release_gsg(); - - report_errors(); - // cant report errors after we set cur context to NULL - - #if 0 //[ TODO:skyler - HGLRC curcxt=GetCurrentContext(); - if (curcxt!=NULL) - unmake_current(); - - if (_context!=NULL) { - chromium.DeleteContext(_context); - _context = NULL; - } - #endif //] - } - - if (_hdc!=NULL) { - ReleaseDC(_mwindow,_hdc); - _hdc = NULL; - } - - if ((_hOldForegroundWindow!=NULL) && (_mwindow==GetForegroundWindow())) { - SetForegroundWindow(_hOldForegroundWindow); - } - - if (_mwindow!=NULL) { - if (_bLoadedCustomCursor && _hMouseCursor!=NULL) - DestroyCursor(_hMouseCursor); - - DestroyWindow(_mwindow); - hwnd_pandawin_map.erase(_mwindow); - _mwindow = NULL; - } - - if (_pCurrent_display_settings!=NULL) { - delete _pCurrent_display_settings; - _pCurrent_display_settings = NULL; - } - - if (_props._fullscreen) { - // revert to default display mode - ChangeDisplaySettings(NULL,0x0); - } -} - -void wcrGraphicsWindow::do_close_window() { - GraphicsWindow::do_close_window(); - DestroyMe(false); -} - -//////////////////////////////////////////////////////////////////// -// Function: Destructor -// Access: -// Description: -//////////////////////////////////////////////////////////////////// -wcrGraphicsWindow::~wcrGraphicsWindow() { - close_window(); -} - -void DestroyAllWindows(bool bAtExitFnCalled) { - // need to go through all windows in map var and delete them - while(!hwnd_pandawin_map.empty()) { - // cant use a for loop cause DestroyMe erases things out from under us, so iterator is invalid - HWND_PANDAWIN_MAP::iterator pwin = hwnd_pandawin_map.begin(); - if ((*pwin).second != NULL) - (*pwin).second->DestroyMe(bAtExitFnCalled); - } -} - -void AtExitFn() { - #ifdef _DEBUG - wcrdisplay_cat.spam() << "AtExitFn called\n"; - #endif - DestroyAllWindows(true); -} - -bool find_acceptable_display_mode(DWORD dwWidth,DWORD dwHeight,DWORD bpp,DEVMODE &dm) { - int modenum=0; - - // look for acceptable mode - while(1) { - ZeroMemory(&dm, sizeof(dm)); - dm.dmSize = sizeof(dm); - - if (!EnumDisplaySettings(NULL,modenum,&dm)) - break; - - if ((dm.dmPelsWidth==dwWidth) && (dm.dmPelsHeight==dwHeight) && - (dm.dmBitsPerPel==bpp) && ACCEPTABLE_REFRESH_RATE(dm.dmDisplayFrequency)) { - return true; - } - modenum++; - } - - return false; -} - -//////////////////////////////////////////////////////////////////// -// Function: config -// Access: -// Description: -//////////////////////////////////////////////////////////////////// -void wcrGraphicsWindow::config() { -#if 1 //[ - int spu_ids[] = { 0, 1 }; - char *spu_names[] = { "readback", "pack" }; - //char *spu_names[] = { "print", "pack" }; - SPU *spu; - spu = crSPULoadChain(sizeof(spu_names)/sizeof(spu_names[0]), spu_ids, - spu_names, NULL, NULL); - if (!spu) { - cerr << "!spu" << endl; - exit(0); - } - chromium=spu->dispatch_table; - /***/ cerr << "CRGraphicsStateGuardian chromium:" << (void*)&chromium << - " spu:" << (void*)spu << " dispatch:" << (void*)&(spu->dispatch_table) << "\n\n\n\n\n\n" << endl; - ///***/ __asm int 3 -#endif //] - - GraphicsWindow::config(); - - HINSTANCE hinstance = GetModuleHandle(NULL); - HWND hDesktopWindow = GetDesktopWindow(); - - global_wcrwinptr = this; // need this until we get an HWND from CreateWindow - - _exiting_window = false; - _return_control_to_app = false; - _bIsLowVidMemCard = false; - _active_minimized_fullscreen = false; - _PandaPausedTimer = NULL; - _mouse_input_enabled = false; - _mouse_motion_enabled = false; - _mouse_passive_motion_enabled = false; - _mouse_entry_enabled = false; - _context = NULL; - _hdc = NULL; - _window_inactive = false; - _pCurrent_display_settings = NULL; - _mwindow = NULL; - _gsg = NULL; - ZeroMemory(&_pixelformat,sizeof(_pixelformat)); - _hOldForegroundWindow=GetForegroundWindow(); - - WNDCLASS wc; - - // Clear before filling in window structure! - ZeroMemory(&wc, sizeof(WNDCLASS)); - wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; - wc.lpfnWndProc = (WNDPROC) static_window_proc; - wc.hInstance = hinstance; - - string windows_icon_filename = get_icon_filename_2().to_os_specific(); - string windows_mono_cursor_filename = get_mono_cursor_filename_2().to_os_specific(); - - if (!windows_icon_filename.empty()) { - // Note: LoadImage seems to cause win2k internal heap corruption (outputdbgstr warnings) - // if icon is more than 8bpp - - // loads a .ico fmt file - wc.hIcon = (HICON) LoadImage(NULL, windows_icon_filename.c_str(), IMAGE_ICON, 0, 0, LR_LOADFROMFILE); - - if (wc.hIcon==NULL) { - wcrdisplay_cat.warning() << "windows icon filename '" << windows_icon_filename << "' not found!!\n"; - } - } else { - wc.hIcon = NULL; // use default app icon - } - - _bLoadedCustomCursor = false; - if (!windows_mono_cursor_filename.empty()) { - // Note: LoadImage seems to cause win2k internal heap corruption (outputdbgstr warnings) - // if icon is more than 8bpp (because it was 'mapping' 16bpp colors to the device?) - - DWORD load_flags = LR_LOADFROMFILE; - - if (_props._fullscreen) { - // I think cursors should use LR_CREATEDIBSECTION since they should not be mapped to the device palette (in the case of 256-color cursors) - // since they are not going to be used on the desktop - load_flags |= LR_CREATEDIBSECTION; - } - - // loads a .cur fmt file - _hMouseCursor = (HCURSOR) LoadImage(NULL, windows_mono_cursor_filename.c_str(), IMAGE_CURSOR, 0, 0, load_flags); - - if (_hMouseCursor==NULL) { - wcrdisplay_cat.warning() << "windows cursor filename '" << windows_mono_cursor_filename << "' not found!!\n"; - } - _bLoadedCustomCursor = true; - } else { - _hMouseCursor = LoadCursor(NULL, IDC_ARROW); - } - - if (!wc_registered) { - // We only need to register the window class once per session. - wc.hCursor = _hMouseCursor; - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = WCR_WINDOWCLASSNAME; - - if (!RegisterClass(&wc)) { - wcrdisplay_cat.error() << "could not register window class!" << endl; - } - wc_registered = true; - } - -// from MSDN: -// An OpenGL window has its own pixel format. Because of this, only device contexts retrieved -// for the client area of an OpenGL window are allowed to draw into the window. As a result, an -// OpenGL window should be created with the WS_CLIPCHILDREN and WS_CLIPSIBLINGS styles. Additionally, -// the window class attribute should not include the CS_PARENTDC style. - - DWORD window_style = WS_POPUP | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; // for CreateWindow - - // rect now contains the coords for the entire window, not the client - if (_props._fullscreen) { - DWORD dwWidth = _props._xsize; - DWORD dwHeight = _props._ysize; - - HDC scrnDC=GetDC(hDesktopWindow); - DWORD drvr_ver=GetDeviceCaps(scrnDC,DRIVERVERSION); - DWORD cur_bitdepth=GetDeviceCaps(scrnDC,BITSPIXEL); - DWORD cur_scrnwidth=GetDeviceCaps(scrnDC,HORZRES); - DWORD cur_scrnheight=GetDeviceCaps(scrnDC,VERTRES); - ReleaseDC(hDesktopWindow,scrnDC); - - DWORD dwFullScreenBitDepth=cur_bitdepth; - - DEVMODE dm; - if (!find_acceptable_display_mode(dwWidth,dwHeight,dwFullScreenBitDepth,dm)) { - wcrdisplay_cat.fatal() << "Videocard has no supported display resolutions at specified res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<")\n"; - exit(1); - } - - // I'd prefer to CreateWindow after DisplayChange in case it messes up GL somehow, - // but I need the window's black background to cover up the desktop during the mode change - _mwindow = CreateWindow(WCR_WINDOWCLASSNAME, _props._title.c_str(), - window_style,0,0,dwWidth,dwHeight,hDesktopWindow, NULL, hinstance, 0); - - // move window to top of zorder, - SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE); - - ShowWindow(_mwindow, SW_SHOWNORMAL); - ShowWindow(_mwindow, SW_SHOWNORMAL); - - int chg_result = ChangeDisplaySettings(&dm, CDS_FULLSCREEN); - - if (chg_result!=DISP_CHANGE_SUCCESSFUL) { - wcrdisplay_cat.fatal() << "ChangeDisplaySettings failed (error code: " << chg_result <<") for specified res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<"), " << dm.dmDisplayFrequency << "Hz\n"; - exit(1); - } - - _pCurrent_display_settings = new(DEVMODE); - memcpy(_pCurrent_display_settings,&dm,sizeof(DEVMODE)); - - _props._xorg = 0; - _props._yorg = 0; - _props._xsize = dwWidth; - _props._ysize = dwHeight; - - if (wcrdisplay_cat.is_debug()) - wcrdisplay_cat.debug() << "set fullscreen mode at res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<"), " << dm.dmDisplayFrequency << "Hz\n"; - } else { - - RECT win_rect; - SetRect(&win_rect, _props._xorg, _props._yorg, _props._xorg + _props._xsize, - _props._yorg + _props._ysize); - - if (_props._border) { - window_style |= WS_OVERLAPPEDWINDOW; - } - - BOOL bRes = AdjustWindowRect(&win_rect, window_style, FALSE); //compute window size based on desired client area size - - if (!bRes) { - wcrdisplay_cat.fatal() << "AdjustWindowRect failed!" << endl; - exit(1); - } - - // make sure origin is on screen, slide far bounds over if necessary - if (win_rect.left < 0) { - win_rect.right += abs(win_rect.left); win_rect.left = 0; - } - if (win_rect.top < 0) { - win_rect.bottom += abs(win_rect.top); win_rect.top = 0; - } - - _mwindow = CreateWindow(WCR_WINDOWCLASSNAME, _props._title.c_str(), - window_style, win_rect.left, win_rect.top, win_rect.right-win_rect.left, - win_rect.bottom-win_rect.top, - NULL, NULL, hinstance, 0); - } - - if (!_mwindow) { - wcrdisplay_cat.fatal() << "CreateWindow() failed!" << endl; - PrintErrorMessage(LAST_ERROR); - exit(1); - } - - // Determine the initial open status of the IME. - _ime_open = false; - HIMC hIMC = ImmGetContext(_mwindow); - if (hIMC != 0) { - _ime_open = (ImmGetOpenStatus(hIMC) != 0); - ImmReleaseContext(_mwindow, hIMC); - } - - hwnd_pandawin_map[_mwindow] = this; - global_wcrwinptr = NULL; // get rid of any reference to this obj - - // move window to top of zorder - SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOOWNERZORDER); - - _hdc = GetDC(_mwindow); - - // Configure the framebuffer according to parameters specified in _props - // Initializes _pixelformat - int pfnum=choose_visual(); - - if (gl_forced_pixfmt!=0) { - if (wcrdisplay_cat.is_debug()) - wcrdisplay_cat.debug() << "overriding pixfmt choice algorithm (" << pfnum << ") with gl-force-pixfmt("<dwFlags & PFD_GENERIC_ACCELERATED) && (pfd->dwFlags & PFD_GENERIC_FORMAT)) - drvtype=MCD; - else if (!(pfd->dwFlags & PFD_GENERIC_ACCELERATED) && !(pfd->dwFlags & PFD_GENERIC_FORMAT)) - drvtype=ICD; - else { - drvtype=Software; - } - -#define PrintFlag(FLG) ((pfd->dwFlags & PFD_##FLG) ? (" PFD_" #FLG "|") : "") - wcrdisplay_cat.spam() << "================================\n"; - - wcrdisplay_cat.spam() << msg << ", " << OGLDrvStrings[drvtype] << " driver\n" - << "PFD flags: 0x" << (void*)pfd->dwFlags << " (" << - PrintFlag(GENERIC_ACCELERATED) << - PrintFlag(GENERIC_FORMAT) << - PrintFlag(DOUBLEBUFFER) << - PrintFlag(SUPPORT_OPENGL) << - PrintFlag(SUPPORT_GDI) << - PrintFlag(STEREO) << - PrintFlag(DRAW_TO_WINDOW) << - PrintFlag(DRAW_TO_BITMAP) << - PrintFlag(SWAP_EXCHANGE) << - PrintFlag(SWAP_COPY) << - PrintFlag(SWAP_LAYER_BUFFERS) << - PrintFlag(NEED_PALETTE) << - PrintFlag(NEED_SYSTEM_PALETTE) << - PrintFlag(SUPPORT_DIRECTDRAW) << ")\n" - << "PFD iPixelType: " << ((pfd->iPixelType==PFD_TYPE_RGBA) ? "PFD_TYPE_RGBA":"PFD_TYPE_COLORINDEX") << endl - << "PFD cColorBits: " << (DWORD)pfd->cColorBits << " R: " << (DWORD)pfd->cRedBits <<" G: " << (DWORD)pfd->cGreenBits <<" B: " << (DWORD)pfd->cBlueBits << endl - << "PFD cAlphaBits: " << (DWORD)pfd->cAlphaBits << " DepthBits: " << (DWORD)pfd->cDepthBits <<" StencilBits: " << (DWORD)pfd->cStencilBits <<" AccumBits: " << (DWORD)pfd->cAccumBits << endl; -} -#endif - -//////////////////////////////////////////////////////////////////// -// Function: choose visual -// Access: -// Description: -//////////////////////////////////////////////////////////////////// -int wcrGraphicsWindow::choose_visual() { - - int mask = _props._mask; - int want_depth_bits = _props._want_depth_bits; - int want_color_bits = _props._want_color_bits; - OGLDriverType drvtype; - - if (mask & W_MULTISAMPLE) { - wcrdisplay_cat.info() - << "config() - multisample not supported"<< endl; - mask &= ~W_MULTISAMPLE; - } - wcrdisplay_cat.info() - << "mask =0x" << (void*) mask - << endl; - - PIXELFORMATDESCRIPTOR pfd; - ZeroMemory(&pfd,sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion=1; - -// if (_props._fullscreen) { -// do anything different for fullscrn? - - // just use the pixfmt of the current desktop - - int MaxPixFmtNum=DescribePixelFormat(_hdc, 1, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - int cur_bpp=GetDeviceCaps(_hdc,BITSPIXEL); - int pfnum; - -#ifdef _DEBUG - if (wcrdisplay_cat.is_debug()) { - for(pfnum=1;pfnum<=MaxPixFmtNum;pfnum++) { - DescribePixelFormat(_hdc, pfnum, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - - if ((pfd.dwFlags & PFD_GENERIC_ACCELERATED) && (pfd.dwFlags & PFD_GENERIC_FORMAT)) - drvtype=MCD; - else if (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED) && !(pfd.dwFlags & PFD_GENERIC_FORMAT)) - drvtype=ICD; - else { - drvtype=Software; - continue; // skipping all SW fmts - } - - // use wcrinfo.exe instead - char msg[200]; - sprintf(msg,"GL PixelFormat[%d]",pfnum); - PrintPFD(&pfd,msg); - } - } -#endif - - for(pfnum=1;pfnum<=MaxPixFmtNum;pfnum++) { - DescribePixelFormat(_hdc, pfnum, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - - // official, nvidia sanctioned way. should be equiv to my algorithm - if ((pfd.dwFlags & PFD_GENERIC_FORMAT) != 0) { - drvtype = Software; - continue; - } - else if (pfd.dwFlags & PFD_GENERIC_ACCELERATED) - drvtype = MCD; - else - drvtype = ICD; - -#if MY_OLD_ALGORITHM - if ((pfd.dwFlags & PFD_GENERIC_ACCELERATED) && (pfd.dwFlags & PFD_GENERIC_FORMAT)) - drvtype=MCD; - else if (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED) && !(pfd.dwFlags & PFD_GENERIC_FORMAT)) - drvtype=ICD; - else { - drvtype=Software; - continue; // skipping all SW fmts - } -#endif - - if (wcrdisplay_cat.is_debug()) - wcrdisplay_cat->debug() << "----------------" << endl; - - if ((pfd.iPixelType == PFD_TYPE_COLORINDEX) && !(mask & W_INDEX)) - continue; - - DWORD dwReqFlags=(PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW); - - if (wcrdisplay_cat.is_debug()) { - if (mask & W_ALPHA) - wcrdisplay_cat->debug() << "want alpha, pfd says '" - << (int)(pfd.cAlphaBits) << "'" << endl; - if (mask & W_DEPTH) - wcrdisplay_cat->debug() << "want depth, pfd says '" - << (int)(pfd.cDepthBits) << "'" << endl; - if (mask & W_STENCIL) - wcrdisplay_cat->debug() << "want stencil, pfd says '" - << (int)(pfd.cStencilBits) << "'" << endl; - wcrdisplay_cat->debug() << "final flag check " - << (int)(pfd.dwFlags & dwReqFlags) << " =? " - << (int)dwReqFlags << endl; - wcrdisplay_cat->debug() << "pfd bits = " << (int)(pfd.cColorBits) - << endl; - wcrdisplay_cat->debug() << "cur_bpp = " << cur_bpp << endl; - } - - if (mask & W_DOUBLE) - dwReqFlags|= PFD_DOUBLEBUFFER; - if ((mask & W_ALPHA) && (pfd.cAlphaBits==0)) - continue; - if ((mask & W_DEPTH) && (pfd.cDepthBits==0)) - continue; - if ((mask & W_STENCIL) && (pfd.cStencilBits==0)) - continue; - - if ((pfd.dwFlags & dwReqFlags)!=dwReqFlags) - continue; - - // now we ignore the specified want_color_bits for windowed mode - // instead we use the current screen depth - - if ((pfd.cColorBits!=cur_bpp) && (!((cur_bpp==16) && (pfd.cColorBits==15))) - && (!((cur_bpp==32) && (pfd.cColorBits==24)))) - continue; - // we've passed all the tests, go ahead and pick this fmt - // note: could go continue looping looking for more alpha bits or more depth bits - // so this would pick 16bpp depth buffer, probably not 24bpp - - break; - } - - if (pfnum>MaxPixFmtNum) { - wcrdisplay_cat.error() << "ERROR: couldn't find HW-accelerated OpenGL pixfmt appropriate for this desktop!!\n"; - wcrdisplay_cat.error() << "make sure OpenGL driver is installed, and try reducing the screen size\n"; - if (cur_bpp>16) - wcrdisplay_cat.error() << "or reducing the desktop screen pixeldepth\n"; - exit(1); - } - - #ifdef _DEBUG - char msg[200]; - sprintf(msg,"Selected GL PixelFormat is #%d",pfnum); - PrintPFD(&pfd,msg); - #endif - - memcpy(&_pixelformat,&pfd,sizeof(PIXELFORMATDESCRIPTOR)); - - return pfnum; -} - -//////////////////////////////////////////////////////////////////// -// Function: setup_colormap -// Access: -// Description: -//////////////////////////////////////////////////////////////////// -void wcrGraphicsWindow::setup_colormap() { - - PIXELFORMATDESCRIPTOR pfd; - LOGPALETTE *logical; - int n; - - /* grab the pixel format */ - memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); - DescribePixelFormat(_hdc, GetPixelFormat(_hdc), - sizeof(PIXELFORMATDESCRIPTOR), &pfd); - - if (!(pfd.dwFlags & PFD_NEED_PALETTE || - pfd.iPixelType == PFD_TYPE_COLORINDEX)) - return; - - n = 1 << pfd.cColorBits; - - /* allocate a bunch of memory for the logical palette (assume 256 - colors in a Win32 palette */ - logical = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) + - sizeof(PALETTEENTRY) * n); - memset(logical, 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * n); - - /* set the entries in the logical palette */ - logical->palVersion = 0x300; - logical->palNumEntries = n; - - /* start with a copy of the current system palette */ - GetSystemPaletteEntries(_hdc, 0, 256, &logical->palPalEntry[0]); - - if (pfd.iPixelType == PFD_TYPE_RGBA) { - int redMask = (1 << pfd.cRedBits) - 1; - int greenMask = (1 << pfd.cGreenBits) - 1; - int blueMask = (1 << pfd.cBlueBits) - 1; - int i; - - /* fill in an RGBA color palette */ - for (i = 0; i < n; ++i) { - logical->palPalEntry[i].peRed = - (((i >> pfd.cRedShift) & redMask) * 255) / redMask; - logical->palPalEntry[i].peGreen = - (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask; - logical->palPalEntry[i].peBlue = - (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask; - logical->palPalEntry[i].peFlags = 0; - } - } - - _colormap = CreatePalette(logical); - free(logical); - - SelectPalette(_hdc, _colormap, FALSE); - RealizePalette(_hdc); -} - -//////////////////////////////////////////////////////////////////// -// Function: end_frame -// Access: -// Description: Swaps the front and back buffers. -//////////////////////////////////////////////////////////////////// -void wcrGraphicsWindow::end_frame() { - if (gl_show_fps_meter) { - DO_PSTATS_STUFF(PStatTimer timer(_show_fps_pcollector);) - DWORD now = timeGetTime(); // this is win32 fn - - float time_delta = (now - _start_time) * 0.001f; - - if (time_delta > gl_fps_meter_update_interval) { - // didnt use global clock object, it wasnt working properly when - // I tried, its probably slower due to cache faults, and I can - // easily track all the info I need in dxgsg - DWORD num_frames = _cur_frame_count - _start_frame_count; - - _current_fps = num_frames / time_delta; - _start_time = now; - _start_frame_count = _cur_frame_count; - } - - char fps_msg[15]; - sprintf(fps_msg, "%.02f fps", _current_fps); - - // Note: we cant use simple GDI TextOut calls to draw FPS meter - // chars (like DX fps meter) because WCR doesnt support GDI in - // double-buffered mode. Instead we have to use glBitMap display - // lists created by chromium.UseFontBitmaps - - chromium.Color3f(0.0f,1.0f,1.0f); - - GLboolean tex_was_on = chromium.IsEnabled(GL_TEXTURE_2D); - - if (tex_was_on) - chromium.Disable(GL_TEXTURE_2D); - - chromium.MatrixMode(GL_MODELVIEW); - chromium.PushMatrix(); - chromium.LoadIdentity(); - chromium.MatrixMode(GL_PROJECTION); - chromium.PushMatrix(); - chromium.LoadIdentity(); - - chromium.Ortho(0.0f,_props._xsize, - 0.0f,_props._ysize, - -1.0f,1.0f); - - chromium.RasterPos2f(_props._xsize-70,_props._ysize-20); // these seem to be good for default font - - // set up for a string-drawing display list call - chromium.ListBase(FONT_BITMAP_OGLDISPLAYLISTNUM); - - // draw a string using font display lists. chars index their - // corresponding displist name - chromium.CallLists(strlen(fps_msg), GL_UNSIGNED_BYTE, fps_msg); - - chromium.PopMatrix(); - chromium.MatrixMode(GL_MODELVIEW); - chromium.PopMatrix(); - - if (tex_was_on) - chromium.Enable(GL_TEXTURE_2D); - - _cur_frame_count++; // only used by fps meter right now - } - - { - DO_PSTATS_STUFF(PStatTimer timer(_swap_pcollector);) - if (_is_synced) - chromium.Finish(); - else { - chromium.SwapBuffers(); - } - } - GraphicsWindow::end_frame(); -} - -//////////////////////////////////////////////////////////////////// -// Function: swap -// Access: -// Description: Swaps the front and back buffers explicitly. -//////////////////////////////////////////////////////////////////// -void wcrGraphicsWindow::swap() { - if (_is_synced) - chromium.SwapBuffers(); -} - -bool wcrGraphicsWindow::resize(unsigned int xsize,unsigned int ysize) { - if (!_props._fullscreen) { - // resizing windowed mode is easy - SetWindowPos(_mwindow, NULL, 0,0, xsize,ysize, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSENDCHANGING); - } else { - DWORD dwWidth = xsize; - DWORD dwHeight = ysize; - - HWND hDesktopWindow = GetDesktopWindow(); - HDC scrnDC=GetDC(hDesktopWindow); - DWORD dwFullScreenBitDepth=GetDeviceCaps(scrnDC,BITSPIXEL); - ReleaseDC(hDesktopWindow,scrnDC); - - // resize will always leave screen bitdepth unchanged - - // allowing resizing of lowvidmem cards to > 640x480. why? I'll assume - // check was already done by caller, so he knows what he wants - - DEVMODE dm; - if (!find_acceptable_display_mode(dwWidth,dwHeight,dwFullScreenBitDepth,dm)) { - wcrdisplay_cat.fatal() << "window resize(" << xsize << "," << ysize << ") failed, no compatible fullscreen display mode found!\n"; - return false; - } - - // this causes WM_SIZE msg to be produced - SetWindowPos(_mwindow, NULL, 0,0, xsize, ysize, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSENDCHANGING); - - int chg_result = ChangeDisplaySettings(&dm, CDS_FULLSCREEN); - - if (chg_result!=DISP_CHANGE_SUCCESSFUL) { - wcrdisplay_cat.fatal() << "resize ChangeDisplaySettings failed (error code: " << chg_result <<") for specified res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<"), " << dm.dmDisplayFrequency << "Hz\n"; - exit(1); - } - - // this assertion could be violated if we eventually allow dynamic fullscrn/windowed mode switching - assert(_pCurrent_display_settings!=NULL); - memcpy(_pCurrent_display_settings,&dm,sizeof(DEVMODE)); - } - return true; -} - -unsigned int wcrGraphicsWindow:: -verify_window_sizes(unsigned int numsizes,unsigned int *dimen) { - // see if window sizes are supported (i.e. in fullscrn mode) - // dimen is an array containing contiguous x,y pairs specifying - // possible display sizes, it is numsizes*2 long. fn will zero - // out any invalid x,y size pairs. return value is number of valid - // sizes that were found. - // - // note: it might be better to implement some sort of query - // interface that returns an array of supported sizes, - // but this way is somewhat simpler and will do the job - // on most cards, assuming they handle the std sizes the app - // knows about. - - if (!_props._fullscreen || (numsizes==0)) { - return numsizes; - } - - assert(dimen!=NULL); - - HWND hDesktopWindow = GetDesktopWindow(); - HDC scrnDC=GetDC(hDesktopWindow); - DWORD dwFullScreenBitDepth=GetDeviceCaps(scrnDC,BITSPIXEL); - ReleaseDC(hDesktopWindow,scrnDC); - - // gonna do an n^2 loop alg for simplicity. if speed is necessary, - // could do linear time with some kind of STL hash container I guess - - DEVMODE dm; - uint modenum=0; - uint goodmodes=0; - unsigned int *cur_dim_pair=dimen; - for(;modenumget_pipe(); - - GraphicsWindow::WindowProps *props_param; - if (!get_param_into(props_param, params)) { - return new wcrGraphicsWindow(pipe); - } else { - return new wcrGraphicsWindow(pipe, props_param->get_properties()); - } -} - -TypeHandle wcrGraphicsWindow::get_class_type() { - return _type_handle; -} - -void wcrGraphicsWindow::init_type() { - GraphicsWindow::init_type(); - register_type(_type_handle, "wcrGraphicsWindow", - GraphicsWindow::get_class_type()); -} - -TypeHandle wcrGraphicsWindow::get_type() const { - return get_class_type(); -} - -//////////////////////////////////////////////////////////////////// -// Function: static_window_proc -// Access: -// Description: -//////////////////////////////////////////////////////////////////// -LONG WINAPI static_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { - HWND_PANDAWIN_MAP::iterator pwin; - pwin=hwnd_pandawin_map.find(hwnd); - - if (pwin!=hwnd_pandawin_map.end()) { - wcrGraphicsWindow *wcrwinptr=(*pwin).second; - return wcrwinptr->window_proc(hwnd, msg, wparam, lparam); - } else if (global_wcrwinptr!=NULL){ - // this stuff should only be used during CreateWindow() - return global_wcrwinptr->window_proc(hwnd, msg, wparam, lparam); - } else { - // should never need this?? (maybe at shutdwn?) - return DefWindowProc(hwnd, msg, wparam, lparam); - } -} - -void wcrGraphicsWindow::deactivate_window() { - // current policy is to suspend minimized or deactivated fullscreen windows, but leave - // regular windows running normally - - if ((!_props._fullscreen) || _exiting_window || _window_inactive || _active_minimized_fullscreen) { - #ifdef _DEBUG - if (wcrdisplay_cat.is_spam()) - wcrdisplay_cat.spam() << "deactivate_window called, but ignored in current mode" << endl; - #endif - return; - } - - throw_event("PandaPaused"); // right now this is used to signal python event handler to disable audio - - if (!bResponsive_minimized_fullscreen_window) { - if (wcrdisplay_cat.is_spam()) - wcrdisplay_cat.spam() << "WCR window deactivated, releasing gl context and waiting...\n"; - - _window_inactive = true; - unmake_current(); - } else { - _active_minimized_fullscreen = true; - assert(_props._fullscreen); - - if (wcrdisplay_cat.is_spam()) - wcrdisplay_cat.spam() << "WCR window minimized from fullscreen mode, remaining active...\n"; - } - - // make sure window is minimized - - WINDOWPLACEMENT wndpl; - wndpl.length=sizeof(WINDOWPLACEMENT); - - if (!GetWindowPlacement(_mwindow,&wndpl)) { - wcrdisplay_cat.error() << "GetWindowPlacement failed!\n"; - return; - } - - if ((wndpl.showCmd!=SW_MINIMIZE)&&(wndpl.showCmd!=SW_SHOWMINIMIZED)) { - ShowWindow(_mwindow, SW_MINIMIZE); - } - - // revert to default display mode - ChangeDisplaySettings(NULL,0x0); - - if (!bResponsive_minimized_fullscreen_window) { - _PandaPausedTimer = SetTimer(_mwindow,PAUSED_TIMER_ID,1500,NULL); - if (_PandaPausedTimer!=PAUSED_TIMER_ID) { - wcrdisplay_cat.error() << "Error in SetTimer!\n"; - } - } - - if (_props._fullscreen) { - throw_event("PandaRestarted"); // right now this is used to signal python event handler to re-enable audio - } -} - -void wcrGraphicsWindow::reactivate_window() { - if (_window_inactive) { - if (wcrdisplay_cat.is_spam()) - wcrdisplay_cat.spam() << "WCR window re-activated...\n"; - - _window_inactive = false; - - if (_PandaPausedTimer!=NULL) { - KillTimer(_mwindow,_PandaPausedTimer); - _PandaPausedTimer = NULL; - } - - // move window to top of zorder, - SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOOWNERZORDER); - - ChangeDisplaySettings(_pCurrent_display_settings,CDS_FULLSCREEN); - - GdiFlush(); - make_current(); - } else if (_active_minimized_fullscreen) { - if (wcrdisplay_cat.is_spam()) - wcrdisplay_cat.spam() << "redisplaying minimized fullscrn active WCR window...\n"; - - // move window to top of zorder, - SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOOWNERZORDER); - - ChangeDisplaySettings(_pCurrent_display_settings,CDS_FULLSCREEN); - - GdiFlush(); - make_current(); - _active_minimized_fullscreen = false; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: window_proc -// Access: -// Description: -//////////////////////////////////////////////////////////////////// -LONG WINAPI wcrGraphicsWindow:: -window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { - int button = -1; - int x, y; - - switch (msg) { - case WM_CREATE: - break; - - case WM_CLOSE: - close_window(); - - // BUGBUG: right now there is no way to tell the panda app the graphics window is invalid or - // has been closed by the user, to prevent further methods from being called on the window. - // this needs to be added to panda for multiple windows to work. in the meantime, just - // trigger an exit here if numwindows==0, since that is the expected behavior when all - // windows are closed (should be done by the app though, and it assumes you only make this - // type of panda gfx window) - - if (hwnd_pandawin_map.size()==0) { - exit(0); - } - break; - - case WM_MOVE: - // handle all this stuff in EXITSIZEMOVE. will rendering work during moving? do we care? - //_props._xorg = LOWORD(lparam); - //_props._yorg = HIWORD(lparam); - break; - - - case WM_ACTIVATEAPP: { - #ifdef _DEBUG - wcrdisplay_cat.spam() << "WM_ACTIVATEAPP(" << (bool)(wparam!=0) <<") received\n"; - #endif - - if (!wparam) { - deactivate_window(); - return 0; - } // dont want to reactivate until window is actually un-minimized (see WM_SIZE) - break; - } - - case WM_EXITSIZEMOVE: - #ifdef _DEBUG - wcrdisplay_cat.spam() << "WM_EXITSIZEMOVE received" << endl; - #endif - - reactivate_window(); - handle_reshape(); - break; - - case WM_ENTERSIZEMOVE: - break; - - case WM_SIZE: { - DWORD width,height; - - width = LOWORD(lparam); height = HIWORD(lparam); - #ifdef _DEBUG - { - wcrdisplay_cat.spam() << "WM_SIZE received with width:" << width << " height: " << height << " flags: " << - ((wparam == SIZE_MAXHIDE)? "SIZE_MAXHIDE " : "") << ((wparam == SIZE_MAXSHOW)? "SIZE_MAXSHOW " : "") << - ((wparam == SIZE_MINIMIZED)? "SIZE_MINIMIZED " : "") << ((wparam == SIZE_RESTORED)? "SIZE_RESTORED " : "") << - ((wparam == SIZE_MAXIMIZED)? "SIZE_MAXIMIZED " : "") << endl; - } - #endif - if (_mwindow==NULL) - break; - - if ((wparam==SIZE_MAXIMIZED) || (wparam==SIZE_RESTORED)) { // old comment -- added SIZE_RESTORED to handle 3dfx case (what does this mean?) - reactivate_window(); - -// if ((_props._xsize != width) || (_props._ysize != height)) - handle_reshape(); - } - break; - } - - case WM_PAINT: { - PAINTSTRUCT ps; - BeginPaint(hwnd, &ps); - // glReadBuffer(GL_BACK); need to copy current rendering to front buffer, a la wdxdisplay? - EndPaint(hwnd, &ps); - return 0; - } - - case WM_IME_NOTIFY: - if (wparam == IMN_SETOPENSTATUS) { - HIMC hIMC = ImmGetContext(hwnd); - nassertr(hIMC != 0, 0); - _ime_open = (ImmGetOpenStatus(hIMC) != 0); - ImmReleaseContext(hwnd, hIMC); - } - break; - - case WM_IME_COMPOSITION: - if (lparam & GCS_RESULTSTR) { - HIMC hIMC = ImmGetContext(hwnd); - nassertr(hIMC != 0, 0); - - static const int max_ime_result = 128; - static char ime_result[max_ime_result]; - - DWORD result_size = - ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, - ime_result, max_ime_result); - ImmReleaseContext(hwnd, hIMC); - - // Add this string into the text buffer of the application. - wchar_t *ime_wchar_result = (wchar_t *)ime_result; - for (DWORD i = 0; i < result_size / 2; i++) { - _input_devices[0].keystroke(ime_wchar_result[i]); - } - } - break; - - case WM_CHAR: - // Ignore WM_CHAR messages if we have the IME open, since - // everything will come in through WM_IME_COMPOSITION. (It's - // supposed to come in through WM_CHAR, too, but there seems to - // be a bug in Win2000 in that it only sends question mark - // characters through here.) - if (!_ime_open && !_input_devices.empty()) { - _input_devices[0].keystroke(wparam); - } - break; - - case WM_SYSKEYDOWN: - // want to use defwindproc on Alt syskey so Alt-F4 works, etc - // but do want to bypass defwindproc F10 behavior (it activates - // the main menu, but we have none) - if (wparam == VK_F10) { - return 0; - } - break; - - case WM_KEYDOWN: { - POINT point; - - GetCursorPos(&point); - ScreenToClient(hwnd, &point); - - #ifdef NDEBUG - handle_keypress(lookup_key(wparam), point.x, point.y); - #else - // handle Cntrl-V paste from clipboard - if (!((wparam=='V') && (GetKeyState(VK_CONTROL) < 0))) { - handle_keypress(lookup_key(wparam), point.x, point.y); - } else { - HGLOBAL hglb; - char *lptstr; - - if (!IsClipboardFormatAvailable(CF_TEXT)) - return 0; - - if (!OpenClipboard(NULL)) - return 0; - - hglb = GetClipboardData(CF_TEXT); - if (hglb!=NULL) { - lptstr = (char *) GlobalLock(hglb); - if (lptstr != NULL) { - char *pChar; - for(pChar=lptstr;*pChar!=NULL;pChar++) { - handle_keypress(KeyboardButton::ascii_key((uchar)*pChar), point.x, point.y); - } - GlobalUnlock(hglb); - } - } - CloseClipboard(); - } - #endif - break; - } - - case WM_SYSKEYUP: - case WM_KEYUP: - handle_keyrelease(lookup_key(wparam)); - break; - - case WM_LBUTTONDOWN: - button = 0; - case WM_MBUTTONDOWN: - if (button < 0) - button = 1; - - case WM_RBUTTONDOWN: - if (button < 0) - button = 2; - SetCapture(hwnd); - // Win32 doesn't return the same numbers as X does when the mouse - // goes beyond the upper or left side of the window - #define SET_MOUSE_COORD(iVal,VAL) { \ - iVal = VAL; \ - if (iVal & 0x8000) \ - iVal -= 0x10000; \ - } - - SET_MOUSE_COORD(x,LOWORD(lparam)); - SET_MOUSE_COORD(y,HIWORD(lparam)); - - // make_current(); what does OGL have to do with mouse input?? - handle_keypress(MouseButton::button(button), x, y); - break; - case WM_LBUTTONUP: - button = 0; - case WM_MBUTTONUP: - if (button < 0) - button = 1; - case WM_RBUTTONUP: - if (button < 0) - button = 2; - ReleaseCapture(); - #if 0 - SET_MOUSE_COORD(x,LOWORD(lparam)); - SET_MOUSE_COORD(y,HIWORD(lparam)); - // make_current(); what does OGL have to do with mouse input?? - #endif - handle_keyrelease(MouseButton::button(button)); - break; - - case WM_MOUSEMOVE: - SET_MOUSE_COORD(x,LOWORD(lparam)); - SET_MOUSE_COORD(y,HIWORD(lparam)); - - if (mouse_motion_enabled() && - (wparam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON))) { - // make_current(); what does OGL have to do with mouse input?? - handle_mouse_motion(x, y); - } else if (mouse_passive_motion_enabled() && - ((wparam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) == 0)) { - // make_current(); what does OGL have to do with mouse input?? - handle_mouse_motion(x, y); - } - break; - - case WM_SETFOCUS: { - // wcrdisplay_cat.info() << "got WM_SETFOCUS\n"; - - if (_mouse_entry_enabled) { - make_current(); - handle_mouse_entry(MOUSE_ENTERED); - } - - POINT point; - GetCursorPos(&point); - ScreenToClient(hwnd, &point); - - // this is a hack to make sure common modifier keys have proper state - // since at focus loss, app may never receive key-up event corresponding to - // a key-down. it would be better to know the exact set of ModifierButtons the - // user is using, since we may miss some here - - int i; - for(i=0;i= 0); - if (bShiftUp) { - if (bCapsLockDown) - key = toupper(key); - else key = tolower(key); - } else { - switch(key) { - // these keys are unaffected by capslock - case '1': key = '!'; break; - case '2': key = '@'; break; - case '3': key = '#'; break; - case '4': key = '$'; break; - case '5': key = '%'; break; - case '6': key = '^'; break; - case '7': key = '&'; break; - case '8': key = '*'; break; - case '9': key = '('; break; - case '0': key = ')'; break; - case '-': key = '_'; break; - case '=': key = '+'; break; - case ',': key = '<'; break; - case '.': key = '>'; break; - case '/': key = '?'; break; - case ';': key = ':'; break; - case '\'': key = '"'; break; - case '[': key = '{'; break; - case ']': key = '}'; break; - case '\\': key = '|'; break; - case '`': key = '~'; break; - default: - if (bCapsLockDown) - key = tolower(key); - else key = toupper(key); - } - } - return KeyboardButton::ascii_key((uchar)key); - } - break; - } - return ButtonHandle::none(); -} - - diff --git a/panda/src/wcrdisplay/wcrGraphicsWindow.h b/panda/src/wcrdisplay/wcrGraphicsWindow.h deleted file mode 100644 index d3fde38468..0000000000 --- a/panda/src/wcrdisplay/wcrGraphicsWindow.h +++ /dev/null @@ -1,147 +0,0 @@ -// Filename: wcrGraphicsWindow.h -// Created by: skyler, based on wgl* file. -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://etc.cmu.edu/panda3d/docs/license/ . -// -// To contact the maintainers of this program write to -// panda3d-general@lists.sourceforge.net . -// -//////////////////////////////////////////////////////////////////// -#ifndef WCRGRAPHICSWINDOW_H -#define WCRGRAPHICSWINDOW_H -// -//////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////// -#include "pandabase.h" - -#include "graphicsWindow.h" -#define WINDOWS_LEAN_AND_MEAN -#include -#undef WINDOWS_LEAN_AND_MEAN - -//////////////////////////////////////////////////////////////////// -// Defines -//////////////////////////////////////////////////////////////////// -class wcrGraphicsPipe; - -//////////////////////////////////////////////////////////////////// -// Class : wcrGraphicsWindow -// Description : -//////////////////////////////////////////////////////////////////// -class EXPCL_PANDACR wcrGraphicsWindow : public GraphicsWindow { -public: - wcrGraphicsWindow(GraphicsPipe* pipe); - wcrGraphicsWindow(GraphicsPipe* pipe, - const GraphicsWindow::Properties& props); - virtual ~wcrGraphicsWindow(); - - virtual bool supports_update() const; - virtual void update(); - virtual void end_frame(); - virtual void swap(); - virtual int get_depth_bitwidth(); - - virtual TypeHandle get_gsg_type() const; - static GraphicsWindow* make_wcrGraphicsWindow(const FactoryParams ¶ms); - -public: - virtual void make_current(); - virtual void unmake_current(); - - INLINE bool mouse_entry_enabled() { return _mouse_entry_enabled; } - INLINE bool mouse_motion_enabled() { return _mouse_motion_enabled; } - INLINE bool mouse_passive_motion_enabled() { - return _mouse_passive_motion_enabled; - } -// void handle_reshape(int w, int h); - - void handle_mouse_motion(int x, int y); - void handle_mouse_entry(int state); - void handle_keypress(ButtonHandle key, int x, int y); - void handle_keyrelease(ButtonHandle key); - -protected: -// PIXELFORMATDESCRIPTOR* try_for_visual(wcrGraphicsPipe *pipe, -// int mask, int want_depth_bits = 1, int want_color_bits = 1); -// static void get_config(PIXELFORMATDESCRIPTOR* visual, int attrib, int *value); - int choose_visual(); - virtual void config(); - void setup_colormap(); - - void enable_mouse_input(bool val); - void enable_mouse_motion(bool val); - void enable_mouse_passive_motion(bool val); - void enable_mouse_entry(bool val); - - void handle_reshape(); - void process_events(); - -public: - HWND _mwindow; - -private: - // TODO:skyler HGLRC _context; - int _context; - HDC _hdc; - PIXELFORMATDESCRIPTOR _pixelformat; - HPALETTE _colormap; - HCURSOR _hMouseCursor; - HWND _hOldForegroundWindow; - UINT_PTR _PandaPausedTimer; - - DEVMODE *_pCurrent_display_settings; - bool _bIsLowVidMemCard; - bool _bLoadedCustomCursor; - - bool _window_inactive; - bool _active_minimized_fullscreen; - bool _return_control_to_app; - bool _exiting_window; - - bool _mouse_input_enabled; - bool _mouse_motion_enabled; - bool _mouse_passive_motion_enabled; - bool _mouse_entry_enabled; - bool _ime_open; - - // vars for frames/sec meter - DWORD _start_time; - DWORD _start_frame_count; - DWORD _cur_frame_count; - float _current_fps; - - string _extensions_str; - -public: - static TypeHandle get_class_type(); - static void init_type(); - virtual TypeHandle get_type() const; - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} - - LONG WINAPI window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); - ButtonHandle lookup_key(WPARAM wparam) const; - void DestroyMe(bool bAtExitFnCalled); - virtual void deactivate_window(); - virtual void reactivate_window(); - - virtual bool resize(unsigned int xsize,unsigned int ysize); - virtual unsigned int verify_window_sizes(unsigned int numsizes,unsigned int *dimen); - -protected: - virtual void do_close_window(); - void check_for_color_cursor_support(); - -private: - static TypeHandle _type_handle; -}; - -#endif diff --git a/panda/src/wcrdisplay/wcrdisplay_composite1.cxx b/panda/src/wcrdisplay/wcrdisplay_composite1.cxx deleted file mode 100644 index 19decd8a79..0000000000 --- a/panda/src/wcrdisplay/wcrdisplay_composite1.cxx +++ /dev/null @@ -1,3 +0,0 @@ - -#include"config_wcrdisplay.cxx" -#include"wcrGraphicsPipe.cxx" diff --git a/panda/src/wcrdisplay/wcrext.h b/panda/src/wcrdisplay/wcrext.h deleted file mode 100644 index df7c2f5356..0000000000 --- a/panda/src/wcrdisplay/wcrext.h +++ /dev/null @@ -1,401 +0,0 @@ -#ifndef __wcrext_h_ -#define __wcrext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif - -/*************************************************************/ - -/* Header file version number */ -#define WCR_WCREXT_VERSION 1 - -#ifndef WCR_ARB_buffer_region -#define WCR_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 -#define WCR_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 -#define WCR_DEPTH_BUFFER_BIT_ARB 0x00000004 -#define WCR_STENCIL_BUFFER_BIT_ARB 0x00000008 -#endif - -#ifndef WCR_ARB_extensions_string -#endif - -#ifndef WCR_ARB_pixel_format -#define WCR_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WCR_DRAW_TO_WINDOW_ARB 0x2001 -#define WCR_DRAW_TO_BITMAP_ARB 0x2002 -#define WCR_ACCELERATION_ARB 0x2003 -#define WCR_NEED_PALETTE_ARB 0x2004 -#define WCR_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WCR_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WCR_SWAP_METHOD_ARB 0x2007 -#define WCR_NUMBER_OVERLAYS_ARB 0x2008 -#define WCR_NUMBER_UNDERLAYS_ARB 0x2009 -#define WCR_TRANSPARENT_ARB 0x200A -#define WCR_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WCR_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WCR_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WCR_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WCR_TRANSPARENT_INDEX_VALUE_ARB 0x203B -#define WCR_SHARE_DEPTH_ARB 0x200C -#define WCR_SHARE_STENCIL_ARB 0x200D -#define WCR_SHARE_ACCUM_ARB 0x200E -#define WCR_SUPPORT_GDI_ARB 0x200F -#define WCR_SUPPORT_OPENGL_ARB 0x2010 -#define WCR_DOUBLE_BUFFER_ARB 0x2011 -#define WCR_STEREO_ARB 0x2012 -#define WCR_PIXEL_TYPE_ARB 0x2013 -#define WCR_COLOR_BITS_ARB 0x2014 -#define WCR_RED_BITS_ARB 0x2015 -#define WCR_RED_SHIFT_ARB 0x2016 -#define WCR_GREEN_BITS_ARB 0x2017 -#define WCR_GREEN_SHIFT_ARB 0x2018 -#define WCR_BLUE_BITS_ARB 0x2019 -#define WCR_BLUE_SHIFT_ARB 0x201A -#define WCR_ALPHA_BITS_ARB 0x201B -#define WCR_ALPHA_SHIFT_ARB 0x201C -#define WCR_ACCUM_BITS_ARB 0x201D -#define WCR_ACCUM_RED_BITS_ARB 0x201E -#define WCR_ACCUM_GREEN_BITS_ARB 0x201F -#define WCR_ACCUM_BLUE_BITS_ARB 0x2020 -#define WCR_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WCR_DEPTH_BITS_ARB 0x2022 -#define WCR_STENCIL_BITS_ARB 0x2023 -#define WCR_AUX_BUFFERS_ARB 0x2024 -#define WCR_NO_ACCELERATION_ARB 0x2025 -#define WCR_GENERIC_ACCELERATION_ARB 0x2026 -#define WCR_FULL_ACCELERATION_ARB 0x2027 -#define WCR_SWAP_EXCHANGE_ARB 0x2028 -#define WCR_SWAP_COPY_ARB 0x2029 -#define WCR_SWAP_UNDEFINED_ARB 0x202A -#define WCR_TYPE_RGBA_ARB 0x202B -#define WCR_TYPE_COLORINDEX_ARB 0x202C -#endif - -#ifndef WCR_ARB_make_current_read -#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 -#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 -#endif - -#ifndef WCR_ARB_pbuffer -#define WCR_DRAW_TO_PBUFFER_ARB 0x202D -#define WCR_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WCR_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WCR_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WCR_PBUFFER_LARGEST_ARB 0x2033 -#define WCR_PBUFFER_WIDTH_ARB 0x2034 -#define WCR_PBUFFER_HEIGHT_ARB 0x2035 -#define WCR_PBUFFER_LOST_ARB 0x2036 -#endif - -#ifndef WCR_EXT_make_current_read -#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 -#endif - -#ifndef WCR_EXT_pixel_format -#define WCR_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WCR_DRAW_TO_WINDOW_EXT 0x2001 -#define WCR_DRAW_TO_BITMAP_EXT 0x2002 -#define WCR_ACCELERATION_EXT 0x2003 -#define WCR_NEED_PALETTE_EXT 0x2004 -#define WCR_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WCR_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WCR_SWAP_METHOD_EXT 0x2007 -#define WCR_NUMBER_OVERLAYS_EXT 0x2008 -#define WCR_NUMBER_UNDERLAYS_EXT 0x2009 -#define WCR_TRANSPARENT_EXT 0x200A -#define WCR_TRANSPARENT_VALUE_EXT 0x200B -#define WCR_SHARE_DEPTH_EXT 0x200C -#define WCR_SHARE_STENCIL_EXT 0x200D -#define WCR_SHARE_ACCUM_EXT 0x200E -#define WCR_SUPPORT_GDI_EXT 0x200F -#define WCR_SUPPORT_OPENGL_EXT 0x2010 -#define WCR_DOUBLE_BUFFER_EXT 0x2011 -#define WCR_STEREO_EXT 0x2012 -#define WCR_PIXEL_TYPE_EXT 0x2013 -#define WCR_COLOR_BITS_EXT 0x2014 -#define WCR_RED_BITS_EXT 0x2015 -#define WCR_RED_SHIFT_EXT 0x2016 -#define WCR_GREEN_BITS_EXT 0x2017 -#define WCR_GREEN_SHIFT_EXT 0x2018 -#define WCR_BLUE_BITS_EXT 0x2019 -#define WCR_BLUE_SHIFT_EXT 0x201A -#define WCR_ALPHA_BITS_EXT 0x201B -#define WCR_ALPHA_SHIFT_EXT 0x201C -#define WCR_ACCUM_BITS_EXT 0x201D -#define WCR_ACCUM_RED_BITS_EXT 0x201E -#define WCR_ACCUM_GREEN_BITS_EXT 0x201F -#define WCR_ACCUM_BLUE_BITS_EXT 0x2020 -#define WCR_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WCR_DEPTH_BITS_EXT 0x2022 -#define WCR_STENCIL_BITS_EXT 0x2023 -#define WCR_AUX_BUFFERS_EXT 0x2024 -#define WCR_NO_ACCELERATION_EXT 0x2025 -#define WCR_GENERIC_ACCELERATION_EXT 0x2026 -#define WCR_FULL_ACCELERATION_EXT 0x2027 -#define WCR_SWAP_EXCHANGE_EXT 0x2028 -#define WCR_SWAP_COPY_EXT 0x2029 -#define WCR_SWAP_UNDEFINED_EXT 0x202A -#define WCR_TYPE_RGBA_EXT 0x202B -#define WCR_TYPE_COLORINDEX_EXT 0x202C -#endif - -#ifndef WCR_EXT_pbuffer -#define WCR_DRAW_TO_PBUFFER_EXT 0x202D -#define WCR_MAX_PBUFFER_PIXELS_EXT 0x202E -#define WCR_MAX_PBUFFER_WIDTH_EXT 0x202F -#define WCR_MAX_PBUFFER_HEIGHT_EXT 0x2030 -#define WCR_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 -#define WCR_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 -#define WCR_PBUFFER_LARGEST_EXT 0x2033 -#define WCR_PBUFFER_WIDTH_EXT 0x2034 -#define WCR_PBUFFER_HEIGHT_EXT 0x2035 -#endif - -#ifndef WCR_EXT_depth_float -#define WCR_DEPTH_FLOAT_EXT 0x2040 -#endif - -#ifndef WCR_3DFX_multisample -#define WCR_SAMPLE_BUFFERS_3DFX 0x2060 -#define WCR_SAMPLES_3DFX 0x2061 -#endif - -#ifndef WCR_EXT_multisample -#define WCR_SAMPLE_BUFFERS_EXT 0x2041 -#define WCR_SAMPLES_EXT 0x2042 -#endif - -#ifndef WCR_I3D_unknown_genlock_extension_name -#define WCR_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 -#define WCR_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 -#define WCR_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 -#define WCR_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 -#define WCR_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 -#define WCR_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 -#define WCR_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A -#define WCR_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B -#define WCR_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C -#endif - -#ifndef WCR_I3D_unknown_gamma_extension_name -#define WCR_GAMMA_TABLE_SIZE_I3D 0x204E -#define WCR_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F -#endif - -#ifndef WCR_I3D_unknown_digital_video_cursor_extension_name -#define WCR_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 -#define WCR_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 -#define WCR_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 -#define WCR_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 -#endif - - -/*************************************************************/ - -#ifndef WCR_ARB_pbuffer -DECLARE_HANDLE(HPBUFFERARB); -#endif -#ifndef WCR_EXT_pbuffer -DECLARE_HANDLE(HPBUFFEREXT); -#endif - -#ifndef WCR_ARB_buffer_region -#define WCR_ARB_buffer_region 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern HANDLE WINAPI wcrCreateBufferRegionARB (HDC, int, UINT); -extern VOID WINAPI wcrDeleteBufferRegionARB (HANDLE); -extern BOOL WINAPI wcrSaveBufferRegionARB (HANDLE, int, int, int, int); -extern BOOL WINAPI wcrRestoreBufferRegionARB (HANDLE, int, int, int, int, int, int); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef HANDLE (WINAPI * PFNWCRCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); -typedef VOID (WINAPI * PFNWCRDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); -typedef BOOL (WINAPI * PFNWCRSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); -typedef BOOL (WINAPI * PFNWCRRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); -#endif - -#ifndef WCR_ARB_extensions_string -#define WCR_ARB_extensions_string 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern const char * WINAPI wcrGetExtensionsStringARB (HDC); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef const char * (WINAPI * PFNWCRGETEXTENSIONSSTRINGARBPROC) (HDC hdc); -#endif - -#ifndef WCR_ARB_pixel_format -#define WCR_ARB_pixel_format 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern BOOL WINAPI wcrGetPixelFormatAttribivARB (HDC, int, int, UINT, const int *, int *); -extern BOOL WINAPI wcrGetPixelFormatAttribfvARB (HDC, int, int, UINT, const int *, FLOAT *); -extern BOOL WINAPI wcrChoosePixelFormatARB (HDC, const int *, const FLOAT *, UINT, int *, UINT *); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWCRGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWCRGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWCRCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif - -#ifndef WCR_ARB_make_current_read -#define WCR_ARB_make_current_read 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern BOOL WINAPI wcrMakeContextCurrentARB (HDC, HDC, HGLRC); -extern HDC WINAPI wcrGetCurrentReadDCARB (); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWCRMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * PFNWCRGETCURRENTREADDCARBPROC) (); -#endif - -#ifndef WCR_ARB_pbuffer -#define WCR_ARB_pbuffer 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern HPBUFFERARB WINAPI wcrCreatePbufferARB (HDC, int, int, int, const int *); -extern HDC WINAPI wcrGetPbufferDCARB (HPBUFFERARB); -extern int WINAPI wcrReleasePbufferDCARB (HPBUFFERARB, HDC); -extern BOOL WINAPI wcrDestroyPbufferARB (HPBUFFERARB); -extern BOOL WINAPI wcrQueryPbufferARB (HPBUFFERARB, int, int *); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef HPBUFFERARB (WINAPI * PFNWCRCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWCRGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef int (WINAPI * PFNWCRRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWCRDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * PFNWCRQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); -#endif - -#ifndef WCR_EXT_display_color_table -#define WCR_EXT_display_color_table 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern GLboolean WINAPI wcrCreateDisplayColorTableEXT (GLushort); -extern GLboolean WINAPI wcrLoadDisplayColorTableEXT (const GLushort *, GLuint); -extern GLboolean WINAPI wcrBindDisplayColorTableEXT (GLushort); -extern VOID WINAPI wcrDestroyDisplayColorTableEXT (GLushort); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef GLboolean (WINAPI * PFNWCRCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef GLboolean (WINAPI * PFNWCRLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); -typedef GLboolean (WINAPI * PFNWCRBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); -typedef VOID (WINAPI * PFNWCRDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); -#endif - -#ifndef WCR_EXT_extensions_string -#define WCR_EXT_extensions_string 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern const char * WINAPI wcrGetExtensionsStringEXT (); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef const char * (WINAPI * PFNWCRGETEXTENSIONSSTRINGEXTPROC) (); -#endif - -#ifndef WCR_EXT_make_current_read -#define WCR_EXT_make_current_read 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern BOOL WINAPI wcrMakeContextCurrentEXT (HDC, HDC, HGLRC); -extern HDC WINAPI wcrGetCurrentReadDCEXT (); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWCRMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * PFNWCRGETCURRENTREADDCEXTPROC) (); -#endif - -#ifndef WCR_EXT_pbuffer -#define WCR_EXT_pbuffer 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern HPBUFFEREXT WINAPI wcrCreatePbufferEXT (HDC, int, int, int, const int *); -extern HDC WINAPI wcrGetPbufferDCEXT (HPBUFFEREXT); -extern int WINAPI wcrReleasePbufferDCEXT (HPBUFFEREXT, HDC); -extern BOOL WINAPI wcrDestroyPbufferEXT (HPBUFFEREXT); -extern BOOL WINAPI wcrQueryPbufferEXT (HPBUFFEREXT, int, int *); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef HPBUFFEREXT (WINAPI * PFNWCRCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * PFNWCRGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); -typedef int (WINAPI * PFNWCRRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); -typedef BOOL (WINAPI * PFNWCRDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); -typedef BOOL (WINAPI * PFNWCRQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); -#endif - -#ifndef WCR_EXT_pixel_format -#define WCR_EXT_pixel_format 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern BOOL WINAPI wcrGetPixelFormatAttribivEXT (HDC, int, int, UINT, int *, int *); -extern BOOL WINAPI wcrGetPixelFormatAttribfvEXT (HDC, int, int, UINT, int *, FLOAT *); -extern BOOL WINAPI wcrChoosePixelFormatEXT (HDC, const int *, const FLOAT *, UINT, int *, UINT *); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWCRGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); -typedef BOOL (WINAPI * PFNWCRGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * PFNWCRCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -#endif - -#ifndef WCR_EXT_swap_control -#define WCR_EXT_swap_control 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern BOOL WINAPI wcrSwapIntervalEXT (int); -extern int WINAPI wcrGetSwapIntervalEXT (); -#endif /* WCR_WCREXT_PROTOTYPES */ -typedef BOOL (WINAPI * PFNWCRSWAPINTERVALEXTPROC) (int interval); -typedef int (WINAPI * PFNWCRGETSWAPINTERVALEXTPROC) (); -#endif - -#ifndef WCR_WCR_EXT_depth_float -#define WCR_WCR_EXT_depth_float 1 -#endif - -#ifndef WCR_WCR_3DFX_multisample -#define WCR_WCR_3DFX_multisample 1 -#endif - -#ifndef WCR_WCR_EXT_multisample -#define WCR_WCR_EXT_multisample 1 -#endif - -/* added by Cass -- but this should already be in here! */ -#ifndef WCR_NV_allocate_memory -#define WCR_NV_allocate_memory 1 -#ifdef WCR_WCREXT_PROTOTYPES -extern void * wcrAllocateMemoryNV(int size, float readfreq, float writefreq, float priority); -extern void wcrFreeMemoryNV(void * pointer); -#endif -typedef void * (APIENTRY * PFNWCRALLOCATEMEMORYNVPROC) (int size, float readfreq, float writefreq, float priority); -typedef void (APIENTRY * PFNWCRFREEMEMORYNVPROC) (void *pointer); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif - -