Coverage Report

Created: 2025-11-16 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/gcore/gdal_rasterband.h
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Name:     gdal_rasterband.h
4
 * Project:  GDAL Core
5
 * Purpose:  Declaration of GDALRasterBand class
6
 * Author:   Frank Warmerdam, warmerdam@pobox.com
7
 *
8
 ******************************************************************************
9
 * Copyright (c) 1998, Frank Warmerdam
10
 * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com>
11
 *
12
 * SPDX-License-Identifier: MIT
13
 ****************************************************************************/
14
15
#ifndef GDALRASTERBAND_H_INCLUDED
16
#define GDALRASTERBAND_H_INCLUDED
17
18
#include "cpl_port.h"
19
#include "gdal.h"
20
#include "gdal_majorobject.h"
21
22
#include <cstddef>
23
#include <cstdint>
24
#include <complex>
25
#include <iterator>
26
#include <memory>
27
#if __cplusplus >= 202002L
28
#include <span>
29
#endif
30
#include <vector>
31
32
//! @cond Doxygen_Suppress
33
#if !defined(OPTIONAL_OUTSIDE_GDAL)
34
#if defined(GDAL_COMPILATION)
35
#define OPTIONAL_OUTSIDE_GDAL(val)
36
#else
37
#define OPTIONAL_OUTSIDE_GDAL(val) = val
38
#endif
39
#endif
40
//! @endcond
41
42
/* ******************************************************************** */
43
/*                            GDALRasterBand                            */
44
/* ******************************************************************** */
45
46
class GDALAbstractBandBlockCache;
47
class GDALColorTable;
48
class GDALDataset;
49
class GDALDoublePointsCache;
50
class GDALRasterAttributeTable;
51
class GDALRasterBlock;
52
class GDALMDArray;
53
class OGRSpatialReference;
54
55
/** Range of values found in a mask band */
56
typedef enum
57
{
58
    GMVR_UNKNOWN, /*! Unknown (can also be used for any values between 0 and 255
59
                     for a Byte band) */
60
    GMVR_0_AND_1_ONLY,   /*! Only 0 and 1 */
61
    GMVR_0_AND_255_ONLY, /*! Only 0 and 255 */
62
} GDALMaskValueRange;
63
64
/** Suggested/most efficient access pattern to blocks. */
65
typedef int GDALSuggestedBlockAccessPattern;
66
67
/** Unknown, or no particular read order is suggested. */
68
constexpr GDALSuggestedBlockAccessPattern GSBAP_UNKNOWN = 0;
69
70
/** Random access to blocks is efficient. */
71
constexpr GDALSuggestedBlockAccessPattern GSBAP_RANDOM = 1;
72
73
/** Reading by strips from top to bottom is the most efficient. */
74
constexpr GDALSuggestedBlockAccessPattern GSBAP_TOP_TO_BOTTOM = 2;
75
76
/** Reading by strips from bottom to top is the most efficient. */
77
constexpr GDALSuggestedBlockAccessPattern GSBAP_BOTTOM_TO_TOP = 3;
78
79
/** Reading the largest chunk from the raster is the most efficient (can be
80
 * combined with above values). */
81
constexpr GDALSuggestedBlockAccessPattern GSBAP_LARGEST_CHUNK_POSSIBLE = 0x100;
82
83
class GDALComputedRasterBand;
84
85
/** A rectangular subset of pixels within a raster */
86
class GDALRasterWindow
87
{
88
  public:
89
    /** left offset of the window */
90
    int nXOff;
91
92
    /** top offset of the window */
93
    int nYOff;
94
95
    /** window width */
96
    int nXSize;
97
98
    /** window height */
99
    int nYSize;
100
};
101
102
/** A single raster band (or channel). */
103
104
class CPL_DLL GDALRasterBand : public GDALMajorObject
105
{
106
  private:
107
    friend class GDALArrayBandBlockCache;
108
    friend class GDALHashSetBandBlockCache;
109
    friend class GDALRasterBlock;
110
    friend class GDALDataset;
111
112
    CPLErr eFlushBlockErr = CE_None;
113
    GDALAbstractBandBlockCache *poBandBlockCache = nullptr;
114
115
    CPL_INTERNAL void SetFlushBlockErr(CPLErr eErr);
116
    CPL_INTERNAL CPLErr UnreferenceBlock(GDALRasterBlock *poBlock);
117
    CPL_INTERNAL void IncDirtyBlocks(int nInc);
118
119
    CPL_INTERNAL CPLErr RasterIOInternal(
120
        GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize,
121
        void *pData, int nBufXSize, int nBufYSize, GDALDataType eBufType,
122
        GSpacing nPixelSpace, GSpacing nLineSpace,
123
        GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
124
125
  protected:
126
    GDALRasterBand();
127
    explicit GDALRasterBand(int bForceCachedIO);
128
129
    //! @cond Doxygen_Suppress
130
    GDALRasterBand(GDALRasterBand &&) = default;
131
    //! @endcond
132
133
    //! @cond Doxygen_Suppress
134
    GDALDataset *poDS = nullptr;
135
    int nBand = 0; /* 1 based */
136
137
    int nRasterXSize = 0;
138
    int nRasterYSize = 0;
139
140
    GDALDataType eDataType = GDT_Byte;
141
    GDALAccess eAccess = GA_ReadOnly;
142
143
    /* stuff related to blocking, and raster cache */
144
    int nBlockXSize = -1;
145
    int nBlockYSize = -1;
146
    int nBlocksPerRow = 0;
147
    int nBlocksPerColumn = 0;
148
149
    int nBlockReads = 0;
150
    int bForceCachedIO = 0;
151
152
    friend class GDALComputedRasterBand;
153
    friend class GDALComputedDataset;
154
155
    class GDALRasterBandOwnedOrNot
156
    {
157
      public:
158
0
        GDALRasterBandOwnedOrNot() = default;
159
160
        GDALRasterBandOwnedOrNot(GDALRasterBandOwnedOrNot &&) = default;
161
162
        void reset()
163
0
        {
164
0
            m_poBandOwned.reset();
165
0
            m_poBandRef = nullptr;
166
0
        }
167
168
        void resetNotOwned(GDALRasterBand *poBand)
169
0
        {
170
0
            m_poBandOwned.reset();
171
0
            m_poBandRef = poBand;
172
0
        }
173
174
        void reset(std::unique_ptr<GDALRasterBand> poBand)
175
0
        {
176
0
            m_poBandOwned = std::move(poBand);
177
0
            m_poBandRef = nullptr;
178
0
        }
179
180
        const GDALRasterBand *get() const
181
0
        {
182
0
            return static_cast<const GDALRasterBand *>(*this);
183
0
        }
184
185
        GDALRasterBand *get()
186
0
        {
187
0
            return static_cast<GDALRasterBand *>(*this);
188
0
        }
189
190
        bool IsOwned() const
191
0
        {
192
0
            return m_poBandOwned != nullptr;
193
0
        }
194
195
        operator const GDALRasterBand *() const
196
0
        {
197
0
            return m_poBandOwned ? m_poBandOwned.get() : m_poBandRef;
198
0
        }
199
200
        operator GDALRasterBand *()
201
0
        {
202
0
            return m_poBandOwned ? m_poBandOwned.get() : m_poBandRef;
203
0
        }
204
205
      private:
206
        CPL_DISALLOW_COPY_ASSIGN(GDALRasterBandOwnedOrNot)
207
        std::unique_ptr<GDALRasterBand> m_poBandOwned{};
208
        GDALRasterBand *m_poBandRef = nullptr;
209
    };
210
211
    GDALRasterBandOwnedOrNot poMask{};
212
    bool m_bEnablePixelTypeSignedByteWarning =
213
        true;  // Remove me in GDAL 4.0. See GetMetadataItem() implementation
214
    int nMaskFlags = 0;
215
216
    void InvalidateMaskBand();
217
218
    friend class GDALProxyRasterBand;
219
    friend class GDALDefaultOverviews;
220
221
    CPLErr
222
    RasterIOResampled(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
223
                      int nYSize, void *pData, int nBufXSize, int nBufYSize,
224
                      GDALDataType eBufType, GSpacing nPixelSpace,
225
                      GSpacing nLineSpace,
226
                      GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
227
228
    int EnterReadWrite(GDALRWFlag eRWFlag);
229
    void LeaveReadWrite();
230
    void InitRWLock();
231
    void SetValidPercent(GUIntBig nSampleCount, GUIntBig nValidCount);
232
233
    mutable GDALDoublePointsCache *m_poPointsCache = nullptr;
234
235
    //! @endcond
236
237
  protected:
238
    virtual CPLErr IReadBlock(int nBlockXOff, int nBlockYOff, void *pData) = 0;
239
    virtual CPLErr IWriteBlock(int nBlockXOff, int nBlockYOff, void *pData);
240
241
    virtual CPLErr
242
    IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize,
243
              void *pData, int nBufXSize, int nBufYSize, GDALDataType eBufType,
244
              GSpacing nPixelSpace, GSpacing nLineSpace,
245
              GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
246
247
    virtual int IGetDataCoverageStatus(int nXOff, int nYOff, int nXSize,
248
                                       int nYSize, int nMaskFlagStop,
249
                                       double *pdfDataPct);
250
251
    virtual bool
252
    EmitErrorMessageIfWriteNotSupported(const char *pszCaller) const;
253
254
    //! @cond Doxygen_Suppress
255
    CPLErr
256
    OverviewRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
257
                     int nYSize, void *pData, int nBufXSize, int nBufYSize,
258
                     GDALDataType eBufType, GSpacing nPixelSpace,
259
                     GSpacing nLineSpace,
260
                     GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
261
262
    CPLErr TryOverviewRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
263
                               int nXSize, int nYSize, void *pData,
264
                               int nBufXSize, int nBufYSize,
265
                               GDALDataType eBufType, GSpacing nPixelSpace,
266
                               GSpacing nLineSpace,
267
                               GDALRasterIOExtraArg *psExtraArg, int *pbTried);
268
269
    CPLErr SplitRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
270
                         int nYSize, void *pData, int nBufXSize, int nBufYSize,
271
                         GDALDataType eBufType, GSpacing nPixelSpace,
272
                         GSpacing nLineSpace, GDALRasterIOExtraArg *psExtraArg)
273
        CPL_WARN_UNUSED_RESULT;
274
275
    int InitBlockInfo();
276
277
    void AddBlockToFreeList(GDALRasterBlock *);
278
279
    bool HasBlockCache() const
280
0
    {
281
0
        return poBandBlockCache != nullptr;
282
0
    }
283
284
    bool HasDirtyBlocks() const;
285
286
    //! @endcond
287
288
  public:
289
    ~GDALRasterBand() override;
290
291
    int GetXSize() const;
292
    int GetYSize() const;
293
    int GetBand() const;
294
    GDALDataset *GetDataset() const;
295
296
    GDALDataType GetRasterDataType(void) const;
297
    void GetBlockSize(int *pnXSize, int *pnYSize) const;
298
    CPLErr GetActualBlockSize(int nXBlockOff, int nYBlockOff, int *pnXValid,
299
                              int *pnYValid) const;
300
301
    virtual GDALSuggestedBlockAccessPattern
302
    GetSuggestedBlockAccessPattern() const;
303
304
    GDALAccess GetAccess();
305
306
#ifndef DOXYGEN_SKIP
307
    CPLErr RasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
308
                    int nYSize, void *pData, int nBufXSize, int nBufYSize,
309
                    GDALDataType eBufType, GSpacing nPixelSpace,
310
                    GSpacing nLineSpace,
311
                    GDALRasterIOExtraArg *psExtraArg
312
                        OPTIONAL_OUTSIDE_GDAL(nullptr)) CPL_WARN_UNUSED_RESULT;
313
#else
314
    CPLErr RasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
315
                    int nYSize, void *pData, int nBufXSize, int nBufYSize,
316
                    GDALDataType eBufType, GSpacing nPixelSpace,
317
                    GSpacing nLineSpace,
318
                    GDALRasterIOExtraArg *psExtraArg) CPL_WARN_UNUSED_RESULT;
319
#endif
320
321
    template <class T>
322
    CPLErr ReadRaster(T *pData, size_t nArrayEltCount = 0, double dfXOff = 0,
323
                      double dfYOff = 0, double dfXSize = 0, double dfYSize = 0,
324
                      size_t nBufXSize = 0, size_t nBufYSize = 0,
325
                      GDALRIOResampleAlg eResampleAlg = GRIORA_NearestNeighbour,
326
                      GDALProgressFunc pfnProgress = nullptr,
327
                      void *pProgressData = nullptr) const;
328
329
    template <class T>
330
    CPLErr ReadRaster(std::vector<T> &vData, double dfXOff = 0,
331
                      double dfYOff = 0, double dfXSize = 0, double dfYSize = 0,
332
                      size_t nBufXSize = 0, size_t nBufYSize = 0,
333
                      GDALRIOResampleAlg eResampleAlg = GRIORA_NearestNeighbour,
334
                      GDALProgressFunc pfnProgress = nullptr,
335
                      void *pProgressData = nullptr) const;
336
337
#if __cplusplus >= 202002L
338
    //! @cond Doxygen_Suppress
339
    template <class T>
340
    inline CPLErr
341
    ReadRaster(std::span<T> pData, double dfXOff = 0, double dfYOff = 0,
342
               double dfXSize = 0, double dfYSize = 0, size_t nBufXSize = 0,
343
               size_t nBufYSize = 0,
344
               GDALRIOResampleAlg eResampleAlg = GRIORA_NearestNeighbour,
345
               GDALProgressFunc pfnProgress = nullptr,
346
               void *pProgressData = nullptr) const
347
    {
348
        return ReadRaster(pData.data(), pData.size(), dfXOff, dfYOff, dfXSize,
349
                          dfYSize, nBufXSize, nBufYSize, eResampleAlg,
350
                          pfnProgress, pProgressData);
351
    }
352
353
    //! @endcond
354
#endif
355
356
    GDALComputedRasterBand
357
    operator+(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
358
    GDALComputedRasterBand operator+(double cst) const CPL_WARN_UNUSED_RESULT;
359
    friend GDALComputedRasterBand CPL_DLL
360
    operator+(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
361
362
    GDALComputedRasterBand
363
    operator-(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
364
    GDALComputedRasterBand operator-(double cst) const CPL_WARN_UNUSED_RESULT;
365
    friend GDALComputedRasterBand CPL_DLL
366
    operator-(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
367
368
    GDALComputedRasterBand
369
    operator*(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
370
    GDALComputedRasterBand operator*(double cst) const CPL_WARN_UNUSED_RESULT;
371
    friend GDALComputedRasterBand CPL_DLL
372
    operator*(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
373
374
    GDALComputedRasterBand
375
    operator/(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
376
    GDALComputedRasterBand operator/(double cst) const CPL_WARN_UNUSED_RESULT;
377
    friend GDALComputedRasterBand CPL_DLL
378
    operator/(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
379
380
    GDALComputedRasterBand
381
    operator>(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
382
    GDALComputedRasterBand operator>(double cst) const CPL_WARN_UNUSED_RESULT;
383
    friend GDALComputedRasterBand CPL_DLL
384
    operator>(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
385
386
    GDALComputedRasterBand
387
    operator>=(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
388
    GDALComputedRasterBand operator>=(double cst) const CPL_WARN_UNUSED_RESULT;
389
    friend GDALComputedRasterBand CPL_DLL
390
    operator>=(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
391
392
    GDALComputedRasterBand
393
    operator<(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
394
    GDALComputedRasterBand operator<(double cst) const CPL_WARN_UNUSED_RESULT;
395
    friend GDALComputedRasterBand CPL_DLL
396
    operator<(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
397
398
    GDALComputedRasterBand
399
    operator<=(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
400
    GDALComputedRasterBand operator<=(double cst) const CPL_WARN_UNUSED_RESULT;
401
    friend GDALComputedRasterBand CPL_DLL
402
    operator<=(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
403
404
    GDALComputedRasterBand
405
    operator==(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
406
    GDALComputedRasterBand operator==(double cst) const CPL_WARN_UNUSED_RESULT;
407
    friend GDALComputedRasterBand CPL_DLL
408
    operator==(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
409
410
    GDALComputedRasterBand
411
    operator!=(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
412
    GDALComputedRasterBand operator!=(double cst) const CPL_WARN_UNUSED_RESULT;
413
    friend GDALComputedRasterBand CPL_DLL
414
    operator!=(double cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
415
416
#if defined(__GNUC__)
417
#pragma GCC diagnostic push
418
#pragma GCC diagnostic ignored "-Weffc++"
419
#endif
420
421
    GDALComputedRasterBand
422
    operator&&(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
423
    GDALComputedRasterBand operator&&(bool cst) const CPL_WARN_UNUSED_RESULT;
424
    friend GDALComputedRasterBand CPL_DLL
425
    operator&&(bool cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
426
427
    GDALComputedRasterBand
428
    operator||(const GDALRasterBand &other) const CPL_WARN_UNUSED_RESULT;
429
    GDALComputedRasterBand operator||(bool cst) const CPL_WARN_UNUSED_RESULT;
430
    friend GDALComputedRasterBand CPL_DLL
431
    operator||(bool cst, const GDALRasterBand &other) CPL_WARN_UNUSED_RESULT;
432
433
#if defined(__GNUC__)
434
#pragma GCC diagnostic pop
435
#endif
436
437
    GDALComputedRasterBand operator!() const CPL_WARN_UNUSED_RESULT;
438
439
    GDALComputedRasterBand operator-() const CPL_WARN_UNUSED_RESULT;
440
441
    GDALComputedRasterBand AsType(GDALDataType) const CPL_WARN_UNUSED_RESULT;
442
443
    CPLErr ReadBlock(int nXBlockOff, int nYBlockOff,
444
                     void *pImage) CPL_WARN_UNUSED_RESULT;
445
446
    CPLErr WriteBlock(int nXBlockOff, int nYBlockOff,
447
                      void *pImage) CPL_WARN_UNUSED_RESULT;
448
449
    // This method should only be overloaded by GDALProxyRasterBand
450
    virtual GDALRasterBlock *
451
    GetLockedBlockRef(int nXBlockOff, int nYBlockOff,
452
                      int bJustInitialize = FALSE) CPL_WARN_UNUSED_RESULT;
453
454
    // This method should only be overloaded by GDALProxyRasterBand
455
    virtual GDALRasterBlock *
456
    TryGetLockedBlockRef(int nXBlockOff,
457
                         int nYBlockYOff) CPL_WARN_UNUSED_RESULT;
458
459
    // This method should only be overloaded by GDALProxyRasterBand
460
    virtual CPLErr FlushBlock(int nXBlockOff, int nYBlockOff,
461
                              int bWriteDirtyBlock = TRUE);
462
463
    unsigned char *
464
    GetIndexColorTranslationTo(/* const */ GDALRasterBand *poReferenceBand,
465
                               unsigned char *pTranslationTable = nullptr,
466
                               int *pApproximateMatching = nullptr);
467
468
    // New OpengIS CV_SampleDimension stuff.
469
470
    virtual CPLErr FlushCache(bool bAtClosing = false);
471
    virtual CPLErr DropCache();
472
    virtual char **GetCategoryNames();
473
    virtual double GetNoDataValue(int *pbSuccess = nullptr);
474
    virtual int64_t GetNoDataValueAsInt64(int *pbSuccess = nullptr);
475
    virtual uint64_t GetNoDataValueAsUInt64(int *pbSuccess = nullptr);
476
    virtual double GetMinimum(int *pbSuccess = nullptr);
477
    virtual double GetMaximum(int *pbSuccess = nullptr);
478
    virtual double GetOffset(int *pbSuccess = nullptr);
479
    virtual double GetScale(int *pbSuccess = nullptr);
480
    virtual const char *GetUnitType();
481
    virtual GDALColorInterp GetColorInterpretation();
482
    virtual GDALColorTable *GetColorTable();
483
    virtual CPLErr Fill(double dfRealValue, double dfImaginaryValue = 0);
484
485
    virtual CPLErr SetCategoryNames(char **papszNames);
486
    virtual CPLErr SetNoDataValue(double dfNoData);
487
    virtual CPLErr SetNoDataValueAsInt64(int64_t nNoData);
488
    virtual CPLErr SetNoDataValueAsUInt64(uint64_t nNoData);
489
    CPLErr SetNoDataValueAsString(const char *pszNoData,
490
                                  bool *pbCannotBeExactlyRepresented = nullptr);
491
    virtual CPLErr DeleteNoDataValue();
492
    virtual CPLErr SetColorTable(GDALColorTable *poCT);
493
    virtual CPLErr SetColorInterpretation(GDALColorInterp eColorInterp);
494
    virtual CPLErr SetOffset(double dfNewOffset);
495
    virtual CPLErr SetScale(double dfNewScale);
496
    virtual CPLErr SetUnitType(const char *pszNewValue);
497
498
    virtual CPLErr GetStatistics(int bApproxOK, int bForce, double *pdfMin,
499
                                 double *pdfMax, double *pdfMean,
500
                                 double *padfStdDev);
501
    virtual CPLErr ComputeStatistics(int bApproxOK, double *pdfMin,
502
                                     double *pdfMax, double *pdfMean,
503
                                     double *pdfStdDev, GDALProgressFunc,
504
                                     void *pProgressData);
505
    virtual CPLErr SetStatistics(double dfMin, double dfMax, double dfMean,
506
                                 double dfStdDev);
507
    virtual CPLErr ComputeRasterMinMax(int bApproxOK, double *adfMinMax);
508
    virtual CPLErr ComputeRasterMinMaxLocation(double *pdfMin, double *pdfMax,
509
                                               int *pnMinX, int *pnMinY,
510
                                               int *pnMaxX, int *pnMaxY);
511
512
// Only defined when Doxygen enabled
513
#ifdef DOXYGEN_SKIP
514
    CPLErr SetMetadata(char **papszMetadata, const char *pszDomain) override;
515
    CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
516
                           const char *pszDomain) override;
517
#endif
518
    virtual const char *GetMetadataItem(const char *pszName,
519
                                        const char *pszDomain = "") override;
520
521
    virtual int HasArbitraryOverviews();
522
    virtual int GetOverviewCount();
523
    virtual GDALRasterBand *GetOverview(int i);
524
    virtual GDALRasterBand *GetRasterSampleOverview(GUIntBig);
525
    virtual CPLErr BuildOverviews(const char *pszResampling, int nOverviews,
526
                                  const int *panOverviewList,
527
                                  GDALProgressFunc pfnProgress,
528
                                  void *pProgressData,
529
                                  CSLConstList papszOptions);
530
531
    virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
532
                              int nBufXSize, int nBufYSize,
533
                              GDALDataType eBufType, char **papszOptions);
534
535
    virtual CPLErr GetHistogram(double dfMin, double dfMax, int nBuckets,
536
                                GUIntBig *panHistogram, int bIncludeOutOfRange,
537
                                int bApproxOK, GDALProgressFunc,
538
                                void *pProgressData);
539
540
    virtual CPLErr GetDefaultHistogram(double *pdfMin, double *pdfMax,
541
                                       int *pnBuckets, GUIntBig **ppanHistogram,
542
                                       int bForce, GDALProgressFunc,
543
                                       void *pProgressData);
544
    virtual CPLErr SetDefaultHistogram(double dfMin, double dfMax, int nBuckets,
545
                                       GUIntBig *panHistogram);
546
547
    virtual GDALRasterAttributeTable *GetDefaultRAT();
548
    virtual CPLErr SetDefaultRAT(const GDALRasterAttributeTable *poRAT);
549
550
    virtual GDALRasterBand *GetMaskBand();
551
    virtual int GetMaskFlags();
552
    virtual CPLErr CreateMaskBand(int nFlagsIn);
553
    virtual bool IsMaskBand() const;
554
    virtual GDALMaskValueRange GetMaskValueRange() const;
555
556
    virtual CPLVirtualMem *
557
    GetVirtualMemAuto(GDALRWFlag eRWFlag, int *pnPixelSpace,
558
                      GIntBig *pnLineSpace,
559
                      char **papszOptions) CPL_WARN_UNUSED_RESULT;
560
561
    int GetDataCoverageStatus(int nXOff, int nYOff, int nXSize, int nYSize,
562
                              int nMaskFlagStop = 0,
563
                              double *pdfDataPct = nullptr);
564
565
    std::shared_ptr<GDALMDArray> AsMDArray() const;
566
567
    CPLErr InterpolateAtGeolocation(
568
        double dfGeolocX, double dfGeolocY, const OGRSpatialReference *poSRS,
569
        GDALRIOResampleAlg eInterpolation, double *pdfRealValue,
570
        double *pdfImagValue = nullptr,
571
        CSLConstList papszTransformerOptions = nullptr) const;
572
573
    virtual CPLErr InterpolateAtPoint(double dfPixel, double dfLine,
574
                                      GDALRIOResampleAlg eInterpolation,
575
                                      double *pdfRealValue,
576
                                      double *pdfImagValue = nullptr) const;
577
578
    //! @cond Doxygen_Suppress
579
    class CPL_DLL WindowIterator
580
    {
581
      public:
582
        using iterator_category = std::input_iterator_tag;
583
        using difference_type = std::ptrdiff_t;
584
585
        using value_type = GDALRasterWindow;
586
        using pointer = value_type *;
587
        using reference = value_type &;
588
589
        WindowIterator(int nRasterXSize, int nRasterYSize, int nBlockXSize,
590
                       int nBlockYSize, int nRow, int nCol);
591
592
        bool operator==(const WindowIterator &other) const;
593
594
        bool operator!=(const WindowIterator &other) const;
595
596
        value_type operator*() const;
597
598
        WindowIterator &operator++();
599
600
      private:
601
        int m_nRasterXSize;
602
        int m_nRasterYSize;
603
        int m_nBlockXSize;
604
        int m_nBlockYSize;
605
        int m_row;
606
        int m_col;
607
    };
608
609
    class CPL_DLL WindowIteratorWrapper
610
    {
611
      public:
612
        explicit WindowIteratorWrapper(const GDALRasterBand &band,
613
                                       size_t maxSize);
614
615
        uint64_t count() const;
616
617
        WindowIterator begin() const;
618
619
        WindowIterator end() const;
620
621
      private:
622
        const int m_nRasterXSize;
623
        const int m_nRasterYSize;
624
        int m_nBlockXSize;
625
        int m_nBlockYSize;
626
    };
627
628
    //! @endcond
629
630
    WindowIteratorWrapper IterateWindows(size_t maxSize = 0) const;
631
632
#ifndef DOXYGEN_XML
633
    void ReportError(CPLErr eErrClass, CPLErrorNum err_no, const char *fmt,
634
                     ...) const CPL_PRINT_FUNC_FORMAT(4, 5);
635
#endif
636
637
    //! @cond Doxygen_Suppress
638
    static void ThrowIfNotSameDimensions(const GDALRasterBand &first,
639
                                         const GDALRasterBand &second);
640
641
    //! @endcond
642
643
    /** Convert a GDALRasterBand* to a GDALRasterBandH.
644
     */
645
    static inline GDALRasterBandH ToHandle(GDALRasterBand *poBand)
646
0
    {
647
0
        return static_cast<GDALRasterBandH>(poBand);
648
0
    }
649
650
    /** Convert a GDALRasterBandH to a GDALRasterBand*.
651
     */
652
    static inline GDALRasterBand *FromHandle(GDALRasterBandH hBand)
653
0
    {
654
0
        return static_cast<GDALRasterBand *>(hBand);
655
0
    }
656
657
    //! @cond Doxygen_Suppress
658
    // Remove me in GDAL 4.0. See GetMetadataItem() implementation
659
    // Internal use in GDAL only !
660
    virtual void EnablePixelTypeSignedByteWarning(bool b)
661
#ifndef GDAL_COMPILATION
662
        CPL_WARN_DEPRECATED("Do not use that method outside of GDAL!")
663
#endif
664
            ;
665
666
    //! @endcond
667
668
  private:
669
    CPL_DISALLOW_COPY_ASSIGN(GDALRasterBand)
670
};
671
672
//! @cond Doxygen_Suppress
673
#define GDAL_EXTERN_TEMPLATE_READ_RASTER(T)                                    \
674
    extern template CPLErr GDALRasterBand::ReadRaster<T>(                      \
675
        T * pData, size_t nArrayEltCount, double dfXOff, double dfYOff,        \
676
        double dfXSize, double dfYSize, size_t nBufXSize, size_t nBufYSize,    \
677
        GDALRIOResampleAlg eResampleAlg, GDALProgressFunc pfnProgress,         \
678
        void *pProgressData) const;
679
680
GDAL_EXTERN_TEMPLATE_READ_RASTER(uint8_t)
681
GDAL_EXTERN_TEMPLATE_READ_RASTER(int8_t)
682
GDAL_EXTERN_TEMPLATE_READ_RASTER(uint16_t)
683
GDAL_EXTERN_TEMPLATE_READ_RASTER(int16_t)
684
GDAL_EXTERN_TEMPLATE_READ_RASTER(uint32_t)
685
GDAL_EXTERN_TEMPLATE_READ_RASTER(int32_t)
686
GDAL_EXTERN_TEMPLATE_READ_RASTER(uint64_t)
687
GDAL_EXTERN_TEMPLATE_READ_RASTER(int64_t)
688
#ifdef CPL_FLOAT_H_INCLUDED
689
GDAL_EXTERN_TEMPLATE_READ_RASTER(GFloat16)
690
#endif
691
GDAL_EXTERN_TEMPLATE_READ_RASTER(float)
692
GDAL_EXTERN_TEMPLATE_READ_RASTER(double)
693
// Not allowed by C++ standard
694
// GDAL_EXTERN_TEMPLATE_READ_RASTER(std::complex<int16_t>)
695
// GDAL_EXTERN_TEMPLATE_READ_RASTER(std::complex<int32_t>)
696
GDAL_EXTERN_TEMPLATE_READ_RASTER(std::complex<float>)
697
GDAL_EXTERN_TEMPLATE_READ_RASTER(std::complex<double>)
698
699
#define GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(T)                             \
700
    extern template CPLErr GDALRasterBand::ReadRaster<T>(                      \
701
        std::vector<T> & vData, double dfXOff, double dfYOff, double dfXSize,  \
702
        double dfYSize, size_t nBufXSize, size_t nBufYSize,                    \
703
        GDALRIOResampleAlg eResampleAlg, GDALProgressFunc pfnProgress,         \
704
        void *pProgressData) const;
705
706
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(uint8_t)
707
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(int8_t)
708
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(uint16_t)
709
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(int16_t)
710
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(uint32_t)
711
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(int32_t)
712
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(uint64_t)
713
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(int64_t)
714
#ifdef CPL_FLOAT_H_INCLUDED
715
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(GFloat16)
716
#endif
717
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(float)
718
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(double)
719
// Not allowed by C++ standard
720
// GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(std::complex<int16_t>)
721
// GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(std::complex<int32_t>)
722
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(std::complex<float>)
723
GDAL_EXTERN_TEMPLATE_READ_RASTER_VECTOR(std::complex<double>)
724
725
//! @endcond
726
727
#include "gdal_computedrasterband.h"
728
729
#endif