LCOV - code coverage report
Current view: top level - alg - gdalwarper.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 4 4 100.0 %
Date: 2025-09-10 17:48:50 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * $Id$
       3             :  *
       4             :  * Project:  GDAL High Performance Warper
       5             :  * Purpose:  Prototypes, and definitions for warping related work.
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2003, Frank Warmerdam
      10             :  * Copyright (c) 2009-2012, Even Rouault <even dot rouault at spatialys.com>
      11             :  *
      12             :  * SPDX-License-Identifier: MIT
      13             :  ****************************************************************************/
      14             : 
      15             : #ifndef GDALWARPER_H_INCLUDED
      16             : #define GDALWARPER_H_INCLUDED
      17             : 
      18             : /**
      19             :  * \file gdalwarper.h
      20             :  *
      21             :  * GDAL warper related entry points and definitions.  Eventually it is
      22             :  * expected that this file will be mostly private to the implementation,
      23             :  * and the public C entry points will be available in gdal_alg.h.
      24             :  */
      25             : 
      26             : #include "gdal_alg.h"
      27             : #include "cpl_minixml.h"
      28             : #include "cpl_multiproc.h"
      29             : 
      30             : CPL_C_START
      31             : 
      32             : /* Note: values are selected to be consistent with GDALRIOResampleAlg of
      33             :  * gcore/gdal.h */
      34             : /*! Warp Resampling Algorithm */
      35             : typedef enum
      36             : {
      37             :     /*! Nearest neighbour (select on one input pixel) */ GRA_NearestNeighbour =
      38             :         0,
      39             :     /*! Bilinear (2x2 kernel) */ GRA_Bilinear = 1,
      40             :     /*! Cubic Convolution Approximation (4x4 kernel) */ GRA_Cubic = 2,
      41             :     /*! Cubic B-Spline Approximation (4x4 kernel) */ GRA_CubicSpline = 3,
      42             :     /*! Lanczos windowed sinc interpolation (6x6 kernel) */ GRA_Lanczos = 4,
      43             :     /*! Average (computes the weighted average of all non-NODATA contributing
      44             :        pixels) */
      45             :     GRA_Average = 5,
      46             :     /*! Mode (selects the value which appears most often of all the sampled
      47             :        points) */
      48             :     GRA_Mode = 6,
      49             :     /*  GRA_Gauss=7 reserved. */
      50             :     /*! Max (selects maximum of all non-NODATA contributing pixels) */ GRA_Max =
      51             :         8,
      52             :     /*! Min (selects minimum of all non-NODATA contributing pixels) */ GRA_Min =
      53             :         9,
      54             :     /*! Med (selects median of all non-NODATA contributing pixels) */ GRA_Med =
      55             :         10,
      56             :     /*! Q1 (selects first quartile of all non-NODATA contributing pixels) */
      57             :     GRA_Q1 = 11,
      58             :     /*! Q3 (selects third quartile of all non-NODATA contributing pixels) */
      59             :     GRA_Q3 = 12,
      60             :     /*! Sum (weighed sum of all non-NODATA contributing pixels). Added in
      61             :        GDAL 3.1 */
      62             :     GRA_Sum = 13,
      63             :     /*! RMS (weighted root mean square (quadratic mean) of all non-NODATA
      64             :        contributing pixels) */
      65             :     GRA_RMS = 14,
      66             :     /*! @cond Doxygen_Suppress */
      67             :     GRA_LAST_VALUE = GRA_RMS
      68             :     /*! @endcond */
      69             : } GDALResampleAlg;
      70             : 
      71             : /*! @cond Doxygen_Suppress */
      72             : typedef int (*GDALMaskFunc)(void *pMaskFuncArg, int nBandCount,
      73             :                             GDALDataType eType, int nXOff, int nYOff,
      74             :                             int nXSize, int nYSize, GByte **papabyImageData,
      75             :                             int bMaskIsFloat, void *pMask);
      76             : 
      77             : CPLErr CPL_DLL GDALWarpNoDataMasker(void *pMaskFuncArg, int nBandCount,
      78             :                                     GDALDataType eType, int nXOff, int nYOff,
      79             :                                     int nXSize, int nYSize,
      80             :                                     GByte **papabyImageData, int bMaskIsFloat,
      81             :                                     void *pValidityMask, int *pbOutAllValid);
      82             : 
      83             : CPLErr CPL_DLL GDALWarpDstAlphaMasker(void *pMaskFuncArg, int nBandCount,
      84             :                                       GDALDataType eType, int nXOff, int nYOff,
      85             :                                       int nXSize, int nYSize,
      86             :                                       GByte ** /*ppImageData */,
      87             :                                       int bMaskIsFloat, void *pValidityMask);
      88             : CPLErr CPL_DLL GDALWarpSrcAlphaMasker(void *pMaskFuncArg, int nBandCount,
      89             :                                       GDALDataType eType, int nXOff, int nYOff,
      90             :                                       int nXSize, int nYSize,
      91             :                                       GByte ** /*ppImageData */,
      92             :                                       int bMaskIsFloat, void *pValidityMask,
      93             :                                       int *pbOutAllOpaque);
      94             : 
      95             : CPLErr CPL_DLL GDALWarpSrcMaskMasker(void *pMaskFuncArg, int nBandCount,
      96             :                                      GDALDataType eType, int nXOff, int nYOff,
      97             :                                      int nXSize, int nYSize,
      98             :                                      GByte ** /*ppImageData */,
      99             :                                      int bMaskIsFloat, void *pValidityMask);
     100             : 
     101             : CPLErr CPL_DLL GDALWarpCutlineMasker(void *pMaskFuncArg, int nBandCount,
     102             :                                      GDALDataType eType, int nXOff, int nYOff,
     103             :                                      int nXSize, int nYSize,
     104             :                                      GByte ** /* ppImageData */,
     105             :                                      int bMaskIsFloat, void *pValidityMask);
     106             : 
     107             : /* GCMVF stands for GDALWARP_CUTLINE_MASKER_VALIDITY_FLAG */
     108             : #define GCMVF_PARTIAL_INTERSECTION 0
     109             : #define GCMVF_NO_INTERSECTION 1
     110             : #define GCMVF_CHUNK_FULLY_WITHIN_CUTLINE 2
     111             : CPLErr CPL_DLL GDALWarpCutlineMaskerEx(void *pMaskFuncArg, int nBandCount,
     112             :                                        GDALDataType eType, int nXOff, int nYOff,
     113             :                                        int nXSize, int nYSize,
     114             :                                        GByte ** /* ppImageData */,
     115             :                                        int bMaskIsFloat, void *pValidityMask,
     116             :                                        int *pnValidityFlag);
     117             : 
     118             : /*! @endcond */
     119             : 
     120             : /*! GWKMode tie-breaking strategy */
     121             : typedef enum
     122             : {
     123             :     /* Choose the first value encountered */ GWKTS_First = 1,
     124             :     /* Choose the minimal value */ GWKTS_Min = 2,
     125             :     /* Choose the maximum value */ GWKTS_Max = 3,
     126             : } GWKTieStrategy;
     127             : 
     128             : /************************************************************************/
     129             : /*                           GDALWarpOptions                            */
     130             : /************************************************************************/
     131             : 
     132             : /** Warp control options for use with GDALWarpOperation::Initialize()  */
     133             : typedef struct
     134             : {
     135             : 
     136             :     char **papszWarpOptions;
     137             : 
     138             :     /*! In bytes, 0.0 for internal default */
     139             :     double dfWarpMemoryLimit;
     140             : 
     141             :     /*! Resampling algorithm to use */
     142             :     GDALResampleAlg eResampleAlg;
     143             : 
     144             :     /*! data type to use during warp operation, GDT_Unknown lets the algorithm
     145             :         select the type */
     146             :     GDALDataType eWorkingDataType;
     147             : 
     148             :     /*! Source image dataset. */
     149             :     GDALDatasetH hSrcDS;
     150             : 
     151             :     /*! Destination image dataset - may be NULL if only using
     152             :      * GDALWarpOperation::WarpRegionToBuffer(). */
     153             :     GDALDatasetH hDstDS;
     154             : 
     155             :     /*! Number of bands to process, may be 0 to select all bands. */
     156             :     int nBandCount;
     157             : 
     158             :     /*! The band numbers for the source bands to process (1 based) */
     159             :     int *panSrcBands;
     160             : 
     161             :     /*! The band numbers for the destination bands to process (1 based) */
     162             :     int *panDstBands;
     163             : 
     164             :     /*! The source band so use as an alpha (transparency) value, 0=disabled */
     165             :     int nSrcAlphaBand;
     166             : 
     167             :     /*! The dest. band so use as an alpha (transparency) value, 0=disabled */
     168             :     int nDstAlphaBand;
     169             : 
     170             :     /*! The "nodata" value real component for each input band, if NULL there
     171             :      * isn't one */
     172             :     double *padfSrcNoDataReal;
     173             :     /*! The "nodata" value imaginary component - may be NULL even if real
     174             :       component is provided. This value is not used to flag invalid values.
     175             :       Only the real component is used. */
     176             :     double *padfSrcNoDataImag;
     177             : 
     178             :     /*! The "nodata" value real component for each output band, if NULL there
     179             :      * isn't one */
     180             :     double *padfDstNoDataReal;
     181             :     /*! The "nodata" value imaginary component - may be NULL even if real
     182             :       component is provided. Note that warp operations only use real component
     183             :       for flagging invalid data.*/
     184             :     double *padfDstNoDataImag;
     185             : 
     186             :     /*! GDALProgressFunc() compatible progress reporting function, or NULL
     187             :       if there isn't one. */
     188             :     GDALProgressFunc pfnProgress;
     189             : 
     190             :     /*! Callback argument to be passed to pfnProgress. */
     191             :     void *pProgressArg;
     192             : 
     193             :     /*! Type of spatial point transformer function */
     194             :     GDALTransformerFunc pfnTransformer;
     195             : 
     196             :     /*! Handle to image transformer setup structure */
     197             :     void *pTransformerArg;
     198             : 
     199             :     /** Unused. Must be NULL */
     200             :     GDALMaskFunc *papfnSrcPerBandValidityMaskFunc;
     201             :     /** Unused. Must be NULL */
     202             :     void **papSrcPerBandValidityMaskFuncArg;
     203             : 
     204             :     /** Unused. Must be NULL */
     205             :     GDALMaskFunc pfnSrcValidityMaskFunc;
     206             :     /** Unused. Must be NULL */
     207             :     void *pSrcValidityMaskFuncArg;
     208             : 
     209             :     /** Unused. Must be NULL */
     210             :     GDALMaskFunc pfnSrcDensityMaskFunc;
     211             :     /** Unused. Must be NULL */
     212             :     void *pSrcDensityMaskFuncArg;
     213             : 
     214             :     /** Unused. Must be NULL */
     215             :     GDALMaskFunc pfnDstDensityMaskFunc;
     216             :     /** Unused. Must be NULL */
     217             :     void *pDstDensityMaskFuncArg;
     218             : 
     219             :     /** Unused. Must be NULL */
     220             :     GDALMaskFunc pfnDstValidityMaskFunc;
     221             :     /** Unused. Must be NULL */
     222             :     void *pDstValidityMaskFuncArg;
     223             : 
     224             :     /** Unused. Must be NULL */
     225             :     CPLErr (*pfnPreWarpChunkProcessor)(void *pKern, void *pArg);
     226             :     /** Unused. Must be NULL */
     227             :     void *pPreWarpProcessorArg;
     228             : 
     229             :     /** Unused. Must be NULL */
     230             :     CPLErr (*pfnPostWarpChunkProcessor)(void *pKern, void *pArg);
     231             :     /** Unused. Must be NULL */
     232             :     void *pPostWarpProcessorArg;
     233             : 
     234             :     /*! Optional OGRPolygonH for a masking cutline. */
     235             :     void *hCutline;
     236             : 
     237             :     /*! Optional blending distance to apply across cutline in pixels, default is
     238             :      * zero. */
     239             :     double dfCutlineBlendDist;
     240             : 
     241             :     /** Tie-breaking method */
     242             :     GWKTieStrategy eTieStrategy;
     243             : } GDALWarpOptions;
     244             : 
     245             : const char CPL_DLL *GDALWarpGetOptionList(void);
     246             : 
     247             : GDALWarpOptions CPL_DLL *CPL_STDCALL GDALCreateWarpOptions(void);
     248             : void CPL_DLL CPL_STDCALL GDALDestroyWarpOptions(GDALWarpOptions *);
     249             : GDALWarpOptions CPL_DLL *CPL_STDCALL
     250             : GDALCloneWarpOptions(const GDALWarpOptions *);
     251             : 
     252             : void CPL_DLL CPL_STDCALL GDALWarpInitDstNoDataReal(GDALWarpOptions *,
     253             :                                                    double dNoDataReal);
     254             : 
     255             : void CPL_DLL CPL_STDCALL GDALWarpInitSrcNoDataReal(GDALWarpOptions *,
     256             :                                                    double dNoDataReal);
     257             : 
     258             : void CPL_DLL CPL_STDCALL GDALWarpInitNoDataReal(GDALWarpOptions *,
     259             :                                                 double dNoDataReal);
     260             : 
     261             : void CPL_DLL CPL_STDCALL GDALWarpInitDstNoDataImag(GDALWarpOptions *,
     262             :                                                    double dNoDataImag);
     263             : 
     264             : void CPL_DLL CPL_STDCALL GDALWarpInitSrcNoDataImag(GDALWarpOptions *,
     265             :                                                    double dNoDataImag);
     266             : 
     267             : void CPL_DLL CPL_STDCALL GDALWarpResolveWorkingDataType(GDALWarpOptions *);
     268             : 
     269             : void CPL_DLL CPL_STDCALL GDALWarpInitDefaultBandMapping(GDALWarpOptions *,
     270             :                                                         int nBandCount);
     271             : 
     272             : /*! @cond Doxygen_Suppress */
     273             : CPLXMLNode CPL_DLL *CPL_STDCALL
     274             : GDALSerializeWarpOptions(const GDALWarpOptions *);
     275             : GDALWarpOptions CPL_DLL *CPL_STDCALL GDALDeserializeWarpOptions(CPLXMLNode *);
     276             : /*! @endcond */
     277             : 
     278             : /************************************************************************/
     279             : /*                         GDALReprojectImage()                         */
     280             : /************************************************************************/
     281             : 
     282             : CPLErr CPL_DLL CPL_STDCALL GDALReprojectImage(
     283             :     GDALDatasetH hSrcDS, const char *pszSrcWKT, GDALDatasetH hDstDS,
     284             :     const char *pszDstWKT, GDALResampleAlg eResampleAlg,
     285             :     double dfWarpMemoryLimit, double dfMaxError, GDALProgressFunc pfnProgress,
     286             :     void *pProgressArg, GDALWarpOptions *psOptions);
     287             : 
     288             : CPLErr CPL_DLL CPL_STDCALL GDALCreateAndReprojectImage(
     289             :     GDALDatasetH hSrcDS, const char *pszSrcWKT, const char *pszDstFilename,
     290             :     const char *pszDstWKT, GDALDriverH hDstDriver, char **papszCreateOptions,
     291             :     GDALResampleAlg eResampleAlg, double dfWarpMemoryLimit, double dfMaxError,
     292             :     GDALProgressFunc pfnProgress, void *pProgressArg,
     293             :     GDALWarpOptions *psOptions);
     294             : 
     295             : /************************************************************************/
     296             : /*                           VRTWarpedDataset                           */
     297             : /************************************************************************/
     298             : 
     299             : GDALDatasetH CPL_DLL CPL_STDCALL
     300             : GDALAutoCreateWarpedVRT(GDALDatasetH hSrcDS, const char *pszSrcWKT,
     301             :                         const char *pszDstWKT, GDALResampleAlg eResampleAlg,
     302             :                         double dfMaxError, const GDALWarpOptions *psOptions);
     303             : 
     304             : GDALDatasetH CPL_DLL CPL_STDCALL GDALAutoCreateWarpedVRTEx(
     305             :     GDALDatasetH hSrcDS, const char *pszSrcWKT, const char *pszDstWKT,
     306             :     GDALResampleAlg eResampleAlg, double dfMaxError,
     307             :     const GDALWarpOptions *psOptions, CSLConstList papszTransformerOptions);
     308             : 
     309             : GDALDatasetH CPL_DLL CPL_STDCALL
     310             : GDALCreateWarpedVRT(GDALDatasetH hSrcDS, int nPixels, int nLines,
     311             :                     const double *padfGeoTransform, GDALWarpOptions *psOptions);
     312             : 
     313             : CPLErr CPL_DLL CPL_STDCALL GDALInitializeWarpedVRT(GDALDatasetH hDS,
     314             :                                                    GDALWarpOptions *psWO);
     315             : 
     316             : CPL_C_END
     317             : 
     318             : #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
     319             : 
     320             : #include <vector>
     321             : #include <utility>
     322             : 
     323             : bool GDALGetWarpResampleAlg(const char *pszResampling,
     324             :                             GDALResampleAlg &eResampleAlg, bool bThrow = false);
     325             : 
     326             : /************************************************************************/
     327             : /*                            GDALWarpKernel                            */
     328             : /*                                                                      */
     329             : 
     330             : /** This is the number of dummy pixels that must be reserved in source arrays
     331             :  * in order to satisfy assumptions made in GWKResample(), and more specifically
     332             :  * by GWKGetPixelRow() that always read a even number of pixels. So if we are
     333             :  * in the situation to read the last pixel of the source array, we need 1 extra
     334             :  * dummy pixel to avoid reading out of bounds. */
     335             : #define WARP_EXTRA_ELTS 1
     336             : 
     337             : /** This class represents the lowest level of abstraction of warping.
     338             :  *
     339             :  * It holds the imagery for one "chunk" of a warp, and the
     340             :  * pre-prepared masks.  All IO is done before and after its
     341             :  * operation.  This class is not normally used by the
     342             :  * application.
     343             :  */
     344             : class CPL_DLL GDALWarpKernel
     345             : {
     346             :     CPL_DISALLOW_COPY_ASSIGN(GDALWarpKernel)
     347             : 
     348             :   public:
     349             :     /** Warp options */
     350             :     char **papszWarpOptions;
     351             : 
     352             :     /** Resample algorithm */
     353             :     GDALResampleAlg eResample;
     354             :     /** Working data type */
     355             :     GDALDataType eWorkingDataType;
     356             :     /** Number of input and output bands (excluding alpha bands) */
     357             :     int nBands;
     358             : 
     359             :     /** Width of the source image */
     360             :     int nSrcXSize;
     361             :     /** Height of the source image */
     362             :     int nSrcYSize;
     363             :     /** Extra pixels (included in nSrcXSize) reserved for filter window. Should
     364             :      * be ignored in scale computation */
     365             :     double dfSrcXExtraSize;
     366             :     /** Extra pixels (included in nSrcYSize) reserved for filter window. Should
     367             :      * be ignored in scale computation */
     368             :     double dfSrcYExtraSize;
     369             :     /** Array of nBands source images of size nSrcXSize * nSrcYSize. Each
     370             :      * subarray must have WARP_EXTRA_ELTS at the end */
     371             :     GByte **papabySrcImage;
     372             : 
     373             :     /** Array of nBands validity mask of size (nSrcXSize * nSrcYSize +
     374             :      * WARP_EXTRA_ELTS) / 8 */
     375             :     GUInt32 **papanBandSrcValid;
     376             :     /** Unified validity mask of size (nSrcXSize * nSrcYSize + WARP_EXTRA_ELTS)
     377             :      * / 8 */
     378             :     GUInt32 *panUnifiedSrcValid;
     379             :     /** Unified source density of size nSrcXSize * nSrcYSize + WARP_EXTRA_ELTS
     380             :      */
     381             :     float *pafUnifiedSrcDensity;
     382             : 
     383             :     /** Width of the destination image */
     384             :     int nDstXSize;
     385             :     /** Height of the destination image */
     386             :     int nDstYSize;
     387             :     /** Array of nBands destination images of size nDstXSize * nDstYSize */
     388             :     GByte **papabyDstImage;
     389             :     /** Validify mask of size (nDstXSize * nDstYSize) / 8 */
     390             :     GUInt32 *panDstValid;
     391             :     /** Destination density of size nDstXSize * nDstYSize */
     392             :     float *pafDstDensity;
     393             : 
     394             :     /** X resampling scale, i.e. nDstXSize / nSrcXSize */
     395             :     double dfXScale;
     396             :     /** Y resampling scale, i.e. nDstYSize / nSrcYSize */
     397             :     double dfYScale;
     398             :     /** X size of filter kernel */
     399             :     double dfXFilter;
     400             :     /** Y size of filter kernel */
     401             :     double dfYFilter;
     402             :     /** X size of window to filter */
     403             :     int nXRadius;
     404             :     /** Y size of window to filter */
     405             :     int nYRadius;
     406             :     /** X filtering offset */
     407             :     int nFiltInitX;
     408             :     /** Y filtering offset */
     409             :     int nFiltInitY;
     410             : 
     411             :     /** X offset of the source buffer regarding the top-left corner of the image
     412             :      */
     413             :     int nSrcXOff;
     414             :     /** Y offset of the source buffer regarding the top-left corner of the image
     415             :      */
     416             :     int nSrcYOff;
     417             : 
     418             :     /** X offset of the destination buffer regarding the top-left corner of the
     419             :      * image */
     420             :     int nDstXOff;
     421             :     /** Y offset of the destination buffer regarding the top-left corner of the
     422             :      * image */
     423             :     int nDstYOff;
     424             : 
     425             :     /** Pixel transformation function */
     426             :     GDALTransformerFunc pfnTransformer;
     427             :     /** User data provided to pfnTransformer */
     428             :     void *pTransformerArg;
     429             : 
     430             :     /** Progress function */
     431             :     GDALProgressFunc pfnProgress;
     432             :     /** User data provided to pfnProgress */
     433             :     void *pProgress;
     434             : 
     435             :     /** Base/offset value for progress computation */
     436             :     double dfProgressBase;
     437             :     /** Scale value for progress computation */
     438             :     double dfProgressScale;
     439             : 
     440             :     /** Array of nBands value for destination nodata */
     441             :     double *padfDstNoDataReal;
     442             : 
     443             :     /*! @cond Doxygen_Suppress */
     444             :     /** Per-thread data. Internally set */
     445             :     void *psThreadData;
     446             : 
     447             :     bool bApplyVerticalShift = false;
     448             : 
     449             :     double dfMultFactorVerticalShift = 1.0;
     450             : 
     451             :     // Tuples of values (e.g. "<R>,<G>,<B>" or "(<R1>,<G1>,<B1>),(<R2>,<G2>,<B2>)") that must
     452             :     // be ignored as contributing source pixels during resampling. Only taken into account by
     453             :     // Average currently
     454             :     std::vector<std::vector<double>> m_aadfExcludedValues{};
     455             : 
     456             :     GWKTieStrategy eTieStrategy;
     457             : 
     458             :     bool bWarnedAboutDstNoDataReplacement = false;
     459             : 
     460             :     /*! @endcond */
     461             : 
     462             :     GDALWarpKernel();
     463             :     ~GDALWarpKernel();
     464             : 
     465             :     CPLErr Validate();
     466             :     CPLErr PerformWarp();
     467             : };
     468             : 
     469             : /*! @cond Doxygen_Suppress */
     470             : void *GWKThreadsCreate(char **papszWarpOptions,
     471             :                        GDALTransformerFunc pfnTransformer,
     472             :                        void *pTransformerArg);
     473             : void GWKThreadsEnd(void *psThreadDataIn);
     474             : /*! @endcond */
     475             : 
     476             : /************************************************************************/
     477             : /*                         GDALWarpOperation()                          */
     478             : /*                                                                      */
     479             : /*      This object is application created, or created by a higher      */
     480             : /*      level convenience function.  It is responsible for              */
     481             : /*      subdividing the operation into chunks, loading and saving       */
     482             : /*      imagery, and establishing the various validity and density      */
     483             : /*      masks.  Actual resampling is done by the GDALWarpKernel.        */
     484             : /************************************************************************/
     485             : 
     486             : /*! @cond Doxygen_Suppress */
     487             : typedef struct _GDALWarpChunk GDALWarpChunk;
     488             : 
     489             : struct GDALTransformerUniquePtrReleaser
     490             : {
     491         946 :     void operator()(void *p)
     492             :     {
     493         946 :         GDALDestroyTransformer(p);
     494         946 :     }
     495             : };
     496             : 
     497             : /*! @endcond */
     498             : 
     499             : /** Unique pointer for the argument of a GDALTransformerFunc */
     500             : using GDALTransformerArgUniquePtr =
     501             :     std::unique_ptr<void, GDALTransformerUniquePtrReleaser>;
     502             : 
     503        1626 : class CPL_DLL GDALWarpOperation final
     504             : {
     505             : 
     506             :     CPL_DISALLOW_COPY_ASSIGN(GDALWarpOperation)
     507             : 
     508             :   private:
     509             :     GDALWarpOptions *psOptions = nullptr;
     510             :     GDALTransformerArgUniquePtr m_psOwnedTransformerArg{nullptr};
     511             : 
     512             :     void WipeOptions();
     513             :     int ValidateOptions();
     514             : 
     515             :     bool ComputeSourceWindowTransformPoints(
     516             :         int nDstXOff, int nDstYOff, int nDstXSize, int nDstYSize, bool bUseGrid,
     517             :         bool bAll, int nStepCount, bool bTryWithCheckWithInvertProj,
     518             :         double &dfMinXOut, double &dfMinYOut, double &dfMaxXOut,
     519             :         double &dfMaxYOut, int &nSamplePoints, int &nFailedCount);
     520             : 
     521             :     void ComputeSourceWindowStartingFromSource(int nDstXOff, int nDstYOff,
     522             :                                                int nDstXSize, int nDstYSize,
     523             :                                                double *padfSrcMinX,
     524             :                                                double *padfSrcMinY,
     525             :                                                double *padfSrcMaxX,
     526             :                                                double *padfSrcMaxY);
     527             : 
     528             :     static CPLErr CreateKernelMask(GDALWarpKernel *, int iBand,
     529             :                                    const char *pszType);
     530             : 
     531             :     CPLMutex *hIOMutex = nullptr;
     532             :     CPLMutex *hWarpMutex = nullptr;
     533             : 
     534             :     int nChunkListCount = 0;
     535             :     int nChunkListMax = 0;
     536             :     GDALWarpChunk *pasChunkList = nullptr;
     537             : 
     538             :     bool bReportTimings = false;
     539             :     unsigned long nLastTimeReported = 0;
     540             : 
     541             :     void *psThreadData = nullptr;
     542             : 
     543             :     // Coordinates a few special points in target image space, to determine
     544             :     // if ComputeSourceWindow() must use a grid based sampling.
     545             :     std::vector<std::pair<double, double>> aDstXYSpecialPoints{};
     546             : 
     547             :     bool m_bIsTranslationOnPixelBoundaries = false;
     548             : 
     549             :     void WipeChunkList();
     550             :     CPLErr CollectChunkListInternal(int nDstXOff, int nDstYOff, int nDstXSize,
     551             :                                     int nDstYSize);
     552             :     void CollectChunkList(int nDstXOff, int nDstYOff, int nDstXSize,
     553             :                           int nDstYSize);
     554             :     void ReportTiming(const char *);
     555             : 
     556             :   public:
     557             :     GDALWarpOperation();
     558             :     ~GDALWarpOperation();
     559             : 
     560             :     CPLErr Initialize(const GDALWarpOptions *psNewOptions,
     561             :                       GDALTransformerFunc pfnTransformer = nullptr,
     562             :                       GDALTransformerArgUniquePtr psOwnedTransformerArg =
     563             :                           GDALTransformerArgUniquePtr{nullptr});
     564             :     void *CreateDestinationBuffer(int nDstXSize, int nDstYSize,
     565             :                                   int *pbWasInitialized = nullptr);
     566             :     CPLErr InitializeDestinationBuffer(void *pDstBuffer, int nDstXSize,
     567             :                                        int nDstYSize,
     568             :                                        int *pbWasInitialized = nullptr) const;
     569             :     static void DestroyDestinationBuffer(void *pDstBuffer);
     570             : 
     571             :     const GDALWarpOptions *GetOptions();
     572             : 
     573             :     CPLErr ChunkAndWarpImage(int nDstXOff, int nDstYOff, int nDstXSize,
     574             :                              int nDstYSize);
     575             :     CPLErr ChunkAndWarpMulti(int nDstXOff, int nDstYOff, int nDstXSize,
     576             :                              int nDstYSize);
     577             :     CPLErr WarpRegion(int nDstXOff, int nDstYOff, int nDstXSize, int nDstYSize,
     578             :                       int nSrcXOff = 0, int nSrcYOff = 0, int nSrcXSize = 0,
     579             :                       int nSrcYSize = 0, double dfProgressBase = 0.0,
     580             :                       double dfProgressScale = 1.0);
     581             :     CPLErr WarpRegion(int nDstXOff, int nDstYOff, int nDstXSize, int nDstYSize,
     582             :                       int nSrcXOff, int nSrcYOff, int nSrcXSize, int nSrcYSize,
     583             :                       double dfSrcXExtraSize, double dfSrcYExtraSize,
     584             :                       double dfProgressBase, double dfProgressScale);
     585             :     CPLErr WarpRegionToBuffer(int nDstXOff, int nDstYOff, int nDstXSize,
     586             :                               int nDstYSize, void *pDataBuf,
     587             :                               GDALDataType eBufDataType, int nSrcXOff = 0,
     588             :                               int nSrcYOff = 0, int nSrcXSize = 0,
     589             :                               int nSrcYSize = 0, double dfProgressBase = 0.0,
     590             :                               double dfProgressScale = 1.0);
     591             :     CPLErr WarpRegionToBuffer(int nDstXOff, int nDstYOff, int nDstXSize,
     592             :                               int nDstYSize, void *pDataBuf,
     593             :                               GDALDataType eBufDataType, int nSrcXOff,
     594             :                               int nSrcYOff, int nSrcXSize, int nSrcYSize,
     595             :                               double dfSrcXExtraSize, double dfSrcYExtraSize,
     596             :                               double dfProgressBase, double dfProgressScale);
     597             : 
     598             :   protected:
     599             :     friend class VRTWarpedDataset;
     600             :     CPLErr ComputeSourceWindow(int nDstXOff, int nDstYOff, int nDstXSize,
     601             :                                int nDstYSize, int *pnSrcXOff, int *pnSrcYOff,
     602             :                                int *pnSrcXSize, int *pnSrcYSize,
     603             :                                double *pdfSrcXExtraSize,
     604             :                                double *pdfSrcYExtraSize,
     605             :                                double *pdfSrcFillRatio);
     606             : 
     607             :     double GetWorkingMemoryForWindow(int nSrcXSize, int nSrcYSize,
     608             :                                      int nDstXSize, int nDstYSize) const;
     609             : };
     610             : 
     611             : #endif /* def __cplusplus */
     612             : 
     613             : CPL_C_START
     614             : 
     615             : /** Opaque type representing a GDALWarpOperation object */
     616             : typedef void *GDALWarpOperationH;
     617             : 
     618             : GDALWarpOperationH CPL_DLL GDALCreateWarpOperation(const GDALWarpOptions *);
     619             : void CPL_DLL GDALDestroyWarpOperation(GDALWarpOperationH);
     620             : CPLErr CPL_DLL GDALChunkAndWarpImage(GDALWarpOperationH, int, int, int, int);
     621             : CPLErr CPL_DLL GDALChunkAndWarpMulti(GDALWarpOperationH, int, int, int, int);
     622             : CPLErr CPL_DLL GDALWarpRegion(GDALWarpOperationH, int, int, int, int, int, int,
     623             :                               int, int);
     624             : CPLErr CPL_DLL GDALWarpRegionToBuffer(GDALWarpOperationH, int, int, int, int,
     625             :                                       void *, GDALDataType, int, int, int, int);
     626             : 
     627             : /************************************************************************/
     628             : /*      Warping kernel functions                                        */
     629             : /************************************************************************/
     630             : 
     631             : /*! @cond Doxygen_Suppress */
     632             : int GWKGetFilterRadius(GDALResampleAlg eResampleAlg);
     633             : 
     634             : typedef double (*FilterFuncType)(double dfX);
     635             : FilterFuncType GWKGetFilterFunc(GDALResampleAlg eResampleAlg);
     636             : 
     637             : // TODO(schwehr): Can padfVals be a const pointer?
     638             : typedef double (*FilterFunc4ValuesType)(double *padfVals);
     639             : FilterFunc4ValuesType GWKGetFilterFunc4Values(GDALResampleAlg eResampleAlg);
     640             : /*! @endcond */
     641             : 
     642             : CPL_C_END
     643             : 
     644             : #endif /* ndef GDAL_ALG_H_INCLUDED */

Generated by: LCOV version 1.14