00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifndef _SO_OUTPUT_
00052 #define _SO_OUTPUT_
00053
00054 #include <Inventor/misc/SoBasic.h>
00055 #include <Inventor/SbDict.h>
00056 #include <Inventor/SbString.h>
00057 #include <Inventor/SoType.h>
00058
00059 class SoBase;
00060 class SoOutputImpl;
00061
00062 typedef void *SoOutputReallocCB(void *ptr, size_t newSize);
00063
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00091
00185 class SoOutput {
00186 public:
00187
00191 SoOutput();
00192
00196 virtual ~SoOutput();
00197
00204 enum FileProperty
00205 {
00207 DefaultProperty = 0,
00209 CompressedZlib = 1
00210 };
00211
00221 virtual void setFileProperty( const FileProperty properties );
00222
00228 FileProperty getFileProperty() const;
00229
00233 virtual void setFilePointer(FILE *newFP);
00234
00241 virtual FILE * getFilePointer() const;
00242
00251 size_t fileWrite( void* buffer, size_t elemSize, size_t count );
00252
00261 int filePuts( const char* );
00262
00271 int filePutc( int );
00272
00278 SoNONUNICODE virtual SbBool openFile(const char *fileName);
00279
00285 virtual SbBool openFile( const SbString& fileName );
00286
00290 virtual void closeFile();
00291
00298 virtual void setBuffer(void *bufPointer, size_t initSize,
00299 SoOutputReallocCB *reallocFunc,
00300 int32_t offset = 0);
00301
00306 virtual SbBool getBuffer(void *&bufPointer, size_t &nBytes) const;
00307
00312 virtual size_t getBufferSize() const { return bufSize; }
00313
00317 virtual void resetBuffer();
00318
00322 virtual void setBinary(SbBool flag);
00323
00327 virtual SbBool isBinary() const { return binary; }
00328
00332 SbBool isWritingForScaleViz() const;
00333
00344 virtual void setHeaderString(const SbString &str);
00348 virtual void resetHeaderString();
00349
00353 static SbString getDefaultASCIIHeader();
00357 static SbString getDefaultBinaryHeader();
00358
00364 virtual void setFloatPrecision(int precision);
00365
00371 virtual void setDoublePrecision(int precision);
00372
00373
00374 private:
00375
00376 #ifdef _WIN32
00377 virtual SbBool openFromHandle(UINT hFile);
00378 #endif
00379 virtual void flushFile();
00380
00381
00382 enum Stage {
00383 COUNT_REFS,
00384 WRITE
00385 };
00386
00387
00388 void setStage(Stage stage) { curStage = stage; }
00389 Stage getStage() const { return curStage; }
00390
00391
00392
00393 void incrementIndent(int amount = 1)
00394 { indentLevel += amount; }
00395 void decrementIndent(int amount = 1)
00396 { indentLevel -= amount; }
00397
00398 int getIndentLevel(){ return indentLevel; }
00399
00400
00401 virtual void write(bool b);
00402 virtual void write(char c);
00403 virtual void write(unsigned char c);
00404 virtual void write(const char *s);
00405 virtual void write(const SbString &s);
00406 virtual void write(const SbName &n);
00407 virtual void write(int32_t i);
00411 virtual void write(int64_t i);
00415 virtual void write(uint32_t i);
00419 virtual void write(uint64_t i);
00420 virtual void write(short s);
00424 virtual void write(unsigned short s);
00425 virtual void write(float f);
00426 virtual void write(double d);
00427 virtual void writeBinaryArray(unsigned char *c, int length);
00428 virtual void writeBinaryArray(int32_t *l, int length);
00429 virtual void writeBinaryArray(int64_t *l, int length);
00430 virtual void writeBinaryArray(float *f, int length);
00431 virtual void writeBinaryArray(double *d, int length);
00432 virtual void writeBinaryArray(short *s, int length);
00433
00434
00435 virtual void indent();
00436
00437 private:
00438
00439 SbBool isOutFileVRML2() { return vrmlFileOut;}
00440 SbBool isOutFileX3D() { return x3dFileOut;}
00441 SbBool isHeaderWritten() { return wroteHeader;}
00442 void incrementRefOut(int amount = 1)
00443 { refOut += amount; }
00444 int getRefOut() { return refOut;}
00445
00446 SoOutput(SoOutput *dictOut);
00447
00448
00449 virtual void reset();
00450
00451
00452
00453 void setCompact(SbBool flag) { compact = flag; }
00454 SbBool isCompact() const { return compact; }
00455
00456
00457
00458 enum Annotations {
00459 ADDRESSES = (1<<0),
00460 REF_COUNTS = (1<<1)
00461 };
00462 void setAnnotation(uint32_t bits)
00463 { annotation = bits; }
00464 uint32_t getAnnotation()
00465 { return (isCompact() || isBinary()) ? 0 : annotation; }
00466 SbPList routeList;
00467
00468
00469
00470 int findReferenceIfVRML2(const SoBase *base) const;
00471
00472
00473 int addReferenceIfVRML2(const SoBase *base);
00474
00475
00476 virtual void addToVRML2Dict(const SbString name, const SoBase *base);
00477
00478
00479 virtual SoBase * findInVRML2Dict( const SbString name) const;
00480
00481
00482 virtual void addToVRMLName(const SoBase *base, const char *name);
00483
00484
00485 void writeHeader();
00486
00487 virtual char * findInVRMLName( const SoBase *base) const;
00488 SbDict *refVRMLName;
00489 SbDict *refVRML2;
00490 SbDict *PROTOToWrite;
00491 int refOut;
00492
00493 int32_t isWritingBinArrayAsMemObj() const;
00494
00495 SoOutputImpl* m_soOutputImpl;
00496
00501 struct SoOutputEntry {
00502 SbName name;
00503 int64_t offset;
00504 SoType type;
00505 };
00506
00507
00508
00509 float getIVVersion();
00510
00511 private:
00512 FILE *fp;
00513 void *zFp;
00514 SbBool toBuffer;
00515 char *tmpBuffer;
00516 void *buffer;
00517 char *curBuf;
00518 size_t bufSize;
00519 size_t tmpBufSize;
00520 SoOutputReallocCB *reallocFunc;
00521 SbBool openedHere;
00522 SbBool openedFromHandle;
00523 SbBool binary;
00524 SbBool compact;
00525 SbBool wroteHeader;
00526 int indentLevel;
00527 SbDict *refDict;
00528 SbBool borrowedDict;
00529 int refIdCount;
00530 SbBool anyRef;
00531 uint32_t annotation;
00532 Stage curStage;
00533 SbString headerString;
00534 FileProperty m_fileProperties;
00535
00536
00537
00538 static SbString padHeader(const SbString &inString);
00539
00540
00541 SbBool isToBuffer() const
00542 { return toBuffer; }
00543
00549 virtual SbBool setupFileProperties();
00550
00551
00552 size_t bytesInBuf() const
00553 { return (curBuf - static_cast<char *>(buffer) ); }
00554
00555
00556 SbBool makeRoomInBuf(size_t nBytes);
00557
00558
00559 SbBool makeRoomInTmpBuf(size_t nBytes);
00560
00561
00562
00563 int addReference(const SoBase *base);
00564
00565
00566
00567 int findReference(const SoBase *base) const;
00568
00569
00570 void convertShort(short s, char *to);
00571 void convertInt32(int32_t l, char *to);
00572 void convertInt64(int64_t l, char *to);
00573 void convertFloat(float f, char *to);
00574 void convertDouble(double d, char *to);
00575 void convertShortArray( short *from, char *to, int len);
00576 void convertInt32Array( int32_t *from, char *to, int len);
00577 void convertInt64Array( int64_t *from, char *to, int len);
00578 void convertFloatArray( float *from, char *to, int len);
00579 void convertDoubleArray( double *from, char *to, int len);
00580
00581 const char* getDoublesFormatString() const;
00582
00583 const char* getFloatsFormatString() const;
00584
00585
00586 SbBool vrmlFileOut;
00587 SbBool x3dFileOut;
00588 float m_ivVersion;
00589
00590 private:
00591 char m_floatsFmtString[16];
00592 char m_doublesFmtString[16];
00593
00594
00595 friend class SoBase;
00596 friend class SoDB;
00597 };
00598
00599 #endif
00600
00601
00602