--- /dev/null
+/*
+===========================================================================
+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;
+}
+