// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. // Copyright (C) 1999-2003 Forgotten // Copyright (C) 2004 Forgotten and the VBA development team // This program 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, or(at your option) // any later version. // // This program 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 this program; if not, write to the Free Software Foundation, // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // PaletteView.cpp : implementation file // #include "stdafx.h" #include "vba.h" #include "FileDlg.h" #include "PaletteView.h" #include "WinResUtil.h" #include "../System.h" #include "../GBA.h" #include "../Globals.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif void GBAPaletteViewControl::updatePalette() { if(paletteRAM != NULL) memcpy(palette, &paletteRAM[paletteAddress], 512); } ///////////////////////////////////////////////////////////////////////////// // PaletteView dialog PaletteView::PaletteView(CWnd* pParent /*=NULL*/) : ResizeDlg(PaletteView::IDD, pParent) { //{{AFX_DATA_INIT(PaletteView) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT autoUpdate = false; } PaletteView::~PaletteView() { } void PaletteView::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(PaletteView) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP DDX_Control(pDX, IDC_PALETTE_VIEW, paletteView); DDX_Control(pDX, IDC_PALETTE_VIEW_OBJ, paletteViewOBJ); DDX_Control(pDX, IDC_COLOR, colorControl); } BEGIN_MESSAGE_MAP(PaletteView, CDialog) //{{AFX_MSG_MAP(PaletteView) ON_BN_CLICKED(IDC_SAVE_BG, OnSaveBg) ON_BN_CLICKED(IDC_SAVE_OBJ, OnSaveObj) ON_BN_CLICKED(IDC_REFRESH2, OnRefresh2) ON_BN_CLICKED(IDC_AUTO_UPDATE, OnAutoUpdate) ON_BN_CLICKED(IDC_CLOSE, OnClose) //}}AFX_MSG_MAP ON_MESSAGE(WM_PALINFO, OnPalInfo) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // PaletteView message handlers BOOL PaletteView::OnInitDialog() { CDialog::OnInitDialog(); DIALOG_SIZER_START( sz ) DIALOG_SIZER_END() SetData(sz, FALSE, HKEY_CURRENT_USER, "Software\\Emulators\\VisualBoyAdvance\\Viewer\\PaletteView", NULL); paletteView.setPaletteAddress(0); paletteView.refresh(); paletteViewOBJ.setPaletteAddress(0x200); paletteViewOBJ.refresh(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void PaletteView::save(int which) { CString captureBuffer; if(which == 0) captureBuffer = "bg.pal"; else captureBuffer = "obj.pal"; LPCTSTR exts[] = {".pal", ".pal", ".act" }; CString filter = theApp.winLoadFilter(IDS_FILTER_PAL); CString title = winResLoadString(IDS_SELECT_PALETTE_NAME); FileDlg dlg(this, captureBuffer, filter, 1, "PAL", exts, "", title, true); if(dlg.DoModal() == IDCANCEL) { return; } PaletteViewControl *p = NULL; if(which == 0) p = &paletteView; else p = &paletteViewOBJ; switch(dlg.getFilterIndex()) { case 0: case 1: p->saveMSPAL(captureBuffer); break; case 2: p->saveJASCPAL(captureBuffer); break; case 3: p->saveAdobe(captureBuffer); break; } } void PaletteView::OnSaveBg() { save(0); } void PaletteView::OnSaveObj() { save(1); } void PaletteView::OnRefresh2() { paletteView.refresh(); paletteViewOBJ.refresh(); } void PaletteView::update() { OnRefresh2(); } void PaletteView::OnAutoUpdate() { autoUpdate = !autoUpdate; if(autoUpdate) { theApp.winAddUpdateListener(this); } else { theApp.winRemoveUpdateListener(this); } } void PaletteView::OnClose() { theApp.winRemoveUpdateListener(this); DestroyWindow(); } LRESULT PaletteView::OnPalInfo(WPARAM wParam, LPARAM lParam) { u16 color = (u16)wParam; u32 address = (u32)lParam; CString buffer; if(address >= 0x200) address = 0x5000200 + 2*(address & 255); else address = 0x5000000 + 2*(address & 255); buffer.Format("0x%08X", address); GetDlgItem(IDC_ADDRESS)->SetWindowText(buffer); int r = (color & 0x1f); int g = (color & 0x3e0) >> 5; int b = (color & 0x7c00) >> 10; buffer.Format("%d", r); GetDlgItem(IDC_R)->SetWindowText(buffer); buffer.Format("%d", g); GetDlgItem(IDC_G)->SetWindowText(buffer); buffer.Format("%d", b); GetDlgItem(IDC_B)->SetWindowText(buffer); buffer.Format("0x%04X", color); GetDlgItem(IDC_VALUE)->SetWindowText(buffer); colorControl.setColor(color); if(address >= 0x5000200) { paletteView.setSelected(-1); } else paletteViewOBJ.setSelected(-1); return TRUE; } void PaletteView::PostNcDestroy() { delete this; }