GDAL

gdal_alg_priv.h
1 /******************************************************************************
2 * $Id$
3 *
4 * Project: GDAL Image Processing Algorithms
5 * Purpose: Prototypes and definitions for various GDAL based algorithms:
6 * private declarations.
7 * Author: Andrey Kiselev, dron@ak4719.spb.edu
8 *
9 ******************************************************************************
10 * Copyright (c) 2008, Andrey Kiselev <dron@ak4719.spb.edu>
11 * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com>
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a
14 * copy of this software and associated documentation files (the "Software"),
15 * to deal in the Software without restriction, including without limitation
16 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 * and/or sell copies of the Software, and to permit persons to whom the
18 * Software is furnished to do so, subject to the following conditions:
19 *
20 * The above copyright notice and this permission notice shall be included
21 * in all copies or substantial portions of the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 * DEALINGS IN THE SOFTWARE.
30 ****************************************************************************/
31
32 #ifndef GDAL_ALG_PRIV_H_INCLUDED
33 #define GDAL_ALG_PRIV_H_INCLUDED
34
35 #ifndef DOXYGEN_SKIP
36
37 #include <cstdint>
38
39 #include "gdal_alg.h"
40 #include "ogr_spatialref.h"
41
42 CPL_C_START
43
45 typedef enum
46 { GBV_UserBurnValue = 0, GBV_Z = 1, GBV_M = 2
50 } GDALBurnValueSrc;
51
52 typedef enum
53 {
54 GRMA_Replace = 0,
55 GRMA_Add = 1,
56 } GDALRasterMergeAlg;
57
58 typedef struct
59 {
60 unsigned char *pabyChunkBuf;
61 int nXSize;
62 int nYSize;
63 int nBands;
64 GDALDataType eType;
65 int nPixelSpace;
66 GSpacing nLineSpace;
67 GSpacing nBandSpace;
68 GDALDataType eBurnValueType;
69 union
70 {
71 const std::int64_t *int64_values;
72 const double *double_values;
73 } burnValues;
74 GDALBurnValueSrc eBurnValueSource;
75 GDALRasterMergeAlg eMergeAlg;
76 } GDALRasterizeInfo;
77
78 typedef enum
79 {
80 GRO_Raster = 0,
81 GRO_Vector = 1,
82 GRO_Auto = 2,
83 } GDALRasterizeOptim;
84
85 /************************************************************************/
86 /* Low level rasterizer API. */
87 /************************************************************************/
88
89 typedef void (*llScanlineFunc)(void *, int, int, int, double);
90 typedef void (*llPointFunc)(void *, int, int, double);
91
92 void GDALdllImagePoint(int nRasterXSize, int nRasterYSize, int nPartCount,
93 const int *panPartSize, const double *padfX,
94 const double *padfY, const double *padfVariant,
95 llPointFunc pfnPointFunc, void *pCBData);
96
97 void GDALdllImageLine(int nRasterXSize, int nRasterYSize, int nPartCount,
98 const int *panPartSize, const double *padfX,
99 const double *padfY, const double *padfVariant,
100 llPointFunc pfnPointFunc, void *pCBData);
101
102 void GDALdllImageLineAllTouched(int nRasterXSize, int nRasterYSize,
103 int nPartCount, const int *panPartSize,
104 const double *padfX, const double *padfY,
105 const double *padfVariant,
106 llPointFunc pfnPointFunc, void *pCBData,
107 int bAvoidBurningSamePoints,
108 bool bIntersectOnly);
109
110 void GDALdllImageFilledPolygon(int nRasterXSize, int nRasterYSize,
111 int nPartCount, const int *panPartSize,
112 const double *padfX, const double *padfY,
113 const double *padfVariant,
114 llScanlineFunc pfnScanlineFunc, void *pCBData);
115
116 CPL_C_END
117
118 /************************************************************************/
119 /* Polygon Enumerator */
120 /************************************************************************/
121
122 #define GP_NODATA_MARKER -51502112
123
124 template <class DataType, class EqualityTest> class GDALRasterPolygonEnumeratorT
125
126 {
127 private:
128 void MergePolygon(int nSrcId, int nDstId);
129 int NewPolygon(DataType nValue);
130
131 CPL_DISALLOW_COPY_ASSIGN(GDALRasterPolygonEnumeratorT)
132
133 public: // these are intended to be readonly.
134 GInt32 *panPolyIdMap = nullptr;
135 DataType *panPolyValue = nullptr;
136
137 int nNextPolygonId = 0;
138 int nPolyAlloc = 0;
139
140 int nConnectedness = 0;
141
142 public:
143 explicit GDALRasterPolygonEnumeratorT(int nConnectedness = 4);
144 ~GDALRasterPolygonEnumeratorT();
145
146 bool ProcessLine(DataType *panLastLineVal, DataType *panThisLineVal,
147 GInt32 *panLastLineId, GInt32 *panThisLineId, int nXSize);
148
149 void CompleteMerges();
150
151 void Clear();
152 };
153
154 struct IntEqualityTest
155 {
156 bool operator()(std::int64_t a, std::int64_t b) const
157 {
158 return a == b;
159 }
160 };
161
162 typedef GDALRasterPolygonEnumeratorT<std::int64_t, IntEqualityTest>
163 GDALRasterPolygonEnumerator;
164
165 typedef void *(*GDALTransformDeserializeFunc)(CPLXMLNode *psTree);
166
167 void CPL_DLL *GDALRegisterTransformDeserializer(
168 const char *pszTransformName, GDALTransformerFunc pfnTransformerFunc,
169 GDALTransformDeserializeFunc pfnDeserializeFunc);
170 void CPL_DLL GDALUnregisterTransformDeserializer(void *pData);
171
172 void GDALCleanupTransformDeserializerMutex();
173
174 /* Transformer cloning */
175
176 void *GDALCreateTPSTransformerInt(int nGCPCount, const GDAL_GCP *pasGCPList,
177 int bReversed, char **papszOptions);
178
179 void CPL_DLL *GDALCloneTransformer(void *pTransformerArg);
180
181 void GDALRefreshGenImgProjTransformer(void *hTransformArg);
182 void GDALRefreshApproxTransformer(void *hTransformArg);
183
184 int GDALTransformLonLatToDestGenImgProjTransformer(void *hTransformArg,
185 double *pdfX, double *pdfY);
186 int GDALTransformLonLatToDestApproxTransformer(void *hTransformArg,
187 double *pdfX, double *pdfY);
188
189 bool GDALTransformIsTranslationOnPixelBoundaries(
190 GDALTransformerFunc pfnTransformer, void *pTransformerArg);
191
192 bool GDALTransformIsAffineNoRotation(GDALTransformerFunc pfnTransformer,
193 void *pTransformerArg);
194
195 typedef struct _CPLQuadTree CPLQuadTree;
196
197 typedef struct
198 {
199 GDALTransformerInfo sTI;
200
201 bool bReversed;
202 double dfOversampleFactor;
203
204 // Map from target georef coordinates back to geolocation array
205 // pixel line coordinates. Built only if needed.
206 int nBackMapWidth;
207 int nBackMapHeight;
208 double adfBackMapGeoTransform[6]; // Maps georef to pixel/line.
209
210 bool bUseArray;
211 void *pAccessors;
212
213 // Geolocation bands.
214 GDALDatasetH hDS_X;
215 GDALRasterBandH hBand_X;
216 GDALDatasetH hDS_Y;
217 GDALRasterBandH hBand_Y;
218 int bSwapXY;
219
220 // Located geolocation data.
221 int nGeoLocXSize;
222 int nGeoLocYSize;
223 double dfMinX;
224 double dfYAtMinX;
225 double dfMinY;
226 double dfXAtMinY;
227 double dfMaxX;
228 double dfYAtMaxX;
229 double dfMaxY;
230 double dfXAtMaxY;
231
232 int bHasNoData;
233 double dfNoDataX;
234
235 // Geolocation <-> base image mapping.
236 double dfPIXEL_OFFSET;
237 double dfPIXEL_STEP;
238 double dfLINE_OFFSET;
239 double dfLINE_STEP;
240
241 bool bOriginIsTopLeftCorner;
242 bool bGeographicSRSWithMinus180Plus180LongRange;
243 CPLQuadTree *hQuadTree;
244
245 char **papszGeolocationInfo;
246
247 } GDALGeoLocTransformInfo;
248
249 /************************************************************************/
250 /* Color table related */
251 /************************************************************************/
252
253 // Definitions exists for T = GUInt32 and T = GUIntBig.
254 template <class T>
255 int GDALComputeMedianCutPCTInternal(
256 GDALRasterBandH hRed, GDALRasterBandH hGreen, GDALRasterBandH hBlue,
257 GByte *pabyRedBand, GByte *pabyGreenBand, GByte *pabyBlueBand,
258 int (*pfnIncludePixel)(int, int, void *), int nColors, int nBits,
259 T *panHistogram, GDALColorTableH hColorTable, GDALProgressFunc pfnProgress,
260 void *pProgressArg);
261
262 int GDALDitherRGB2PCTInternal(GDALRasterBandH hRed, GDALRasterBandH hGreen,
263 GDALRasterBandH hBlue, GDALRasterBandH hTarget,
264 GDALColorTableH hColorTable, int nBits,
265 GInt16 *pasDynamicColorMap, int bDither,
266 GDALProgressFunc pfnProgress, void *pProgressArg);
267
268 #define PRIME_FOR_65536 98317
269
270 // See HashHistogram structure in gdalmediancut.cpp and ColorIndex structure in
271 // gdaldither.cpp 6 * sizeof(int) should be the size of the largest of both
272 // structures.
273 #define MEDIAN_CUT_AND_DITHER_BUFFER_SIZE_65536 \
274 (6 * sizeof(int) * PRIME_FOR_65536)
275
276 /************************************************************************/
277 /* Float comparison function. */
278 /************************************************************************/
279
286 #define MAX_ULPS 10
287
288 GBool GDALFloatEquals(float A, float B);
289
290 struct FloatEqualityTest
291 {
292 bool operator()(float a, float b)
293 {
294 return GDALFloatEquals(a, b) == TRUE;
295 }
296 };
297
298 bool GDALComputeAreaOfInterest(OGRSpatialReference *poSRS, double adfGT[6],
299 int nXSize, int nYSize,
300 double &dfWestLongitudeDeg,
301 double &dfSouthLatitudeDeg,
302 double &dfEastLongitudeDeg,
303 double &dfNorthLatitudeDeg);
304
305 bool GDALComputeAreaOfInterest(OGRSpatialReference *poSRS, double dfX1,
306 double dfY1, double dfX2, double dfY2,
307 double &dfWestLongitudeDeg,
308 double &dfSouthLatitudeDeg,
309 double &dfEastLongitudeDeg,
310 double &dfNorthLatitudeDeg);
311
312 CPLStringList GDALCreateGeolocationMetadata(GDALDatasetH hBaseDS,
313 const char *pszGeolocationDataset,
314 bool bIsSource);
315
316 void *GDALCreateGeoLocTransformerEx(GDALDatasetH hBaseDS,
317 CSLConstList papszGeolocationInfo,
318 int bReversed, const char *pszSourceDataset,
319 CSLConstList papszTransformOptions);
320
321 #endif /* #ifndef DOXYGEN_SKIP */
322
323 #endif /* ndef GDAL_ALG_PRIV_H_INCLUDED */
ogr_spatialref.h
GByte
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:205
GInt16
short GInt16
Int16 type.
Definition: cpl_port.h:201
GDALTransformerFunc
int(* GDALTransformerFunc)(void *pTransformerArg, int bDstToSrc, int nPointCount, double *x, double *y, double *z, int *panSuccess)
Definition: gdal_alg.h:95
CPLStringList
String list class designed around our use of C "char**" string lists.
Definition: cpl_string.h:437
OGRSpatialReference
This class represents an OpenGIS Spatial Reference System, and contains methods for converting betwee...
Definition: ogr_spatialref.h:166
GDALColorTableH
void * GDALColorTableH
Opaque type used for the C bindings of the C++ GDALColorTable class.
Definition: gdal.h:300
GDALDataType
GDALDataType
Definition: gdal.h:63
CPLXMLNode
Document node structure.
Definition: cpl_minixml.h:69
CPLQuadTree
struct _CPLQuadTree CPLQuadTree
Opaque type for a quad tree.
Definition: cpl_quad_tree.h:65
CPL_C_START
#define CPL_C_START
Macro to start a block of C symbols.
Definition: cpl_port.h:315
CSLConstList
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1195
GDAL_GCP
Ground Control Point.
Definition: gdal.h:1036
CPL_C_END
#define CPL_C_END
Macro to end a block of C symbols.
Definition: cpl_port.h:319
GSpacing
GIntBig GSpacing
Type to express pixel, line or band spacing.
Definition: gdal.h:315
gdal_alg.h
GBool
int GBool
Type for boolean values (alias to int)
Definition: cpl_port.h:216
GDALRasterBandH
void * GDALRasterBandH
Opaque type used for the C bindings of the C++ GDALRasterBand class.
Definition: gdal.h:294
GInt32
int GInt32
Int32 type.
Definition: cpl_port.h:195
CPL_DISALLOW_COPY_ASSIGN
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition: cpl_port.h:1051
GDALDatasetH
void * GDALDatasetH
Opaque type used for the C bindings of the C++ GDALDataset class.
Definition: gdal.h:291