GDAL
|
00001 /****************************************************************************** 00002 * $Id: gdal_proxy.h 20962 2010-10-25 23:00:16Z rouault $ 00003 * 00004 * Project: GDAL Core 00005 * Purpose: GDAL Core C++/Private declarations 00006 * Author: Even Rouault <even dot rouault at mines dash paris dot org> 00007 * 00008 ****************************************************************************** 00009 * Copyright (c) 2008, Even Rouault 00010 * 00011 * Permission is hereby granted, free of charge, to any person obtaining a 00012 * copy of this software and associated documentation files (the "Software"), 00013 * to deal in the Software without restriction, including without limitation 00014 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00015 * and/or sell copies of the Software, and to permit persons to whom the 00016 * Software is furnished to do so, subject to the following conditions: 00017 * 00018 * The above copyright notice and this permission notice shall be included 00019 * in all copies or substantial portions of the Software. 00020 * 00021 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00022 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00023 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00024 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00025 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00026 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00027 * DEALINGS IN THE SOFTWARE. 00028 ****************************************************************************/ 00029 00030 #ifndef GDAL_PROXY_H_INCLUDED 00031 #define GDAL_PROXY_H_INCLUDED 00032 00033 #include "gdal.h" 00034 00035 #ifdef __cplusplus 00036 00037 #include "gdal_priv.h" 00038 #include "cpl_hash_set.h" 00039 00040 /* ******************************************************************** */ 00041 /* GDALProxyDataset */ 00042 /* ******************************************************************** */ 00043 00044 class CPL_DLL GDALProxyDataset : public GDALDataset 00045 { 00046 protected: 00047 virtual GDALDataset *RefUnderlyingDataset() = 0; 00048 virtual void UnrefUnderlyingDataset(GDALDataset* poUnderlyingDataset); 00049 00050 virtual CPLErr IBuildOverviews( const char *, int, int *, 00051 int, int *, GDALProgressFunc, void * ); 00052 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int, 00053 void *, int, int, GDALDataType, 00054 int, int *, int, int, int ); 00055 public: 00056 00057 virtual char **GetMetadata( const char * pszDomain ); 00058 virtual CPLErr SetMetadata( char ** papszMetadata, 00059 const char * pszDomain ); 00060 virtual const char *GetMetadataItem( const char * pszName, 00061 const char * pszDomain ); 00062 virtual CPLErr SetMetadataItem( const char * pszName, 00063 const char * pszValue, 00064 const char * pszDomain ); 00065 00066 virtual void FlushCache(void); 00067 00068 virtual const char *GetProjectionRef(void); 00069 virtual CPLErr SetProjection( const char * ); 00070 00071 virtual CPLErr GetGeoTransform( double * ); 00072 virtual CPLErr SetGeoTransform( double * ); 00073 00074 virtual void *GetInternalHandle( const char * ); 00075 virtual GDALDriver *GetDriver(void); 00076 virtual char **GetFileList(void); 00077 00078 virtual int GetGCPCount(); 00079 virtual const char *GetGCPProjection(); 00080 virtual const GDAL_GCP *GetGCPs(); 00081 virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList, 00082 const char *pszGCPProjection ); 00083 00084 virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize, 00085 int nBufXSize, int nBufYSize, 00086 GDALDataType eDT, 00087 int nBandCount, int *panBandList, 00088 char **papszOptions ); 00089 00090 virtual CPLErr CreateMaskBand( int nFlags ); 00091 00092 }; 00093 00094 /* ******************************************************************** */ 00095 /* GDALProxyRasterBand */ 00096 /* ******************************************************************** */ 00097 00098 class CPL_DLL GDALProxyRasterBand : public GDALRasterBand 00099 { 00100 protected: 00101 virtual GDALRasterBand* RefUnderlyingRasterBand() = 0; 00102 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00103 00104 virtual CPLErr IReadBlock( int, int, void * ); 00105 virtual CPLErr IWriteBlock( int, int, void * ); 00106 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int, 00107 void *, int, int, GDALDataType, 00108 int, int ); 00109 00110 public: 00111 00112 virtual char **GetMetadata( const char * pszDomain ); 00113 virtual CPLErr SetMetadata( char ** papszMetadata, 00114 const char * pszDomain ); 00115 virtual const char *GetMetadataItem( const char * pszName, 00116 const char * pszDomain ); 00117 virtual CPLErr SetMetadataItem( const char * pszName, 00118 const char * pszValue, 00119 const char * pszDomain ); 00120 virtual CPLErr FlushCache(); 00121 virtual char **GetCategoryNames(); 00122 virtual double GetNoDataValue( int *pbSuccess = NULL ); 00123 virtual double GetMinimum( int *pbSuccess = NULL ); 00124 virtual double GetMaximum(int *pbSuccess = NULL ); 00125 virtual double GetOffset( int *pbSuccess = NULL ); 00126 virtual double GetScale( int *pbSuccess = NULL ); 00127 virtual const char *GetUnitType(); 00128 virtual GDALColorInterp GetColorInterpretation(); 00129 virtual GDALColorTable *GetColorTable(); 00130 virtual CPLErr Fill(double dfRealValue, double dfImaginaryValue = 0); 00131 00132 virtual CPLErr SetCategoryNames( char ** ); 00133 virtual CPLErr SetNoDataValue( double ); 00134 virtual CPLErr SetColorTable( GDALColorTable * ); 00135 virtual CPLErr SetColorInterpretation( GDALColorInterp ); 00136 virtual CPLErr SetOffset( double ); 00137 virtual CPLErr SetScale( double ); 00138 virtual CPLErr SetUnitType( const char * ); 00139 00140 virtual CPLErr GetStatistics( int bApproxOK, int bForce, 00141 double *pdfMin, double *pdfMax, 00142 double *pdfMean, double *padfStdDev ); 00143 virtual CPLErr ComputeStatistics( int bApproxOK, 00144 double *pdfMin, double *pdfMax, 00145 double *pdfMean, double *pdfStdDev, 00146 GDALProgressFunc, void *pProgressData ); 00147 virtual CPLErr SetStatistics( double dfMin, double dfMax, 00148 double dfMean, double dfStdDev ); 00149 virtual CPLErr ComputeRasterMinMax( int, double* ); 00150 00151 virtual int HasArbitraryOverviews(); 00152 virtual int GetOverviewCount(); 00153 virtual GDALRasterBand *GetOverview(int); 00154 virtual GDALRasterBand *GetRasterSampleOverview( int ); 00155 virtual CPLErr BuildOverviews( const char *, int, int *, 00156 GDALProgressFunc, void * ); 00157 00158 virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize, 00159 int nBufXSize, int nBufYSize, 00160 GDALDataType eDT, char **papszOptions ); 00161 00162 virtual CPLErr GetHistogram( double dfMin, double dfMax, 00163 int nBuckets, int * panHistogram, 00164 int bIncludeOutOfRange, int bApproxOK, 00165 GDALProgressFunc, void *pProgressData ); 00166 00167 virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax, 00168 int *pnBuckets, int ** ppanHistogram, 00169 int bForce, 00170 GDALProgressFunc, void *pProgressData); 00171 virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax, 00172 int nBuckets, int *panHistogram ); 00173 00174 virtual const GDALRasterAttributeTable *GetDefaultRAT(); 00175 virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * ); 00176 00177 virtual GDALRasterBand *GetMaskBand(); 00178 virtual int GetMaskFlags(); 00179 virtual CPLErr CreateMaskBand( int nFlags ); 00180 00181 }; 00182 00183 00184 /* ******************************************************************** */ 00185 /* GDALProxyPoolDataset */ 00186 /* ******************************************************************** */ 00187 00188 typedef struct _GDALProxyPoolCacheEntry GDALProxyPoolCacheEntry; 00189 class GDALProxyPoolRasterBand; 00190 00191 class CPL_DLL GDALProxyPoolDataset : public GDALProxyDataset 00192 { 00193 private: 00194 GIntBig responsiblePID; 00195 00196 char *pszProjectionRef; 00197 double adfGeoTransform[6]; 00198 int bHasSrcProjection; 00199 int bHasSrcGeoTransform; 00200 char *pszGCPProjection; 00201 int nGCPCount; 00202 GDAL_GCP *pasGCPList; 00203 CPLHashSet *metadataSet; 00204 CPLHashSet *metadataItemSet; 00205 00206 GDALProxyPoolCacheEntry* cacheEntry; 00207 00208 protected: 00209 virtual GDALDataset *RefUnderlyingDataset(); 00210 virtual void UnrefUnderlyingDataset(GDALDataset* poUnderlyingDataset); 00211 00212 friend class GDALProxyPoolRasterBand; 00213 00214 public: 00215 GDALProxyPoolDataset(const char* pszSourceDatasetDescription, 00216 int nRasterXSize, int nRasterYSize, 00217 GDALAccess eAccess = GA_ReadOnly, 00218 int bShared = FALSE, 00219 const char * pszProjectionRef = NULL, 00220 double * padfGeoTransform = NULL); 00221 ~GDALProxyPoolDataset(); 00222 00223 void AddSrcBandDescription( GDALDataType eDataType, int nBlockXSize, int nBlockYSize); 00224 00225 virtual const char *GetProjectionRef(void); 00226 virtual CPLErr SetProjection( const char * ); 00227 00228 virtual CPLErr GetGeoTransform( double * ); 00229 virtual CPLErr SetGeoTransform( double * ); 00230 00231 /* Special behaviour for the following methods : they return a pointer */ 00232 /* data type, that must be cached by the proxy, so it doesn't become invalid */ 00233 /* when the underlying object get closed */ 00234 virtual char **GetMetadata( const char * pszDomain ); 00235 virtual const char *GetMetadataItem( const char * pszName, 00236 const char * pszDomain ); 00237 00238 virtual void *GetInternalHandle( const char * pszRequest ); 00239 00240 virtual const char *GetGCPProjection(); 00241 virtual const GDAL_GCP *GetGCPs(); 00242 }; 00243 00244 /* ******************************************************************** */ 00245 /* GDALProxyPoolRasterBand */ 00246 /* ******************************************************************** */ 00247 00248 class GDALProxyPoolOverviewRasterBand; 00249 class GDALProxyPoolMaskBand; 00250 00251 class CPL_DLL GDALProxyPoolRasterBand : public GDALProxyRasterBand 00252 { 00253 private: 00254 CPLHashSet *metadataSet; 00255 CPLHashSet *metadataItemSet; 00256 char *pszUnitType; 00257 char **papszCategoryNames; 00258 GDALColorTable *poColorTable; 00259 00260 int nSizeProxyOverviewRasterBand; 00261 GDALProxyPoolOverviewRasterBand **papoProxyOverviewRasterBand; 00262 GDALProxyPoolMaskBand *poProxyMaskBand; 00263 00264 void Init(); 00265 00266 protected: 00267 virtual GDALRasterBand* RefUnderlyingRasterBand(); 00268 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00269 00270 friend class GDALProxyPoolOverviewRasterBand; 00271 friend class GDALProxyPoolMaskBand; 00272 00273 public: 00274 GDALProxyPoolRasterBand(GDALProxyPoolDataset* poDS, int nBand, 00275 GDALDataType eDataType, 00276 int nBlockXSize, int nBlockYSize); 00277 GDALProxyPoolRasterBand(GDALProxyPoolDataset* poDS, 00278 GDALRasterBand* poUnderlyingRasterBand); 00279 ~GDALProxyPoolRasterBand(); 00280 00281 void AddSrcMaskBandDescription( GDALDataType eDataType, int nBlockXSize, int nBlockYSize); 00282 00283 /* Special behaviour for the following methods : they return a pointer */ 00284 /* data type, that must be cached by the proxy, so it doesn't become invalid */ 00285 /* when the underlying object get closed */ 00286 virtual char **GetMetadata( const char * pszDomain ); 00287 virtual const char *GetMetadataItem( const char * pszName, 00288 const char * pszDomain ); 00289 virtual char **GetCategoryNames(); 00290 virtual const char *GetUnitType(); 00291 virtual GDALColorTable *GetColorTable(); 00292 virtual GDALRasterBand *GetOverview(int); 00293 virtual GDALRasterBand *GetRasterSampleOverview( int nDesiredSamples); // TODO 00294 virtual GDALRasterBand *GetMaskBand(); 00295 00296 }; 00297 00298 /* ******************************************************************** */ 00299 /* GDALProxyPoolOverviewRasterBand */ 00300 /* ******************************************************************** */ 00301 00302 class GDALProxyPoolOverviewRasterBand : public GDALProxyPoolRasterBand 00303 { 00304 private: 00305 GDALProxyPoolRasterBand *poMainBand; 00306 int nOverviewBand; 00307 00308 GDALRasterBand *poUnderlyingMainRasterBand; 00309 int nRefCountUnderlyingMainRasterBand; 00310 00311 protected: 00312 virtual GDALRasterBand* RefUnderlyingRasterBand(); 00313 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00314 00315 public: 00316 GDALProxyPoolOverviewRasterBand(GDALProxyPoolDataset* poDS, 00317 GDALRasterBand* poUnderlyingOverviewBand, 00318 GDALProxyPoolRasterBand* poMainBand, 00319 int nOverviewBand); 00320 ~GDALProxyPoolOverviewRasterBand(); 00321 }; 00322 00323 /* ******************************************************************** */ 00324 /* GDALProxyPoolMaskBand */ 00325 /* ******************************************************************** */ 00326 00327 class GDALProxyPoolMaskBand : public GDALProxyPoolRasterBand 00328 { 00329 private: 00330 GDALProxyPoolRasterBand *poMainBand; 00331 00332 GDALRasterBand *poUnderlyingMainRasterBand; 00333 int nRefCountUnderlyingMainRasterBand; 00334 00335 protected: 00336 virtual GDALRasterBand* RefUnderlyingRasterBand(); 00337 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00338 00339 public: 00340 GDALProxyPoolMaskBand(GDALProxyPoolDataset* poDS, 00341 GDALRasterBand* poUnderlyingMaskBand, 00342 GDALProxyPoolRasterBand* poMainBand); 00343 GDALProxyPoolMaskBand(GDALProxyPoolDataset* poDS, 00344 GDALProxyPoolRasterBand* poMainBand, 00345 GDALDataType eDataType, 00346 int nBlockXSize, int nBlockYSize); 00347 ~GDALProxyPoolMaskBand(); 00348 }; 00349 00350 #endif 00351 00352 00353 /* ******************************************************************** */ 00354 /* C types and methods declarations */ 00355 /* ******************************************************************** */ 00356 00357 00358 CPL_C_START 00359 00360 typedef struct GDALProxyPoolDatasetHS *GDALProxyPoolDatasetH; 00361 00362 GDALProxyPoolDatasetH CPL_DLL GDALProxyPoolDatasetCreate(const char* pszSourceDatasetDescription, 00363 int nRasterXSize, int nRasterYSize, 00364 GDALAccess eAccess, int bShared, 00365 const char * pszProjectionRef, 00366 double * padfGeoTransform); 00367 00368 void CPL_DLL GDALProxyPoolDatasetDelete(GDALProxyPoolDatasetH hProxyPoolDataset); 00369 00370 void CPL_DLL GDALProxyPoolDatasetAddSrcBandDescription( GDALProxyPoolDatasetH hProxyPoolDataset, 00371 GDALDataType eDataType, 00372 int nBlockXSize, int nBlockYSize); 00373 00374 CPL_C_END 00375 00376 #endif /* GDAL_PROXY_H_INCLUDED */