Line data Source code
1 : /******************************************************************************
2 : * $Id$
3 : *
4 : * Project: GDAL
5 : * Purpose: ECW (ERDAS Wavelet Compression Format) Driver Definitions
6 : * Author: Frank Warmerdam, warmerdam@pobox.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2001-2011, Frank Warmerdam <warmerdam@pobox.com>
10 : * Copyright (c) 2013, Even Rouault <even dot rouault at spatialys.com>
11 : *
12 : * SPDX-License-Identifier: MIT
13 : ****************************************************************************/
14 :
15 : #ifndef GDAL_ECW_H_INCLUDED
16 : #define GDAL_ECW_H_INCLUDED
17 :
18 : #include "gdaljp2abstractdataset.h"
19 : #include "gdal_frmts.h"
20 : #include "cpl_string.h"
21 : #include "cpl_conv.h"
22 : #include "cpl_multiproc.h"
23 : #include "cpl_vsi.h"
24 :
25 : #undef NOISY_DEBUG
26 :
27 : #include "ecwsdk_headers.h"
28 :
29 : #if ECWSDK_VERSION >= 55
30 : #include "NCSIOStreamOptions.h"
31 : #endif
32 :
33 : void ECWInitialize(void);
34 : GDALDataset *ECWDatasetOpenJPEG2000(GDALOpenInfo *poOpenInfo);
35 : const char *ECWGetColorInterpretationName(GDALColorInterp eColorInterpretation,
36 : int nBandNumber);
37 : GDALColorInterp ECWGetColorInterpretationByName(const char *pszName);
38 : const char *ECWGetColorSpaceName(NCSFileColorSpace colorSpace);
39 : #ifdef HAVE_COMPRESS
40 : GDALDataset *ECWCreateCopyECW(const char *pszFilename, GDALDataset *poSrcDS,
41 : int bStrict, char **papszOptions,
42 : GDALProgressFunc pfnProgress,
43 : void *pProgressData);
44 : GDALDataset *ECWCreateCopyJPEG2000(const char *pszFilename,
45 : GDALDataset *poSrcDS, int bStrict,
46 : char **papszOptions,
47 : GDALProgressFunc pfnProgress,
48 : void *pProgressData);
49 :
50 : GDALDataset *ECWCreateECW(const char *pszFilename, int nXSize, int nYSize,
51 : int nBands, GDALDataType eType, char **papszOptions);
52 : GDALDataset *ECWCreateJPEG2000(const char *pszFilename, int nXSize, int nYSize,
53 : int nBands, GDALDataType eType,
54 : char **papszOptions);
55 : #endif
56 :
57 : void ECWReportError(CNCSError &oErr, const char *pszMsg = "");
58 :
59 : /************************************************************************/
60 : /* ==================================================================== */
61 : /* JP2Userbox */
62 : /* ==================================================================== */
63 : /************************************************************************/
64 : #ifdef HAVE_COMPRESS
65 : #if ECWSDK_VERSION >= 50
66 : class JP2UserBox final : public CNCSSDKBox
67 : {
68 : #else
69 : class JP2UserBox final : public CNCSJP2Box
70 : {
71 : #endif
72 : private:
73 : int nDataLength;
74 : unsigned char *pabyData;
75 :
76 : public:
77 : JP2UserBox();
78 :
79 : virtual ~JP2UserBox();
80 :
81 : #if ECWSDK_VERSION >= 55
82 : CNCSError Parse(NCS::SDK::CFileBase &JP2File,
83 : const NCS::CIOStreamPtr &Stream) override;
84 : CNCSError UnParse(NCS::SDK::CFileBase &JP2File,
85 : const NCS::CIOStreamPtr &Stream) override;
86 : #elif ECWSDK_VERSION >= 40
87 : virtual CNCSError Parse(NCS::SDK::CFileBase &JP2File,
88 : NCS::CIOStream &Stream) override;
89 : virtual CNCSError UnParse(NCS::SDK::CFileBase &JP2File,
90 : NCS::CIOStream &Stream) override;
91 : #else
92 : virtual CNCSError Parse(class CNCSJP2File &JP2File,
93 : CNCSJPCIOStream &Stream) override;
94 : virtual CNCSError UnParse(class CNCSJP2File &JP2File,
95 : CNCSJPCIOStream &Stream) override;
96 : #endif
97 : virtual void UpdateXLBox() override;
98 :
99 : void SetData(int nDataLength, const unsigned char *pabyDataIn);
100 :
101 : int GetDataLength()
102 : {
103 : return nDataLength;
104 : }
105 :
106 : unsigned char *GetData()
107 : {
108 : return pabyData;
109 : }
110 : };
111 : #endif /* def HAVE_COMPRESS */
112 :
113 : /************************************************************************/
114 : /* ==================================================================== */
115 : /* VSIIOStream */
116 : /* ==================================================================== */
117 : /************************************************************************/
118 :
119 : class VSIIOStream final : public CNCSJPCIOStream
120 : {
121 : VSIIOStream(const VSIIOStream &) = delete;
122 : VSIIOStream &operator=(const VSIIOStream &) = delete;
123 : VSIIOStream(VSIIOStream &&) = delete;
124 : VSIIOStream &operator=(VSIIOStream &&) = delete;
125 :
126 : char *m_Filename = nullptr;
127 :
128 : public:
129 : INT64 startOfJPData = 0;
130 : INT64 lengthOfJPData = -1;
131 : VSILFILE *fpVSIL = nullptr;
132 : BOOLEAN bWritable = false;
133 : BOOLEAN bSeekable = false;
134 : int nFileViewCount = 0;
135 :
136 : int nCOMState = 0;
137 : int nCOMLength = 0;
138 : GByte abyCOMType[2]{};
139 :
140 : /* To fix ‘virtual bool NCS::CIOStream::Read(INT64, void*, UINT32)’ was
141 : * hidden' with SDK 5 */
142 : using CNCSJPCIOStream::Read;
143 :
144 121 : VSIIOStream()
145 121 : {
146 121 : if (CSLTestBoolean(CPLGetConfigOption(
147 121 : "GDAL_ECW_WRITE_COMPRESSION_SOFTWARE", "YES")))
148 121 : nCOMState = -1;
149 121 : abyCOMType[0] = 0;
150 121 : abyCOMType[1] = 0;
151 121 : }
152 :
153 174 : virtual ~VSIIOStream()
154 121 : {
155 121 : VSIIOStream::Close();
156 121 : if (m_Filename != nullptr)
157 : {
158 84 : CPLFree(m_Filename);
159 : }
160 174 : }
161 :
162 238 : CNCSError Close() override
163 : {
164 238 : CNCSError oErr = CNCSJPCIOStream::Close();
165 238 : if (fpVSIL != nullptr)
166 : {
167 84 : VSIFCloseL(fpVSIL);
168 84 : fpVSIL = nullptr;
169 : }
170 238 : return oErr;
171 : }
172 :
173 : #if ECWSDK_VERSION >= 40
174 : VSIIOStream *Clone() override
175 : {
176 : CPLDebug("ECW", "VSIIOStream::Clone()");
177 : VSILFILE *fpNewVSIL = VSIFOpenL(m_Filename, "rb");
178 : if (fpNewVSIL == nullptr)
179 : {
180 : return nullptr;
181 : }
182 :
183 : VSIIOStream *pDst = new VSIIOStream();
184 : pDst->Access(fpNewVSIL, bWritable, bSeekable, m_Filename, startOfJPData,
185 : lengthOfJPData);
186 : return pDst;
187 : }
188 : #endif /* ECWSDK_VERSION >= 4 */
189 :
190 84 : CNCSError Access(VSILFILE *fpVSILIn, BOOLEAN bWrite, BOOLEAN bSeekableIn,
191 : const char *pszFilename, INT64 start, INT64 size = -1)
192 : {
193 :
194 84 : fpVSIL = fpVSILIn;
195 84 : startOfJPData = start;
196 84 : lengthOfJPData = size;
197 84 : bWritable = bWrite;
198 84 : bSeekable = bSeekableIn;
199 84 : VSIFSeekL(fpVSIL, startOfJPData, SEEK_SET);
200 84 : m_Filename = CPLStrdup(pszFilename);
201 :
202 : #if ECWSDK_VERSION >= 55
203 : const std::string vsiStreamPrefix("STREAM=/vsi");
204 : const std::string vsiPrefix("/vsi");
205 : m_StreamOptions->SetIsRemoteStream(
206 : std::string(m_Filename).compare(0, vsiPrefix.length(), vsiPrefix) ==
207 : 0 ||
208 : std::string(m_Filename)
209 : .compare(0, vsiStreamPrefix.length(), vsiStreamPrefix) ==
210 : 0);
211 : #endif
212 : // the filename is used to establish where to put temporary files.
213 : // if it does not have a path to a real directory, we will
214 : // substitute something.
215 168 : CPLString osFilenameUsed = pszFilename;
216 :
217 : #if ECWSDK_VERSION < 55
218 168 : CPLString osPath = CPLGetPath(pszFilename);
219 : struct stat sStatBuf;
220 84 : if (!osPath.empty() && stat(osPath, &sStatBuf) != 0)
221 : {
222 69 : osFilenameUsed = CPLGenerateTempFilename(nullptr);
223 : // try to preserve the extension.
224 69 : if (strlen(CPLGetExtension(pszFilename)) > 0)
225 : {
226 68 : osFilenameUsed += ".";
227 68 : osFilenameUsed += CPLGetExtension(pszFilename);
228 : }
229 69 : CPLDebug("ECW",
230 : "Using filename '%s' for temporary directory "
231 : "determination purposes.",
232 : osFilenameUsed.c_str());
233 : }
234 : #endif
235 :
236 : #ifdef _WIN32
237 : if (CSLTestBoolean(CPLGetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")))
238 : {
239 : wchar_t *pwszFilename = CPLRecodeToWChar(
240 : osFilenameUsed.c_str(), CPL_ENC_UTF8, CPL_ENC_UCS2);
241 : CNCSError oError;
242 : oError = CNCSJPCIOStream::Open(pwszFilename, (bool)bWrite);
243 : CPLFree(pwszFilename);
244 : return oError;
245 : }
246 : else
247 : #endif
248 : {
249 84 : return (CNCSJPCIOStream::Open((char *)osFilenameUsed.c_str(),
250 168 : (bool)bWrite));
251 : }
252 : }
253 :
254 396 : virtual bool NCS_FASTCALL Seek() override
255 : {
256 396 : return bSeekable;
257 : }
258 :
259 1589 : virtual bool NCS_FASTCALL Seek(INT64 offset,
260 : Origin origin = CURRENT) override
261 : {
262 : #ifdef DEBUG_VERBOSE
263 : CPLDebug("ECW", "VSIIOStream::Seek(" CPL_FRMT_GIB ",%d)",
264 : static_cast<GIntBig>(offset), (int)origin);
265 : #endif
266 1589 : bool success = false;
267 1589 : switch (origin)
268 : {
269 1303 : case START:
270 1303 : success =
271 1303 : (0 == VSIFSeekL(fpVSIL, offset + startOfJPData, SEEK_SET));
272 1303 : break;
273 :
274 0 : case CURRENT:
275 0 : success = (0 == VSIFSeekL(fpVSIL, offset, SEEK_CUR));
276 0 : break;
277 :
278 286 : case END:
279 286 : success = (0 == VSIFSeekL(fpVSIL, offset, SEEK_END));
280 286 : break;
281 : }
282 1589 : if (!success)
283 0 : CPLDebug("ECW", "VSIIOStream::Seek(%d,%d) failed.", (int)offset,
284 : (int)origin);
285 1589 : return (success);
286 : }
287 :
288 6027 : virtual INT64 NCS_FASTCALL Tell() override
289 : {
290 6027 : return VSIFTellL(fpVSIL) - startOfJPData;
291 : }
292 :
293 286 : virtual INT64 NCS_FASTCALL Size() override
294 : {
295 286 : if (lengthOfJPData != -1)
296 0 : return lengthOfJPData;
297 : else
298 : {
299 286 : INT64 curPos = Tell(), size;
300 :
301 286 : Seek(0, END);
302 286 : size = Tell();
303 286 : Seek(curPos, START);
304 : #ifdef DEBUG_VERBOSE
305 : CPLDebug("ECW", "VSIIOStream::Size()=" CPL_FRMT_GIB,
306 : static_cast<GIntBig>(size));
307 : #endif
308 286 : return size;
309 : }
310 : }
311 :
312 : #if ECWSDK_VERSION >= 40
313 : /* New, and needed, in ECW SDK 4 */
314 : virtual bool Read(INT64 offset, void *buffer, UINT32 count) override
315 : {
316 : #ifdef DEBUG_VERBOSE
317 : CPLDebug("ECW", "VSIIOStream::Read(" CPL_FRMT_GIB ",%u)",
318 : static_cast<GIntBig>(offset), count);
319 : #endif
320 : /* SDK 4.3 doc says it is not supposed to update the file pointer. */
321 : /* Later versions have no comment... */
322 : INT64 curPos = Tell();
323 : Seek(offset, START);
324 : bool ret = Read(buffer, count);
325 : Seek(curPos, START);
326 : return ret;
327 : }
328 : #endif
329 :
330 10038 : virtual bool NCS_FASTCALL Read(void *buffer, UINT32 count) override
331 : {
332 : #ifdef DEBUG_VERBOSE
333 : CPLDebug("ECW", "VSIIOStream::Read(%u)", count);
334 : #endif
335 10038 : if (count == 0)
336 366 : return true;
337 :
338 : // return(1 == VSIFReadL( buffer, count, 1, fpVSIL ) );
339 :
340 : // The following is a hack
341 9672 : if (VSIFReadL(buffer, count, 1, fpVSIL) != 1)
342 : {
343 0 : CPLDebug("VSIIOSTREAM",
344 : "Read(%d) failed @ " CPL_FRMT_GIB ", ignoring failure.",
345 0 : count, (VSIFTellL(fpVSIL) - startOfJPData));
346 : }
347 :
348 9672 : return true;
349 : }
350 :
351 5350 : virtual bool NCS_FASTCALL Write(void *buffer, UINT32 count) override
352 : {
353 5350 : if (count == 0)
354 0 : return true;
355 :
356 5350 : GByte *paby = (GByte *)buffer;
357 5350 : if (nCOMState == 0)
358 : {
359 0 : if (count == 2 && paby[0] == 0xff && paby[1] == 0x64)
360 : {
361 0 : nCOMState++;
362 0 : return true;
363 : }
364 : }
365 5350 : else if (nCOMState == 1)
366 : {
367 0 : if (count == 2)
368 : {
369 0 : nCOMLength = (paby[0] << 8) | paby[1];
370 0 : nCOMState++;
371 0 : return true;
372 : }
373 : else
374 : {
375 0 : GByte prevBuffer[] = {0xff, 0x64};
376 0 : VSIFWriteL(prevBuffer, 2, 1, fpVSIL);
377 0 : nCOMState = 0;
378 : }
379 : }
380 5350 : else if (nCOMState == 2)
381 : {
382 0 : if (count == 2)
383 : {
384 0 : abyCOMType[0] = paby[0];
385 0 : abyCOMType[1] = paby[1];
386 0 : nCOMState++;
387 0 : return true;
388 : }
389 : else
390 : {
391 0 : GByte prevBuffer[] = {(GByte)(nCOMLength >> 8),
392 0 : (GByte)(nCOMLength & 0xff)};
393 0 : VSIFWriteL(prevBuffer, 2, 1, fpVSIL);
394 0 : nCOMState = 0;
395 : }
396 : }
397 5350 : else if (nCOMState == 3)
398 : {
399 0 : if (count == (UINT32)nCOMLength - 4)
400 : {
401 0 : nCOMState = 0;
402 0 : return true;
403 : }
404 : else
405 : {
406 0 : VSIFWriteL(abyCOMType, 2, 1, fpVSIL);
407 0 : nCOMState = 0;
408 : }
409 : }
410 :
411 5350 : if (1 != VSIFWriteL(buffer, count, 1, fpVSIL))
412 : {
413 0 : CPLDebug("ECW", "VSIIOStream::Write(%d) failed.", (int)count);
414 0 : return false;
415 : }
416 : else
417 5350 : return true;
418 : }
419 : };
420 :
421 : /************************************************************************/
422 : /* ==================================================================== */
423 : /* ECWAsyncReader */
424 : /* ==================================================================== */
425 : /************************************************************************/
426 : class ECWDataset;
427 :
428 : #if ECWSDK_VERSION >= 40
429 :
430 : class ECWAsyncReader final : public GDALAsyncReader
431 : {
432 : private:
433 : CNCSJP2FileView *poFileView = nullptr;
434 : CPLMutex *hMutex = nullptr;
435 : int bUsingCustomStream = false;
436 :
437 : int bUpdateReady = false;
438 : int bComplete = false;
439 :
440 : static NCSEcwReadStatus RefreshCB(NCSFileView *);
441 : NCSEcwReadStatus ReadToBuffer();
442 :
443 : public:
444 : ECWAsyncReader();
445 : virtual ~ECWAsyncReader();
446 : virtual GDALAsyncStatusType
447 : GetNextUpdatedRegion(double dfTimeout, int *pnXBufOff, int *pnYBufOff,
448 : int *pnXBufSize, int *pnYBufSize) override;
449 :
450 : friend class ECWDataset;
451 : };
452 : #endif /* ECWSDK_VERSION >= 40 */
453 :
454 : /************************************************************************/
455 : /* ==================================================================== */
456 : /* ECWDataset */
457 : /* ==================================================================== */
458 : /************************************************************************/
459 :
460 : class ECWRasterBand;
461 :
462 : typedef struct
463 : {
464 : int bEnabled;
465 : int nBandsTried;
466 :
467 : int nXOff;
468 : int nYOff;
469 : int nXSize;
470 : int nYSize;
471 : int nBufXSize;
472 : int nBufYSize;
473 : GDALDataType eBufType;
474 : GByte *pabyData;
475 : } ECWCachedMultiBandIO;
476 :
477 : class CPL_DLL ECWDataset final : public GDALJP2AbstractDataset
478 : {
479 : friend class ECWRasterBand;
480 : friend class ECWAsyncReader;
481 :
482 : int bIsJPEG2000;
483 :
484 : CNCSJP2FileView *poFileView;
485 : NCSFileViewFileInfoEx *psFileInfo;
486 :
487 : GDALDataType eRasterDataType;
488 : NCSEcwCellType eNCSRequestDataType;
489 :
490 : int bUsingCustomStream;
491 :
492 : // Current view window.
493 : int bWinActive;
494 : int nWinXOff, nWinYOff, nWinXSize, nWinYSize;
495 : int nWinBufXSize, nWinBufYSize;
496 : int nWinBandCount;
497 : int *panWinBandList;
498 : int nWinBufLoaded;
499 : void **papCurLineBuf;
500 :
501 : // Deferred advise read parameters
502 : int m_nAdviseReadXOff;
503 : int m_nAdviseReadYOff;
504 : int m_nAdviseReadXSize;
505 : int m_nAdviseReadYSize;
506 : int m_nAdviseReadBufXSize;
507 : int m_nAdviseReadBufYSize;
508 : int m_nAdviseReadBandCount;
509 : int *m_panAdviseReadBandList;
510 :
511 : char **papszGMLMetadata;
512 :
513 : ECWCachedMultiBandIO sCachedMultiBandIO;
514 :
515 : void ECW2WKTProjection();
516 :
517 : void CleanupWindow();
518 : CPLErr RunDeferredAdviseRead();
519 : int TryWinRasterIO(GDALRWFlag, int, int, int, int, GByte *, int, int,
520 : GDALDataType, int, const int *, GSpacing nPixelSpace,
521 : GSpacing nLineSpace, GSpacing nBandSpace,
522 : GDALRasterIOExtraArg *psExtraArg);
523 : CPLErr LoadNextLine();
524 :
525 : #if ECWSDK_VERSION >= 50
526 :
527 : NCSFileStatistics *pStatistics;
528 : int bStatisticsDirty;
529 : int bStatisticsInitialized;
530 : NCS::CError StatisticsEnsureInitialized();
531 : NCS::CError StatisticsWrite();
532 : void CleanupStatistics();
533 : void ReadFileMetaDataFromFile();
534 :
535 : int bFileMetaDataDirty;
536 : void WriteFileMetaData(NCSFileMetaData *pFileMetaDataCopy);
537 :
538 : #endif
539 :
540 : static CNCSJP2FileView *OpenFileView(const char *pszDatasetName,
541 : bool bProgressive,
542 : int &bUsingCustomStream,
543 : bool bWrite = false);
544 :
545 : int bHdrDirty;
546 : CPLString m_osDatumCode;
547 : CPLString m_osProjCode;
548 : CPLString m_osUnitsCode;
549 : int bGeoTransformChanged;
550 : int bProjectionChanged;
551 : int bProjCodeChanged;
552 : int bDatumCodeChanged;
553 : int bUnitsCodeChanged;
554 : void WriteHeader();
555 :
556 : int bUseOldBandRasterIOImplementation;
557 :
558 : int bPreventCopyingSomeMetadata;
559 :
560 : int nBandIndexToPromoteTo8Bit;
561 :
562 : CPLStringList oECWMetadataList;
563 : CPLErr ReadBands(void *pData, int nBufXSize, int nBufYSize,
564 : GDALDataType eBufType, int nBandCount,
565 : GSpacing nPixelSpace, GSpacing nLineSpace,
566 : GSpacing nBandSpace, GDALRasterIOExtraArg *psExtraArg);
567 : CPLErr ReadBandsDirectly(void *pData, int nBufXSize, int nBufYSize,
568 : GDALDataType eBufType, int nBandCount,
569 : GSpacing nPixelSpace, GSpacing nLineSpace,
570 : GSpacing nBandSpace,
571 : GDALRasterIOExtraArg *psExtraArg);
572 :
573 : public:
574 : explicit ECWDataset(int bIsJPEG2000);
575 : ~ECWDataset();
576 :
577 : static GDALDataset *Open(GDALOpenInfo *, int bIsJPEG2000);
578 : static GDALDataset *OpenJPEG2000(GDALOpenInfo *);
579 : static GDALDataset *OpenECW(GDALOpenInfo *);
580 :
581 62 : void SetPreventCopyingSomeMetadata(int b)
582 : {
583 62 : bPreventCopyingSomeMetadata = b;
584 62 : }
585 :
586 : virtual CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
587 : GDALDataType, int, BANDMAP_TYPE,
588 : GSpacing nPixelSpace, GSpacing nLineSpace,
589 : GSpacing nBandSpace,
590 : GDALRasterIOExtraArg *psExtraArg) override;
591 :
592 : virtual char **GetMetadataDomainList() override;
593 : virtual const char *GetMetadataItem(const char *pszName,
594 : const char *pszDomain = "") override;
595 : virtual char **GetMetadata(const char *pszDomain = "") override;
596 :
597 : virtual CPLErr SetGeoTransform(double *padfGeoTransform) override;
598 : CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
599 :
600 : virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
601 : const char *pszDomain = "") override;
602 : virtual CPLErr SetMetadata(char **papszMetadata,
603 : const char *pszDomain = "") override;
604 :
605 : virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
606 : int nBufXSize, int nBufYSize, GDALDataType eDT,
607 : int nBandCount, int *panBandList,
608 : char **papszOptions) override;
609 :
610 : // progressive methods
611 : #if ECWSDK_VERSION >= 40
612 : virtual GDALAsyncReader *
613 : BeginAsyncReader(int nXOff, int nYOff, int nXSize, int nYSize, void *pBuf,
614 : int nBufXSize, int nBufYSize, GDALDataType eBufType,
615 : int nBandCount, int *panBandMap, int nPixelSpace,
616 : int nLineSpace, int nBandSpace,
617 : char **papszOptions) override;
618 :
619 : virtual void EndAsyncReader(GDALAsyncReader *) override;
620 : #endif /* ECWSDK_VERSION > 40 */
621 : #if ECWSDK_VERSION >= 50
622 : int GetFormatVersion() const
623 : {
624 : return psFileInfo->nFormatVersion;
625 : }
626 : #endif
627 : };
628 :
629 : /************************************************************************/
630 : /* ==================================================================== */
631 : /* ECWRasterBand */
632 : /* ==================================================================== */
633 : /************************************************************************/
634 :
635 : class ECWRasterBand final : public GDALPamRasterBand
636 : {
637 : friend class ECWDataset;
638 :
639 : // NOTE: poDS may be altered for NITF/JPEG2000 files!
640 : ECWDataset *poGDS;
641 :
642 : GDALColorInterp eBandInterp;
643 :
644 : int iOverview; // -1 for base.
645 :
646 : std::vector<ECWRasterBand *> apoOverviews;
647 :
648 : #if ECWSDK_VERSION >= 50
649 :
650 : int nStatsBandIndex = 0;
651 : int nStatsBandCount = 0;
652 :
653 : #endif
654 :
655 : int bPromoteTo8Bit;
656 :
657 : // #if !defined(SDK_CAN_DO_SUPERSAMPLING)
658 : CPLErr OldIRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
659 : GDALDataType, GSpacing nPixelSpace, GSpacing nLineSpace,
660 : GDALRasterIOExtraArg *psExtraArg);
661 : // #endif
662 :
663 : virtual CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
664 : GDALDataType, GSpacing nPixelSpace,
665 : GSpacing nLineSpace,
666 : GDALRasterIOExtraArg *psExtraArg) override;
667 :
668 : public:
669 : ECWRasterBand(ECWDataset *, int, int iOverview, char **papszOpenOptions);
670 : ~ECWRasterBand();
671 :
672 : virtual CPLErr IReadBlock(int, int, void *) override;
673 :
674 0 : virtual int HasArbitraryOverviews() override
675 : {
676 0 : return apoOverviews.empty();
677 : }
678 :
679 3 : virtual int GetOverviewCount() override
680 : {
681 3 : return (int)apoOverviews.size();
682 : }
683 :
684 : virtual GDALRasterBand *GetOverview(int) override;
685 :
686 : virtual GDALColorInterp GetColorInterpretation() override;
687 : virtual CPLErr SetColorInterpretation(GDALColorInterp) override;
688 :
689 : virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,
690 : int nBufXSize, int nBufYSize, GDALDataType eDT,
691 : char **papszOptions) override;
692 : #if ECWSDK_VERSION >= 50
693 : void GetBandIndexAndCountForStatistics(int &bandIndex,
694 : int &bandCount) const;
695 : virtual CPLErr GetDefaultHistogram(double *pdfMin, double *pdfMax,
696 : int *pnBuckets, GUIntBig **ppanHistogram,
697 : int bForce, GDALProgressFunc,
698 : void *pProgressData) override;
699 : virtual CPLErr SetDefaultHistogram(double dfMin, double dfMax, int nBuckets,
700 : GUIntBig *panHistogram) override;
701 : virtual double GetMinimum(int *pbSuccess) override;
702 : virtual double GetMaximum(int *pbSuccess) override;
703 : virtual CPLErr GetStatistics(int bApproxOK, int bForce, double *pdfMin,
704 : double *pdfMax, double *pdfMean,
705 : double *padfStdDev) override;
706 : virtual CPLErr SetStatistics(double dfMin, double dfMax, double dfMean,
707 : double dfStdDev) override;
708 :
709 : virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue,
710 : const char *pszDomain = "") override;
711 : #endif
712 : };
713 :
714 : int ECWTranslateFromWKT(const OGRSpatialReference *poSRS, char *pszProjection,
715 : int nProjectionLen, char *pszDatum, int nDatumLen,
716 : char *pszUnits);
717 :
718 : CellSizeUnits ECWTranslateToCellSizeUnits(const char *pszUnits);
719 : const char *ECWTranslateFromCellSizeUnits(CellSizeUnits eUnits);
720 :
721 : #endif /* ndef GDAL_ECW_H_INCLUDED */
|