123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- /*
- ===========================================================================
- Copyright (C) 1999-2005 Id Software, Inc.
- This file is part of Quake III Arena source code.
- Quake III Arena source code is free software; you can redistribute it
- and/or modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the License,
- or (at your option) any later version.
- Quake III Arena source code is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with Foobar; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- ===========================================================================
- */
- // win_xy.c -- windows specific xy view code
- #include "stdafx.h"
- #include "qe3.h"
- static HDC s_hdcXY;
- static HGLRC s_hglrcXY;
- static unsigned s_stipple[32] =
- {
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- 0xaaaaaaaa, 0x55555555,0xaaaaaaaa, 0x55555555,
- };
- /*
- ============
- WXY_WndProc
- ============
- */
- LONG WINAPI XYWndProc (
- HWND hWnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
- {
- int fwKeys, xPos, yPos;
- RECT rect;
- GetClientRect(hWnd, &rect);
- switch (uMsg)
- {
- case WM_CREATE:
- s_hdcXY = GetDC(hWnd);
- QEW_SetupPixelFormat(s_hdcXY, false);
- if ( ( s_hglrcXY = wglCreateContext( s_hdcXY ) ) == 0 )
- Error( "wglCreateContext in WXY_WndProc failed" );
- if (!wglMakeCurrent( s_hdcXY, s_hglrcXY ))
- Error ("wglMakeCurrent failed");
- if (!wglShareLists( g_qeglobals.d_hglrcBase, s_hglrcXY ) )
- Error( "wglShareLists in WXY_WndProc failed" );
- glPolygonStipple ((unsigned char *)s_stipple);
- glLineStipple (3, 0xaaaa);
- return 0;
- case WM_DESTROY:
- QEW_StopGL( hWnd, s_hglrcXY, s_hdcXY );
- return 0;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- BeginPaint(hWnd, &ps);
- if (!wglMakeCurrent( s_hdcXY, s_hglrcXY ))
- Error ("wglMakeCurrent failed");
- QE_CheckOpenGLForErrors();
- XY_Draw ();
- QE_CheckOpenGLForErrors();
- SwapBuffers(s_hdcXY);
- EndPaint(hWnd, &ps);
- }
- return 0;
- case WM_KEYDOWN:
- return QE_KeyDown (wParam);
-
- case WM_MBUTTONDOWN:
- case WM_RBUTTONDOWN:
- case WM_LBUTTONDOWN:
- if ( GetTopWindow( g_qeglobals.d_hwndMain ) != hWnd)
- BringWindowToTop(hWnd);
- SetFocus( g_qeglobals.d_hwndXY );
- SetCapture( g_qeglobals.d_hwndXY );
- fwKeys = wParam; // key flags
- xPos = (short)LOWORD(lParam); // horizontal position of cursor
- yPos = (short)HIWORD(lParam); // vertical position of cursor
- yPos = (int)rect.bottom - 1 - yPos;
- XY_MouseDown (xPos, yPos, fwKeys);
- return 0;
- case WM_MBUTTONUP:
- case WM_RBUTTONUP:
- case WM_LBUTTONUP:
- fwKeys = wParam; // key flags
- xPos = (short)LOWORD(lParam); // horizontal position of cursor
- yPos = (short)HIWORD(lParam); // vertical position of cursor
- yPos = (int)rect.bottom - 1 - yPos;
- XY_MouseUp (xPos, yPos, fwKeys);
- if (! (fwKeys & (MK_LBUTTON|MK_RBUTTON|MK_MBUTTON)))
- ReleaseCapture ();
- return 0;
- case WM_MOUSEMOVE:
- if (::GetFocus() != hWnd)
- ::SetFocus(hWnd);
- fwKeys = wParam; // key flags
- xPos = (short)LOWORD(lParam); // horizontal position of cursor
- yPos = (short)HIWORD(lParam); // vertical position of cursor
- yPos = (int)rect.bottom - 1 - yPos;
- XY_MouseMoved (xPos, yPos, fwKeys);
- return 0;
- case WM_SIZE:
- g_qeglobals.d_xy.width = rect.right;
- g_qeglobals.d_xy.height = rect.bottom - 16;
- InvalidateRect( g_qeglobals.d_hwndXY, NULL, false);
- return 0;
- case WM_NCCALCSIZE:// don't let windows copy pixels
- DefWindowProc (hWnd, uMsg, wParam, lParam);
- return WVR_REDRAW;
- case WM_KILLFOCUS:
- case WM_SETFOCUS:
- SendMessage( hWnd, WM_NCACTIVATE, uMsg == WM_SETFOCUS, 0 );
- return 0;
- case WM_CLOSE:
- DestroyWindow (hWnd);
- return 0;
- }
- return DefWindowProc (hWnd, uMsg, wParam, lParam);
- }
- /*
- ==============
- WXY_Create
- ==============
- */
- void WXY_Create (HINSTANCE hInstance)
- {
- ASSERT(0);
- #if 0
- WNDCLASS wc;
- /* Register the camera class */
- memset (&wc, 0, sizeof(wc));
- wc.style = CS_NOCLOSE;
- wc.lpfnWndProc = (WNDPROC)WXY_WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = 0;
- wc.hCursor = LoadCursor (NULL,IDC_ARROW);
- wc.hbrBackground = NULL; //(HBRUSH)(COLOR_WINDOW+1);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = XY_WINDOW_CLASS;
- if (!RegisterClass (&wc) )
- Error ("RegisterClass: failed");
- g_qeglobals.d_hwndXY = CreateWindow (XY_WINDOW_CLASS ,
- "XY View",
- QE3_STYLE ,
- ZWIN_WIDTH,
- (int)(screen_height*CWIN_SIZE)-20,
- screen_width-ZWIN_WIDTH,
- (int)(screen_height*(1.0-CWIN_SIZE)-38), // size
- g_qeglobals.d_hwndMain, // parent
- 0, // no menu
- hInstance,
- NULL);
- if (!g_qeglobals.d_hwndXY )
- Error ("Couldn't create XY View");
- LoadWindowState(g_qeglobals.d_hwndXY, "xywindow");
- ShowWindow(g_qeglobals.d_hwndXY, SW_SHOWDEFAULT);
- #endif
- }
- static void WXY_InitPixelFormat( PIXELFORMATDESCRIPTOR *pPFD )
- {
- memset( pPFD, 0, sizeof( *pPFD ) );
- pPFD->nSize = sizeof( PIXELFORMATDESCRIPTOR );
- pPFD->nVersion = 1;
- pPFD->dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
- pPFD->iPixelType = PFD_TYPE_RGBA;
- pPFD->cColorBits = 24;
- pPFD->cDepthBits = 32;
- pPFD->iLayerType = PFD_MAIN_PLANE;
- }
- void WXY_Print( void )
- {
- DOCINFO di;
- PRINTDLG pd;
- /*
- ** initialize the PRINTDLG struct and execute it
- */
- memset( &pd, 0, sizeof( pd ) );
- pd.lStructSize = sizeof( pd );
- pd.hwndOwner = g_qeglobals.d_hwndXY;
- pd.Flags = PD_RETURNDC;
- pd.hInstance = 0;
- if ( !PrintDlg( &pd ) || !pd.hDC )
- {
- MessageBox( g_qeglobals.d_hwndMain, "Could not PrintDlg()", "QE4 Print Error", MB_OK | MB_ICONERROR );
- return;
- }
- /*
- ** StartDoc
- */
- memset( &di, 0, sizeof( di ) );
- di.cbSize = sizeof( di );
- di.lpszDocName = "QE4";
- if ( StartDoc( pd.hDC, &di ) <= 0 )
- {
- MessageBox( g_qeglobals.d_hwndMain, "Could not StartDoc()", "QE4 Print Error", MB_OK | MB_ICONERROR );
- return;
- }
- /*
- ** StartPage
- */
- if ( StartPage( pd.hDC ) <= 0 )
- {
- MessageBox( g_qeglobals.d_hwndMain, "Could not StartPage()", "QE4 Print Error", MB_OK | MB_ICONERROR );
- return;
- }
- /*
- ** read pixels from the XY window
- */
- {
- int bmwidth = 320, bmheight = 320;
- int pwidth, pheight;
- RECT r;
- GetWindowRect( g_qeglobals.d_hwndXY, &r );
- bmwidth = r.right - r.left;
- bmheight = r.bottom - r.top;
- pwidth = GetDeviceCaps( pd.hDC, PHYSICALWIDTH ) - GetDeviceCaps( pd.hDC, PHYSICALOFFSETX );
- pheight = GetDeviceCaps( pd.hDC, PHYSICALHEIGHT ) - GetDeviceCaps( pd.hDC, PHYSICALOFFSETY );
- StretchBlt( pd.hDC,
- 0, 0,
- pwidth, pheight,
- s_hdcXY,
- 0, 0,
- bmwidth, bmheight,
- SRCCOPY );
- }
- /*
- ** EndPage and EndDoc
- */
- if ( EndPage( pd.hDC ) <= 0 )
- {
- MessageBox( g_qeglobals.d_hwndMain, "QE4 Print Error", "Could not EndPage()", MB_OK | MB_ICONERROR );
- return;
- }
- if ( EndDoc( pd.hDC ) <= 0 )
- {
- MessageBox( g_qeglobals.d_hwndMain, "QE4 Print Error", "Could not EndDoc()", MB_OK | MB_ICONERROR );
- return;
- }
- }
|