tagging release
[dasher.git] / trunk / Src / DasherCore / ColourIO.cpp
blob22f2f99086e8123efd956237a575f9f6ee439596
1 // ColourIO.cpp
2 //
3 // Copyright (c) 2002 Iain Murray
5 #include "../Common/Common.h"
7 #include "ColourIO.h"
8 using namespace Dasher;
9 using namespace std;
10 using namespace expat;
12 // Track memory leaks on Windows to the line that new'd the memory
13 #ifdef _WIN32
14 #ifdef _DEBUG
15 #define DEBUG_NEW new( _NORMAL_BLOCK, THIS_FILE, __LINE__ )
16 #define new DEBUG_NEW
17 #undef THIS_FILE
18 static char THIS_FILE[] = __FILE__;
19 #endif
20 #endif
22 // TODO: Share information with AlphIO class?
24 CColourIO::CColourIO(std::string SystemLocation, std::string UserLocation, std::vector<std::string> Filenames)
25 :BlankInfo(), SystemLocation(SystemLocation), UserLocation(UserLocation), Filenames(Filenames), LoadMutable(false), CData("") {
26 CreateDefault();
28 LoadMutable = false;
29 ParseFile(SystemLocation + "colour.xml");
30 if(Filenames.size() > 0) {
31 for(unsigned int i = 0; i < Filenames.size(); i++) {
32 ParseFile(SystemLocation + Filenames[i]);
35 LoadMutable = true;
36 ParseFile(UserLocation + "colour.xml");
37 if(Filenames.size() > 0) {
38 for(unsigned int i = 0; i < Filenames.size(); i++) {
39 ParseFile(UserLocation + Filenames[i]);
44 void CColourIO::ParseFile(std::string Filename) {
45 FILE *Input;
46 if((Input = fopen(Filename.c_str(), "r")) == (FILE *) 0) {
47 // could not open file
48 return;
51 XML_Parser Parser = XML_ParserCreate(NULL);
53 // Members passed as callbacks must be static, so don't have a "this" pointer.
54 // We give them one through horrible casting so they can effect changes.
55 XML_SetUserData(Parser, this);
57 XML_SetElementHandler(Parser, XML_StartElement, XML_EndElement);
58 XML_SetCharacterDataHandler(Parser, XML_CharacterData);
60 const unsigned int BufferSize = 1024;
61 char Buffer[BufferSize];
62 int Done;
63 do {
64 size_t len = fread(Buffer, 1, sizeof(Buffer), Input);
65 Done = len < sizeof(Buffer);
66 if(XML_Parse(Parser, Buffer, len, Done) == XML_STATUS_ERROR) {
67 break;
69 } while(!Done);
71 XML_ParserFree(Parser);
72 fclose(Input);
75 void CColourIO::GetColours(std::vector <std::string >*ColourList) const {
76 ColourList->clear();
78 typedef std::map < std::string, ColourInfo >::const_iterator CI;
79 CI End = Colours.end();
81 for(CI Cur = Colours.begin(); Cur != End; Cur++)
82 ColourList->push_back((*Cur).second.ColourID);
85 const CColourIO::ColourInfo & CColourIO::GetInfo(const std::string &ColourID) {
86 if(ColourID == "") // return Default if no colour scheme is specified
87 return Colours["Default"];
88 else {
89 if(Colours.count(ColourID) != 0) {
90 Colours[ColourID].ColourID = ColourID; // Ensure consistency
91 return Colours[ColourID];
93 else {
94 // if we don't have the colour scheme they asked for, return default
95 return Colours["Default"];
100 void CColourIO::SetInfo(const ColourInfo &NewInfo) {
101 Colours[NewInfo.ColourID] = NewInfo;
102 Save(NewInfo.ColourID);
105 void CColourIO::Delete(const std::string &ColourID) {
106 if(Colours.find(ColourID) != Colours.end()) {
107 Colours.erase(ColourID);
108 Save("");
112 void CColourIO::Save(const std::string &ColourID) {
113 // Write an XML file containing all the colours that have been defined.
114 // I am not going to indent the XML file as it will just bloat it, and it
115 // is very simple. There are line breaks though as it is very hard to read
116 // without. I'm going to ignore ColourID and save all alphabets as the
117 // overhead doesn't seem to matter and it makes things much easier.
119 FILE *Output;
120 std::string Filename = UserLocation + "colours.xml";
121 if((Output = fopen(Filename.c_str(), "w")) == (FILE *) 0) {
122 // could not open file
125 fwrite("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", sizeof(char), 39, Output);
126 fwrite("<!DOCTYPE alphabets SYSTEM \"colours.dtd\">\n", sizeof(char), 43, Output);
127 fwrite("<?xml-stylesheet type=\"text/xsl\" href=\"colours.xsl\"?>\n", sizeof(char), 55, Output);
128 fwrite("<colours>\n", sizeof(char), 12, Output);
129 fclose(Output);
132 void CColourIO::CreateDefault() {
133 // TODO: Urgh - replace with a table
135 ColourInfo & Default = Colours["Default"];
136 Default.ColourID = "Default";
137 Default.Mutable = false;
138 Default.Reds.push_back(255);
139 Default.Greens.push_back(255);
140 Default.Blues.push_back(255);
141 Default.Reds.push_back(255);
142 Default.Greens.push_back(0);
143 Default.Blues.push_back(0);
144 Default.Reds.push_back(0);
145 Default.Greens.push_back(0);
146 Default.Blues.push_back(0);
147 Default.Reds.push_back(218);
148 Default.Greens.push_back(218);
149 Default.Blues.push_back(218);
150 Default.Reds.push_back(0);
151 Default.Greens.push_back(0);
152 Default.Blues.push_back(0);
153 Default.Reds.push_back(0);
154 Default.Greens.push_back(0);
155 Default.Blues.push_back(0);
156 Default.Reds.push_back(0);
157 Default.Greens.push_back(0);
158 Default.Blues.push_back(0);
159 Default.Reds.push_back(180);
160 Default.Greens.push_back(238);
161 Default.Blues.push_back(180);
162 Default.Reds.push_back(80);
163 Default.Greens.push_back(80);
164 Default.Blues.push_back(80);
165 Default.Reds.push_back(235);
166 Default.Greens.push_back(235);
167 Default.Blues.push_back(235);
168 Default.Reds.push_back(0);
169 Default.Greens.push_back(255);
170 Default.Blues.push_back(255);
171 Default.Reds.push_back(180);
172 Default.Greens.push_back(238);
173 Default.Blues.push_back(180);
174 Default.Reds.push_back(155);
175 Default.Greens.push_back(205);
176 Default.Blues.push_back(155);
177 Default.Reds.push_back(0);
178 Default.Greens.push_back(255);
179 Default.Blues.push_back(255);
180 Default.Reds.push_back(180);
181 Default.Greens.push_back(238);
182 Default.Blues.push_back(180);
183 Default.Reds.push_back(155);
184 Default.Greens.push_back(205);
185 Default.Blues.push_back(155);
186 Default.Reds.push_back(0);
187 Default.Greens.push_back(255);
188 Default.Blues.push_back(255);
189 Default.Reds.push_back(180);
190 Default.Greens.push_back(238);
191 Default.Blues.push_back(180);
192 Default.Reds.push_back(155);
193 Default.Greens.push_back(205);
194 Default.Blues.push_back(155);
195 Default.Reds.push_back(0);
196 Default.Greens.push_back(255);
197 Default.Blues.push_back(255);
198 Default.Reds.push_back(180);
199 Default.Greens.push_back(238);
200 Default.Blues.push_back(180);
201 Default.Reds.push_back(155);
202 Default.Greens.push_back(205);
203 Default.Blues.push_back(155);
204 Default.Reds.push_back(0);
205 Default.Greens.push_back(255);
206 Default.Blues.push_back(255);
207 Default.Reds.push_back(180);
208 Default.Greens.push_back(238);
209 Default.Blues.push_back(180);
210 Default.Reds.push_back(155);
211 Default.Greens.push_back(205);
212 Default.Blues.push_back(155);
213 Default.Reds.push_back(0);
214 Default.Greens.push_back(255);
215 Default.Blues.push_back(255);
216 Default.Reds.push_back(180);
217 Default.Greens.push_back(238);
218 Default.Blues.push_back(180);
219 Default.Reds.push_back(155);
220 Default.Greens.push_back(205);
221 Default.Blues.push_back(155);
222 Default.Reds.push_back(0);
223 Default.Greens.push_back(255);
224 Default.Blues.push_back(255);
225 Default.Reds.push_back(180);
226 Default.Greens.push_back(238);
227 Default.Blues.push_back(180);
228 Default.Reds.push_back(155);
229 Default.Greens.push_back(205);
230 Default.Blues.push_back(155);
231 Default.Reds.push_back(0);
232 Default.Greens.push_back(255);
233 Default.Blues.push_back(255);
234 Default.Reds.push_back(180);
235 Default.Greens.push_back(238);
236 Default.Blues.push_back(180);
237 Default.Reds.push_back(155);
238 Default.Greens.push_back(205);
239 Default.Blues.push_back(155);
240 Default.Reds.push_back(0);
241 Default.Greens.push_back(255);
242 Default.Blues.push_back(255);
243 Default.Reds.push_back(180);
244 Default.Greens.push_back(238);
245 Default.Blues.push_back(180);
246 Default.Reds.push_back(155);
247 Default.Greens.push_back(205);
248 Default.Blues.push_back(155);
249 Default.Reds.push_back(0);
250 Default.Greens.push_back(255);
251 Default.Blues.push_back(255);
252 Default.Reds.push_back(180);
253 Default.Greens.push_back(238);
254 Default.Blues.push_back(180);
255 Default.Reds.push_back(155);
256 Default.Greens.push_back(205);
257 Default.Blues.push_back(155);
258 Default.Reds.push_back(0);
259 Default.Greens.push_back(255);
260 Default.Blues.push_back(255);
261 Default.Reds.push_back(180);
262 Default.Greens.push_back(238);
263 Default.Blues.push_back(180);
264 Default.Reds.push_back(155);
265 Default.Greens.push_back(205);
266 Default.Blues.push_back(155);
267 Default.Reds.push_back(0);
268 Default.Greens.push_back(255);
269 Default.Blues.push_back(255);
270 Default.Reds.push_back(180);
271 Default.Greens.push_back(238);
272 Default.Blues.push_back(180);
273 Default.Reds.push_back(155);
274 Default.Greens.push_back(205);
275 Default.Blues.push_back(155);
276 Default.Reds.push_back(0);
277 Default.Greens.push_back(255);
278 Default.Blues.push_back(255);
279 Default.Reds.push_back(180);
280 Default.Greens.push_back(238);
281 Default.Blues.push_back(180);
282 Default.Reds.push_back(155);
283 Default.Greens.push_back(205);
284 Default.Blues.push_back(155);
285 Default.Reds.push_back(0);
286 Default.Greens.push_back(255);
287 Default.Blues.push_back(255);
288 Default.Reds.push_back(180);
289 Default.Greens.push_back(238);
290 Default.Blues.push_back(180);
291 Default.Reds.push_back(155);
292 Default.Greens.push_back(205);
293 Default.Blues.push_back(155);
294 Default.Reds.push_back(0);
295 Default.Greens.push_back(255);
296 Default.Blues.push_back(255);
297 Default.Reds.push_back(180);
298 Default.Greens.push_back(238);
299 Default.Blues.push_back(180);
300 Default.Reds.push_back(155);
301 Default.Greens.push_back(205);
302 Default.Blues.push_back(155);
303 Default.Reds.push_back(0);
304 Default.Greens.push_back(255);
305 Default.Blues.push_back(255);
306 Default.Reds.push_back(180);
307 Default.Greens.push_back(238);
308 Default.Blues.push_back(180);
309 Default.Reds.push_back(155);
310 Default.Greens.push_back(205);
311 Default.Blues.push_back(155);
312 Default.Reds.push_back(0);
313 Default.Greens.push_back(255);
314 Default.Blues.push_back(255);
315 Default.Reds.push_back(180);
316 Default.Greens.push_back(238);
317 Default.Blues.push_back(180);
318 Default.Reds.push_back(155);
319 Default.Greens.push_back(205);
320 Default.Blues.push_back(155);
321 Default.Reds.push_back(0);
322 Default.Greens.push_back(255);
323 Default.Blues.push_back(255);
324 Default.Reds.push_back(180);
325 Default.Greens.push_back(238);
326 Default.Blues.push_back(180);
327 Default.Reds.push_back(155);
328 Default.Greens.push_back(205);
329 Default.Blues.push_back(155);
330 Default.Reds.push_back(0);
331 Default.Greens.push_back(255);
332 Default.Blues.push_back(255);
333 Default.Reds.push_back(180);
334 Default.Greens.push_back(238);
335 Default.Blues.push_back(180);
336 Default.Reds.push_back(155);
337 Default.Greens.push_back(205);
338 Default.Blues.push_back(155);
339 Default.Reds.push_back(0);
340 Default.Greens.push_back(255);
341 Default.Blues.push_back(255);
342 Default.Reds.push_back(180);
343 Default.Greens.push_back(238);
344 Default.Blues.push_back(180);
345 Default.Reds.push_back(155);
346 Default.Greens.push_back(205);
347 Default.Blues.push_back(155);
348 Default.Reds.push_back(0);
349 Default.Greens.push_back(255);
350 Default.Blues.push_back(255);
351 Default.Reds.push_back(180);
352 Default.Greens.push_back(238);
353 Default.Blues.push_back(180);
354 Default.Reds.push_back(155);
355 Default.Greens.push_back(205);
356 Default.Blues.push_back(155);
357 Default.Reds.push_back(0);
358 Default.Greens.push_back(255);
359 Default.Blues.push_back(255);
360 Default.Reds.push_back(180);
361 Default.Greens.push_back(238);
362 Default.Blues.push_back(180);
363 Default.Reds.push_back(155);
364 Default.Greens.push_back(205);
365 Default.Blues.push_back(155);
366 Default.Reds.push_back(0);
367 Default.Greens.push_back(255);
368 Default.Blues.push_back(255);
369 Default.Reds.push_back(180);
370 Default.Greens.push_back(238);
371 Default.Blues.push_back(180);
372 Default.Reds.push_back(155);
373 Default.Greens.push_back(205);
374 Default.Blues.push_back(155);
375 Default.Reds.push_back(0);
376 Default.Greens.push_back(255);
377 Default.Blues.push_back(255);
378 Default.Reds.push_back(180);
379 Default.Greens.push_back(238);
380 Default.Blues.push_back(180);
381 Default.Reds.push_back(155);
382 Default.Greens.push_back(205);
383 Default.Blues.push_back(155);
384 Default.Reds.push_back(0);
385 Default.Greens.push_back(255);
386 Default.Blues.push_back(255);
387 Default.Reds.push_back(180);
388 Default.Greens.push_back(238);
389 Default.Blues.push_back(180);
390 Default.Reds.push_back(155);
391 Default.Greens.push_back(205);
392 Default.Blues.push_back(155);
393 Default.Reds.push_back(0);
394 Default.Greens.push_back(255);
395 Default.Blues.push_back(255);
396 Default.Reds.push_back(180);
397 Default.Greens.push_back(238);
398 Default.Blues.push_back(180);
399 Default.Reds.push_back(155);
400 Default.Greens.push_back(205);
401 Default.Blues.push_back(155);
402 Default.Reds.push_back(0);
403 Default.Greens.push_back(255);
404 Default.Blues.push_back(255);
405 Default.Reds.push_back(180);
406 Default.Greens.push_back(238);
407 Default.Blues.push_back(180);
408 Default.Reds.push_back(155);
409 Default.Greens.push_back(205);
410 Default.Blues.push_back(155);
411 Default.Reds.push_back(0);
412 Default.Greens.push_back(255);
413 Default.Blues.push_back(255);
414 Default.Reds.push_back(180);
415 Default.Greens.push_back(238);
416 Default.Blues.push_back(180);
417 Default.Reds.push_back(155);
418 Default.Greens.push_back(205);
419 Default.Blues.push_back(155);
420 Default.Reds.push_back(0);
421 Default.Greens.push_back(255);
422 Default.Blues.push_back(255);
423 Default.Reds.push_back(180);
424 Default.Greens.push_back(238);
425 Default.Blues.push_back(180);
426 Default.Reds.push_back(155);
427 Default.Greens.push_back(205);
428 Default.Blues.push_back(155);
429 Default.Reds.push_back(0);
430 Default.Greens.push_back(255);
431 Default.Blues.push_back(255);
432 Default.Reds.push_back(180);
433 Default.Greens.push_back(238);
434 Default.Blues.push_back(180);
435 Default.Reds.push_back(155);
436 Default.Greens.push_back(205);
437 Default.Blues.push_back(155);
438 Default.Reds.push_back(0);
439 Default.Greens.push_back(255);
440 Default.Blues.push_back(255);
441 Default.Reds.push_back(180);
442 Default.Greens.push_back(238);
443 Default.Blues.push_back(180);
444 Default.Reds.push_back(155);
445 Default.Greens.push_back(205);
446 Default.Blues.push_back(155);
447 Default.Reds.push_back(0);
448 Default.Greens.push_back(255);
449 Default.Blues.push_back(255);
450 Default.Reds.push_back(180);
451 Default.Greens.push_back(238);
452 Default.Blues.push_back(180);
453 Default.Reds.push_back(155);
454 Default.Greens.push_back(205);
455 Default.Blues.push_back(155);
456 Default.Reds.push_back(0);
457 Default.Greens.push_back(255);
458 Default.Blues.push_back(255);
459 Default.Reds.push_back(180);
460 Default.Greens.push_back(238);
461 Default.Blues.push_back(180);
462 Default.Reds.push_back(155);
463 Default.Greens.push_back(205);
464 Default.Blues.push_back(155);
465 Default.Reds.push_back(0);
466 Default.Greens.push_back(255);
467 Default.Blues.push_back(255);
468 Default.Reds.push_back(255);
469 Default.Greens.push_back(0);
470 Default.Blues.push_back(0);
471 Default.Reds.push_back(255);
472 Default.Greens.push_back(255);
473 Default.Blues.push_back(0);
474 Default.Reds.push_back(0);
475 Default.Greens.push_back(200);
476 Default.Blues.push_back(0);
477 Default.Reds.push_back(255);
478 Default.Greens.push_back(0);
479 Default.Blues.push_back(0);
480 Default.Reds.push_back(255);
481 Default.Greens.push_back(255);
482 Default.Blues.push_back(0);
483 Default.Reds.push_back(0);
484 Default.Greens.push_back(200);
485 Default.Blues.push_back(0);
486 Default.Reds.push_back(255);
487 Default.Greens.push_back(0);
488 Default.Blues.push_back(0);
489 Default.Reds.push_back(255);
490 Default.Greens.push_back(255);
491 Default.Blues.push_back(0);
492 Default.Reds.push_back(0);
493 Default.Greens.push_back(200);
494 Default.Blues.push_back(0);
495 Default.Reds.push_back(255);
496 Default.Greens.push_back(0);
497 Default.Blues.push_back(0);
498 Default.Reds.push_back(255);
499 Default.Greens.push_back(255);
500 Default.Blues.push_back(0);
501 Default.Reds.push_back(0);
502 Default.Greens.push_back(200);
503 Default.Blues.push_back(0);
504 Default.Reds.push_back(255);
505 Default.Greens.push_back(0);
506 Default.Blues.push_back(0);
507 Default.Reds.push_back(255);
508 Default.Greens.push_back(255);
509 Default.Blues.push_back(0);
510 Default.Reds.push_back(0);
511 Default.Greens.push_back(200);
512 Default.Blues.push_back(0);
513 Default.Reds.push_back(255);
514 Default.Greens.push_back(0);
515 Default.Blues.push_back(0);
516 Default.Reds.push_back(255);
517 Default.Greens.push_back(255);
518 Default.Blues.push_back(0);
519 Default.Reds.push_back(0);
520 Default.Greens.push_back(200);
521 Default.Blues.push_back(0);
522 Default.Reds.push_back(255);
523 Default.Greens.push_back(0);
524 Default.Blues.push_back(0);
525 Default.Reds.push_back(255);
526 Default.Greens.push_back(255);
527 Default.Blues.push_back(0);
528 Default.Reds.push_back(0);
529 Default.Greens.push_back(0);
530 Default.Blues.push_back(0);
531 Default.Reds.push_back(0);
532 Default.Greens.push_back(0);
533 Default.Blues.push_back(0);
534 Default.Reds.push_back(0);
535 Default.Greens.push_back(0);
536 Default.Blues.push_back(0);
537 Default.Reds.push_back(0);
538 Default.Greens.push_back(0);
539 Default.Blues.push_back(0);
540 Default.Reds.push_back(0);
541 Default.Greens.push_back(0);
542 Default.Blues.push_back(0);
543 Default.Reds.push_back(0);
544 Default.Greens.push_back(0);
545 Default.Blues.push_back(0);
546 Default.Reds.push_back(0);
547 Default.Greens.push_back(0);
548 Default.Blues.push_back(0);
549 Default.Reds.push_back(0);
550 Default.Greens.push_back(0);
551 Default.Blues.push_back(0);
552 Default.Reds.push_back(80);
553 Default.Greens.push_back(80);
554 Default.Blues.push_back(80);
555 Default.Reds.push_back(255);
556 Default.Greens.push_back(255);
557 Default.Blues.push_back(255);
558 Default.Reds.push_back(135);
559 Default.Greens.push_back(206);
560 Default.Blues.push_back(255);
561 Default.Reds.push_back(255);
562 Default.Greens.push_back(174);
563 Default.Blues.push_back(185);
564 Default.Reds.push_back(255);
565 Default.Greens.push_back(187);
566 Default.Blues.push_back(255);
567 Default.Reds.push_back(135);
568 Default.Greens.push_back(206);
569 Default.Blues.push_back(255);
570 Default.Reds.push_back(255);
571 Default.Greens.push_back(174);
572 Default.Blues.push_back(185);
573 Default.Reds.push_back(255);
574 Default.Greens.push_back(187);
575 Default.Blues.push_back(255);
576 Default.Reds.push_back(135);
577 Default.Greens.push_back(206);
578 Default.Blues.push_back(255);
579 Default.Reds.push_back(255);
580 Default.Greens.push_back(174);
581 Default.Blues.push_back(185);
582 Default.Reds.push_back(255);
583 Default.Greens.push_back(187);
584 Default.Blues.push_back(255);
585 Default.Reds.push_back(135);
586 Default.Greens.push_back(206);
587 Default.Blues.push_back(255);
588 Default.Reds.push_back(255);
589 Default.Greens.push_back(174);
590 Default.Blues.push_back(185);
591 Default.Reds.push_back(255);
592 Default.Greens.push_back(187);
593 Default.Blues.push_back(255);
594 Default.Reds.push_back(135);
595 Default.Greens.push_back(206);
596 Default.Blues.push_back(255);
597 Default.Reds.push_back(255);
598 Default.Greens.push_back(174);
599 Default.Blues.push_back(185);
600 Default.Reds.push_back(255);
601 Default.Greens.push_back(187);
602 Default.Blues.push_back(255);
603 Default.Reds.push_back(135);
604 Default.Greens.push_back(206);
605 Default.Blues.push_back(255);
606 Default.Reds.push_back(255);
607 Default.Greens.push_back(174);
608 Default.Blues.push_back(185);
609 Default.Reds.push_back(255);
610 Default.Greens.push_back(187);
611 Default.Blues.push_back(255);
612 Default.Reds.push_back(135);
613 Default.Greens.push_back(206);
614 Default.Blues.push_back(255);
615 Default.Reds.push_back(255);
616 Default.Greens.push_back(174);
617 Default.Blues.push_back(185);
618 Default.Reds.push_back(255);
619 Default.Greens.push_back(187);
620 Default.Blues.push_back(255);
621 Default.Reds.push_back(135);
622 Default.Greens.push_back(206);
623 Default.Blues.push_back(255);
624 Default.Reds.push_back(255);
625 Default.Greens.push_back(174);
626 Default.Blues.push_back(185);
627 Default.Reds.push_back(255);
628 Default.Greens.push_back(187);
629 Default.Blues.push_back(255);
630 Default.Reds.push_back(135);
631 Default.Greens.push_back(206);
632 Default.Blues.push_back(255);
633 Default.Reds.push_back(255);
634 Default.Greens.push_back(174);
635 Default.Blues.push_back(185);
636 Default.Reds.push_back(255);
637 Default.Greens.push_back(187);
638 Default.Blues.push_back(255);
639 Default.Reds.push_back(135);
640 Default.Greens.push_back(206);
641 Default.Blues.push_back(255);
642 Default.Reds.push_back(255);
643 Default.Greens.push_back(174);
644 Default.Blues.push_back(185);
645 Default.Reds.push_back(255);
646 Default.Greens.push_back(187);
647 Default.Blues.push_back(255);
648 Default.Reds.push_back(135);
649 Default.Greens.push_back(206);
650 Default.Blues.push_back(255);
651 Default.Reds.push_back(255);
652 Default.Greens.push_back(174);
653 Default.Blues.push_back(185);
654 Default.Reds.push_back(255);
655 Default.Greens.push_back(187);
656 Default.Blues.push_back(255);
657 Default.Reds.push_back(135);
658 Default.Greens.push_back(206);
659 Default.Blues.push_back(255);
660 Default.Reds.push_back(255);
661 Default.Greens.push_back(174);
662 Default.Blues.push_back(185);
663 Default.Reds.push_back(255);
664 Default.Greens.push_back(187);
665 Default.Blues.push_back(255);
666 Default.Reds.push_back(135);
667 Default.Greens.push_back(206);
668 Default.Blues.push_back(255);
669 Default.Reds.push_back(255);
670 Default.Greens.push_back(174);
671 Default.Blues.push_back(185);
672 Default.Reds.push_back(255);
673 Default.Greens.push_back(187);
674 Default.Blues.push_back(255);
675 Default.Reds.push_back(135);
676 Default.Greens.push_back(206);
677 Default.Blues.push_back(255);
678 Default.Reds.push_back(255);
679 Default.Greens.push_back(174);
680 Default.Blues.push_back(185);
681 Default.Reds.push_back(255);
682 Default.Greens.push_back(187);
683 Default.Blues.push_back(255);
684 Default.Reds.push_back(135);
685 Default.Greens.push_back(206);
686 Default.Blues.push_back(255);
687 Default.Reds.push_back(255);
688 Default.Greens.push_back(174);
689 Default.Blues.push_back(185);
690 Default.Reds.push_back(255);
691 Default.Greens.push_back(187);
692 Default.Blues.push_back(255);
693 Default.Reds.push_back(135);
694 Default.Greens.push_back(206);
695 Default.Blues.push_back(255);
696 Default.Reds.push_back(255);
697 Default.Greens.push_back(174);
698 Default.Blues.push_back(185);
699 Default.Reds.push_back(255);
700 Default.Greens.push_back(187);
701 Default.Blues.push_back(255);
702 Default.Reds.push_back(135);
703 Default.Greens.push_back(206);
704 Default.Blues.push_back(255);
705 Default.Reds.push_back(255);
706 Default.Greens.push_back(174);
707 Default.Blues.push_back(185);
708 Default.Reds.push_back(255);
709 Default.Greens.push_back(187);
710 Default.Blues.push_back(255);
711 Default.Reds.push_back(135);
712 Default.Greens.push_back(206);
713 Default.Blues.push_back(255);
714 Default.Reds.push_back(255);
715 Default.Greens.push_back(174);
716 Default.Blues.push_back(185);
717 Default.Reds.push_back(255);
718 Default.Greens.push_back(187);
719 Default.Blues.push_back(255);
720 Default.Reds.push_back(135);
721 Default.Greens.push_back(206);
722 Default.Blues.push_back(255);
723 Default.Reds.push_back(255);
724 Default.Greens.push_back(174);
725 Default.Blues.push_back(185);
726 Default.Reds.push_back(255);
727 Default.Greens.push_back(187);
728 Default.Blues.push_back(255);
729 Default.Reds.push_back(135);
730 Default.Greens.push_back(206);
731 Default.Blues.push_back(255);
732 Default.Reds.push_back(255);
733 Default.Greens.push_back(174);
734 Default.Blues.push_back(185);
735 Default.Reds.push_back(255);
736 Default.Greens.push_back(187);
737 Default.Blues.push_back(255);
738 Default.Reds.push_back(135);
739 Default.Greens.push_back(206);
740 Default.Blues.push_back(255);
741 Default.Reds.push_back(255);
742 Default.Greens.push_back(174);
743 Default.Blues.push_back(185);
744 Default.Reds.push_back(255);
745 Default.Greens.push_back(187);
746 Default.Blues.push_back(255);
747 Default.Reds.push_back(135);
748 Default.Greens.push_back(206);
749 Default.Blues.push_back(255);
750 Default.Reds.push_back(255);
751 Default.Greens.push_back(174);
752 Default.Blues.push_back(185);
753 Default.Reds.push_back(255);
754 Default.Greens.push_back(187);
755 Default.Blues.push_back(255);
756 Default.Reds.push_back(135);
757 Default.Greens.push_back(206);
758 Default.Blues.push_back(255);
759 Default.Reds.push_back(255);
760 Default.Greens.push_back(174);
761 Default.Blues.push_back(185);
762 Default.Reds.push_back(255);
763 Default.Greens.push_back(187);
764 Default.Blues.push_back(255);
765 Default.Reds.push_back(135);
766 Default.Greens.push_back(206);
767 Default.Blues.push_back(255);
768 Default.Reds.push_back(255);
769 Default.Greens.push_back(174);
770 Default.Blues.push_back(185);
771 Default.Reds.push_back(255);
772 Default.Greens.push_back(187);
773 Default.Blues.push_back(255);
774 Default.Reds.push_back(135);
775 Default.Greens.push_back(206);
776 Default.Blues.push_back(255);
777 Default.Reds.push_back(255);
778 Default.Greens.push_back(174);
779 Default.Blues.push_back(185);
780 Default.Reds.push_back(255);
781 Default.Greens.push_back(187);
782 Default.Blues.push_back(255);
783 Default.Reds.push_back(135);
784 Default.Greens.push_back(206);
785 Default.Blues.push_back(255);
786 Default.Reds.push_back(255);
787 Default.Greens.push_back(174);
788 Default.Blues.push_back(185);
789 Default.Reds.push_back(255);
790 Default.Greens.push_back(187);
791 Default.Blues.push_back(255);
792 Default.Reds.push_back(135);
793 Default.Greens.push_back(206);
794 Default.Blues.push_back(255);
795 Default.Reds.push_back(255);
796 Default.Greens.push_back(174);
797 Default.Blues.push_back(185);
798 Default.Reds.push_back(255);
799 Default.Greens.push_back(187);
800 Default.Blues.push_back(255);
801 Default.Reds.push_back(135);
802 Default.Greens.push_back(206);
803 Default.Blues.push_back(255);
804 Default.Reds.push_back(255);
805 Default.Greens.push_back(174);
806 Default.Blues.push_back(185);
807 Default.Reds.push_back(255);
808 Default.Greens.push_back(187);
809 Default.Blues.push_back(255);
810 Default.Reds.push_back(135);
811 Default.Greens.push_back(206);
812 Default.Blues.push_back(255);
813 Default.Reds.push_back(255);
814 Default.Greens.push_back(174);
815 Default.Blues.push_back(185);
816 Default.Reds.push_back(255);
817 Default.Greens.push_back(187);
818 Default.Blues.push_back(255);
819 Default.Reds.push_back(135);
820 Default.Greens.push_back(206);
821 Default.Blues.push_back(255);
822 Default.Reds.push_back(255);
823 Default.Greens.push_back(174);
824 Default.Blues.push_back(185);
825 Default.Reds.push_back(255);
826 Default.Greens.push_back(187);
827 Default.Blues.push_back(255);
828 Default.Reds.push_back(135);
829 Default.Greens.push_back(206);
830 Default.Blues.push_back(255);
831 Default.Reds.push_back(255);
832 Default.Greens.push_back(174);
833 Default.Blues.push_back(185);
834 Default.Reds.push_back(255);
835 Default.Greens.push_back(187);
836 Default.Blues.push_back(255);
837 Default.Reds.push_back(135);
838 Default.Greens.push_back(206);
839 Default.Blues.push_back(255);
840 Default.Reds.push_back(255);
841 Default.Greens.push_back(174);
842 Default.Blues.push_back(185);
843 Default.Reds.push_back(255);
844 Default.Greens.push_back(187);
845 Default.Blues.push_back(255);
846 Default.Reds.push_back(135);
847 Default.Greens.push_back(206);
848 Default.Blues.push_back(255);
849 Default.Reds.push_back(255);
850 Default.Greens.push_back(174);
851 Default.Blues.push_back(185);
852 Default.Reds.push_back(255);
853 Default.Greens.push_back(187);
854 Default.Blues.push_back(255);
855 Default.Reds.push_back(135);
856 Default.Greens.push_back(206);
857 Default.Blues.push_back(255);
858 Default.Reds.push_back(0);
859 Default.Greens.push_back(255);
860 Default.Blues.push_back(0);
861 Default.Reds.push_back(240);
862 Default.Greens.push_back(240);
863 Default.Blues.push_back(0);
864 Default.Reds.push_back(255);
865 Default.Greens.push_back(0);
866 Default.Blues.push_back(0);
870 void CColourIO::XML_Escape(std::string *Text, bool Attribute) {
871 // The XML "W3C Recommendation" is here: http://www.w3.org/TR/REC-xml
873 std::string & Input = *Text; // Makes syntax less fiddly below
875 for(unsigned int i = 0; i < Text->size(); i++) {
876 // & and < need escaping in XML. In one rare circumstance >
877 // needs escaping too. I'll always do it, as I'm allowed to.
878 if(Input[i] == '&') {
879 Input.replace(i, 1, "&amp;");
880 continue;
882 if(Input[i] == '<') {
883 Input.replace(i, 1, "&lt;");
884 continue;
886 if(Input[i] == '>') {
887 Input.replace(i, 1, "&gt;");
888 continue;
890 // " and ' might need escaping inside attributes, I'll do them all.
891 if(Attribute == false)
892 continue;
894 if(Input[i] == '\'') {
895 Input.replace(i, 1, "&apos;");
896 continue;
898 if(Input[i] == '"') {
899 Input.replace(i, 1, "&quot;");
900 continue;
905 // Below here handlers for the Expat XML input library
906 ////////////////////////////////////////////////////////////////////////////////////
908 void CColourIO::XML_StartElement(void *userData, const expat::XML_Char *name, const expat::XML_Char **atts) {
909 CColourIO *Me = (CColourIO *) userData;
911 Me->CData = "";
913 if(strcmp(name, "palette") == 0) {
914 ColourInfo NewInfo;
915 Me->InputInfo = NewInfo;
916 Me->InputInfo.Mutable = Me->LoadMutable;
917 while(*atts != 0) {
918 if(strcmp(*atts, "name") == 0) {
919 atts++;
920 Me->InputInfo.ColourID = *atts;
921 atts--;
923 atts += 2;
925 return;
927 if(strcmp(name, "colour") == 0) {
928 while(*atts != 0) {
929 if(strcmp(*atts, "r") == 0) {
930 atts++;
931 Me->InputInfo.Reds.push_back(atoi(*atts));
932 atts--;
934 if(strcmp(*atts, "g") == 0) {
935 atts++;
936 Me->InputInfo.Greens.push_back(atoi(*atts));
937 atts--;
939 if(strcmp(*atts, "b") == 0) {
940 atts++;
941 Me->InputInfo.Blues.push_back(atoi(*atts));
942 atts--;
944 atts += 2;
946 return;
949 void CColourIO::XML_EndElement(void *userData, const expat::XML_Char *name) {
950 CColourIO *Me = (CColourIO *) userData;
952 if(strcmp(name, "palette") == 0) {
953 Me->Colours[Me->InputInfo.ColourID] = Me->InputInfo;
954 return;
958 void CColourIO::XML_CharacterData(void *userData, const expat::XML_Char *s, int len) {
959 // CAREFUL: s points to a string which is NOT null-terminated.
961 CColourIO *Me = (CColourIO *) userData;
963 Me->CData.append(s, len);