rlm@1: // PaletteViewControl.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "PaletteViewControl.h" rlm@1: rlm@1: #include "../common/Util.h" rlm@1: rlm@1: bool PaletteViewControl::isRegistered = false; rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // PaletteViewControl rlm@1: rlm@1: PaletteViewControl::PaletteViewControl() rlm@1: { rlm@1: memset(&bmpInfo.bmiHeader, 0, sizeof(bmpInfo.bmiHeader)); rlm@1: rlm@1: bmpInfo.bmiHeader.biSize = sizeof(bmpInfo.bmiHeader); rlm@1: bmpInfo.bmiHeader.biWidth = 256; rlm@1: bmpInfo.bmiHeader.biHeight = -256; rlm@1: bmpInfo.bmiHeader.biPlanes = 1; rlm@1: bmpInfo.bmiHeader.biBitCount = 24; rlm@1: bmpInfo.bmiHeader.biCompression = BI_RGB; rlm@1: data = (u8 *)malloc(3 * 256 * 256); rlm@1: rlm@1: w = 256; rlm@1: h = 256; rlm@1: rlm@1: colors = 256; rlm@1: rlm@1: paletteAddress = 0; rlm@1: rlm@1: ZeroMemory(palette, 512); rlm@1: rlm@1: selected = -1; rlm@1: registerClass(); rlm@1: } rlm@1: rlm@1: PaletteViewControl::~PaletteViewControl() rlm@1: { rlm@1: if(data) rlm@1: free(data); rlm@1: } rlm@1: rlm@1: rlm@1: BEGIN_MESSAGE_MAP(PaletteViewControl, CWnd) rlm@1: //{{AFX_MSG_MAP(PaletteViewControl) rlm@1: ON_WM_LBUTTONDOWN() rlm@1: ON_WM_ERASEBKGND() rlm@1: ON_WM_PAINT() rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // PaletteViewControl message handlers rlm@1: rlm@1: void PaletteViewControl::init(int c, int w, int h) rlm@1: { rlm@1: this->w = w; rlm@1: this->h = h; rlm@1: this->colors = c; rlm@1: rlm@1: bmpInfo.bmiHeader.biWidth = w; rlm@1: bmpInfo.bmiHeader.biHeight = -h; rlm@1: } rlm@1: rlm@1: rlm@1: bool PaletteViewControl::saveAdobe(const char *name) rlm@1: { rlm@1: FILE *f = fopen(name, "wb"); rlm@1: rlm@1: if(!f) rlm@1: return false; rlm@1: rlm@1: for(int i = 0; i < colors; i++) { rlm@1: u16 c = palette[i]; rlm@1: int r = (c & 0x1f) << 3; rlm@1: int g = (c & 0x3e0) >> 2; rlm@1: int b = (c & 0x7c00) >> 7; rlm@1: rlm@1: u8 data[3] = { r, g, b }; rlm@1: fwrite(data, 1, 3, f); rlm@1: } rlm@1: if(colors < 256) { rlm@1: for(int i = colors; i < 256; i++) { rlm@1: u8 data[3] = { 0, 0, 0 }; rlm@1: fwrite(data, 1, 3, f); rlm@1: } rlm@1: } rlm@1: fclose(f); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: rlm@1: bool PaletteViewControl::saveMSPAL(const char *name) rlm@1: { rlm@1: FILE *f = fopen(name, "wb"); rlm@1: rlm@1: if(!f) rlm@1: return false; rlm@1: rlm@1: u8 data[4] = { 'R', 'I', 'F', 'F' }; rlm@1: rlm@1: fwrite(data, 1, 4, f); rlm@1: utilPutDword(data, 256 * 4 + 16); rlm@1: fwrite(data, 1, 4, f); rlm@1: u8 data3[4] = { 'P', 'A', 'L', ' ' }; rlm@1: fwrite(data3, 1, 4, f); rlm@1: u8 data4[4] = { 'd', 'a', 't', 'a' }; rlm@1: fwrite(data4, 1, 4, f); rlm@1: utilPutDword(data, 256*4+4); rlm@1: fwrite(data, 1, 4, f); rlm@1: utilPutWord(&data[0], 0x0300); rlm@1: utilPutWord(&data[2], 256); // causes problems if not 16 or 256 rlm@1: fwrite(data, 1, 4, f); rlm@1: rlm@1: for(int i = 0; i < colors; i++) { rlm@1: u16 c = palette[i]; rlm@1: int r = (c & 0x1f) << 3; rlm@1: int g = (c & 0x3e0) >> 2; rlm@1: int b = (c & 0x7c00) >> 7; rlm@1: rlm@1: u8 data7[4] = { r, g, b, 0 }; rlm@1: fwrite(data7, 1, 4, f); rlm@1: } rlm@1: if(colors < 256) { rlm@1: for(int i = colors; i < 256; i++) { rlm@1: u8 data7[4] = { 0, 0, 0, 0 }; rlm@1: fwrite(data7, 1, 4, f); rlm@1: } rlm@1: } rlm@1: fclose(f); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: rlm@1: bool PaletteViewControl::saveJASCPAL(const char *name) rlm@1: { rlm@1: FILE *f = fopen(name, "wb"); rlm@1: rlm@1: if(!f) rlm@1: return false; rlm@1: rlm@1: fprintf(f, "JASC-PAL\r\n0100\r\n256\r\n"); rlm@1: rlm@1: for(int i = 0; i < colors; i++) { rlm@1: u16 c = palette[i]; rlm@1: int r = (c & 0x1f) << 3; rlm@1: int g = (c & 0x3e0) >> 2; rlm@1: int b = (c & 0x7c00) >> 7; rlm@1: rlm@1: fprintf(f, "%d %d %d\r\n", r, g, b); rlm@1: } rlm@1: if(colors < 256) { rlm@1: for(int i = colors; i < 256; i++) rlm@1: fprintf(f, "0 0 0\r\n"); rlm@1: } rlm@1: fclose(f); rlm@1: rlm@1: return true; rlm@1: } rlm@1: rlm@1: void PaletteViewControl::setPaletteAddress(int address) rlm@1: { rlm@1: paletteAddress = address; rlm@1: } rlm@1: rlm@1: rlm@1: void PaletteViewControl::setSelected(int s) rlm@1: { rlm@1: selected = s; rlm@1: InvalidateRect(NULL, FALSE); rlm@1: } rlm@1: rlm@1: rlm@1: void PaletteViewControl::render(u16 color, int x, int y) rlm@1: { rlm@1: u8 *start = data + y*16*w*3 + x*16*3; rlm@1: int skip = w*3-16*3; rlm@1: rlm@1: int r = (color & 0x1f) << 3; rlm@1: int g = (color & 0x3e0) >> 2; rlm@1: int b = (color & 0x7c00) >> 7; rlm@1: rlm@1: for(int i = 0; i < 16; i++) { rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: *start++ = b; rlm@1: *start++ = g; rlm@1: *start++ = r; rlm@1: rlm@1: start += skip; rlm@1: } rlm@1: } rlm@1: rlm@1: void PaletteViewControl::refresh() rlm@1: { rlm@1: updatePalette(); rlm@1: int sw = w/16; rlm@1: int sh = h/16; rlm@1: for(int i = 0; i < colors; i++) { rlm@1: render(palette[i], i & (sw-1), i/sw); rlm@1: } rlm@1: InvalidateRect(NULL, FALSE); rlm@1: } rlm@1: rlm@1: void PaletteViewControl::OnLButtonDown(UINT nFlags, CPoint point) rlm@1: { rlm@1: int x = point.x; rlm@1: int y = point.y; rlm@1: RECT rect; rlm@1: GetClientRect(&rect); rlm@1: int h = rect.bottom - rect.top; rlm@1: int w = rect.right - rect.left; rlm@1: int sw = (this->w/16); rlm@1: int sh = (this->h/16); rlm@1: int mult = w / sw; rlm@1: int multY = h / sh; rlm@1: rlm@1: setSelected(x/mult + (y/multY)*sw); rlm@1: rlm@1: GetParent()->SendMessage(WM_PALINFO, rlm@1: palette[x/mult+(y/multY)*sw], rlm@1: paletteAddress+(x/mult+(y/multY)*sw)); rlm@1: } rlm@1: rlm@1: BOOL PaletteViewControl::OnEraseBkgnd(CDC* pDC) rlm@1: { rlm@1: return TRUE; rlm@1: } rlm@1: rlm@1: rlm@1: void PaletteViewControl::OnPaint() rlm@1: { rlm@1: CPaintDC dc(this); // device context for painting rlm@1: rlm@1: RECT rect; rlm@1: GetClientRect(&rect); rlm@1: int w = rect.right - rect.left; rlm@1: int h = rect.bottom - rect.top; rlm@1: rlm@1: CDC memDC; rlm@1: memDC.CreateCompatibleDC(&dc); rlm@1: CBitmap bitmap, *pOldBitmap; rlm@1: bitmap.CreateCompatibleBitmap(&dc, w, h); rlm@1: pOldBitmap = memDC.SelectObject(&bitmap); rlm@1: rlm@1: StretchDIBits(memDC.GetSafeHdc(), rlm@1: 0, rlm@1: 0, rlm@1: w, rlm@1: h, rlm@1: 0, rlm@1: 0, rlm@1: this->w, rlm@1: this->h, rlm@1: data, rlm@1: &bmpInfo, rlm@1: DIB_RGB_COLORS, rlm@1: SRCCOPY); rlm@1: int sw = this->w / 16; rlm@1: int sh = this->h / 16; rlm@1: int mult = w / sw; rlm@1: int multY = h / sh; rlm@1: CPen pen; rlm@1: pen.CreatePen(PS_SOLID, 1, RGB(192,192,192)); rlm@1: CPen *old = memDC.SelectObject(&pen); rlm@1: int i; rlm@1: for(i = 1; i < sh; i++) { rlm@1: memDC.MoveTo(0, i * multY); rlm@1: memDC.LineTo(w, i * multY); rlm@1: } rlm@1: for(i = 1; i < sw; i++) { rlm@1: memDC.MoveTo(i * mult, 0); rlm@1: memDC.LineTo(i * mult, h); rlm@1: } rlm@1: memDC.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT); rlm@1: memDC.SelectObject(old); rlm@1: pen.DeleteObject(); rlm@1: rlm@1: if(selected != -1) { rlm@1: pen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); rlm@1: old = memDC.SelectObject(&pen); rlm@1: rlm@1: int startX = (selected & (sw-1))*mult+1; rlm@1: int startY = (selected / sw)*multY+1; rlm@1: int endX = startX + mult-2; rlm@1: int endY = startY + multY-2; rlm@1: rlm@1: memDC.MoveTo(startX, startY); rlm@1: memDC.LineTo(endX, startY); rlm@1: memDC.LineTo(endX, endY); rlm@1: memDC.LineTo(startX, endY); rlm@1: memDC.LineTo(startX, startY-1); rlm@1: rlm@1: memDC.SelectObject(old); rlm@1: pen.DeleteObject(); rlm@1: } rlm@1: rlm@1: dc.BitBlt(0,0,w,h, rlm@1: &memDC,0,0,SRCCOPY); rlm@1: rlm@1: memDC.SelectObject(pOldBitmap); rlm@1: bitmap.DeleteObject(); rlm@1: memDC.DeleteDC(); rlm@1: } rlm@1: rlm@1: void PaletteViewControl::registerClass() rlm@1: { rlm@1: if(!isRegistered) { rlm@1: WNDCLASS wc; rlm@1: ZeroMemory(&wc, sizeof(wc)); rlm@1: wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; rlm@1: wc.lpfnWndProc = (WNDPROC)::DefWindowProc; rlm@1: wc.hInstance = AfxGetInstanceHandle(); rlm@1: wc.hCursor = LoadCursor(NULL, IDC_ARROW); rlm@1: wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH); rlm@1: wc.lpszMenuName = NULL; rlm@1: wc.lpszClassName = "VbaPaletteViewControl"; rlm@1: AfxRegisterClass(&wc); rlm@1: isRegistered = true; rlm@1: } rlm@1: }