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 #ifndef GDALWARPER_H_INCLUDED
00031 #define GDALWARPER_H_INCLUDED
00032
00041 #include "gdal_alg.h"
00042 #include "cpl_minixml.h"
00043
00044 CPL_C_START
00045
00047 typedef enum { GRA_NearestNeighbour=0, GRA_Bilinear=1, GRA_Cubic=2, GRA_CubicSpline=3,
00052 } GDALResampleAlg;
00053
00054 typedef int
00055 (*GDALMaskFunc)( void *pMaskFuncArg,
00056 int nBandCount, GDALDataType eType,
00057 int nXOff, int nYOff,
00058 int nXSize, int nYSize,
00059 GByte **papabyImageData,
00060 int bMaskIsFloat, void *pMask );
00061
00062 CPLErr CPL_DLL
00063 GDALWarpNoDataMasker( void *pMaskFuncArg, int nBandCount, GDALDataType eType,
00064 int nXOff, int nYOff, int nXSize, int nYSize,
00065 GByte **papabyImageData, int bMaskIsFloat,
00066 void *pValidityMask );
00067
00068 CPLErr CPL_DLL
00069 GDALWarpDstAlphaMasker( void *pMaskFuncArg, int nBandCount, GDALDataType eType,
00070 int nXOff, int nYOff, int nXSize, int nYSize,
00071 GByte ** ,
00072 int bMaskIsFloat, void *pValidityMask );
00073 CPLErr CPL_DLL
00074 GDALWarpSrcAlphaMasker( void *pMaskFuncArg, int nBandCount, GDALDataType eType,
00075 int nXOff, int nYOff, int nXSize, int nYSize,
00076 GByte ** ,
00077 int bMaskIsFloat, void *pValidityMask );
00078
00079
00080
00081
00082
00084 typedef struct {
00085
00086 char **papszWarpOptions;
00087
00089 double dfWarpMemoryLimit;
00090
00092 GDALResampleAlg eResampleAlg;
00093
00096 GDALDataType eWorkingDataType;
00097
00099 GDALDatasetH hSrcDS;
00100
00102 GDALDatasetH hDstDS;
00103
00105 int nBandCount;
00106
00108 int *panSrcBands;
00109
00111 int *panDstBands;
00112
00114 int nSrcAlphaBand;
00115
00117 int nDstAlphaBand;
00118
00120 double *padfSrcNoDataReal;
00123 double *padfSrcNoDataImag;
00124
00126 double *padfDstNoDataReal;
00129 double *padfDstNoDataImag;
00130
00133 GDALProgressFunc pfnProgress;
00134
00136 void *pProgressArg;
00137
00139 GDALTransformerFunc pfnTransformer;
00140
00142 void *pTransformerArg;
00143
00144 GDALMaskFunc *papfnSrcPerBandValidityMaskFunc;
00145 void **papSrcPerBandValidityMaskFuncArg;
00146
00147 GDALMaskFunc pfnSrcValidityMaskFunc;
00148 void *pSrcValidityMaskFuncArg;
00149
00150 GDALMaskFunc pfnSrcDensityMaskFunc;
00151 void *pSrcDensityMaskFuncArg;
00152
00153 GDALMaskFunc pfnDstDensityMaskFunc;
00154 void *pDstDensityMaskFuncArg;
00155
00156 GDALMaskFunc pfnDstValidityMaskFunc;
00157 void *pDstValidityMaskFuncArg;
00158
00159 CPLErr (*pfnPreWarpChunkProcessor)( void *pKern, void *pArg );
00160 void *pPreWarpProcessorArg;
00161
00162 CPLErr (*pfnPostWarpChunkProcessor)( void *pKern, void *pArg);
00163 void *pPostWarpProcessorArg;
00164
00165 } GDALWarpOptions;
00166
00167 GDALWarpOptions CPL_DLL * CPL_STDCALL GDALCreateWarpOptions(void);
00168 void CPL_DLL CPL_STDCALL GDALDestroyWarpOptions( GDALWarpOptions * );
00169 GDALWarpOptions CPL_DLL * CPL_STDCALL
00170 GDALCloneWarpOptions( const GDALWarpOptions * );
00171
00172 CPLXMLNode CPL_DLL * CPL_STDCALL
00173 GDALSerializeWarpOptions( const GDALWarpOptions * );
00174 GDALWarpOptions CPL_DLL * CPL_STDCALL
00175 GDALDeserializeWarpOptions( CPLXMLNode * );
00176
00177
00178
00179
00180
00181 CPLErr CPL_DLL CPL_STDCALL
00182 GDALReprojectImage( GDALDatasetH hSrcDS, const char *pszSrcWKT,
00183 GDALDatasetH hDstDS, const char *pszDstWKT,
00184 GDALResampleAlg eResampleAlg, double dfWarpMemoryLimit,
00185 double dfMaxError,
00186 GDALProgressFunc pfnProgress, void *pProgressArg,
00187 GDALWarpOptions *psOptions );
00188
00189 CPLErr CPL_DLL CPL_STDCALL
00190 GDALCreateAndReprojectImage( GDALDatasetH hSrcDS, const char *pszSrcWKT,
00191 const char *pszDstFilename, const char *pszDstWKT,
00192 GDALDriverH hDstDriver, char **papszCreateOptions,
00193 GDALResampleAlg eResampleAlg, double dfWarpMemoryLimit,
00194 double dfMaxError,
00195 GDALProgressFunc pfnProgress, void *pProgressArg,
00196 GDALWarpOptions *psOptions );
00197
00198
00199
00200
00201
00202 GDALDatasetH CPL_DLL CPL_STDCALL
00203 GDALAutoCreateWarpedVRT( GDALDatasetH hSrcDS,
00204 const char *pszSrcWKT, const char *pszDstWKT,
00205 GDALResampleAlg eResampleAlg,
00206 double dfMaxError, const GDALWarpOptions *psOptions );
00207
00208 GDALDatasetH CPL_DLL CPL_STDCALL
00209 GDALCreateWarpedVRT( GDALDatasetH hSrcDS,
00210 int nPixels, int nLines, double *padfGeoTransform,
00211 GDALWarpOptions *psOptions );
00212
00213 CPLErr CPL_DLL CPL_STDCALL
00214 GDALInitializeWarpedVRT( GDALDatasetH hDS,
00215 GDALWarpOptions *psWO );
00216
00217 CPL_C_END
00218
00219 #ifdef __cplusplus
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 class CPL_DLL GDALWarpKernel
00232 {
00233 public:
00234 GDALWarpKernel();
00235 virtual ~GDALWarpKernel();
00236
00237 char **papszWarpOptions;
00238
00239 GDALResampleAlg eResample;
00240 GDALDataType eWorkingDataType;
00241 int nBands;
00242
00243 int nSrcXSize;
00244 int nSrcYSize;
00245 GByte **papabySrcImage;
00246
00247 GUInt32 **papanBandSrcValid;
00248 GUInt32 *panUnifiedSrcValid;
00249 float *pafUnifiedSrcDensity;
00250
00251 int nDstXSize;
00252 int nDstYSize;
00253 GByte **papabyDstImage;
00254 GUInt32 *panDstValid;
00255 float *pafDstDensity;
00256
00257 int nSrcXOff;
00258 int nSrcYOff;
00259
00260 int nDstXOff;
00261 int nDstYOff;
00262
00263 GDALTransformerFunc pfnTransformer;
00264 void *pTransformerArg;
00265
00266 GDALProgressFunc pfnProgress;
00267 void *pProgress;
00268
00269 double dfProgressBase;
00270 double dfProgressScale;
00271
00272 CPLErr Validate();
00273 CPLErr PerformWarp();
00274 };
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 class CPL_DLL GDALWarpOperation {
00287 private:
00288 GDALWarpOptions *psOptions;
00289
00290 double dfProgressBase;
00291 double dfProgressScale;
00292
00293 void WipeOptions();
00294 int ValidateOptions();
00295
00296 CPLErr ComputeSourceWindow( int nDstXOff, int nDstYOff,
00297 int nDstXSize, int nDstYSize,
00298 int *pnSrcXOff, int *pnSrcYOff,
00299 int *pnSrcXSize, int *pnSrcYSize );
00300
00301 CPLErr CreateKernelMask( GDALWarpKernel *, int iBand,
00302 const char *pszType );
00303
00304 void *hThread1Mutex;
00305 void *hThread2Mutex;
00306 void *hIOMutex;
00307 void *hWarpMutex;
00308
00309 int nChunkListCount;
00310 int nChunkListMax;
00311 int *panChunkList;
00312
00313 int bReportTimings;
00314 unsigned long nLastTimeReported;
00315
00316 void WipeChunkList();
00317 CPLErr CollectChunkList( int nDstXOff, int nDstYOff,
00318 int nDstXSize, int nDstYSize );
00319 void ReportTiming( const char * );
00320
00321 public:
00322 GDALWarpOperation();
00323 virtual ~GDALWarpOperation();
00324
00325 CPLErr Initialize( const GDALWarpOptions *psNewOptions );
00326
00327 const GDALWarpOptions *GetOptions();
00328
00329 CPLErr ChunkAndWarpImage( int nDstXOff, int nDstYOff,
00330 int nDstXSize, int nDstYSize );
00331 CPLErr ChunkAndWarpMulti( int nDstXOff, int nDstYOff,
00332 int nDstXSize, int nDstYSize );
00333 CPLErr WarpRegion( int nDstXOff, int nDstYOff,
00334 int nDstXSize, int nDstYSize,
00335 int nSrcXOff=0, int nSrcYOff=0,
00336 int nSrcXSize=0, int nSrcYSize=0 );
00337
00338 CPLErr WarpRegionToBuffer( int nDstXOff, int nDstYOff,
00339 int nDstXSize, int nDstYSize,
00340 void *pDataBuf,
00341 GDALDataType eBufDataType,
00342 int nSrcXOff=0, int nSrcYOff=0,
00343 int nSrcXSize=0, int nSrcYSize=0 );
00344 };
00345
00346 #endif
00347
00348 CPL_C_START
00349
00350 typedef void * GDALWarpOperationH;
00351
00352 GDALWarpOperationH CPL_DLL GDALCreateWarpOperation(const GDALWarpOptions* );
00353 void CPL_DLL GDALDestroyWarpOperation( GDALWarpOperationH );
00354 CPLErr CPL_DLL GDALChunkAndWarpImage( GDALWarpOperationH, int, int, int, int );
00355 CPLErr CPL_DLL GDALChunkAndWarpMulti( GDALWarpOperationH, int, int, int, int );
00356 CPLErr CPL_DLL GDALWarpRegion( GDALWarpOperationH,
00357 int, int, int, int, int, int, int, int );
00358 CPLErr CPL_DLL GDALWarpRegionToBuffer( GDALWarpOperationH, int, int, int, int,
00359 void *, GDALDataType,
00360 int, int, int, int );
00361
00362 CPL_C_END
00363
00364 #endif