]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake2/extra/texpaint/win_main.c
Q2Tools source - didn't import this in initially
[xonotic/netradiant.git] / tools / quake2 / extra / texpaint / win_main.c
diff --git a/tools/quake2/extra/texpaint/win_main.c b/tools/quake2/extra/texpaint/win_main.c
new file mode 100644 (file)
index 0000000..d377d7b
--- /dev/null
@@ -0,0 +1,496 @@
+/*
+===========================================================================
+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;
+}
+