GDAL
|
00001 /****************************************************************************** 00002 * $Id: gdal_proxy.h 28899 2015-04-14 09:27:00Z 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-2014, Even Rouault <even dot rouault at mines-paris dot org> 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 *, GSpacing, GSpacing, GSpacing, 00055 GDALRasterIOExtraArg* psExtraArg ); 00056 public: 00057 00058 virtual char **GetMetadataDomainList(); 00059 virtual char **GetMetadata( const char * pszDomain ); 00060 virtual CPLErr SetMetadata( char ** papszMetadata, 00061 const char * pszDomain ); 00062 virtual const char *GetMetadataItem( const char * pszName, 00063 const char * pszDomain ); 00064 virtual CPLErr SetMetadataItem( const char * pszName, 00065 const char * pszValue, 00066 const char * pszDomain ); 00067 00068 virtual void FlushCache(void); 00069 00070 virtual const char *GetProjectionRef(void); 00071 virtual CPLErr SetProjection( const char * ); 00072 00073 virtual CPLErr GetGeoTransform( double * ); 00074 virtual CPLErr SetGeoTransform( double * ); 00075 00076 virtual void *GetInternalHandle( const char * ); 00077 virtual GDALDriver *GetDriver(void); 00078 virtual char **GetFileList(void); 00079 00080 virtual int GetGCPCount(); 00081 virtual const char *GetGCPProjection(); 00082 virtual const GDAL_GCP *GetGCPs(); 00083 virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList, 00084 const char *pszGCPProjection ); 00085 00086 virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize, 00087 int nBufXSize, int nBufYSize, 00088 GDALDataType eDT, 00089 int nBandCount, int *panBandList, 00090 char **papszOptions ); 00091 00092 virtual CPLErr CreateMaskBand( int nFlags ); 00093 00094 }; 00095 00096 /* ******************************************************************** */ 00097 /* GDALProxyRasterBand */ 00098 /* ******************************************************************** */ 00099 00100 class CPL_DLL GDALProxyRasterBand : public GDALRasterBand 00101 { 00102 protected: 00103 virtual GDALRasterBand* RefUnderlyingRasterBand() = 0; 00104 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00105 00106 virtual CPLErr IReadBlock( int, int, void * ); 00107 virtual CPLErr IWriteBlock( int, int, void * ); 00108 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int, 00109 void *, int, int, GDALDataType, 00110 GSpacing, GSpacing, GDALRasterIOExtraArg* psExtraArg ); 00111 00112 public: 00113 00114 virtual char **GetMetadataDomainList(); 00115 virtual char **GetMetadata( const char * pszDomain ); 00116 virtual CPLErr SetMetadata( char ** papszMetadata, 00117 const char * pszDomain ); 00118 virtual const char *GetMetadataItem( const char * pszName, 00119 const char * pszDomain ); 00120 virtual CPLErr SetMetadataItem( const char * pszName, 00121 const char * pszValue, 00122 const char * pszDomain ); 00123 virtual CPLErr FlushCache(); 00124 virtual char **GetCategoryNames(); 00125 virtual double GetNoDataValue( int *pbSuccess = NULL ); 00126 virtual double GetMinimum( int *pbSuccess = NULL ); 00127 virtual double GetMaximum(int *pbSuccess = NULL ); 00128 virtual double GetOffset( int *pbSuccess = NULL ); 00129 virtual double GetScale( int *pbSuccess = NULL ); 00130 virtual const char *GetUnitType(); 00131 virtual GDALColorInterp GetColorInterpretation(); 00132 virtual GDALColorTable *GetColorTable(); 00133 virtual CPLErr Fill(double dfRealValue, double dfImaginaryValue = 0); 00134 00135 virtual CPLErr SetCategoryNames( char ** ); 00136 virtual CPLErr SetNoDataValue( double ); 00137 virtual CPLErr SetColorTable( GDALColorTable * ); 00138 virtual CPLErr SetColorInterpretation( GDALColorInterp ); 00139 virtual CPLErr SetOffset( double ); 00140 virtual CPLErr SetScale( double ); 00141 virtual CPLErr SetUnitType( const char * ); 00142 00143 virtual CPLErr GetStatistics( int bApproxOK, int bForce, 00144 double *pdfMin, double *pdfMax, 00145 double *pdfMean, double *padfStdDev ); 00146 virtual CPLErr ComputeStatistics( int bApproxOK, 00147 double *pdfMin, double *pdfMax, 00148 double *pdfMean, double *pdfStdDev, 00149 GDALProgressFunc, void *pProgressData ); 00150 virtual CPLErr SetStatistics( double dfMin, double dfMax, 00151 double dfMean, double dfStdDev ); 00152 virtual CPLErr ComputeRasterMinMax( int, double* ); 00153 00154 virtual int HasArbitraryOverviews(); 00155 virtual int GetOverviewCount(); 00156 virtual GDALRasterBand *GetOverview(int); 00157 virtual GDALRasterBand *GetRasterSampleOverview( GUIntBig ); 00158 virtual CPLErr BuildOverviews( const char *, int, int *, 00159 GDALProgressFunc, void * ); 00160 00161 virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize, 00162 int nBufXSize, int nBufYSize, 00163 GDALDataType eDT, char **papszOptions ); 00164 00165 virtual CPLErr GetHistogram( double dfMin, double dfMax, 00166 int nBuckets, GUIntBig * panHistogram, 00167 int bIncludeOutOfRange, int bApproxOK, 00168 GDALProgressFunc, void *pProgressData ); 00169 00170 virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax, 00171 int *pnBuckets, GUIntBig ** ppanHistogram, 00172 int bForce, 00173 GDALProgressFunc, void *pProgressData); 00174 virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax, 00175 int nBuckets, GUIntBig *panHistogram ); 00176 00177 virtual GDALRasterAttributeTable *GetDefaultRAT(); 00178 virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * ); 00179 00180 virtual GDALRasterBand *GetMaskBand(); 00181 virtual int GetMaskFlags(); 00182 virtual CPLErr CreateMaskBand( int nFlags ); 00183 00184 virtual CPLVirtualMem *GetVirtualMemAuto( GDALRWFlag eRWFlag, 00185 int *pnPixelSpace, 00186 GIntBig *pnLineSpace, 00187 char **papszOptions ); 00188 }; 00189 00190 00191 /* ******************************************************************** */ 00192 /* GDALProxyPoolDataset */ 00193 /* ******************************************************************** */ 00194 00195 typedef struct _GDALProxyPoolCacheEntry GDALProxyPoolCacheEntry; 00196 class GDALProxyPoolRasterBand; 00197 00198 class CPL_DLL GDALProxyPoolDataset : public GDALProxyDataset 00199 { 00200 private: 00201 GIntBig responsiblePID; 00202 00203 char *pszProjectionRef; 00204 double adfGeoTransform[6]; 00205 int bHasSrcProjection; 00206 int bHasSrcGeoTransform; 00207 char *pszGCPProjection; 00208 int nGCPCount; 00209 GDAL_GCP *pasGCPList; 00210 CPLHashSet *metadataSet; 00211 CPLHashSet *metadataItemSet; 00212 00213 GDALProxyPoolCacheEntry* cacheEntry; 00214 00215 protected: 00216 virtual GDALDataset *RefUnderlyingDataset(); 00217 virtual void UnrefUnderlyingDataset(GDALDataset* poUnderlyingDataset); 00218 00219 friend class GDALProxyPoolRasterBand; 00220 00221 public: 00222 GDALProxyPoolDataset(const char* pszSourceDatasetDescription, 00223 int nRasterXSize, int nRasterYSize, 00224 GDALAccess eAccess = GA_ReadOnly, 00225 int bShared = FALSE, 00226 const char * pszProjectionRef = NULL, 00227 double * padfGeoTransform = NULL); 00228 ~GDALProxyPoolDataset(); 00229 00230 void SetOpenOptions(char** papszOpenOptions); 00231 void AddSrcBandDescription( GDALDataType eDataType, int nBlockXSize, int nBlockYSize); 00232 00233 virtual const char *GetProjectionRef(void); 00234 virtual CPLErr SetProjection( const char * ); 00235 00236 virtual CPLErr GetGeoTransform( double * ); 00237 virtual CPLErr SetGeoTransform( double * ); 00238 00239 /* Special behaviour for the following methods : they return a pointer */ 00240 /* data type, that must be cached by the proxy, so it doesn't become invalid */ 00241 /* when the underlying object get closed */ 00242 virtual char **GetMetadata( const char * pszDomain ); 00243 virtual const char *GetMetadataItem( const char * pszName, 00244 const char * pszDomain ); 00245 00246 virtual void *GetInternalHandle( const char * pszRequest ); 00247 00248 virtual const char *GetGCPProjection(); 00249 virtual const GDAL_GCP *GetGCPs(); 00250 }; 00251 00252 /* ******************************************************************** */ 00253 /* GDALProxyPoolRasterBand */ 00254 /* ******************************************************************** */ 00255 00256 class GDALProxyPoolOverviewRasterBand; 00257 class GDALProxyPoolMaskBand; 00258 00259 class CPL_DLL GDALProxyPoolRasterBand : public GDALProxyRasterBand 00260 { 00261 private: 00262 CPLHashSet *metadataSet; 00263 CPLHashSet *metadataItemSet; 00264 char *pszUnitType; 00265 char **papszCategoryNames; 00266 GDALColorTable *poColorTable; 00267 00268 int nSizeProxyOverviewRasterBand; 00269 GDALProxyPoolOverviewRasterBand **papoProxyOverviewRasterBand; 00270 GDALProxyPoolMaskBand *poProxyMaskBand; 00271 00272 void Init(); 00273 00274 protected: 00275 virtual GDALRasterBand* RefUnderlyingRasterBand(); 00276 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00277 00278 friend class GDALProxyPoolOverviewRasterBand; 00279 friend class GDALProxyPoolMaskBand; 00280 00281 public: 00282 GDALProxyPoolRasterBand(GDALProxyPoolDataset* poDS, int nBand, 00283 GDALDataType eDataType, 00284 int nBlockXSize, int nBlockYSize); 00285 GDALProxyPoolRasterBand(GDALProxyPoolDataset* poDS, 00286 GDALRasterBand* poUnderlyingRasterBand); 00287 ~GDALProxyPoolRasterBand(); 00288 00289 void AddSrcMaskBandDescription( GDALDataType eDataType, int nBlockXSize, int nBlockYSize); 00290 00291 /* Special behaviour for the following methods : they return a pointer */ 00292 /* data type, that must be cached by the proxy, so it doesn't become invalid */ 00293 /* when the underlying object get closed */ 00294 virtual char **GetMetadata( const char * pszDomain ); 00295 virtual const char *GetMetadataItem( const char * pszName, 00296 const char * pszDomain ); 00297 virtual char **GetCategoryNames(); 00298 virtual const char *GetUnitType(); 00299 virtual GDALColorTable *GetColorTable(); 00300 virtual GDALRasterBand *GetOverview(int); 00301 virtual GDALRasterBand *GetRasterSampleOverview( GUIntBig nDesiredSamples); // TODO 00302 virtual GDALRasterBand *GetMaskBand(); 00303 00304 }; 00305 00306 /* ******************************************************************** */ 00307 /* GDALProxyPoolOverviewRasterBand */ 00308 /* ******************************************************************** */ 00309 00310 class GDALProxyPoolOverviewRasterBand : public GDALProxyPoolRasterBand 00311 { 00312 private: 00313 GDALProxyPoolRasterBand *poMainBand; 00314 int nOverviewBand; 00315 00316 GDALRasterBand *poUnderlyingMainRasterBand; 00317 int nRefCountUnderlyingMainRasterBand; 00318 00319 protected: 00320 virtual GDALRasterBand* RefUnderlyingRasterBand(); 00321 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00322 00323 public: 00324 GDALProxyPoolOverviewRasterBand(GDALProxyPoolDataset* poDS, 00325 GDALRasterBand* poUnderlyingOverviewBand, 00326 GDALProxyPoolRasterBand* poMainBand, 00327 int nOverviewBand); 00328 ~GDALProxyPoolOverviewRasterBand(); 00329 }; 00330 00331 /* ******************************************************************** */ 00332 /* GDALProxyPoolMaskBand */ 00333 /* ******************************************************************** */ 00334 00335 class GDALProxyPoolMaskBand : public GDALProxyPoolRasterBand 00336 { 00337 private: 00338 GDALProxyPoolRasterBand *poMainBand; 00339 00340 GDALRasterBand *poUnderlyingMainRasterBand; 00341 int nRefCountUnderlyingMainRasterBand; 00342 00343 protected: 00344 virtual GDALRasterBand* RefUnderlyingRasterBand(); 00345 virtual void UnrefUnderlyingRasterBand(GDALRasterBand* poUnderlyingRasterBand); 00346 00347 public: 00348 GDALProxyPoolMaskBand(GDALProxyPoolDataset* poDS, 00349 GDALRasterBand* poUnderlyingMaskBand, 00350 GDALProxyPoolRasterBand* poMainBand); 00351 GDALProxyPoolMaskBand(GDALProxyPoolDataset* poDS, 00352 GDALProxyPoolRasterBand* poMainBand, 00353 GDALDataType eDataType, 00354 int nBlockXSize, int nBlockYSize); 00355 ~GDALProxyPoolMaskBand(); 00356 }; 00357 00358 #endif 00359 00360 00361 /* ******************************************************************** */ 00362 /* C types and methods declarations */ 00363 /* ******************************************************************** */ 00364 00365 00366 CPL_C_START 00367 00368 typedef struct GDALProxyPoolDatasetHS *GDALProxyPoolDatasetH; 00369 00370 GDALProxyPoolDatasetH CPL_DLL GDALProxyPoolDatasetCreate(const char* pszSourceDatasetDescription, 00371 int nRasterXSize, int nRasterYSize, 00372 GDALAccess eAccess, int bShared, 00373 const char * pszProjectionRef, 00374 double * padfGeoTransform); 00375 00376 void CPL_DLL GDALProxyPoolDatasetDelete(GDALProxyPoolDatasetH hProxyPoolDataset); 00377 00378 void CPL_DLL GDALProxyPoolDatasetAddSrcBandDescription( GDALProxyPoolDatasetH hProxyPoolDataset, 00379 GDALDataType eDataType, 00380 int nBlockXSize, int nBlockYSize); 00381 00382 CPL_C_END 00383 00384 #endif /* GDAL_PROXY_H_INCLUDED */