Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: Memory Array Translator
4 : * Purpose: Declaration of MEMDataset, and MEMRasterBand.
5 : * Author: Frank Warmerdam, warmerdam@pobox.com
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 2000, Frank Warmerdam
9 : *
10 : * SPDX-License-Identifier: MIT
11 : ****************************************************************************/
12 :
13 : #ifndef MEMDATASET_H_INCLUDED
14 : #define MEMDATASET_H_INCLUDED
15 :
16 : #include "gdal_pam.h"
17 : #include "gdal_priv.h"
18 : #include "gdal_rat.h"
19 :
20 : #include <memory>
21 :
22 : CPL_C_START
23 : /* Caution: if changing this prototype, also change in
24 : swig/include/gdal_python.i where it is redefined */
25 : GDALRasterBandH CPL_DLL MEMCreateRasterBand(GDALDataset *, int, GByte *,
26 : GDALDataType, int, int, int);
27 : GDALRasterBandH CPL_DLL MEMCreateRasterBandEx(GDALDataset *, int, GByte *,
28 : GDALDataType, GSpacing, GSpacing,
29 : int);
30 : CPL_C_END
31 :
32 : /************************************************************************/
33 : /* MEMDataset */
34 : /************************************************************************/
35 :
36 : class MEMRasterBand;
37 :
38 : class CPL_DLL MEMDataset CPL_NON_FINAL : public GDALDataset
39 : {
40 : CPL_DISALLOW_COPY_ASSIGN(MEMDataset)
41 :
42 : friend class MEMRasterBand;
43 :
44 : int bGeoTransformSet;
45 : double adfGeoTransform[6];
46 :
47 : OGRSpatialReference m_oSRS{};
48 :
49 : std::vector<gdal::GCP> m_aoGCPs{};
50 : OGRSpatialReference m_oGCPSRS{};
51 :
52 : std::vector<std::unique_ptr<GDALDataset>> m_apoOverviewDS{};
53 :
54 : struct Private;
55 : std::unique_ptr<Private> m_poPrivate;
56 :
57 : #if 0
58 : protected:
59 : virtual int EnterReadWrite(GDALRWFlag eRWFlag);
60 : virtual void LeaveReadWrite();
61 : #endif
62 :
63 : friend void GDALRegister_MEM();
64 :
65 : // cppcheck-suppress unusedPrivateFunction
66 : static GDALDataset *CreateBase(const char *pszFilename, int nXSize,
67 : int nYSize, int nBands, GDALDataType eType,
68 : char **papszParamList);
69 :
70 : protected:
71 : bool CanBeCloned(int nScopeFlags, bool bCanShareState) const override;
72 :
73 : std::unique_ptr<GDALDataset> Clone(int nScopeFlags,
74 : bool bCanShareState) const override;
75 :
76 : public:
77 : MEMDataset();
78 : virtual ~MEMDataset();
79 :
80 : const OGRSpatialReference *GetSpatialRef() const override;
81 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
82 :
83 : virtual CPLErr GetGeoTransform(double *) override;
84 : virtual CPLErr SetGeoTransform(double *) override;
85 :
86 : virtual void *GetInternalHandle(const char *) override;
87 :
88 : virtual int GetGCPCount() override;
89 : const OGRSpatialReference *GetGCPSpatialRef() const override;
90 : virtual const GDAL_GCP *GetGCPs() override;
91 : CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList,
92 : const OGRSpatialReference *poSRS) override;
93 : virtual CPLErr AddBand(GDALDataType eType,
94 : char **papszOptions = nullptr) override;
95 : virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
96 : int nXSize, int nYSize, void *pData, int nBufXSize,
97 : int nBufYSize, GDALDataType eBufType,
98 : int nBandCount, BANDMAP_TYPE panBandMap,
99 : GSpacing nPixelSpaceBuf, GSpacing nLineSpaceBuf,
100 : GSpacing nBandSpaceBuf,
101 : GDALRasterIOExtraArg *psExtraArg) override;
102 : virtual CPLErr IBuildOverviews(const char *pszResampling, int nOverviews,
103 : const int *panOverviewList, int nListBands,
104 : const int *panBandList,
105 : GDALProgressFunc pfnProgress,
106 : void *pProgressData,
107 : CSLConstList papszOptions) override;
108 :
109 : virtual CPLErr CreateMaskBand(int nFlagsIn) override;
110 :
111 : std::shared_ptr<GDALGroup> GetRootGroup() const override;
112 :
113 : void AddMEMBand(GDALRasterBandH hMEMBand);
114 :
115 : static GDALDataset *Open(GDALOpenInfo *);
116 : static MEMDataset *Create(const char *pszFilename, int nXSize, int nYSize,
117 : int nBands, GDALDataType eType,
118 : char **papszParamList);
119 : static GDALDataset *
120 : CreateMultiDimensional(const char *pszFilename,
121 : CSLConstList papszRootGroupOptions,
122 : CSLConstList papszOptions);
123 : };
124 :
125 : /************************************************************************/
126 : /* MEMRasterBand */
127 : /************************************************************************/
128 :
129 : class CPL_DLL MEMRasterBand CPL_NON_FINAL : public GDALPamRasterBand
130 : {
131 : private:
132 : CPL_DISALLOW_COPY_ASSIGN(MEMRasterBand)
133 :
134 : protected:
135 : friend class MEMDataset;
136 :
137 : GByte *pabyData;
138 : GSpacing nPixelOffset;
139 : GSpacing nLineOffset;
140 : int bOwnData;
141 :
142 : bool m_bIsMask = false;
143 :
144 : MEMRasterBand(GByte *pabyDataIn, GDALDataType eTypeIn, int nXSizeIn,
145 : int nYSizeIn, bool bOwnDataIn);
146 :
147 : public:
148 : MEMRasterBand(GDALDataset *poDS, int nBand, GByte *pabyData,
149 : GDALDataType eType, GSpacing nPixelOffset,
150 : GSpacing nLineOffset, int bAssumeOwnership,
151 : const char *pszPixelType = nullptr);
152 : virtual ~MEMRasterBand();
153 :
154 : virtual CPLErr IReadBlock(int, int, void *) override;
155 : virtual CPLErr IWriteBlock(int, int, void *) override;
156 : virtual CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
157 : int nXSize, int nYSize, void *pData, int nBufXSize,
158 : int nBufYSize, GDALDataType eBufType,
159 : GSpacing nPixelSpaceBuf, GSpacing nLineSpaceBuf,
160 : GDALRasterIOExtraArg *psExtraArg) override;
161 :
162 : virtual int GetOverviewCount() override;
163 : virtual GDALRasterBand *GetOverview(int) override;
164 :
165 : virtual CPLErr CreateMaskBand(int nFlagsIn) override;
166 : virtual bool IsMaskBand() const override;
167 :
168 : // Allow access to MEM driver's private internal memory buffer.
169 1264 : GByte *GetData() const
170 : {
171 1264 : return (pabyData);
172 : }
173 : };
174 :
175 : #endif /* ndef MEMDATASET_H_INCLUDED */
|