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