Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: ESRI .hdr Driver
4 : * Purpose: Implementation of EHdrDataset
5 : * Author: Frank Warmerdam, warmerdam@pobox.com
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 1999, Frank Warmerdam <warmerdam@pobox.com>
9 : * Copyright (c) 2007-2013, Even Rouault <even dot rouault at spatialys.com>
10 : *
11 : * SPDX-License-Identifier: MIT
12 : ****************************************************************************/
13 :
14 : #ifndef GDAL_FRMTS_RAW_EHDRDATASET_H_INCLUDED
15 : #define GDAL_FRMTS_RAW_EHDRDATASET_H_INCLUDED
16 :
17 : #include "cpl_port.h"
18 : #include "rawdataset.h"
19 :
20 : #include <cctype>
21 : #include <cerrno>
22 : #include <climits>
23 : #include <cmath>
24 : #include <cstddef>
25 : #include <cstdio>
26 : #include <cstdlib>
27 : #include <cstring>
28 : #if HAVE_FCNTL_H
29 : #include <fcntl.h>
30 : #endif
31 :
32 : #include <limits>
33 : #include <memory>
34 :
35 : #include "cpl_conv.h"
36 : #include "cpl_error.h"
37 : #include "cpl_progress.h"
38 : #include "cpl_string.h"
39 : #include "cpl_vsi.h"
40 : #include "gdal.h"
41 : #include "gdal_frmts.h"
42 : #include "gdal_pam.h"
43 : #include "gdal_priv.h"
44 : #include "gdal_rat.h"
45 : #include "ogr_core.h"
46 : #include "ogr_spatialref.h"
47 :
48 : /************************************************************************/
49 : /* ==================================================================== */
50 : /* EHdrDataset */
51 : /* ==================================================================== */
52 : /************************************************************************/
53 :
54 : class EHdrRasterBand;
55 :
56 : class EHdrDataset final : public RawDataset
57 : {
58 : friend class EHdrRasterBand;
59 :
60 : VSILFILE *fpImage; // image data file.
61 :
62 : CPLString osHeaderExt{};
63 :
64 : bool bGotTransform{};
65 : double adfGeoTransform[6]{0, 1, 0, 0, 0, 1};
66 : OGRSpatialReference m_oSRS{};
67 :
68 : bool bHDRDirty{};
69 : char **papszHDR{};
70 :
71 : bool bCLRDirty{};
72 : std::shared_ptr<GDALColorTable> m_poColorTable{};
73 : std::shared_ptr<GDALRasterAttributeTable> m_poRAT{};
74 :
75 : CPLErr ReadSTX() const;
76 : CPLErr RewriteSTX() const;
77 : CPLErr RewriteHDR();
78 : void ResetKeyValue(const char *pszKey, const char *pszValue);
79 : const char *GetKeyValue(const char *pszKey, const char *pszDefault = "");
80 : void RewriteCLR(GDALRasterBand *) const;
81 :
82 : CPL_DISALLOW_COPY_ASSIGN(EHdrDataset)
83 :
84 : CPLErr Close() override;
85 :
86 : public:
87 : EHdrDataset();
88 : ~EHdrDataset() override;
89 :
90 : CPLErr GetGeoTransform(double *padfTransform) override;
91 : CPLErr SetGeoTransform(double *padfTransform) override;
92 :
93 10 : const OGRSpatialReference *GetSpatialRef() const override
94 : {
95 10 : return m_oSRS.IsEmpty() ? RawDataset::GetSpatialRef() : &m_oSRS;
96 : }
97 :
98 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
99 :
100 : char **GetFileList() override;
101 :
102 : static GDALDataset *Open(GDALOpenInfo *);
103 : static GDALDataset *Open(GDALOpenInfo *, bool bFileSizeCheck);
104 : static GDALDataset *Create(const char *pszFilename, int nXSize, int nYSize,
105 : int nBands, GDALDataType eType,
106 : char **papszParamList);
107 : static GDALDataset *CreateCopy(const char *pszFilename,
108 : GDALDataset *poSrcDS, int bStrict,
109 : char **papszOptions,
110 : GDALProgressFunc pfnProgress,
111 : void *pProgressData);
112 : static CPLString GetImageRepFilename(const char *pszFilename);
113 : };
114 :
115 : /************************************************************************/
116 : /* ==================================================================== */
117 : /* EHdrRasterBand */
118 : /* ==================================================================== */
119 : /************************************************************************/
120 :
121 : class EHdrRasterBand final : public RawRasterBand
122 : {
123 : friend class EHdrDataset;
124 :
125 : std::shared_ptr<GDALColorTable> m_poColorTable{};
126 : std::shared_ptr<GDALRasterAttributeTable> m_poRAT{};
127 :
128 : bool m_bValid = false;
129 : int nBits{};
130 : vsi_l_offset nStartBit{};
131 : int nPixelOffsetBits{};
132 : vsi_l_offset nLineOffsetBits{};
133 :
134 : int bNoDataSet{}; // TODO(schwehr): Convert to bool.
135 : double dfNoData{};
136 : double dfMin{};
137 : double dfMax{};
138 : double dfMean{};
139 : double dfStdDev{};
140 :
141 : int minmaxmeanstddev{};
142 :
143 : CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
144 : GDALDataType, GSpacing nPixelSpace, GSpacing nLineSpace,
145 : GDALRasterIOExtraArg *psExtraArg) override;
146 :
147 : CPL_DISALLOW_COPY_ASSIGN(EHdrRasterBand)
148 :
149 : public:
150 : EHdrRasterBand(GDALDataset *poDS, int nBand, VSILFILE *fpRaw,
151 : vsi_l_offset nImgOffset, int nPixelOffset, int nLineOffset,
152 : GDALDataType eDataType,
153 : RawRasterBand::ByteOrder eByteOrderIn, int nBits);
154 :
155 186 : bool IsValid() const
156 : {
157 186 : return m_bValid;
158 : }
159 :
160 : CPLErr IReadBlock(int, int, void *) override;
161 : CPLErr IWriteBlock(int, int, void *) override;
162 :
163 : double GetNoDataValue(int *pbSuccess = nullptr) override;
164 : double GetMinimum(int *pbSuccess = nullptr) override;
165 : double GetMaximum(int *pbSuccess = nullptr) override;
166 : CPLErr GetStatistics(int bApproxOK, int bForce, double *pdfMin,
167 : double *pdfMax, double *pdfMean,
168 : double *pdfStdDev) override;
169 : CPLErr SetStatistics(double dfMin, double dfMax, double dfMean,
170 : double dfStdDev) override;
171 : CPLErr SetColorTable(GDALColorTable *poNewCT) override;
172 : GDALColorTable *GetColorTable() override;
173 :
174 : GDALRasterAttributeTable *GetDefaultRAT() override;
175 : CPLErr SetDefaultRAT(const GDALRasterAttributeTable *poRAT) override;
176 : };
177 :
178 : #endif // GDAL_FRMTS_RAW_EHDRDATASET_H_INCLUDED
|