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