~ubuntu-branches/ubuntu/warty/dasher/warty

« back to all changes in this revision

Viewing changes to Src/DasherCore/ColourIO.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Matthew Garrett
  • Date: 2003-06-05 11:10:04 UTC
  • Revision ID: james.westby@ubuntu.com-20030605111004-kqiutbrlvs7td9ic
Tags: upstream-3.2.10
ImportĀ upstreamĀ versionĀ 3.2.10

Show diffs side-by-side

added added

removed removed

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