123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- /*
- ===========================================================================
- Copyright (C) 1997-2006 Id Software, Inc.
- This file is part of Quake 2 Tools source code.
- Quake 2 Tools 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 2 Tools 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 Quake 2 Tools source code; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- ===========================================================================
- */
- #include "texpaint.h"
- HINSTANCE main_instance;
- int screen_width, screen_height;
- HWND mainwindow;
- HWND camerawindow;
- HWND palettewindow;
- HWND skinwindow;
- /*
- =================
- Sys_Error
- For abnormal program terminations
- =================
- */
- void Sys_Error (char *error, ...)
- {
- va_list argptr;
- char text[1024];
- char text2[1024];
- int err;
- err = GetLastError ();
- va_start (argptr,error);
- vsprintf (text, error,argptr);
- va_end (argptr);
- sprintf (text2, "%s\nGetLastError() = %i", text, err);
- MessageBox(mainwindow, text2, "Error", 0 /* MB_OK */ );
- exit (1);
- }
- /*
- ======================================================================
- FILE DIALOGS
- ======================================================================
- */
- qboolean modified;
- qboolean modified_past_autosave;
- qboolean ConfirmModified (void)
- {
- if (!modified)
- return true;
- if (MessageBox (mainwindow, "This will lose changes to the skin"
- , "warning", MB_OKCANCEL) == IDCANCEL)
- return false;
- return true;
- }
- OPENFILENAME ofn; /* common dialog box structure */
- char szDirName[MAX_PATH]; /* directory string */
- char szFile[260]; /* filename string */
- char szFileTitle[260]; /* file title string */
- char szSkinFilter[260] = /* filter string */
- "Skin texture (*.lbm *.pcx)\0*.lbm;*.pcx\0\0";
- char szFrameFilter[260] = /* filter string */
- "Model frame (*.tri)\0*.tri\0\0";
- char chReplace; /* string separator for szFilter */
- int i, cbString; /* integer count variables */
- HANDLE hf; /* file handle */
- void OpenSkinDialog (void)
- {
- // strcpy (szDirName, ValueForKey (project_entity, "basepath") );
- // strcat (szDirName, "\\maps");
- /* Place the terminating null character in the szFile. */
- szFile[0] = '\0';
- /* Set the members of the OPENFILENAME structure. */
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = mainwindow;
- ofn.lpstrFilter = szSkinFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = szDirName;
- ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
- OFN_FILEMUSTEXIST;
- /* Display the Open dialog box. */
- if (!GetOpenFileName(&ofn))
- return; // canceled
- Skin_LoadFile (ofn.lpstrFile);
- }
- void OpenFrameDialog (void)
- {
- // strcpy (szDirName, ValueForKey (project_entity, "basepath") );
- // strcat (szDirName, "\\maps");
- /* Place the terminating null character in the szFile. */
- szFile[0] = '\0';
- /* Set the members of the OPENFILENAME structure. */
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = mainwindow;
- ofn.lpstrFilter = szFrameFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = szDirName;
- ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
- OFN_FILEMUSTEXIST;
- /* Display the Open dialog box. */
- if (!GetOpenFileName(&ofn))
- return; // canceled
- LoadTriFile (ofn.lpstrFile);
- }
- void SaveSkinDialog (void)
- {
- // strcpy (szDirName, ValueForKey (project_entity, "basepath") );
- // strcat (szDirName, "\\maps");
- /* Place the terminating null character in the szFile. */
- szFile[0] = '\0';
- /* Set the members of the OPENFILENAME structure. */
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = mainwindow;
- ofn.lpstrFilter = szSkinFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = szDirName;
- ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
- OFN_FILEMUSTEXIST;
- /* Display the Open dialog box. */
- if (!GetSaveFileName(&ofn))
- return; // canceled
- DefaultExtension (ofn.lpstrFile, ".lbm");
- Skin_SaveFile (ofn.lpstrFile);
- strcpy (skin_filename, ofn.lpstrFile);
- }
- //==========================================================================
- BOOL bSetupPixelFormat(HDC hDC)
- {
- static PIXELFORMATDESCRIPTOR pfd = {
- sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
- 1, // version number
- PFD_DRAW_TO_WINDOW | // support window
- PFD_SUPPORT_OPENGL | // support OpenGL
- PFD_DOUBLEBUFFER, // double buffered
- PFD_TYPE_RGBA, // RGBA type
- 24, // 24-bit color depth
- 0, 0, 0, 0, 0, 0, // color bits ignored
- 0, // no alpha buffer
- 0, // shift bit ignored
- 0, // no accumulation buffer
- 0, 0, 0, 0, // accum bits ignored
- 32, // 32-bit z-buffer
- 0, // no stencil buffer
- 0, // no auxiliary buffer
- PFD_MAIN_PLANE, // main layer
- 0, // reserved
- 0, 0, 0 // layer masks ignored
- };
- int pixelformat = 0;
- PIXELFORMATDESCRIPTOR newp;
- if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 )
- {
- printf("%d",GetLastError());
- Error ("ChoosePixelFormat failed");
- }
- if (!SetPixelFormat(hDC, pixelformat, &pfd))
- Error ("SetPixelFormat failed");
- return TRUE;
- }
- /*
- ==============================================================================
- MENU
- ==============================================================================
- */
- /* handle all WM_COMMAND messages here */
- LONG WINAPI CommandHandler (
- HWND hWnd,
- WPARAM wParam,
- LPARAM lParam)
- {
- unsigned short cmd;
- cmd = LOWORD(wParam);
- switch (cmd)
- {
- //
- // file menu
- //
- case ID_FILE_RESAMPLESKIN:
- ResampleSkin ();
- break;
- case ID_FILE_NEWSKIN:
- NewSkin ();
- break;
- case ID_FILE_OPENFRAME:
- OpenFrameDialog ();
- break;
- case ID_FILE_OPENSKIN:
- if (!ConfirmModified())
- break;
- OpenSkinDialog ();
- break;
- case ID_FILE_RELOADSKIN:
- if (!ConfirmModified())
- break;
- Skin_LoadFile (skin_filename);
- break;
- case ID_FILE_SAVESKIN:
- Skin_SaveFile (skin_filename);
- break;
- case ID_FILE_SAVESKINAS:
- SaveSkinDialog ();
- break;
- case ID_FILE_EXIT:
- if (!ConfirmModified())
- break;
- PostQuitMessage (0);
- break;
- //
- // edit menu
- //
- case ID_EDIT_UNDO:
- Undo();
- break;
- case ID_EDIT_REDO:
- Redo();
- break;
- //
- // view menu
- //
- case ID_VIEW_MODELLINES:
- model_lines ^= 1;
- CheckMenuItem ( GetSubMenu (GetMenu(mainwindow), MENU_VIEW)
- , ID_VIEW_MODELLINES
- , MF_BYCOMMAND | (model_lines ? MF_CHECKED : MF_UNCHECKED) );
- InvalidateRect (camerawindow, NULL, false);
- break;
- case ID_VIEW_TEXTURELINES:
- skin_lines ^= 1;
- CheckMenuItem ( GetSubMenu (GetMenu(mainwindow), MENU_VIEW)
- , ID_VIEW_TEXTURELINES
- , MF_BYCOMMAND | (skin_lines ? MF_CHECKED : MF_UNCHECKED) );
- InvalidateRect (skinwindow, NULL, false);
- break;
- default:
- return FALSE;
- }
- return TRUE;
- }
- /*
- ============
- WMAIN_WndProc
- ============
- */
- LONG WINAPI WMAIN_WndProc (
- HWND hWnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
- {
- LONG lRet = 1;
- RECT rect;
- HDC maindc;
- GetClientRect(hWnd, &rect);
- switch (uMsg)
- {
- case WM_CREATE:
- maindc = GetDC(hWnd);
- bSetupPixelFormat(maindc);
- break;
- case WM_COMMAND:
- lRet = CommandHandler (hWnd, wParam, lParam);
- break;
- case WM_CLOSE:
- if (!ConfirmModified())
- break;
- PostQuitMessage (0);
- break;
- default:
- /* pass all unhandled messages to DefWindowProc */
- lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
- break;
- }
- /* return 1 if handled message, 0 if not */
- return lRet;
- }
- /*
- ==============
- Main_Create
- ==============
- */
- void Main_Create (HINSTANCE hInstance)
- {
- WNDCLASS wc;
- /* Register the class */
- memset (&wc, 0, sizeof(wc));
- wc.style = 0;
- wc.lpfnWndProc = (WNDPROC)WMAIN_WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = 0;
- wc.hCursor = LoadCursor (NULL,IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU2);
- wc.lpszClassName = "TEXPAINT_MAIN";
- if (!RegisterClass (&wc) )
- Error ("WCam_Register: failed");
- mainwindow = CreateWindow ("TEXPAINT_MAIN" ,
- "Texpaint",
- WS_OVERLAPPEDWINDOW |
- WS_CLIPSIBLINGS |
- WS_CLIPCHILDREN,
- 0,0,screen_width,screen_height, // size
- 0,
- NULL, // no menu
- hInstance,
- NULL);
- if (!mainwindow)
- Error ("Couldn't create main window");
- // GetWindowInfo("mainwindow", &SavedInfo, NULL);
- ShowWindow (mainwindow, SW_SHOWDEFAULT);
- }
- BOOL SaveWindowInfo(const char *pszName, void *pvBuf, long lSize)
- {
- LONG lres;
- DWORD dwDisp;
- HKEY hKeyId;
- lres = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\id\\Texpaint", 0, NULL,
- REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyId, &dwDisp);
- if (lres != ERROR_SUCCESS)
- return FALSE;
- lres = RegSetValueEx(hKeyId, pszName, 0, REG_BINARY, pvBuf, lSize);
- RegCloseKey(hKeyId);
- if (lres != ERROR_SUCCESS)
- return FALSE;
- return TRUE;
- }
- BOOL GetWindowInfo(const char *pszName, void *pvBuf, long *plSize)
- {
- HKEY hKey;
- long lres, lType, lSize;
- if (plSize == NULL)
- plSize = &lSize;
- lres = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\id\\Texpaint", 0, KEY_READ, &hKey);
- if (lres != ERROR_SUCCESS)
- return FALSE;
- lres = RegQueryValueEx(hKey, pszName, NULL, &lType, pvBuf, plSize);
- RegCloseKey(hKey);
- if (lres != ERROR_SUCCESS)
- return FALSE;
- return TRUE;
- }
- BOOL SaveWindowState(HWND hWnd, const char *pszName)
- {
- RECT rc;
- GetWindowRect(hWnd, &rc);
- MapWindowPoints(NULL, mainwindow, (POINT *)&rc, 2);
- return SaveWindowInfo(pszName, &rc, sizeof(rc));
- }
- BOOL RestoreWindowState(HWND hWnd, const char *pszName)
- {
- RECT rc;
- LONG lSize = sizeof(rc);
- if (GetWindowInfo(pszName, &rc, &lSize))
- {
- if (rc.left < 0)
- rc.left = 0;
- if (rc.top < 0)
- rc.top = 0;
- if (rc.right < rc.left + 16)
- rc.right = rc.left + 16;
- if (rc.bottom < rc.top + 16)
- rc.bottom = rc.top + 16;
- MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left,
- rc.bottom - rc.top, FALSE);
- return TRUE;
- }
- return FALSE;
- }
|