gates_of_skeldal/mapedit/ColEdit/PaletteEditor.cpp
2025-01-24 18:27:22 +01:00

113 lines
2.3 KiB
C++

// PaletteEditor.cpp : implementation file
//
#include "stdafx.h"
#include "ColEdit.h"
#include "PaletteEditor.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPaletteEditor
CPaletteEditor::CPaletteEditor()
{
memset(_selection,0,sizeof(_selection));
}
CPaletteEditor::~CPaletteEditor()
{
}
BEGIN_MESSAGE_MAP(CPaletteEditor, CStatic)
//{{AFX_MSG_MAP(CPaletteEditor)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPaletteEditor message handlers
void CPaletteEditor::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(&rc);
char *p=_palette;
for (int i=0;i<16;i++)
for (int j=0;j<16;j++)
{
int x1=rc.right*j/16;
int y1=rc.bottom*i/16;
int x2=rc.right*(j+1)/16-1;
int y2=rc.bottom*(i+1)/16-1;
COLORREF ref=RGB(p[0],p[1],p[2]);
bool white=(p[0]*0.3+p[1]*0.5+p[2]*0.2)<128;
p+=3;
dc.FillSolidRect(x1,y1,x2-x1,y2-y1,ref);
dc.SelectStockObject(white?WHITE_PEN:BLACK_PEN);
if (!_selection[i*16+j])
{
dc.SelectStockObject(HOLLOW_BRUSH);
dc.Rectangle(x1,y1,x2,y2);
dc.MoveTo(x1,y1);dc.LineTo(x2,y2);
dc.MoveTo(x1,y2);dc.LineTo(x2,y1);
}
}
}
// Do not call CStatic::OnPaint() for painting message}
void CPaletteEditor::OnLButtonDown(UINT nFlags, CPoint point)
{
int pt=IndexFromPoint(point);
if (!(nFlags & MK_CONTROL))
memset(_selection,0,sizeof(_selection));
if (pt>=0 && pt<256)
_selection[pt]=!_selection[pt];
_drawsel=_selection[pt];
Invalidate();
SetCapture();
}
void CPaletteEditor::OnMouseMove(UINT nFlags, CPoint point)
{
if (GetCapture()==this)
{
int pt=IndexFromPoint(point);
if (pt>=0 && pt<256)
_selection[pt]=_drawsel;
Invalidate();
}
}
int CPaletteEditor::IndexFromPoint(CPoint pt)
{
CRect rc;
GetClientRect(&rc);
int x=pt.x*16/rc.right;
int y=pt.y*16/rc.bottom;
int ret=y*16+x;
return ret;
}
void CPaletteEditor::OnLButtonUp(UINT nFlags, CPoint point)
{
if (GetCapture()==this)
{
ReleaseCapture();
GetParent()->SendNotifyMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(),BN_CLICKED),(LPARAM)GetSafeHwnd());
}
}