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