comparison src/win32/PaletteViewControl.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
comparison
equal deleted inserted replaced
0:8ced16adf2e1 1:f9f4f1b99eed
1 // PaletteViewControl.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "PaletteViewControl.h"
6
7 #include "../common/Util.h"
8
9 bool PaletteViewControl::isRegistered = false;
10
11 /////////////////////////////////////////////////////////////////////////////
12 // PaletteViewControl
13
14 PaletteViewControl::PaletteViewControl()
15 {
16 memset(&bmpInfo.bmiHeader, 0, sizeof(bmpInfo.bmiHeader));
17
18 bmpInfo.bmiHeader.biSize = sizeof(bmpInfo.bmiHeader);
19 bmpInfo.bmiHeader.biWidth = 256;
20 bmpInfo.bmiHeader.biHeight = -256;
21 bmpInfo.bmiHeader.biPlanes = 1;
22 bmpInfo.bmiHeader.biBitCount = 24;
23 bmpInfo.bmiHeader.biCompression = BI_RGB;
24 data = (u8 *)malloc(3 * 256 * 256);
25
26 w = 256;
27 h = 256;
28
29 colors = 256;
30
31 paletteAddress = 0;
32
33 ZeroMemory(palette, 512);
34
35 selected = -1;
36 registerClass();
37 }
38
39 PaletteViewControl::~PaletteViewControl()
40 {
41 if(data)
42 free(data);
43 }
44
45
46 BEGIN_MESSAGE_MAP(PaletteViewControl, CWnd)
47 //{{AFX_MSG_MAP(PaletteViewControl)
48 ON_WM_LBUTTONDOWN()
49 ON_WM_ERASEBKGND()
50 ON_WM_PAINT()
51 //}}AFX_MSG_MAP
52 END_MESSAGE_MAP()
53
54
55 /////////////////////////////////////////////////////////////////////////////
56 // PaletteViewControl message handlers
57
58 void PaletteViewControl::init(int c, int w, int h)
59 {
60 this->w = w;
61 this->h = h;
62 this->colors = c;
63
64 bmpInfo.bmiHeader.biWidth = w;
65 bmpInfo.bmiHeader.biHeight = -h;
66 }
67
68
69 bool PaletteViewControl::saveAdobe(const char *name)
70 {
71 FILE *f = fopen(name, "wb");
72
73 if(!f)
74 return false;
75
76 for(int i = 0; i < colors; i++) {
77 u16 c = palette[i];
78 int r = (c & 0x1f) << 3;
79 int g = (c & 0x3e0) >> 2;
80 int b = (c & 0x7c00) >> 7;
81
82 u8 data[3] = { r, g, b };
83 fwrite(data, 1, 3, f);
84 }
85 if(colors < 256) {
86 for(int i = colors; i < 256; i++) {
87 u8 data[3] = { 0, 0, 0 };
88 fwrite(data, 1, 3, f);
89 }
90 }
91 fclose(f);
92
93 return true;
94 }
95
96
97 bool PaletteViewControl::saveMSPAL(const char *name)
98 {
99 FILE *f = fopen(name, "wb");
100
101 if(!f)
102 return false;
103
104 u8 data[4] = { 'R', 'I', 'F', 'F' };
105
106 fwrite(data, 1, 4, f);
107 utilPutDword(data, 256 * 4 + 16);
108 fwrite(data, 1, 4, f);
109 u8 data3[4] = { 'P', 'A', 'L', ' ' };
110 fwrite(data3, 1, 4, f);
111 u8 data4[4] = { 'd', 'a', 't', 'a' };
112 fwrite(data4, 1, 4, f);
113 utilPutDword(data, 256*4+4);
114 fwrite(data, 1, 4, f);
115 utilPutWord(&data[0], 0x0300);
116 utilPutWord(&data[2], 256); // causes problems if not 16 or 256
117 fwrite(data, 1, 4, f);
118
119 for(int i = 0; i < colors; i++) {
120 u16 c = palette[i];
121 int r = (c & 0x1f) << 3;
122 int g = (c & 0x3e0) >> 2;
123 int b = (c & 0x7c00) >> 7;
124
125 u8 data7[4] = { r, g, b, 0 };
126 fwrite(data7, 1, 4, f);
127 }
128 if(colors < 256) {
129 for(int i = colors; i < 256; i++) {
130 u8 data7[4] = { 0, 0, 0, 0 };
131 fwrite(data7, 1, 4, f);
132 }
133 }
134 fclose(f);
135
136 return true;
137 }
138
139
140 bool PaletteViewControl::saveJASCPAL(const char *name)
141 {
142 FILE *f = fopen(name, "wb");
143
144 if(!f)
145 return false;
146
147 fprintf(f, "JASC-PAL\r\n0100\r\n256\r\n");
148
149 for(int i = 0; i < colors; i++) {
150 u16 c = palette[i];
151 int r = (c & 0x1f) << 3;
152 int g = (c & 0x3e0) >> 2;
153 int b = (c & 0x7c00) >> 7;
154
155 fprintf(f, "%d %d %d\r\n", r, g, b);
156 }
157 if(colors < 256) {
158 for(int i = colors; i < 256; i++)
159 fprintf(f, "0 0 0\r\n");
160 }
161 fclose(f);
162
163 return true;
164 }
165
166 void PaletteViewControl::setPaletteAddress(int address)
167 {
168 paletteAddress = address;
169 }
170
171
172 void PaletteViewControl::setSelected(int s)
173 {
174 selected = s;
175 InvalidateRect(NULL, FALSE);
176 }
177
178
179 void PaletteViewControl::render(u16 color, int x, int y)
180 {
181 u8 *start = data + y*16*w*3 + x*16*3;
182 int skip = w*3-16*3;
183
184 int r = (color & 0x1f) << 3;
185 int g = (color & 0x3e0) >> 2;
186 int b = (color & 0x7c00) >> 7;
187
188 for(int i = 0; i < 16; i++) {
189 *start++ = b;
190 *start++ = g;
191 *start++ = r;
192
193 *start++ = b;
194 *start++ = g;
195 *start++ = r;
196
197 *start++ = b;
198 *start++ = g;
199 *start++ = r;
200
201 *start++ = b;
202 *start++ = g;
203 *start++ = r;
204
205 *start++ = b;
206 *start++ = g;
207 *start++ = r;
208
209 *start++ = b;
210 *start++ = g;
211 *start++ = r;
212
213 *start++ = b;
214 *start++ = g;
215 *start++ = r;
216
217 *start++ = b;
218 *start++ = g;
219 *start++ = r;
220
221 *start++ = b;
222 *start++ = g;
223 *start++ = r;
224
225 *start++ = b;
226 *start++ = g;
227 *start++ = r;
228
229 *start++ = b;
230 *start++ = g;
231 *start++ = r;
232
233 *start++ = b;
234 *start++ = g;
235 *start++ = r;
236
237 *start++ = b;
238 *start++ = g;
239 *start++ = r;
240
241 *start++ = b;
242 *start++ = g;
243 *start++ = r;
244
245 *start++ = b;
246 *start++ = g;
247 *start++ = r;
248
249 *start++ = b;
250 *start++ = g;
251 *start++ = r;
252
253 start += skip;
254 }
255 }
256
257 void PaletteViewControl::refresh()
258 {
259 updatePalette();
260 int sw = w/16;
261 int sh = h/16;
262 for(int i = 0; i < colors; i++) {
263 render(palette[i], i & (sw-1), i/sw);
264 }
265 InvalidateRect(NULL, FALSE);
266 }
267
268 void PaletteViewControl::OnLButtonDown(UINT nFlags, CPoint point)
269 {
270 int x = point.x;
271 int y = point.y;
272 RECT rect;
273 GetClientRect(&rect);
274 int h = rect.bottom - rect.top;
275 int w = rect.right - rect.left;
276 int sw = (this->w/16);
277 int sh = (this->h/16);
278 int mult = w / sw;
279 int multY = h / sh;
280
281 setSelected(x/mult + (y/multY)*sw);
282
283 GetParent()->SendMessage(WM_PALINFO,
284 palette[x/mult+(y/multY)*sw],
285 paletteAddress+(x/mult+(y/multY)*sw));
286 }
287
288 BOOL PaletteViewControl::OnEraseBkgnd(CDC* pDC)
289 {
290 return TRUE;
291 }
292
293
294 void PaletteViewControl::OnPaint()
295 {
296 CPaintDC dc(this); // device context for painting
297
298 RECT rect;
299 GetClientRect(&rect);
300 int w = rect.right - rect.left;
301 int h = rect.bottom - rect.top;
302
303 CDC memDC;
304 memDC.CreateCompatibleDC(&dc);
305 CBitmap bitmap, *pOldBitmap;
306 bitmap.CreateCompatibleBitmap(&dc, w, h);
307 pOldBitmap = memDC.SelectObject(&bitmap);
308
309 StretchDIBits(memDC.GetSafeHdc(),
310 0,
311 0,
312 w,
313 h,
314 0,
315 0,
316 this->w,
317 this->h,
318 data,
319 &bmpInfo,
320 DIB_RGB_COLORS,
321 SRCCOPY);
322 int sw = this->w / 16;
323 int sh = this->h / 16;
324 int mult = w / sw;
325 int multY = h / sh;
326 CPen pen;
327 pen.CreatePen(PS_SOLID, 1, RGB(192,192,192));
328 CPen *old = memDC.SelectObject(&pen);
329 int i;
330 for(i = 1; i < sh; i++) {
331 memDC.MoveTo(0, i * multY);
332 memDC.LineTo(w, i * multY);
333 }
334 for(i = 1; i < sw; i++) {
335 memDC.MoveTo(i * mult, 0);
336 memDC.LineTo(i * mult, h);
337 }
338 memDC.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
339 memDC.SelectObject(old);
340 pen.DeleteObject();
341
342 if(selected != -1) {
343 pen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
344 old = memDC.SelectObject(&pen);
345
346 int startX = (selected & (sw-1))*mult+1;
347 int startY = (selected / sw)*multY+1;
348 int endX = startX + mult-2;
349 int endY = startY + multY-2;
350
351 memDC.MoveTo(startX, startY);
352 memDC.LineTo(endX, startY);
353 memDC.LineTo(endX, endY);
354 memDC.LineTo(startX, endY);
355 memDC.LineTo(startX, startY-1);
356
357 memDC.SelectObject(old);
358 pen.DeleteObject();
359 }
360
361 dc.BitBlt(0,0,w,h,
362 &memDC,0,0,SRCCOPY);
363
364 memDC.SelectObject(pOldBitmap);
365 bitmap.DeleteObject();
366 memDC.DeleteDC();
367 }
368
369 void PaletteViewControl::registerClass()
370 {
371 if(!isRegistered) {
372 WNDCLASS wc;
373 ZeroMemory(&wc, sizeof(wc));
374 wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
375 wc.lpfnWndProc = (WNDPROC)::DefWindowProc;
376 wc.hInstance = AfxGetInstanceHandle();
377 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
378 wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
379 wc.lpszMenuName = NULL;
380 wc.lpszClassName = "VbaPaletteViewControl";
381 AfxRegisterClass(&wc);
382 isRegistered = true;
383 }
384 }