mirror of
https://github.com/id-Software/Quake-2-Tools.git
synced 2026-03-20 09:00:02 +01:00
The Quake 2 tools as originally released under the GPL license.
This commit is contained in:
257
texpaint/win_pal.c
Normal file
257
texpaint/win_pal.c
Normal file
@@ -0,0 +1,257 @@
|
||||
/*
|
||||
===========================================================================
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user