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