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 #ifndef GDAL_PRIV_H_INCLUDED
00032 #define GDAL_PRIV_H_INCLUDED
00033
00034
00035
00036
00037
00038 class GDALMajorObject;
00039 class GDALDataset;
00040 class GDALRasterBand;
00041 class GDALDriver;
00042 class GDALRasterAttributeTable;
00043 class GDALProxyDataset;
00044 class GDALProxyRasterBand;
00045
00046
00047
00048
00049
00050
00051
00052 #include "gdal.h"
00053 #include "gdal_frmts.h"
00054 #include "cpl_vsi.h"
00055 #include "cpl_conv.h"
00056 #include "cpl_string.h"
00057 #include "cpl_minixml.h"
00058 #include <vector>
00059
00060 #define GMO_VALID 0x0001
00061 #define GMO_IGNORE_UNIMPLEMENTED 0x0002
00062 #define GMO_SUPPORT_MD 0x0004
00063 #define GMO_SUPPORT_MDMD 0x0008
00064 #define GMO_MD_DIRTY 0x0010
00065 #define GMO_PAM_CLASS 0x0020
00066
00067
00068
00069
00070
00071 class CPL_DLL GDALMultiDomainMetadata
00072 {
00073 private:
00074 char **papszDomainList;
00075 char ***papapszMetadataLists;
00076
00077 public:
00078 GDALMultiDomainMetadata();
00079 ~GDALMultiDomainMetadata();
00080
00081 int XMLInit( CPLXMLNode *psMetadata, int bMerge );
00082 CPLXMLNode *Serialize();
00083
00084 char **GetDomainList() { return papszDomainList; }
00085
00086 char **GetMetadata( const char * pszDomain = "" );
00087 CPLErr SetMetadata( char ** papszMetadata,
00088 const char * pszDomain = "" );
00089 const char *GetMetadataItem( const char * pszName,
00090 const char * pszDomain = "" );
00091 CPLErr SetMetadataItem( const char * pszName,
00092 const char * pszValue,
00093 const char * pszDomain = "" );
00094
00095 void Clear();
00096 };
00097
00098
00099
00100
00101
00102
00103
00104
00106
00107 class CPL_DLL GDALMajorObject
00108 {
00109 protected:
00110 int nFlags;
00111 CPLString sDescription;
00112 GDALMultiDomainMetadata oMDMD;
00113
00114 public:
00115 GDALMajorObject();
00116 virtual ~GDALMajorObject();
00117
00118 int GetMOFlags();
00119 void SetMOFlags(int nFlags);
00120
00121 virtual const char *GetDescription() const;
00122 virtual void SetDescription( const char * );
00123
00124 virtual char **GetMetadata( const char * pszDomain = "" );
00125 virtual CPLErr SetMetadata( char ** papszMetadata,
00126 const char * pszDomain = "" );
00127 virtual const char *GetMetadataItem( const char * pszName,
00128 const char * pszDomain = "" );
00129 virtual CPLErr SetMetadataItem( const char * pszName,
00130 const char * pszValue,
00131 const char * pszDomain = "" );
00132 };
00133
00134
00135
00136
00137 class CPL_DLL GDALDefaultOverviews
00138 {
00139 friend class GDALDataset;
00140
00141 GDALDataset *poDS;
00142 GDALDataset *poODS;
00143
00144 CPLString osOvrFilename;
00145
00146 int bOvrIsAux;
00147
00148 int bCheckedForMask;
00149 int bOwnMaskDS;
00150 GDALDataset *poMaskDS;
00151
00152
00153
00154 GDALDataset *poBaseDS;
00155
00156
00157 bool bCheckedForOverviews;
00158 void OverviewScan();
00159 char *pszInitName;
00160 int bInitNameIsOVR;
00161 char **papszInitSiblingFiles;
00162
00163 public:
00164 GDALDefaultOverviews();
00165 ~GDALDefaultOverviews();
00166
00167 void Initialize( GDALDataset *poDS, const char *pszName = NULL,
00168 char **papszSiblingFiles = NULL,
00169 int bNameIsOVR = FALSE );
00170
00171 int IsInitialized();
00172
00173
00174
00175 int GetOverviewCount(int);
00176 GDALRasterBand *GetOverview(int,int);
00177
00178 CPLErr BuildOverviews( const char * pszBasename,
00179 const char * pszResampling,
00180 int nOverviews, int * panOverviewList,
00181 int nBands, int * panBandList,
00182 GDALProgressFunc pfnProgress,
00183 void *pProgressData );
00184
00185 CPLErr BuildOverviewsSubDataset( const char * pszPhysicalFile,
00186 const char * pszResampling,
00187 int nOverviews, int * panOverviewList,
00188 int nBands, int * panBandList,
00189 GDALProgressFunc pfnProgress,
00190 void *pProgressData );
00191
00192 CPLErr CleanOverviews();
00193
00194
00195
00196 CPLErr CreateMaskBand( int nFlags, int nBand = -1 );
00197 GDALRasterBand *GetMaskBand( int nBand );
00198 int GetMaskFlags( int nBand );
00199
00200 int HaveMaskFile( char **papszSiblings = NULL,
00201 const char *pszBasename = NULL );
00202
00203 };
00204
00205
00206
00207
00208
00210
00211 class CPL_DLL GDALDataset : public GDALMajorObject
00212 {
00213 friend GDALDatasetH CPL_STDCALL GDALOpen( const char *, GDALAccess);
00214 friend GDALDatasetH CPL_STDCALL GDALOpenShared( const char *, GDALAccess);
00215 friend class GDALDriver;
00216 friend class GDALDefaultOverviews;
00217 friend class GDALProxyDataset;
00218
00219 protected:
00220 GDALDriver *poDriver;
00221 GDALAccess eAccess;
00222
00223
00224 int nRasterXSize;
00225 int nRasterYSize;
00226 int nBands;
00227 GDALRasterBand **papoBands;
00228
00229 int bForceCachedIO;
00230
00231 int nRefCount;
00232 int bShared;
00233
00234 GDALDataset(void);
00235 void RasterInitialize( int, int );
00236 void SetBand( int, GDALRasterBand * );
00237
00238 GDALDefaultOverviews oOvManager;
00239
00240 virtual CPLErr IBuildOverviews( const char *, int, int *,
00241 int, int *, GDALProgressFunc, void * );
00242
00243 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00244 void *, int, int, GDALDataType,
00245 int, int *, int, int, int );
00246
00247 CPLErr BlockBasedRasterIO( GDALRWFlag, int, int, int, int,
00248 void *, int, int, GDALDataType,
00249 int, int *, int, int, int );
00250 void BlockBasedFlushCache();
00251
00252 friend class GDALRasterBand;
00253
00254 public:
00255 virtual ~GDALDataset();
00256
00257 int GetRasterXSize( void );
00258 int GetRasterYSize( void );
00259 int GetRasterCount( void );
00260 GDALRasterBand *GetRasterBand( int );
00261
00262 virtual void FlushCache(void);
00263
00264 virtual const char *GetProjectionRef(void);
00265 virtual CPLErr SetProjection( const char * );
00266
00267 virtual CPLErr GetGeoTransform( double * );
00268 virtual CPLErr SetGeoTransform( double * );
00269
00270 virtual CPLErr AddBand( GDALDataType eType,
00271 char **papszOptions=NULL );
00272
00273 virtual void *GetInternalHandle( const char * );
00274 virtual GDALDriver *GetDriver(void);
00275 virtual char **GetFileList(void);
00276
00277 virtual int GetGCPCount();
00278 virtual const char *GetGCPProjection();
00279 virtual const GDAL_GCP *GetGCPs();
00280 virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList,
00281 const char *pszGCPProjection );
00282
00283 virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize,
00284 int nBufXSize, int nBufYSize,
00285 GDALDataType eDT,
00286 int nBandCount, int *panBandList,
00287 char **papszOptions );
00288
00289 virtual CPLErr CreateMaskBand( int nFlags );
00290
00291 CPLErr RasterIO( GDALRWFlag, int, int, int, int,
00292 void *, int, int, GDALDataType,
00293 int, int *, int, int, int );
00294
00295 int Reference();
00296 int Dereference();
00297 GDALAccess GetAccess() { return eAccess; }
00298
00299 int GetShared();
00300 void MarkAsShared();
00301
00302 static GDALDataset **GetOpenDatasets( int *pnDatasetCount );
00303
00304 CPLErr BuildOverviews( const char *, int, int *,
00305 int, int *, GDALProgressFunc, void * );
00306 };
00307
00308
00309
00310
00311
00313
00314 class CPL_DLL GDALRasterBlock
00315 {
00316 GDALDataType eType;
00317
00318 int bDirty;
00319 int nLockCount;
00320
00321 int nXOff;
00322 int nYOff;
00323
00324 int nXSize;
00325 int nYSize;
00326
00327 void *pData;
00328
00329 GDALRasterBand *poBand;
00330
00331 GDALRasterBlock *poNext;
00332 GDALRasterBlock *poPrevious;
00333
00334 public:
00335 GDALRasterBlock( GDALRasterBand *, int, int );
00336 virtual ~GDALRasterBlock();
00337
00338 CPLErr Internalize( void );
00339 void Touch( void );
00340 void MarkDirty( void );
00341 void MarkClean( void );
00342 void AddLock( void ) { nLockCount++; }
00343 void DropLock( void ) { nLockCount--; }
00344 void Detach();
00345
00346 CPLErr Write();
00347
00348 GDALDataType GetDataType() { return eType; }
00349 int GetXOff() { return nXOff; }
00350 int GetYOff() { return nYOff; }
00351 int GetXSize() { return nXSize; }
00352 int GetYSize() { return nYSize; }
00353 int GetDirty() { return bDirty; }
00354 int GetLockCount() { return nLockCount; }
00355
00356 void *GetDataRef( void ) { return pData; }
00357
00360 GDALRasterBand *GetBand() { return poBand; }
00361
00362 static int FlushCacheBlock();
00363 static void Verify();
00364
00365 static int SafeLockBlock( GDALRasterBlock ** );
00366 };
00367
00368
00369
00370
00371
00374 class CPL_DLL GDALColorTable
00375 {
00376 GDALPaletteInterp eInterp;
00377
00378 std::vector<GDALColorEntry> aoEntries;
00379
00380 public:
00381 GDALColorTable( GDALPaletteInterp = GPI_RGB );
00382 ~GDALColorTable();
00383
00384 GDALColorTable *Clone() const;
00385
00386 GDALPaletteInterp GetPaletteInterpretation() const;
00387
00388 int GetColorEntryCount() const;
00389 const GDALColorEntry *GetColorEntry( int ) const;
00390 int GetColorEntryAsRGB( int, GDALColorEntry * ) const;
00391 void SetColorEntry( int, const GDALColorEntry * );
00392 int CreateColorRamp( int, const GDALColorEntry * ,
00393 int, const GDALColorEntry * );
00394 };
00395
00396
00397
00398
00399
00401
00402 class CPL_DLL GDALRasterBand : public GDALMajorObject
00403 {
00404 protected:
00405 GDALDataset *poDS;
00406 int nBand;
00407
00408 int nRasterXSize;
00409 int nRasterYSize;
00410
00411 GDALDataType eDataType;
00412 GDALAccess eAccess;
00413
00414
00415 int nBlockXSize;
00416 int nBlockYSize;
00417 int nBlocksPerRow;
00418 int nBlocksPerColumn;
00419
00420 int bSubBlockingActive;
00421 int nSubBlocksPerRow;
00422 int nSubBlocksPerColumn;
00423 GDALRasterBlock **papoBlocks;
00424
00425 int nBlockReads;
00426 int bForceCachedIO;
00427
00428 GDALRasterBand *poMask;
00429 bool bOwnMask;
00430 int nMaskFlags;
00431
00432 friend class GDALDataset;
00433 friend class GDALRasterBlock;
00434 friend class GDALProxyRasterBand;
00435
00436 protected:
00437 virtual CPLErr IReadBlock( int, int, void * ) = 0;
00438 virtual CPLErr IWriteBlock( int, int, void * );
00439 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00440 void *, int, int, GDALDataType,
00441 int, int );
00442 CPLErr OverviewRasterIO( GDALRWFlag, int, int, int, int,
00443 void *, int, int, GDALDataType,
00444 int, int );
00445
00446 int InitBlockInfo();
00447
00448 CPLErr AdoptBlock( int, int, GDALRasterBlock * );
00449 GDALRasterBlock *TryGetLockedBlockRef( int nXBlockOff, int nYBlockYOff );
00450
00451 public:
00452 GDALRasterBand();
00453
00454 virtual ~GDALRasterBand();
00455
00456 int GetXSize();
00457 int GetYSize();
00458 int GetBand();
00459 GDALDataset*GetDataset();
00460
00461 GDALDataType GetRasterDataType( void );
00462 void GetBlockSize( int *, int * );
00463 GDALAccess GetAccess();
00464
00465 CPLErr RasterIO( GDALRWFlag, int, int, int, int,
00466 void *, int, int, GDALDataType,
00467 int, int );
00468 CPLErr ReadBlock( int, int, void * );
00469
00470 CPLErr WriteBlock( int, int, void * );
00471
00472 GDALRasterBlock *GetLockedBlockRef( int nXBlockOff, int nYBlockOff,
00473 int bJustInitialize = FALSE );
00474 CPLErr FlushBlock( int = -1, int = -1 );
00475
00476 unsigned char* GetIndexColorTranslationTo( GDALRasterBand* poReferenceBand,
00477 unsigned char* pTranslationTable = NULL,
00478 int* pApproximateMatching = NULL);
00479
00480
00481
00482 virtual CPLErr FlushCache();
00483 virtual char **GetCategoryNames();
00484 virtual double GetNoDataValue( int *pbSuccess = NULL );
00485 virtual double GetMinimum( int *pbSuccess = NULL );
00486 virtual double GetMaximum(int *pbSuccess = NULL );
00487 virtual double GetOffset( int *pbSuccess = NULL );
00488 virtual double GetScale( int *pbSuccess = NULL );
00489 virtual const char *GetUnitType();
00490 virtual GDALColorInterp GetColorInterpretation();
00491 virtual GDALColorTable *GetColorTable();
00492 virtual CPLErr Fill(double dfRealValue, double dfImaginaryValue = 0);
00493
00494 virtual CPLErr SetCategoryNames( char ** );
00495 virtual CPLErr SetNoDataValue( double );
00496 virtual CPLErr SetColorTable( GDALColorTable * );
00497 virtual CPLErr SetColorInterpretation( GDALColorInterp );
00498 virtual CPLErr SetOffset( double );
00499 virtual CPLErr SetScale( double );
00500 virtual CPLErr SetUnitType( const char * );
00501
00502 virtual CPLErr GetStatistics( int bApproxOK, int bForce,
00503 double *pdfMin, double *pdfMax,
00504 double *pdfMean, double *padfStdDev );
00505 virtual CPLErr ComputeStatistics( int bApproxOK,
00506 double *pdfMin, double *pdfMax,
00507 double *pdfMean, double *pdfStdDev,
00508 GDALProgressFunc, void *pProgressData );
00509 virtual CPLErr SetStatistics( double dfMin, double dfMax,
00510 double dfMean, double dfStdDev );
00511 virtual CPLErr ComputeRasterMinMax( int, double* );
00512
00513 virtual int HasArbitraryOverviews();
00514 virtual int GetOverviewCount();
00515 virtual GDALRasterBand *GetOverview(int);
00516 virtual GDALRasterBand *GetRasterSampleOverview( int );
00517 virtual CPLErr BuildOverviews( const char *, int, int *,
00518 GDALProgressFunc, void * );
00519
00520 virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize,
00521 int nBufXSize, int nBufYSize,
00522 GDALDataType eDT, char **papszOptions );
00523
00524 virtual CPLErr GetHistogram( double dfMin, double dfMax,
00525 int nBuckets, int * panHistogram,
00526 int bIncludeOutOfRange, int bApproxOK,
00527 GDALProgressFunc, void *pProgressData );
00528
00529 virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
00530 int *pnBuckets, int ** ppanHistogram,
00531 int bForce,
00532 GDALProgressFunc, void *pProgressData);
00533 virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax,
00534 int nBuckets, int *panHistogram );
00535
00536 virtual const GDALRasterAttributeTable *GetDefaultRAT();
00537 virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * );
00538
00539 virtual GDALRasterBand *GetMaskBand();
00540 virtual int GetMaskFlags();
00541 virtual CPLErr CreateMaskBand( int nFlags );
00542 };
00543
00544
00545
00546
00547
00548 class CPL_DLL GDALAllValidMaskBand : public GDALRasterBand
00549 {
00550 protected:
00551 virtual CPLErr IReadBlock( int, int, void * );
00552
00553 public:
00554 GDALAllValidMaskBand( GDALRasterBand * );
00555 virtual ~GDALAllValidMaskBand();
00556
00557 virtual GDALRasterBand *GetMaskBand();
00558 virtual int GetMaskFlags();
00559 };
00560
00561
00562
00563
00564
00565 class CPL_DLL GDALNoDataMaskBand : public GDALRasterBand
00566 {
00567 double dfNoDataValue;
00568 GDALRasterBand *poParent;
00569
00570 protected:
00571 virtual CPLErr IReadBlock( int, int, void * );
00572
00573 public:
00574 GDALNoDataMaskBand( GDALRasterBand * );
00575 virtual ~GDALNoDataMaskBand();
00576 };
00577
00578
00579
00580
00581
00582 class CPL_DLL GDALNoDataValuesMaskBand : public GDALRasterBand
00583 {
00584 double *padfNodataValues;
00585
00586 protected:
00587 virtual CPLErr IReadBlock( int, int, void * );
00588
00589 public:
00590 GDALNoDataValuesMaskBand( GDALDataset * );
00591 virtual ~GDALNoDataValuesMaskBand();
00592 };
00593
00594
00595
00596
00597
00598
00599
00600 class CPL_DLL GDALOpenInfo
00601 {
00602 public:
00603 GDALOpenInfo( const char * pszFile, GDALAccess eAccessIn,
00604 char **papszSiblingFiles = NULL );
00605 ~GDALOpenInfo( void );
00606
00607 char *pszFilename;
00608 char **papszSiblingFiles;
00609
00610 GDALAccess eAccess;
00611
00612 int bStatOK;
00613 int bIsDirectory;
00614
00615 FILE *fp;
00616
00617 int nHeaderBytes;
00618 GByte *pabyHeader;
00619
00620 };
00621
00622
00623
00624
00625
00626
00638 class CPL_DLL GDALDriver : public GDALMajorObject
00639 {
00640 public:
00641 GDALDriver();
00642 ~GDALDriver();
00643
00644
00645
00646
00647 GDALDataset *Create( const char * pszName,
00648 int nXSize, int nYSize, int nBands,
00649 GDALDataType eType, char ** papszOptions );
00650
00651 CPLErr Delete( const char * pszName );
00652 CPLErr Rename( const char * pszNewName,
00653 const char * pszOldName );
00654 CPLErr CopyFiles( const char * pszNewName,
00655 const char * pszOldName );
00656
00657 GDALDataset *CreateCopy( const char *, GDALDataset *,
00658 int, char **,
00659 GDALProgressFunc pfnProgress,
00660 void * pProgressData );
00661
00662
00663
00664
00665
00666
00667 GDALDataset *(*pfnOpen)( GDALOpenInfo * );
00668
00669 GDALDataset *(*pfnCreate)( const char * pszName,
00670 int nXSize, int nYSize, int nBands,
00671 GDALDataType eType,
00672 char ** papszOptions );
00673
00674 CPLErr (*pfnDelete)( const char * pszName );
00675
00676 GDALDataset *(*pfnCreateCopy)( const char *, GDALDataset *,
00677 int, char **,
00678 GDALProgressFunc pfnProgress,
00679 void * pProgressData );
00680
00681 void *pDriverData;
00682
00683 void (*pfnUnloadDriver)(GDALDriver *);
00684
00685 int (*pfnIdentify)( GDALOpenInfo * );
00686
00687 CPLErr (*pfnRename)( const char * pszNewName,
00688 const char * pszOldName );
00689 CPLErr (*pfnCopyFiles)( const char * pszNewName,
00690 const char * pszOldName );
00691
00692
00693
00694
00695 GDALDataset *DefaultCreateCopy( const char *, GDALDataset *,
00696 int, char **,
00697 GDALProgressFunc pfnProgress,
00698 void * pProgressData );
00699 static CPLErr DefaultCopyMasks( GDALDataset *poSrcDS,
00700 GDALDataset *poDstDS,
00701 int bStrict );
00702 static CPLErr QuietDelete( const char * pszName );
00703 };
00704
00705
00706
00707
00708
00716 class CPL_DLL GDALDriverManager : public GDALMajorObject
00717 {
00718 int nDrivers;
00719 GDALDriver **papoDrivers;
00720
00721 char *pszHome;
00722
00723 public:
00724 GDALDriverManager();
00725 ~GDALDriverManager();
00726
00727 int GetDriverCount( void );
00728 GDALDriver *GetDriver( int );
00729 GDALDriver *GetDriverByName( const char * );
00730
00731 int RegisterDriver( GDALDriver * );
00732 void MoveDriver( GDALDriver *, int );
00733 void DeregisterDriver( GDALDriver * );
00734
00735 void AutoLoadDrivers();
00736 void AutoSkipDrivers();
00737
00738 const char *GetHome();
00739 void SetHome( const char * );
00740 };
00741
00742
00743 CPLErr
00744 GDALRegenerateOverviewsMultiBand(int nBands, GDALRasterBand** papoSrcBands,
00745 int nOverviews,
00746 GDALRasterBand*** papapoOverviewBands,
00747 const char * pszResampling,
00748 GDALProgressFunc pfnProgress, void * pProgressData );
00749
00750 CPL_C_START
00751 GDALDriverManager CPL_DLL * GetGDALDriverManager( void );
00752 CPL_C_END
00753
00754
00755
00756
00757
00758 CPL_C_START
00759
00760 #ifndef WIN32CE
00761
00762 CPLErr CPL_DLL
00763 HFAAuxBuildOverviews( const char *pszOvrFilename, GDALDataset *poParentDS,
00764 GDALDataset **ppoDS,
00765 int nBands, int *panBandList,
00766 int nNewOverviews, int *panNewOverviewList,
00767 const char *pszResampling,
00768 GDALProgressFunc pfnProgress,
00769 void *pProgressData );
00770
00771 #endif
00772
00773 CPLErr CPL_DLL
00774 GTIFFBuildOverviews( const char * pszFilename,
00775 int nBands, GDALRasterBand **papoBandList,
00776 int nOverviews, int * panOverviewList,
00777 const char * pszResampling,
00778 GDALProgressFunc pfnProgress, void * pProgressData );
00779
00780 CPLErr CPL_DLL
00781 GDALDefaultBuildOverviews( GDALDataset *hSrcDS, const char * pszBasename,
00782 const char * pszResampling,
00783 int nOverviews, int * panOverviewList,
00784 int nBands, int * panBandList,
00785 GDALProgressFunc pfnProgress, void * pProgressData);
00786
00787 int CPL_DLL GDALBandGetBestOverviewLevel(GDALRasterBand* poBand,
00788 int &nXOff, int &nYOff,
00789 int &nXSize, int &nYSize,
00790 int nBufXSize, int nBufYSize);
00791
00792 int CPL_DLL GDALOvLevelAdjust( int nOvLevel, int nXSize );
00793
00794 GDALDataset CPL_DLL *
00795 GDALFindAssociatedAuxFile( const char *pszBasefile, GDALAccess eAccess,
00796 GDALDataset *poDependentDS );
00797
00798
00799
00800
00801
00802 CPLErr CPL_DLL GDALParseGMLCoverage( CPLXMLNode *psTree,
00803 int *pnXSize, int *pnYSize,
00804 double *padfGeoTransform,
00805 char **ppszProjection );
00806
00807
00808
00809
00810
00811 int CPL_DLL GDALCheckDatasetDimensions( int nXSize, int nYSize );
00812 int CPL_DLL GDALCheckBandCount( int nBands, int bIsZeroAllowed );
00813
00814 CPL_C_END
00815
00816 #endif