1 /******************************************************************************
2 **  libDXFrw - Library to read/write DXF files (ascii & binary)              **
3 **                                                                           **
4 **  Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com               **
5 **                                                                           **
6 **  This library is free software, licensed under the terms of the GNU       **
7 **  General Public License as published by the Free Software Foundation,     **
8 **  either version 2 of the License, or (at your option) any later version.  **
9 **  You should have received a copy of the GNU General Public License        **
10 **  along with this program.  If not, see <http://www.gnu.org/licenses/>.    **
11 ******************************************************************************/
12 
13 #ifndef DRW_OBJECTS_H
14 #define DRW_OBJECTS_H
15 
16 
17 #include <string>
18 #include <vector>
19 #include <map>
20 #include "drw_base.h"
21 
22 class dxfReader;
23 class dxfWriter;
24 class dwgBuffer;
25 
26 namespace DRW {
27 
28 //! Table entries type.
29      enum TTYPE {
30          UNKNOWNT,
31          LTYPE,
32          LAYER,
33          STYLE,
34          DIMSTYLE,
35          VPORT,
36          BLOCK_RECORD,
37          APPID,
38          IMAGEDEF,
39          PLOTSETTINGS
40      };
41 
42 //pending VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD,
43 //ACDBPLACEHOLDER, VBA_PROJECT, ACAD_TABLE, CELLSTYLEMAP, DBCOLOR, DICTIONARYVAR,
44 //DICTIONARYWDFLT, FIELD, IDBUFFER, IMAGEDEF, IMAGEDEFREACTOR, LAYER_INDEX, LAYOUT
45 //MATERIAL, PLACEHOLDER, PLOTSETTINGS, RASTERVARIABLES, SCALE, SORTENTSTABLE,
46 //SPATIAL_INDEX, SPATIAL_FILTER, TABLEGEOMETRY, TABLESTYLES,VISUALSTYLE,
47 }
48 
49 #define SETOBJFRIENDS  friend class dxfRW; \
50                        friend class dwgReader;
51 
52 //! Base class for tables entries
53 /*!
54 *  Base class for tables entries
55 *  @author Rallaz
56 */
57 class DRW_TableEntry {
58 public:
59     //initializes default values
DRW_TableEntry()60     DRW_TableEntry() {
61         tType = DRW::UNKNOWNT;
62         flags = 0;
63         numReactors = xDictFlag = 0;
64         parentHandle = 0;
65         curr = NULL;
66     }
67 
~DRW_TableEntry()68     virtual~DRW_TableEntry() {
69         for (std::vector<DRW_Variant*>::iterator it=extData.begin(); it!=extData.end(); ++it)
70             delete *it;
71 
72         extData.clear();
73     }
74 
DRW_TableEntry(const DRW_TableEntry & e)75     DRW_TableEntry(const DRW_TableEntry& e) {
76         tType = e.tType;
77         handle = e.handle;
78         parentHandle = e.parentHandle;
79         name = e.name;
80         flags = e.flags;
81         numReactors = e.numReactors;
82         xDictFlag = e.xDictFlag;
83         curr = e.curr;
84         for (std::vector<DRW_Variant*>::const_iterator it=e.extData.begin(); it!=e.extData.end(); ++it){
85             extData.push_back(new DRW_Variant(*(*it)));
86         }
87     }
88 
89 protected:
90     void parseCode(int code, dxfReader *reader);
91     virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0) = 0;
92     bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs=0);
reset()93     void reset(){
94         flags =0;
95         for (std::vector<DRW_Variant*>::iterator it=extData.begin(); it!=extData.end(); ++it)
96             delete *it;
97         extData.clear();
98     }
99 
100 public:
101     enum DRW::TTYPE tType;     /*!< enum: entity type, code 0 */
102     duint32 handle;            /*!< entity identifier, code 5 */
103     int parentHandle;          /*!< Soft-pointer ID/handle to owner object, code 330 */
104     UTF8STRING name;           /*!< entry name, code 2 */
105     int flags;                 /*!< Flags relevant to entry, code 70 */
106     std::vector<DRW_Variant*> extData; /*!< FIFO list of extended data, codes 1000 to 1071*/
107 
108 private:
109     DRW_Variant* curr;
110 
111     //***** dwg parse ********/
112 protected:
113     dint16 oType;
114     duint8 xDictFlag;
115     dint32 numReactors; //
116     duint32 objSize;  //RL 32bits object data size in bits
117 };
118 
119 
120 //! Class to handle dimstyle entries
121 /*!
122 *  Class to handle dim style symbol table entries
123 *  @author Rallaz
124 */
125 class DRW_Dimstyle : public DRW_TableEntry {
126     SETOBJFRIENDS
127 public:
DRW_Dimstyle()128     DRW_Dimstyle() { reset();}
129 
reset()130     void reset(){
131         tType = DRW::DIMSTYLE;
132         dimasz = dimtxt = dimexe = 0.18;
133         dimexo = 0.0625;
134         dimgap = dimcen = 0.09;
135         dimtxsty = "Standard";
136         dimscale = dimlfac = dimtfac = dimfxl = 1.0;
137         dimdli = 0.38;
138         dimrnd = dimdle = dimtp = dimtm = dimtsz = dimtvp = 0.0;
139         dimaltf = 25.4;
140         dimtol = dimlim = dimse1 = dimse2 = dimtad = dimzin = 0;
141         dimtoh = dimtolj = 1;
142         dimalt = dimtofl = dimsah = dimtix = dimsoxd = dimfxlon = 0;
143         dimaltd = dimunit = dimaltu = dimalttd = dimlunit = 2;
144         dimclrd = dimclre = dimclrt = dimjust = dimupt = 0;
145         dimazin = dimaltz = dimaltttz = dimtzin = dimfrac = 0;
146         dimtih = dimadec = dimaunit = dimsd1 = dimsd2 = dimtmove = 0;
147         dimaltrnd = 0.0;
148         dimdec = dimtdec = 4;
149         dimfit = dimatfit = 3;
150         dimdsep = '.';
151         dimlwd = dimlwe = -2;
152         DRW_TableEntry::reset();
153     }
154 
155 protected:
156     void parseCode(int code, dxfReader *reader);
157     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
158 
159 public:
160     //V12
161     UTF8STRING dimpost;       /*!< code 3 */
162     UTF8STRING dimapost;      /*!< code 4 */
163 /* handle are code 105 */
164     UTF8STRING dimblk;        /*!< code 5, code 342 V2000+ */
165     UTF8STRING dimblk1;       /*!< code 6, code 343 V2000+ */
166     UTF8STRING dimblk2;       /*!< code 7, code 344 V2000+ */
167     double dimscale;          /*!< code 40 */
168     double dimasz;            /*!< code 41 */
169     double dimexo;            /*!< code 42 */
170     double dimdli;            /*!< code 43 */
171     double dimexe;            /*!< code 44 */
172     double dimrnd;            /*!< code 45 */
173     double dimdle;            /*!< code 46 */
174     double dimtp;             /*!< code 47 */
175     double dimtm;             /*!< code 48 */
176     double dimfxl;            /*!< code 49 V2007+ */
177     double dimtxt;            /*!< code 140 */
178     double dimcen;            /*!< code 141 */
179     double dimtsz;            /*!< code 142 */
180     double dimaltf;           /*!< code 143 */
181     double dimlfac;           /*!< code 144 */
182     double dimtvp;            /*!< code 145 */
183     double dimtfac;           /*!< code 146 */
184     double dimgap;            /*!< code 147 */
185     double dimaltrnd;         /*!< code 148 V2000+ */
186     int dimtol;               /*!< code 71 */
187     int dimlim;               /*!< code 72 */
188     int dimtih;               /*!< code 73 */
189     int dimtoh;               /*!< code 74 */
190     int dimse1;               /*!< code 75 */
191     int dimse2;               /*!< code 76 */
192     int dimtad;               /*!< code 77 */
193     int dimzin;               /*!< code 78 */
194     int dimazin;              /*!< code 79 V2000+ */
195     int dimalt;               /*!< code 170 */
196     int dimaltd;              /*!< code 171 */
197     int dimtofl;              /*!< code 172 */
198     int dimsah;               /*!< code 173 */
199     int dimtix;               /*!< code 174 */
200     int dimsoxd;              /*!< code 175 */
201     int dimclrd;              /*!< code 176 */
202     int dimclre;              /*!< code 177 */
203     int dimclrt;              /*!< code 178 */
204     int dimadec;              /*!< code 179 V2000+ */
205     int dimunit;              /*!< code 270 R13+ (obsolete 2000+, use dimlunit & dimfrac) */
206     int dimdec;               /*!< code 271 R13+ */
207     int dimtdec;              /*!< code 272 R13+ */
208     int dimaltu;              /*!< code 273 R13+ */
209     int dimalttd;             /*!< code 274 R13+ */
210     int dimaunit;             /*!< code 275 R13+ */
211     int dimfrac;              /*!< code 276 V2000+ */
212     int dimlunit;             /*!< code 277 V2000+ */
213     int dimdsep;              /*!< code 278 V2000+ */
214     int dimtmove;             /*!< code 279 V2000+ */
215     int dimjust;              /*!< code 280 R13+ */
216     int dimsd1;               /*!< code 281 R13+ */
217     int dimsd2;               /*!< code 282 R13+ */
218     int dimtolj;              /*!< code 283 R13+ */
219     int dimtzin;              /*!< code 284 R13+ */
220     int dimaltz;              /*!< code 285 R13+ */
221     int dimaltttz;            /*!< code 286 R13+ */
222     int dimfit;               /*!< code 287 R13+  (obsolete 2000+, use dimatfit & dimtmove)*/
223     int dimupt;               /*!< code 288 R13+ */
224     int dimatfit;             /*!< code 289 V2000+ */
225     int dimfxlon;             /*!< code 290 V2007+ */
226     UTF8STRING dimtxsty;      /*!< code 340 R13+ */
227     UTF8STRING dimldrblk;     /*!< code 341 V2000+ */
228     int dimlwd;               /*!< code 371 V2000+ */
229     int dimlwe;               /*!< code 372 V2000+ */
230 };
231 
232 
233 //! Class to handle line type entries
234 /*!
235 *  Class to handle line type symbol table entries
236 *  @author Rallaz
237 */
238 /*TODO: handle complex lineType*/
239 class DRW_LType : public DRW_TableEntry {
240     SETOBJFRIENDS
241 public:
DRW_LType()242     DRW_LType() { reset();}
243 
reset()244     void reset(){
245         tType = DRW::LTYPE;
246         desc = "";
247         size = 0;
248         length = 0.0;
249         pathIdx = 0;
250         DRW_TableEntry::reset();
251     }
252 
253 protected:
254     void parseCode(int code, dxfReader *reader);
255     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
256     void update();
257 
258 public:
259     UTF8STRING desc;           /*!< descriptive string, code 3 */
260 //    int align;               /*!< align code, always 65 ('A') code 72 */
261     int size;                 /*!< element number, code 73 */
262     double length;            /*!< total length of pattern, code 40 */
263 //    int haveShape;      /*!< complex linetype type, code 74 */
264     std::vector<double> path;  /*!< trace, point or space length sequence, code 49 */
265 private:
266     int pathIdx;
267 };
268 
269 
270 //! Class to handle layer entries
271 /*!
272 *  Class to handle layer symbol table entries
273 *  @author Rallaz
274 */
275 class DRW_Layer : public DRW_TableEntry {
276     SETOBJFRIENDS
277 public:
DRW_Layer()278     DRW_Layer() { reset();}
279 
reset()280     void reset() {
281         tType = DRW::LAYER;
282         lineType = "CONTINUOUS";
283         color = 7; // default BYLAYER (256)
284         plotF = true; // default TRUE (plot yes)
285         lWeight = DRW_LW_Conv::widthDefault; // default BYDEFAULT (dxf -3, dwg 31)
286         color24 = -1; //default -1 not set
287         DRW_TableEntry::reset();
288     }
289 
290 protected:
291     void parseCode(int code, dxfReader *reader);
292     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
293 
294 public:
295     UTF8STRING lineType;            /*!< line type, code 6 */
296     int color;                      /*!< layer color, code 62 */
297     int color24;                    /*!< 24-bit color, code 420 */
298     bool plotF;                     /*!< Plot flag, code 290 */
299     enum DRW_LW_Conv::lineWidth lWeight; /*!< layer lineweight, code 370 */
300     std::string handlePlotS;        /*!< Hard-pointer ID/handle of plotstyle, code 390 */
301     std::string handleMaterialS;        /*!< Hard-pointer ID/handle of materialstyle, code 347 */
302 /*only used for read dwg*/
303     dwgHandle lTypeH;
304 };
305 
306 //! Class to handle block record entries
307 /*!
308 *  Class to handle block record table entries
309 *  @author Rallaz
310 */
311 class DRW_Block_Record : public DRW_TableEntry {
312     SETOBJFRIENDS
313 public:
DRW_Block_Record()314     DRW_Block_Record() { reset();}
reset()315     void reset() {
316         tType = DRW::BLOCK_RECORD;
317         flags = 0;
318         firstEH = lastEH = DRW::NoHandle;
319         DRW_TableEntry::reset();
320     }
321 
322 protected:
323 //    void parseCode(int code, dxfReader *reader);
324     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
325 
326 public:
327 //Note:    int DRW_TableEntry::flags; contains code 70 of block
328     int insUnits;             /*!< block insertion units, code 70 of block_record*/
329     DRW_Coord basePoint;      /*!<  block insertion base point dwg only */
330 protected:
331     //dwg parser
332 private:
333     duint32 block;   //handle for block entity
334     duint32 endBlock;//handle for end block entity
335     duint32 firstEH; //handle of first entity, only in pre-2004
336     duint32 lastEH;  //handle of last entity, only in pre-2004
337     std::vector<duint32>entMap;
338 };
339 
340 //! Class to handle text style entries
341 /*!
342 *  Class to handle text style symbol table entries
343 *  @author Rallaz
344 */
345 class DRW_Textstyle : public DRW_TableEntry {
346     SETOBJFRIENDS
347 public:
DRW_Textstyle()348     DRW_Textstyle() { reset();}
349 
reset()350     void reset(){
351         tType = DRW::STYLE;
352         height = oblique = 0.0;
353         width = lastHeight = 1.0;
354         font="txt";
355         genFlag = 0; //2= X mirror, 4= Y mirror
356         fontFamily = 0;
357         DRW_TableEntry::reset();
358     }
359 
360 protected:
361     void parseCode(int code, dxfReader *reader);
362     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
363 
364 public:
365     double height;          /*!< Fixed text height (0 not set), code 40 */
366     double width;           /*!< Width factor, code 41 */
367     double oblique;         /*!< Oblique angle, code 50 */
368     int genFlag;            /*!< Text generation flags, code 71 */
369     double lastHeight;      /*!< Last height used, code 42 */
370     UTF8STRING font;        /*!< primary font file name, code 3 */
371     UTF8STRING bigFont;     /*!< bigfont file name or blank if none, code 4 */
372     int fontFamily;         /*!< ttf font family, italic and bold flags, code 1071 */
373 };
374 
375 //! Class to handle vport entries
376 /*!
377 *  Class to handle vport symbol table entries
378 *  @author Rallaz
379 */
380 class DRW_Vport : public DRW_TableEntry {
381     SETOBJFRIENDS
382 public:
DRW_Vport()383     DRW_Vport() { reset();}
384 
reset()385     void reset(){
386         tType = DRW::VPORT;
387         UpperRight.x = UpperRight.y = 1.0;
388         snapSpacing.x = snapSpacing.y = 10.0;
389         gridSpacing = snapSpacing;
390         center.x = 0.651828;
391         center.y = -0.16;
392         viewDir.z = 1;
393         height = 5.13732;
394         ratio = 2.4426877;
395         lensHeight = 50;
396         frontClip = backClip = snapAngle = twistAngle = 0.0;
397         viewMode = snap = grid = snapStyle = snapIsopair = 0;
398         fastZoom = 1;
399         circleZoom = 100;
400         ucsIcon = 3;
401         gridBehavior = 7;
402         DRW_TableEntry::reset();
403     }
404 
405 protected:
406     void parseCode(int code, dxfReader *reader);
407     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
408 
409 public:
410     DRW_Coord lowerLeft;     /*!< Lower left corner, code 10 & 20 */
411     DRW_Coord UpperRight;    /*!< Upper right corner, code 11 & 21 */
412     DRW_Coord center;        /*!< center point in WCS, code 12 & 22 */
413     DRW_Coord snapBase;      /*!< snap base point in DCS, code 13 & 23 */
414     DRW_Coord snapSpacing;   /*!< snap Spacing, code 14 & 24 */
415     DRW_Coord gridSpacing;   /*!< grid Spacing, code 15 & 25 */
416     DRW_Coord viewDir;       /*!< view direction from target point, code 16, 26 & 36 */
417     DRW_Coord viewTarget;    /*!< view target point, code 17, 27 & 37 */
418     double height;           /*!< view height, code 40 */
419     double ratio;            /*!< viewport aspect ratio, code 41 */
420     double lensHeight;       /*!< lens height, code 42 */
421     double frontClip;        /*!< front clipping plane, code 43 */
422     double backClip;         /*!< back clipping plane, code 44 */
423     double snapAngle;        /*!< snap rotation angle, code 50 */
424     double twistAngle;       /*!< view twist angle, code 51 */
425     int viewMode;            /*!< view mode, code 71 */
426     int circleZoom;          /*!< circle zoom percent, code 72 */
427     int fastZoom;            /*!< fast zoom setting, code 73 */
428     int ucsIcon;             /*!< UCSICON setting, code 74 */
429     int snap;                /*!< snap on/off, code 75 */
430     int grid;                /*!< grid on/off, code 76 */
431     int snapStyle;           /*!< snap style, code 77 */
432     int snapIsopair;         /*!< snap isopair, code 78 */
433     int gridBehavior;        /*!< grid behavior, code 60, undocummented */
434     /** code 60, bit coded possible value are
435     * bit 1 (1) show out of limits
436     * bit 2 (2) adaptive grid
437     * bit 3 (4) allow subdivision
438     * bit 4 (8) follow dinamic SCP
439     **/
440 };
441 
442 
443 //! Class to handle imagedef entries
444 /*!
445 *  Class to handle image definitions object entries
446 *  @author Rallaz
447 */
448 class DRW_ImageDef : public DRW_TableEntry {//
449     SETOBJFRIENDS
450 public:
DRW_ImageDef()451     DRW_ImageDef() {
452         reset();
453     }
454 
reset()455     void reset(){
456         tType = DRW::IMAGEDEF;
457         imgVersion = 0;
458         DRW_TableEntry::reset();
459     }
460 
461 protected:
462     void parseCode(int code, dxfReader *reader);
463     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
464 
465 public:
466 //    std::string handle;       /*!< entity identifier, code 5 */
467     UTF8STRING name;          /*!< File name of image, code 1 */
468     int imgVersion;              /*!< class version, code 90, 0=R14 version */
469     double u;                 /*!< image size in pixels U value, code 10 */
470     double v;                 /*!< image size in pixels V value, code 20 */
471     double up;                /*!< default size of one pixel U value, code 11 */
472     double vp;                /*!< default size of one pixel V value, code 12 really is 21*/
473     int loaded;               /*!< image is loaded flag, code 280, 0=unloaded, 1=loaded */
474     int resolution;           /*!< resolution units, code 281, 0=no, 2=centimeters, 5=inch */
475 
476     std::map<std::string,std::string> reactors;
477 };
478 
479 
480 //! Class to handle plotsettings entries
481 /*!
482 *  Class to handle plot settings object entries
483 *  @author baranovskiykonstantin@gmail.com
484 */
485 class DRW_PlotSettings : public DRW_TableEntry {
486     SETOBJFRIENDS
487 public:
DRW_PlotSettings()488     DRW_PlotSettings() {
489         reset();
490     }
491 
reset()492     void reset(){
493         tType = DRW::PLOTSETTINGS;
494         marginLeft = 0.0;
495         marginBottom = 0.0;
496         marginRight = 0.0;
497         marginTop = 0.0;
498         DRW_TableEntry::reset();
499     }
500 
501 protected:
502     void parseCode(int code, dxfReader *reader);
503     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
504 
505 public:
506     UTF8STRING plotViewName;/*!< Plot view name, code 6 */
507     double marginLeft;      /*!< Size, in millimeters, of unprintable margin on left side of paper, code 40 */
508     double marginBottom;    /*!< Size, in millimeters, of unprintable margin on bottom side of paper, code 41 */
509     double marginRight;     /*!< Size, in millimeters, of unprintable margin on right side of paper, code 42 */
510     double marginTop;       /*!< Size, in millimeters, of unprintable margin on top side of paper, code 43 */
511 };
512 
513 //! Class to handle AppId entries
514 /*!
515 *  Class to handle AppId symbol table entries
516 *  @author Rallaz
517 */
518 class DRW_AppId : public DRW_TableEntry {
519     SETOBJFRIENDS
520 public:
DRW_AppId()521     DRW_AppId() { reset();}
522 
reset()523     void reset(){
524         tType = DRW::APPID;
525         flags = 0;
526         name = "";
527     }
528 
529 protected:
parseCode(int code,dxfReader * reader)530     void parseCode(int code, dxfReader *reader){DRW_TableEntry::parseCode(code, reader);}
531     bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
532 };
533 
534 namespace DRW {
535 
536 // Extended color palette:
537 // The first entry is only for direct indexing starting with [1]
538 // Color 1 is red (1,0,0)
539 const unsigned char dxfColors[][3] = {
540     {  0,  0,  0}, // unused
541     {255,  0,  0}, // 1 red
542     {255,255,  0}, // 2 yellow
543     {  0,255,  0}, // 3 green
544     {  0,255,255}, // 4 cyan
545     {  0,  0,255}, // 5 blue
546     {255,  0,255}, // 6 magenta
547     {  0,  0,  0}, // 7 black or white
548     {128,128,128}, // 8 50% gray
549     {192,192,192}, // 9 75% gray
550     {255,  0,  0}, // 10
551     {255,127,127},
552     {204,  0,  0},
553     {204,102,102},
554     {153,  0,  0},
555     {153, 76, 76}, // 15
556     {127,  0,  0},
557     {127, 63, 63},
558     { 76,  0,  0},
559     { 76, 38, 38},
560     {255, 63,  0}, // 20
561     {255,159,127},
562     {204, 51,  0},
563     {204,127,102},
564     {153, 38,  0},
565     {153, 95, 76}, // 25
566     {127, 31,  0},
567     {127, 79, 63},
568     { 76, 19,  0},
569     { 76, 47, 38},
570     {255,127,  0}, // 30
571     {255,191,127},
572     {204,102,  0},
573     {204,153,102},
574     {153, 76,  0},
575     {153,114, 76}, // 35
576     {127, 63,  0},
577     {127, 95, 63},
578     { 76, 38,  0},
579     { 76, 57, 38},
580     {255,191,  0}, // 40
581     {255,223,127},
582     {204,153,  0},
583     {204,178,102},
584     {153,114,  0},
585     {153,133, 76}, // 45
586     {127, 95,  0},
587     {127,111, 63},
588     { 76, 57,  0},
589     { 76, 66, 38},
590     {255,255,  0}, // 50
591     {255,255,127},
592     {204,204,  0},
593     {204,204,102},
594     {153,153,  0},
595     {153,153, 76}, // 55
596     {127,127,  0},
597     {127,127, 63},
598     { 76, 76,  0},
599     { 76, 76, 38},
600     {191,255,  0}, // 60
601     {223,255,127},
602     {153,204,  0},
603     {178,204,102},
604     {114,153,  0},
605     {133,153, 76}, // 65
606     { 95,127,  0},
607     {111,127, 63},
608     { 57, 76,  0},
609     { 66, 76, 38},
610     {127,255,  0}, // 70
611     {191,255,127},
612     {102,204,  0},
613     {153,204,102},
614     { 76,153,  0},
615     {114,153, 76}, // 75
616     { 63,127,  0},
617     { 95,127, 63},
618     { 38, 76,  0},
619     { 57, 76, 38},
620     { 63,255,  0}, // 80
621     {159,255,127},
622     { 51,204,  0},
623     {127,204,102},
624     { 38,153,  0},
625     { 95,153, 76}, // 85
626     { 31,127,  0},
627     { 79,127, 63},
628     { 19, 76,  0},
629     { 47, 76, 38},
630     {  0,255,  0}, // 90
631     {127,255,127},
632     {  0,204,  0},
633     {102,204,102},
634     {  0,153,  0},
635     { 76,153, 76}, // 95
636     {  0,127,  0},
637     { 63,127, 63},
638     {  0, 76,  0},
639     { 38, 76, 38},
640     {  0,255, 63}, // 100
641     {127,255,159},
642     {  0,204, 51},
643     {102,204,127},
644     {  0,153, 38},
645     { 76,153, 95}, // 105
646     {  0,127, 31},
647     { 63,127, 79},
648     {  0, 76, 19},
649     { 38, 76, 47},
650     {  0,255,127}, // 110
651     {127,255,191},
652     {  0,204,102},
653     {102,204,153},
654     {  0,153, 76},
655     { 76,153,114}, // 115
656     {  0,127, 63},
657     { 63,127, 95},
658     {  0, 76, 38},
659     { 38, 76, 57},
660     {  0,255,191}, // 120
661     {127,255,223},
662     {  0,204,153},
663     {102,204,178},
664     {  0,153,114},
665     { 76,153,133}, // 125
666     {  0,127, 95},
667     { 63,127,111},
668     {  0, 76, 57},
669     { 38, 76, 66},
670     {  0,255,255}, // 130
671     {127,255,255},
672     {  0,204,204},
673     {102,204,204},
674     {  0,153,153},
675     { 76,153,153}, // 135
676     {  0,127,127},
677     { 63,127,127},
678     {  0, 76, 76},
679     { 38, 76, 76},
680     {  0,191,255}, // 140
681     {127,223,255},
682     {  0,153,204},
683     {102,178,204},
684     {  0,114,153},
685     { 76,133,153}, // 145
686     {  0, 95,127},
687     { 63,111,127},
688     {  0, 57, 76},
689     { 38, 66, 76},
690     {  0,127,255}, // 150
691     {127,191,255},
692     {  0,102,204},
693     {102,153,204},
694     {  0, 76,153},
695     { 76,114,153}, // 155
696     {  0, 63,127},
697     { 63, 95,127},
698     {  0, 38, 76},
699     { 38, 57, 76},
700     {  0, 66,255}, // 160
701     {127,159,255},
702     {  0, 51,204},
703     {102,127,204},
704     {  0, 38,153},
705     { 76, 95,153}, // 165
706     {  0, 31,127},
707     { 63, 79,127},
708     {  0, 19, 76},
709     { 38, 47, 76},
710     {  0,  0,255}, // 170
711     {127,127,255},
712     {  0,  0,204},
713     {102,102,204},
714     {  0,  0,153},
715     { 76, 76,153}, // 175
716     {  0,  0,127},
717     { 63, 63,127},
718     {  0,  0, 76},
719     { 38, 38, 76},
720     { 63,  0,255}, // 180
721     {159,127,255},
722     { 50,  0,204},
723     {127,102,204},
724     { 38,  0,153},
725     { 95, 76,153}, // 185
726     { 31,  0,127},
727     { 79, 63,127},
728     { 19,  0, 76},
729     { 47, 38, 76},
730     {127,  0,255}, // 190
731     {191,127,255},
732     {102,  0,204},
733     {153,102,204},
734     { 76,  0,153},
735     {114, 76,153}, // 195
736     { 63,  0,127},
737     { 95, 63,127},
738     { 38,  0, 76},
739     { 57, 38, 76},
740     {191,  0,255}, // 200
741     {223,127,255},
742     {153,  0,204},
743     {178,102,204},
744     {114,  0,153},
745     {133, 76,153}, // 205
746     { 95,  0,127},
747     {111, 63,127},
748     { 57,  0, 76},
749     { 66, 38, 76},
750     {255,  0,255}, // 210
751     {255,127,255},
752     {204,  0,204},
753     {204,102,204},
754     {153,  0,153},
755     {153, 76,153}, // 215
756     {127,  0,127},
757     {127, 63,127},
758     { 76,  0, 76},
759     { 76, 38, 76},
760     {255,  0,191}, // 220
761     {255,127,223},
762     {204,  0,153},
763     {204,102,178},
764     {153,  0,114},
765     {153, 76,133}, // 225
766     {127,  0, 95},
767     {127, 63, 11},
768     { 76,  0, 57},
769     { 76, 38, 66},
770     {255,  0,127}, // 230
771     {255,127,191},
772     {204,  0,102},
773     {204,102,153},
774     {153,  0, 76},
775     {153, 76,114}, // 235
776     {127,  0, 63},
777     {127, 63, 95},
778     { 76,  0, 38},
779     { 76, 38, 57},
780     {255,  0, 63}, // 240
781     {255,127,159},
782     {204,  0, 51},
783     {204,102,127},
784     {153,  0, 38},
785     {153, 76, 95}, // 245
786     {127,  0, 31},
787     {127, 63, 79},
788     { 76,  0, 19},
789     { 76, 38, 47},
790     { 51, 51, 51}, // 250
791     { 91, 91, 91},
792     {132,132,132},
793     {173,173,173},
794     {214,214,214},
795     {255,255,255}  // 255
796 };
797 
798 }
799 
800 #endif
801 
802 // EOF
803 
804