123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- /*
- ===========================================================================
- 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"
- #define PALETTE_WINDOW_CLASS "TPPalette"
- HDC paldc;
- int pal_width, pal_height;
- int blocks_x, blocks_y;
- int selected_index;
- unsigned selected_rgb;
- byte palette[768];
- float SnapAspect (float aspect)
- {
- if (aspect > 128)
- return 256;
- if (aspect > 32)
- return 128;
- if (aspect > 8)
- return 64;
- if (aspect > 2)
- return 32;
- return 16;
- }
- void Pal_SetIndex (int index)
- {
- selected_index = index;
- selected_rgb = palette[index*3] + (palette[index*3+1]<<8) + (palette[index*3+2]<<16);
- InvalidateRect (palettewindow, NULL, false);
- }
- void Pal_Draw (void)
- {
- int x, y;
- float aspect;
- float xs, ys;
- int c;
- if (pal_width < 1 || pal_height < 1)
- return;
- //
- // determine the block arrangement
- //
- if (pal_width > pal_height)
- {
- aspect = SnapAspect (pal_width / pal_height);
- blocks_x = aspect;
- blocks_y = 256/blocks_x;
- }
- else
- {
- aspect = SnapAspect (pal_height / pal_width);
- blocks_y = aspect;
- blocks_x = 256/blocks_y;
- }
- //
- // draw it
- //
- glViewport (0,0,pal_width, pal_height);
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
- glOrtho (0,1,0,1,-100,100);
- glMatrixMode (GL_MODELVIEW);
- glLoadIdentity ();
- glClear (GL_COLOR_BUFFER_BIT);
- glDisable (GL_DEPTH_TEST);
- glDisable (GL_CULL_FACE);
- glDisable (GL_TEXTURE_2D);
- xs = 1.0/blocks_x;
- ys = 1.0/blocks_y;
- for (x=0 ; x<blocks_x ; x++)
- {
- for (y=0 ; y<blocks_y ; y++)
- {
- c = x*blocks_y+(blocks_y-1-y);
- glColor3ubv (palette+c*3);
- glRectf (x*xs, y*ys, (x+1)*xs, (y+1)*ys);
- }
- }
- // highlight the selected texture
- y = selected_index % blocks_y;
- x = selected_index / blocks_y;
- y = blocks_y-1-y;
- glColor3f (0,0,0);
- glRectf ( (x+0.4)*xs, (y+0.4)*ys, (x+0.6)*xs, (y+0.6)*ys);
- }
- void Pal_Click (int x, int y)
- {
- int index;
- x = x*blocks_x/pal_width;
- y = y*blocks_y/pal_height;
- y = blocks_y-1-y;
- index = x*blocks_y + y;
- Pal_SetIndex (index);
- }
- /*
- ============
- Palette_WndProc
- ============
- */
- LONG WINAPI Palette_WndProc (
- HWND hWnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
- {
- LONG lRet = 1;
- int fwKeys, xPos, yPos;
- RECT rect;
- GetClientRect(hWnd, &rect);
- pal_width = rect.right-rect.left;
- pal_height = rect.bottom-rect.top;
- switch (uMsg)
- {
- case WM_CREATE:
- paldc = GetDC(hWnd);
- bSetupPixelFormat(paldc);
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- BeginPaint(hWnd, &ps);
- if (!wglMakeCurrent( paldc, baseRC ))
- Error ("wglMakeCurrent failed");
- Pal_Draw ();
- EndPaint(hWnd, &ps);
- SwapBuffers(paldc);
- }
- break;
- case WM_MOUSEMOVE:
- if (wParam != MK_LBUTTON)
- break;
- case WM_LBUTTONDOWN:
- if (GetTopWindow(mainwindow) != hWnd)
- BringWindowToTop(hWnd);
- xPos = (short)LOWORD(lParam); // horizontal position of cursor
- yPos = (short)HIWORD(lParam); // vertical position of cursor
- yPos = (int)rect.bottom - 1 - yPos;
- Pal_Click (xPos, yPos);
- break;
- 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;
- ReleaseCapture ();
- break;
- case WM_SIZE:
- InvalidateRect(skinwindow, NULL, false);
- break;
- case WM_NCCALCSIZE:// don't let windows copy pixels
- lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
- return WVR_REDRAW;
- case WM_CLOSE:
- /* call destroy window to cleanup and go away */
- DestroyWindow (hWnd);
- 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;
- }
- /*
- ==============
- WPal_Create
- ==============
- */
- void WPal_Create (HINSTANCE hInstance)
- {
- WNDCLASS wc;
- /* Register the skin class */
- memset (&wc, 0, sizeof(wc));
- wc.style = 0;
- wc.lpfnWndProc = (WNDPROC)Palette_WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = 0;
- wc.hCursor = LoadCursor (NULL,IDC_ARROW);
- wc.hbrBackground = NULL;
- wc.lpszMenuName = 0;
- wc.lpszClassName = PALETTE_WINDOW_CLASS;
- if (!RegisterClass (&wc) )
- Error ("RegisterClass failed");
- palettewindow = CreateWindow (PALETTE_WINDOW_CLASS ,
- "Palette View",
- QE3_STYLE,
- (int)(screen_width*0.5),
- 0,
- (int)(screen_width*0.5),
- (int)(screen_height*.2), // size
- mainwindow, // parent window
- 0, // no menu
- hInstance,
- 0);
- if (!palettewindow)
- Error ("Couldn't create palettewindow");
- // RestoreWindowState(palettewindow, "palettewindow");
- ShowWindow (palettewindow, SW_SHOWDEFAULT);
- }
|