1 #include "burner.h"
2
3 static HWND hPaletteViewerDlg = NULL;
4 static HWND hParent = NULL;
5 static HWND PaletteControl[256] = {NULL,};
6 static HBRUSH PaletteBrush[256] = {NULL,};
7
8 static int nPalettePosition;
9 static int nPaletteEntries;
10
is_CapcomCPS1or2()11 static int is_CapcomCPS1or2()
12 {
13 UINT32 cap =
14 ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CAPCOM_CPS1) ||
15 ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CAPCOM_CPS1_QSOUND) ||
16 ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CAPCOM_CPS1_GENERIC) ||
17 ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CAPCOM_CPSCHANGER) ||
18 ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CAPCOM_CPS2);
19
20 return cap != 0;
21 }
22
CalcBrushes(int nStartColour)23 static void CalcBrushes(int nStartColour)
24 {
25 int Colour, r, g, b;
26
27 for (int i = 0; i < 256; i++) {
28 DeleteObject(PaletteBrush[i]);
29 PaletteBrush[i] = NULL;
30
31 if (i + nStartColour < nPaletteEntries) {
32 if (is_CapcomCPS1or2()) {
33 Colour = pBurnDrvPalette[(i + nStartColour) ^ 0xf];
34 } else {
35 Colour = pBurnDrvPalette[i + nStartColour];
36 }
37
38 if (nVidImageDepth < 16 || (BurnDrvGetFlags() & BDF_16BIT_ONLY)) {
39 // 15-bit
40 r = (Colour & 0x7c00) >> 7;
41 g = (Colour & 0x03e0) >> 2;
42 b = (Colour & 0x001f) << 3;
43 } else
44 if (nVidImageDepth == 16) {
45 // 16-bit
46 r = (Colour & 0xf800) >> 8;
47 g = (Colour & 0x07e0) >> 3;
48 b = (Colour & 0x001f) << 3;
49
50 } else {
51 // 24/32-bit
52 r = (Colour & 0xff0000) >> 16;
53 g = (Colour & 0x00ff00) >> 8;
54 b = (Colour & 0x0000ff);
55 }
56
57 PaletteBrush[i] = CreateSolidBrush(RGB(r, g, b));
58 }
59 }
60 }
61
UpdateLabels()62 static void UpdateLabels()
63 {
64 TCHAR szItemText[10];
65
66 for (int i = 0; i < 16; i++) {
67 int nLabel = nPalettePosition + (i * 16);
68 szItemText[0] = _T('\0');
69 _stprintf(szItemText, _T("%05X"), nLabel);
70 SendMessage(GetDlgItem(hPaletteViewerDlg, IDC_GFX_VIEWER_VERT_1 + i), WM_SETTEXT, (WPARAM)0, (LPARAM)szItemText);
71 }
72 }
73
DialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam)74 static INT_PTR CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
75 {
76 if (Msg == WM_INITDIALOG) {
77 hPaletteViewerDlg = hDlg;
78
79 if (bDrvOkay) {
80 if (!kNetGame && bAutoPause) bRunPause = 1;
81 AudSoundStop();
82 }
83
84 for (int y = 0; y < 16; y++) {
85 for (int x = 0; x < 16; x++) {
86 PaletteControl[(y * 16) + x] = CreateWindowEx(0, _T("STATIC"), NULL, WS_CHILD | WS_VISIBLE | SS_NOTIFY, (x * 21) + 38, (y * 21) + 21, 20, 20, hPaletteViewerDlg, NULL, NULL, NULL);
87 }
88 }
89
90 nPaletteEntries = BurnDrvGetPaletteEntries();
91 nPalettePosition = 0x0000;
92 CalcBrushes(nPalettePosition);
93
94 WndInMid(hDlg, hParent);
95 SetFocus(hDlg);
96
97 return TRUE;
98 }
99
100 if (Msg == WM_CTLCOLORSTATIC) {
101 for (int i = 0; i < 256; i++) {
102 if ((HWND)lParam == PaletteControl[i]) {
103 return (INT_PTR)PaletteBrush[i];
104 }
105
106 }
107 }
108
109 if (Msg == WM_CLOSE) {
110 for (int i = 0; i < 256; i++) {
111 DeleteObject(PaletteBrush[i]);
112 PaletteBrush[i] = NULL;
113 PaletteControl[i] = NULL;
114 }
115
116 nPalettePosition = 0;
117 nPaletteEntries = 0;
118
119 EndDialog(hPaletteViewerDlg, 0);
120
121 EnableWindow(hScrnWnd, TRUE);
122 DestroyWindow(hPaletteViewerDlg);
123
124 if (bDrvOkay) {
125 if(!bAltPause && bRunPause) bRunPause = 0;
126 AudSoundPlay();
127 }
128
129 return 0;
130 }
131
132 if (Msg == WM_COMMAND) {
133 int Id = LOWORD(wParam);
134 int Notify = HIWORD(wParam);
135
136 if (Notify == STN_CLICKED) {
137 TCHAR szText[100];
138
139 for (int i = 0; i < 256; i++) {
140 if ((HWND)lParam == PaletteControl[i]) {
141 int Colour, r, g, b;
142
143 if (is_CapcomCPS1or2()) {
144 Colour = pBurnDrvPalette[(i + nPalettePosition) ^ 0xf];
145 } else {
146 Colour = pBurnDrvPalette[i + nPalettePosition];
147 }
148
149 if (nVidImageDepth < 16 || (BurnDrvGetFlags() & BDF_16BIT_ONLY)) {
150 // 15-bit
151 r = (Colour & 0x7c00) >> 7;
152 g = (Colour & 0x03e0) >> 2;
153 b = (Colour & 0x001f) << 3;
154 } else
155 if (nVidImageDepth == 16) {
156 // 16-bit
157 r = (Colour & 0xf800) >> 8;
158 g = (Colour & 0x07e0) >> 3;
159 b = (Colour & 0x001f) << 3;
160 } else {
161 // 24/32-bit
162 r = (Colour & 0xff0000) >> 16;
163 g = (Colour & 0x00ff00) >> 8;
164 b = (Colour & 0x0000ff);
165 }
166
167 szText[0] = _T('\0');
168 _stprintf(szText, _T("Selected colour: #%X RGB #%02X%02X%02X"), i + nPalettePosition, r, g, b);
169 SendMessage(GetDlgItem(hPaletteViewerDlg, IDC_GFX_VIEWER_SEL_COL), WM_SETTEXT, (WPARAM)0, (LPARAM)szText);
170 return 0;
171 }
172 }
173 }
174
175 if (Id == IDCANCEL && Notify == BN_CLICKED) {
176 SendMessage(hPaletteViewerDlg, WM_CLOSE, 0, 0);
177 return 0;
178 }
179
180 if (Id == IDC_GFX_VIEWER_PREV && Notify == BN_CLICKED) {
181 nPalettePosition -= 0x100;
182 if (nPalettePosition < 0) nPalettePosition = nPaletteEntries - 0x100; // last page
183 if (nPalettePosition < 0) nPalettePosition = 0x0000; // no last page, stay on first
184 CalcBrushes(nPalettePosition);
185 RedrawWindow(hPaletteViewerDlg, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
186 UpdateLabels();
187 return 0;
188 }
189
190 if (Id == IDC_GFX_VIEWER_NEXT && Notify == BN_CLICKED) {
191 nPalettePosition += 0x100;
192 if (nPalettePosition >= nPaletteEntries) nPalettePosition = 0x0000;
193 CalcBrushes(nPalettePosition);
194 RedrawWindow(hPaletteViewerDlg, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
195 UpdateLabels();
196 return 0;
197 }
198 }
199
200 return 0;
201 }
202
PaletteViewerDialogCreate(HWND hParentWND)203 int PaletteViewerDialogCreate(HWND hParentWND)
204 {
205 if (pBurnDrvPalette == NULL) {
206 bprintf(PRINT_IMPORTANT, _T("No DrvPalette associated with this game.\n"));
207 return 1;
208 }
209
210 hParent = hParentWND;
211 FBADialogBox(hAppInst, MAKEINTRESOURCE(IDD_PALETTEVIEWER), hParent, (DLGPROC)DialogProc);
212
213 hParent = NULL;
214 hPaletteViewerDlg = NULL;
215
216 return 0;
217 }
218