Official websites use .gov
A .gov website belongs to an official government organization in the United States.

Secure .gov websites use HTTPS
A lock ( ) or https:// means you’ve safely connected to the .gov website. Share sensitive information only on official, secure websites.

Isis 3 Programmer Reference
GdalIoHandler.cpp
1#include "GdalIoHandler.h"
2
3#include "Brick.h"
4#include "Buffer.h"
5#include "CubeCachingAlgorithm.h"
6#include "IException.h"
7#include "Pvl.h"
8#include "PvlObject.h"
9#include "SpecialPixel.h"
10
11#include <QList>
12#include <QMutex>
13#include <QString>
14
15#include <iostream>
16
17using namespace std;
18
19namespace Isis {
20 GdalIoHandler::GdalIoHandler(QString &dataFilePath, const QList<int> *virtualBandList, GDALDataType pixelType, GDALAccess eAccess) :
21 ImageIoHandler(virtualBandList) {
22 m_geodataSetPath = dataFilePath.toUtf8().constData();
23 m_geodataSet = GDALDataset::FromHandle(GDALOpen(m_geodataSetPath.c_str(), eAccess));
24 m_datasetOwner = true;
25 m_pixelType = pixelType;
26 init();
27 }
28
29 GdalIoHandler::GdalIoHandler(GDALDataset *geodataSet, const QList<int> *virtualBandList, GDALDataType pixelType) :
30 ImageIoHandler(virtualBandList) {
31 m_geodataSet = geodataSet;
32 if (!m_geodataSet) {
33 QString msg = "Constructing GdalIoHandler failed. Null geodataSet pointer passed";
34 throw IException(IException::Programmer, msg, _FILEINFO_);
35 }
36 m_datasetOwner = false;
37 m_pixelType = pixelType;
38 init();
39 }
40
41 void GdalIoHandler::init() {
42 m_samples = m_geodataSet->GetRasterXSize();
43 m_lines = m_geodataSet->GetRasterYSize();
44 m_bands = m_geodataSet->GetRasterCount();
45
46 m_driverName = std::string(m_geodataSet->GetDriverName());
47
48 // Check if we need to create the mask band
49 if ((m_geodataSet->GetAccess() == GA_Update) && (m_driverName != "ISIS3")) {
50 for (int i = 1; i <= m_bands; i++) {
51 GDALRasterBand *band = m_geodataSet->GetRasterBand(i);
52 band->CreateMaskBand(GMF_ALPHA);
53 band->GetMaskBand()->Fill(255);
54 }
55 }
56
57 GDALRasterBand *band = m_geodataSet->GetRasterBand(1);
58 m_offset = band->GetOffset();
59 m_scale = band->GetScale();
60 int *pbSuccess = new int;
61 m_gdalNoDataValue = band->GetNoDataValue(pbSuccess);
62 if (!pbSuccess) {
63 m_gdalNoDataValue = NULL8;
64 }
65 delete pbSuccess;
66 }
67
68 GdalIoHandler::~GdalIoHandler() {
69 clearCache();
70 if (m_maskBuff) {
71 delete m_maskBuff;
72 }
73 if (m_geodataSet && m_datasetOwner) {
74 m_geodataSet->Close();
75 }
76 }
77
78 void GdalIoHandler::read(Buffer &bufferToFill) const {
79 GDALRasterBand *poBand;
80
81 bufferToFill = NULL8;
82 int maxBand = bufferToFill.BandDimension() + bufferToFill.Band() - 1;
83 for (int band = bufferToFill.Band(); band <= maxBand; band++) {
84 int vband = band;
85 if (m_virtualBands)
86 vband = m_virtualBands->at(band - 1);
87
88 if (vband > m_bands) {
89 return;
90 }
91
92 poBand = m_geodataSet->GetRasterBand(vband);
93
94 // Account for 1 based line and sample reading from ISIS process classes
95 // as gdal reads 0 based lines and samples
96 int lineStart = bufferToFill.Line() - 1;
97 int sampleStart = bufferToFill.Sample() - 1;
98 int lineSize = bufferToFill.LineDimension();
99 int sampleSize = bufferToFill.SampleDimension();
100
101 // Handle reading out of bound pixels as cube IO handler would
102 bool outOfBounds = false;
103 if (lineStart < 0) {
104 lineStart = 0;
105 outOfBounds = true;
106 }
107 if (lineStart + lineSize > m_lines) {
108 lineSize = m_lines - lineStart;
109 outOfBounds = true;
110 }
111 if (sampleStart < 0) {
112 sampleStart = 0;
113 outOfBounds = true;
114 }
115 if (sampleStart + sampleSize > m_samples) {
116 sampleSize = m_samples - sampleStart;
117 outOfBounds = true;
118 }
119
120 if (sampleSize > 0 && lineSize > 0) {
121 if (outOfBounds) {
122 Brick boundedBrick(sampleSize, lineSize, bufferToFill.BandDimension(), GdalPixelToIsis(m_pixelType), false);
123 boundedBrick.SetBasePosition(sampleStart + 1, lineStart + 1, bufferToFill.Band());
124 CPLErr err = poBand->RasterIO(GF_Read, sampleStart, lineStart,
125 sampleSize, lineSize,
126 boundedBrick.RawBuffer(),
127 sampleSize, lineSize,
128 m_pixelType,
129 0, 0);
130
131 if (err >= CE_Failure) {
132 QString msg = "Failure when trying to read image";
133 throw IException(IException::Unknown, msg, _FILEINFO_);
134 }
135
136 // Handle pixel type conversion
137 char *buffersRawBuf = (char *)boundedBrick.RawBuffer();
138 double *buffersDoubleBuf = boundedBrick.DoubleBuffer();
139 for (int bufferIdx = 0; bufferIdx < boundedBrick.size(); bufferIdx++) {
140 readPixelType(buffersDoubleBuf, buffersRawBuf, bufferIdx);
141 }
142 bufferToFill.CopyOverlapFrom(boundedBrick);
143 }
144 else {
145 CPLErr err = poBand->RasterIO(GF_Read, sampleStart, lineStart,
146 sampleSize, lineSize,
147 bufferToFill.RawBuffer(),
148 sampleSize, lineSize,
149 m_pixelType,
150 0, 0);
151 if (err >= CE_Failure) {
152 QString msg = "Failure when trying to read image";
153 throw IException(IException::Unknown, msg, _FILEINFO_);
154 }
155
156 // Handle pixel type conversion
157 char *buffersRawBuf = (char *)bufferToFill.RawBuffer();
158 double *buffersDoubleBuf = bufferToFill.DoubleBuffer();
159 for (int bufferIdx = 0; bufferIdx < bufferToFill.size(); bufferIdx++) {
160 readPixelType(buffersDoubleBuf, buffersRawBuf, bufferIdx);
161 }
162 }
163 }
164 }
165 }
166
167 void GdalIoHandler::write(const Buffer &bufferToWrite) {
168 CPLErr gdalerr;
169 GDALRasterBand *poBand;
170
171 int maxBand = bufferToWrite.BandDimension() + bufferToWrite.Band() - 1;
172 for (int band = bufferToWrite.Band(); band <= maxBand; band++) {
173 int vband = band;
174 if(m_virtualBands)
175 vband = m_virtualBands->indexOf(band) + 1;
176
177 if (band > m_bands) {
178 return;
179 }
180
181 poBand = m_geodataSet->GetRasterBand(vband);
182
183 int lineStart = bufferToWrite.Line() - 1;
184 int sampleStart = bufferToWrite.Sample() - 1;
185 int lineSize = bufferToWrite.LineDimension();
186 int sampleSize = bufferToWrite.SampleDimension();
187
188 if (lineStart < 0) {
189 lineStart = 0;
190 }
191 if (lineStart + lineSize > m_lines) {
192 lineSize = m_lines - lineStart;
193 }
194 if (sampleStart < 0) {
195 sampleStart = 0;
196 }
197 if (sampleStart + sampleSize > m_samples) {
198 sampleSize = m_samples - sampleStart;
199 }
200
201 int bufferSize = sampleSize * lineSize;
202 int currentBandIdx = bufferSize * (vband - bufferToWrite.Band());
203 m_maskBuff = (unsigned char *) CPLMalloc(sizeof(unsigned char) * bufferSize);
204 for (int i = 0; i < bufferSize; i++) {
205 m_maskBuff[i] = 255;
206 }
207
208
209 // Handle pixel type conversion
210 char *buffersRawBuf = &(((char *)bufferToWrite.RawBuffer())[(int)(currentBandIdx * SizeOf(bufferToWrite.PixelType()))]);
211 double *buffersDoubleBuf = &(bufferToWrite.DoubleBuffer()[currentBandIdx]);
212 // std::cout << buffersDoubleBuf[0] << std::endl;
213 for (int bufferIdx = 0; bufferIdx < bufferSize; bufferIdx++) {
214 if (writePixelType(buffersDoubleBuf, buffersRawBuf, bufferIdx)) {
215 m_maskBuff[bufferIdx] = 0;
216 };
217 }
218
219 // silence warning
220 gdalerr = poBand->RasterIO(GF_Write, sampleStart, lineStart,
221 sampleSize, lineSize,
222 (void *)buffersRawBuf,
223 sampleSize, lineSize,
224 m_pixelType,
225 0, 0);
226 if (gdalerr >= CE_Failure) {
227 QString msg = "Failure when trying to write image";
228 throw IException(IException::Unknown, msg, _FILEINFO_);
229 }
230
231 if (m_driverName != "ISIS3") {
232 poBand = m_geodataSet->GetRasterBand(band)->GetMaskBand();
233 gdalerr = poBand->RasterIO(GF_Write, sampleStart, lineStart,
234 sampleSize, lineSize,
235 m_maskBuff,
236 sampleSize, lineSize,
237 GDT_Byte,
238 0, 0);
239 if (gdalerr >= CE_Failure) {
240 QString msg = "Failure when trying to write msk file";
241 throw IException(IException::Unknown, msg, _FILEINFO_);
242 }
243 }
244 }
245
246 delete m_maskBuff;
247 m_maskBuff = NULL;
248 }
249
250 BigInt GdalIoHandler::getDataSize() const {
251 return 0;
252 }
258 void GdalIoHandler::updateLabels(Pvl &labels) {
259 PvlObject &core = labels.findObject("IsisCube").findObject("Core");
260 core.addKeyword(PvlKeyword("Format", "GTiff"), PvlContainer::Replace);
261 }
262
263 void GdalIoHandler::readPixelType(double *doubleBuff, void *rawBuff, int idx) const {
264 double &bufferVal = doubleBuff[idx];
265
266 if (m_pixelType == GDT_Float64) {
267 bufferVal = ((double *)rawBuff)[idx];
268 if (bufferVal == m_gdalNoDataValue) {
269 bufferVal = NULL8;
270 }
271 }
272
273 else if(m_pixelType == GDT_Float32) {
274 float raw = ((float *)rawBuff)[idx];
275 // if(m_byteSwapper)
276 // raw = m_byteSwapper->Float(&raw);
277 if (raw == (float) m_gdalNoDataValue) {
278 raw = NULL4;
279 }
280
281 if(raw >= VALID_MIN4) {
282 bufferVal = (double) raw * m_scale + m_offset;
283 }
284 else {
285 if(raw == NULL4)
286 bufferVal = NULL8;
287 else if(raw == LOW_INSTR_SAT4)
288 bufferVal = LOW_INSTR_SAT8;
289 else if(raw == LOW_REPR_SAT4)
290 bufferVal = LOW_REPR_SAT8;
291 else if(raw == HIGH_INSTR_SAT4)
292 bufferVal = HIGH_INSTR_SAT8;
293 else if(raw == HIGH_REPR_SAT4)
294 bufferVal = HIGH_REPR_SAT8;
295 else
296 bufferVal = LOW_REPR_SAT8;
297 }
298
299 ((float *)rawBuff)[idx] = raw;
300 }
301
302 else if(m_pixelType == GDT_Int32) {
303 int raw = ((int *)rawBuff)[idx];
304 // if(m_byteSwapper)
305 // raw = m_byteSwapper->Uint32_t(&raw);
306 if (raw == (int) m_gdalNoDataValue) {
307 raw = NULLI4;
308 }
309
310 if(raw >= VALID_MINI4) {
311 bufferVal = (double) raw * m_scale + m_offset;
312 }
313 else {
314 if (raw == NULLI4)
315 bufferVal = NULL8;
316 else if (raw == LOW_INSTR_SATI4)
317 bufferVal = LOW_INSTR_SAT8;
318 else if (raw == LOW_REPR_SATI4)
319 bufferVal = LOW_REPR_SAT8;
320 else if (raw == HIGH_INSTR_SATI4)
321 bufferVal = HIGH_INSTR_SAT8;
322 else if (raw == HIGH_REPR_SATI4)
323 bufferVal = HIGH_REPR_SAT8;
324 else
325 bufferVal = LOW_REPR_SAT8;
326 }
327 ((int *)rawBuff)[idx] = raw;
328 }
329
330 else if(m_pixelType == GDT_UInt32) {
331 unsigned int raw = ((unsigned int *)rawBuff)[idx];
332 // if(m_byteSwapper)
333 // raw = m_byteSwapper->Uint32_t(&raw);
334 if (raw == (unsigned int) m_gdalNoDataValue) {
335 raw = NULLUI4;
336 }
337
338 if(raw >= VALID_MINUI4) {
339 bufferVal = (double) raw * m_scale + m_offset;
340 if (raw >= VALID_MAXUI4) {
341 if(raw == HIGH_INSTR_SATUI4)
342 bufferVal = HIGH_INSTR_SAT8;
343 else if(raw == HIGH_REPR_SATUI4)
344 bufferVal = HIGH_REPR_SAT8;
345 else
346 bufferVal = HIGH_REPR_SAT8;
347 }
348 }
349 else {
350 if(raw == NULLUI4)
351 bufferVal = NULL8;
352 else if(raw == LOW_INSTR_SATUI4)
353 bufferVal = LOW_INSTR_SAT8;
354 else if(raw == LOW_REPR_SATUI4)
355 bufferVal = LOW_REPR_SAT8;
356 else
357 bufferVal = LOW_REPR_SAT8;
358 }
359 ((unsigned int *)rawBuff)[idx] = raw;
360 }
361
362 else if(m_pixelType == GDT_Int16) {
363 short raw = ((short *)rawBuff)[idx];
364 // if(m_byteSwapper)
365 // raw = m_byteSwapper->ShortInt(&raw);
366 if (raw == (short) m_gdalNoDataValue) {
367 raw = NULL2;
368 }
369
370 if(raw >= VALID_MIN2) {
371 bufferVal = (double) raw * m_scale + m_offset;
372 }
373 else {
374 if(raw == NULL2)
375 bufferVal = NULL8;
376 else if(raw == LOW_INSTR_SAT2)
377 bufferVal = LOW_INSTR_SAT8;
378 else if(raw == LOW_REPR_SAT2)
379 bufferVal = LOW_REPR_SAT8;
380 else if(raw == HIGH_INSTR_SAT2)
381 bufferVal = HIGH_INSTR_SAT8;
382 else if(raw == HIGH_REPR_SAT2)
383 bufferVal = HIGH_REPR_SAT8;
384 else
385 bufferVal = LOW_REPR_SAT8;
386 }
387
388 ((short *)rawBuff)[idx] = raw;
389 }
390
391 else if(m_pixelType == GDT_UInt16) {
392 unsigned short raw = ((unsigned short *)rawBuff)[idx];
393 // if(m_byteSwapper)
394 // raw = m_byteSwapper->UnsignedShortInt(&raw);
395 if (raw == (unsigned short) m_gdalNoDataValue) {
396 raw = NULLU2;
397 }
398
399 if(raw >= VALID_MINU2) {
400 bufferVal = (double) raw * m_scale + m_offset;
401 if (raw > VALID_MAXU2) {
402 if(raw == HIGH_INSTR_SATU2)
403 bufferVal = HIGH_INSTR_SAT8;
404 else if(raw == HIGH_REPR_SATU2)
405 bufferVal = HIGH_REPR_SAT8;
406 else
407 bufferVal = HIGH_REPR_SAT8;
408 }
409 }
410 else {
411 if(raw == NULLU2)
412 bufferVal = NULL8;
413 else if(raw == LOW_INSTR_SATU2)
414 bufferVal = LOW_INSTR_SAT8;
415 else if(raw == LOW_REPR_SATU2)
416 bufferVal = LOW_REPR_SAT8;
417 else
418 bufferVal = LOW_REPR_SAT8;
419 }
420 ((unsigned short *)rawBuff)[idx] = raw;
421 }
422
423 else if(m_pixelType == GDT_Int8) {
424 signed char raw = ((signed char *)rawBuff)[idx];
425 if (raw == (signed char) m_gdalNoDataValue) {
426 raw = NULLS1;
427 }
428
429 if(raw == NULLS1) {
430 bufferVal = NULL8;
431 }
432 else if(raw == HIGH_REPR_SATS1) {
433 bufferVal = HIGH_REPR_SAT8;
434 }
435 else {
436 bufferVal = (double) raw * m_scale + m_offset;
437 }
438
439 ((signed char *)rawBuff)[idx] = raw;
440 }
441
442 else if(m_pixelType == GDT_Byte) {
443 unsigned char raw = ((unsigned char *)rawBuff)[idx];
444 if (raw == (char) m_gdalNoDataValue) {
445 raw = NULL1;
446 }
447
448 if(raw == NULL1) {
449 bufferVal = NULL8;
450 }
451 else if(raw == HIGH_REPR_SAT1) {
452 bufferVal = HIGH_REPR_SAT8;
453 }
454 else {
455 bufferVal = (double) raw * m_scale + m_offset;
456 }
457
458 ((unsigned char *)rawBuff)[idx] = raw;
459 }
460 }
461
462 bool GdalIoHandler::writePixelType(double *doubleBuff, void *rawBuff, int idx) const {
463 double bufferVal = doubleBuff[idx];
464 bool isSpecial = false;
465 if (m_pixelType == GDT_Float64) {
466 ((double *)rawBuff)[idx] = bufferVal;
467 }
468
469 else if(m_pixelType == GDT_Float32) {
470 float raw = 0;
471
472 if(bufferVal >= VALID_MIN8) {
473 double filePixelValueDbl = (bufferVal - m_offset) /
474 m_scale;
475
476 if(filePixelValueDbl < (double) VALID_MIN4) {
477 raw = LOW_REPR_SAT4;
478 isSpecial = true;
479 }
480 else if(filePixelValueDbl > (double) VALID_MAX4) {
481 raw = HIGH_REPR_SAT4;
482 isSpecial = true;
483 }
484 else {
485 raw = (float) filePixelValueDbl;
486 }
487 }
488 else {
489 if(bufferVal == NULL8) {
490 raw = NULL4;
491 isSpecial = true;
492 }
493 else if(bufferVal == LOW_INSTR_SAT8) {
494 raw = LOW_INSTR_SAT4;
495 isSpecial = true;
496 }
497 else if(bufferVal == LOW_REPR_SAT8) {
498 raw = LOW_REPR_SAT4;
499 isSpecial = true;
500 }
501 else if(bufferVal == HIGH_INSTR_SAT8) {
502 raw = HIGH_INSTR_SAT4;
503 isSpecial = true;
504 }
505 else if(bufferVal == HIGH_REPR_SAT8) {
506 raw = HIGH_REPR_SAT4;
507 isSpecial = true;
508 }
509 else {
510 raw = LOW_REPR_SAT4;
511 isSpecial = true;
512 }
513 }
514 ((float *)rawBuff)[idx] = raw;
515 }
516
517 else if(m_pixelType == GDT_Int32) {
518 int raw;
519
520 if(bufferVal >= VALID_MINI4) {
521 double filePixelValueDbl = (bufferVal - m_offset) /
522 m_scale;
523 if(filePixelValueDbl < VALID_MINI4 - 0.5) {
524 raw = LOW_REPR_SATI4;
525 isSpecial = true;
526 }
527 if(filePixelValueDbl > VALID_MAXI4) {
528 raw = HIGH_REPR_SATI4;
529 isSpecial = true;
530 }
531 else {
532 int filePixelValue = (int)round(filePixelValueDbl);
533
534 if(filePixelValue < VALID_MINI4) {
535 raw = LOW_REPR_SATI4;
536 isSpecial = true;
537 }
538 else if(filePixelValue > VALID_MAXI4) {
539 raw = HIGH_REPR_SATI4;
540 isSpecial = true;
541 }
542 else {
543 raw = filePixelValue;
544 }
545 }
546 }
547 else {
548 if(bufferVal == NULL8) {
549 raw = NULLI4;
550 isSpecial = true;
551 }
552 else if(bufferVal == LOW_INSTR_SAT8) {
553 raw = LOW_INSTR_SATI4;
554 isSpecial = true;
555 }
556 else if(bufferVal == LOW_REPR_SAT8) {
557 raw = LOW_REPR_SATI4;
558 isSpecial = true;
559 }
560 else if(bufferVal == HIGH_INSTR_SAT8) {
561 raw = HIGH_INSTR_SATI4;
562 isSpecial = true;
563 }
564 else if(bufferVal == HIGH_REPR_SAT8) {
565 raw = HIGH_REPR_SATI4;
566 isSpecial = true;
567 }
568 else {
569 raw = LOW_REPR_SATI4;
570 isSpecial = true;
571 }
572 }
573 ((int *)rawBuff)[idx] = raw;
574 }
575
576 else if(m_pixelType == GDT_UInt32) {
577 unsigned int raw;
578
579 if(bufferVal >= VALID_MINUI4) {
580 double filePixelValueDbl = (bufferVal - m_offset) /
581 m_scale;
582 if(filePixelValueDbl < VALID_MINUI4 - 0.5) {
583 raw = LOW_REPR_SATUI4;
584 isSpecial = true;
585 }
586 if(filePixelValueDbl > VALID_MAXUI4) {
587 raw = HIGH_REPR_SATUI4;
588 isSpecial = true;
589 }
590 else {
591 unsigned int filePixelValue = (unsigned int)round(filePixelValueDbl);
592
593 if(filePixelValue < VALID_MINUI4) {
594 raw = LOW_REPR_SATUI4;
595 isSpecial = true;
596 }
597 else if(filePixelValue > VALID_MAXUI4) {
598 raw = HIGH_REPR_SATUI4;
599 isSpecial = true;
600 }
601 else {
602 raw = filePixelValue;
603 }
604 }
605 }
606 else {
607 if(bufferVal == NULL8) {
608 raw = NULLUI4;
609 isSpecial = true;
610 }
611 else if(bufferVal == LOW_INSTR_SAT8) {
612 raw = LOW_INSTR_SATUI4;
613 isSpecial = true;
614 }
615 else if(bufferVal == LOW_REPR_SAT8) {
616 raw = LOW_REPR_SATUI4;
617 isSpecial = true;
618 }
619 else if(bufferVal == HIGH_INSTR_SAT8) {
620 raw = HIGH_INSTR_SATUI4;
621 isSpecial = true;
622 }
623 else if(bufferVal == HIGH_REPR_SAT8) {
624 raw = HIGH_REPR_SATUI4;
625 isSpecial = true;
626 }
627 else {
628 raw = LOW_REPR_SATUI4;
629 isSpecial = true;
630 }
631 }
632 ((unsigned int *)rawBuff)[idx] = raw;
633 }
634
635 else if(m_pixelType == GDT_Int16) {
636 short raw;
637
638 if(bufferVal >= VALID_MIN8) {
639 double filePixelValueDbl = (bufferVal - m_offset) /
640 m_scale;
641 if(filePixelValueDbl < VALID_MIN2 - 0.5) {
642 raw = LOW_REPR_SAT2;
643 isSpecial = true;
644 }
645 if(filePixelValueDbl > VALID_MAX2 + 0.5) {
646 raw = HIGH_REPR_SAT2;
647 isSpecial = true;
648 }
649 else {
650 int filePixelValue = (int)round(filePixelValueDbl);
651
652 if(filePixelValue < VALID_MIN2) {
653 raw = LOW_REPR_SAT2;
654 isSpecial = true;
655 }
656 else if(filePixelValue > VALID_MAX2) {
657 raw = HIGH_REPR_SAT2;
658 isSpecial = true;
659 }
660 else {
661 raw = filePixelValue;
662 }
663 }
664 }
665 else {
666 if(bufferVal == NULL8) {
667 raw = NULL2;
668 isSpecial = true;
669 }
670 else if(bufferVal == LOW_INSTR_SAT8) {
671 raw = LOW_INSTR_SAT2;
672 isSpecial = true;
673 }
674 else if(bufferVal == LOW_REPR_SAT8) {
675 raw = LOW_REPR_SAT2;
676 isSpecial = true;
677 }
678 else if(bufferVal == HIGH_INSTR_SAT8) {
679 raw = HIGH_INSTR_SAT2;
680 isSpecial = true;
681 }
682 else if(bufferVal == HIGH_REPR_SAT8) {
683 raw = HIGH_REPR_SAT2;
684 isSpecial = true;
685 }
686 else {
687 raw = LOW_REPR_SAT2;
688 isSpecial = true;
689 }
690 }
691 ((short *)rawBuff)[idx] = raw;
692 }
693
694 else if(m_pixelType == GDT_UInt16) {
695 unsigned short raw;
696
697 if(bufferVal >= VALID_MIN8) {
698 double filePixelValueDbl = (bufferVal - m_offset) /
699 m_scale;
700 if(filePixelValueDbl < VALID_MINU2 - 0.5) {
701 raw = LOW_REPR_SATU2;
702 isSpecial = true;
703 }
704 if(filePixelValueDbl > VALID_MAXU2 + 0.5) {
705 raw = HIGH_REPR_SATU2;
706 isSpecial = true;
707 }
708 else {
709 int filePixelValue = (int)round(filePixelValueDbl);
710
711 if(filePixelValue < VALID_MINU2) {
712 raw = LOW_REPR_SATU2;
713 isSpecial = true;
714 }
715 else if(filePixelValue > VALID_MAXU2) {
716 raw = HIGH_REPR_SATU2;
717 isSpecial = true;
718 }
719 else {
720 raw = filePixelValue;
721 }
722 }
723 }
724 else {
725 if(bufferVal == NULL8) {
726 raw = NULLU2;
727 isSpecial = true;
728 }
729 else if(bufferVal == LOW_INSTR_SAT8) {
730 raw = LOW_INSTR_SATU2;
731 isSpecial = true;
732 }
733 else if(bufferVal == LOW_REPR_SAT8) {
734 raw = LOW_REPR_SATU2;
735 isSpecial = true;
736 }
737 else if(bufferVal == HIGH_INSTR_SAT8) {
738 raw = HIGH_INSTR_SATU2;
739 isSpecial = true;
740 }
741 else if(bufferVal == HIGH_REPR_SAT8) {
742 raw = HIGH_REPR_SATU2;
743 isSpecial = true;
744 }
745 else {
746 raw = LOW_REPR_SATU2;
747 isSpecial = true;
748 }
749 }
750 ((unsigned short *)rawBuff)[idx] = raw;
751 }
752
753 else if(m_pixelType == GDT_Int8) {
754 signed char raw;
755
756 if(bufferVal >= VALID_MIN8) {
757 double filePixelValueDbl = (bufferVal - m_offset) /
758 m_scale;
759 if(filePixelValueDbl < VALID_MINS1 - 0.5) {
760 raw = LOW_REPR_SATS1;
761 isSpecial = true;
762 }
763 else if(filePixelValueDbl > VALID_MAXS1 + 0.5) {
764 raw = HIGH_REPR_SATS1;
765 isSpecial = true;
766 }
767 else {
768 int filePixelValue = (int)(filePixelValueDbl + 0.5);
769 if(filePixelValue < VALID_MINS1) {
770 raw = LOW_REPR_SATS1;
771 isSpecial = true;
772 }
773 else if(filePixelValue > VALID_MAXS1) {
774 raw = HIGH_REPR_SATS1;
775 isSpecial = true;
776 }
777 else {
778 raw = (signed char)(filePixelValue);
779 }
780 }
781 }
782 else {
783 if(bufferVal == NULL8) {
784 raw = NULLS1;
785 isSpecial = true;
786 }
787 else if(bufferVal == LOW_INSTR_SAT8) {
788 raw = LOW_INSTR_SATS1;
789 isSpecial = true;
790 }
791 else if(bufferVal == LOW_REPR_SAT8) {
792 raw = LOW_REPR_SATS1;
793 isSpecial = true;
794 }
795 else if(bufferVal == HIGH_INSTR_SAT8) {
796 raw = HIGH_INSTR_SATS1;
797 isSpecial = true;
798 }
799 else if(bufferVal == HIGH_REPR_SAT8) {
800 raw = HIGH_REPR_SATS1;
801 isSpecial = true;
802 }
803 else {
804 raw = LOW_REPR_SATS1;
805 isSpecial = true;
806 }
807 }
808 ((signed char *)rawBuff)[idx] = raw;
809 }
810
811 else if(m_pixelType == GDT_Byte) {
812 unsigned char raw;
813
814 if(bufferVal >= VALID_MIN8) {
815 double filePixelValueDbl = (bufferVal - m_offset) /
816 m_scale;
817 if(filePixelValueDbl < VALID_MIN1 - 0.5) {
818 raw = LOW_REPR_SAT1;
819 isSpecial = true;
820 }
821 else if(filePixelValueDbl > VALID_MAX1 + 0.5) {
822 raw = HIGH_REPR_SAT1;
823 isSpecial = true;
824 }
825 else {
826 int filePixelValue = (int)(filePixelValueDbl + 0.5);
827 if(filePixelValue < VALID_MIN1) {
828 raw = LOW_REPR_SAT1;
829 isSpecial = true;
830 }
831 else if(filePixelValue > VALID_MAX1) {
832 raw = HIGH_REPR_SAT1;
833 isSpecial = true;
834 }
835 else {
836 raw = (unsigned char)(filePixelValue);
837 }
838 }
839 }
840 else {
841 if(bufferVal == NULL8) {
842 raw = NULL1;
843 isSpecial = true;
844 }
845 else if(bufferVal == LOW_INSTR_SAT8) {
846 raw = LOW_INSTR_SAT1;
847 isSpecial = true;
848 }
849 else if(bufferVal == LOW_REPR_SAT8) {
850 raw = LOW_REPR_SAT1;
851 isSpecial = true;
852 }
853 else if(bufferVal == HIGH_INSTR_SAT8) {
854 raw = HIGH_INSTR_SAT1;
855 isSpecial = true;
856 }
857 else if(bufferVal == HIGH_REPR_SAT8) {
858 raw = HIGH_REPR_SAT1;
859 isSpecial = true;
860 }
861 else {
862 raw = LOW_REPR_SAT1;
863 isSpecial = true;
864 }
865 }
866 ((unsigned char *)rawBuff)[idx] = raw;
867 }
868 return isSpecial;
869 }
870}
virtual void updateLabels(Pvl &labels)
Function to update the labels with a Pvl object.
Handles converting buffers to and from disk.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
Namespace for the standard library.