11 #if !defined(CubeIoPolicy_h)
12 #define CubeIoPolicy_h
15 #include "IdlVariable.h"
17 #include "AlphaCube.h"
22 #include "SpecialPixel.h"
25 #include "tnt/tnt_array3d.h"
36 template <
class T>
struct RawIO {
38 void Extract(Brick &b, T *data, Cube &cube) {
39 T *ptr(static_cast<T *> (b.RawBuffer()));
40 for (
int i = 0 ; i < b.size() ; i++) {
46 void Inject(Brick &b, T *data, Cube &cube) {
47 T *ptr(static_cast<T *> (b.RawBuffer()));
48 for (
int i = 0 ; i < b.size() ; i++) {
56 if (rbuf.PixelType() == Isis::UnsignedByte) {
57 double *dbuf = rbuf.DoubleBuffer();
58 unsigned char *cbuf = (
unsigned char *) rbuf.RawBuffer();
59 for (
int i=0; i<rbuf.size(); i++) {
60 if (cbuf[i] == Isis::NULL1) {
61 dbuf[i] = Isis::NULL8;
63 else if (cbuf[i] == Isis::HIGH_REPR_SAT1) {
64 dbuf[i] = Isis::HIGH_REPR_SAT8;
67 dbuf[i] = (double) cbuf[i] * cube.multiplier() + cube.base();
71 else if (rbuf.PixelType() == Isis::SignedWord) {
72 double *dbuf = rbuf.DoubleBuffer();
73 short int *sbuf = (
short *) rbuf.RawBuffer();
74 for (
int i=0; i<rbuf.size(); i++) {
75 if (sbuf[i] < Isis::VALID_MIN2) {
76 if (sbuf[i] == Isis::NULL2) dbuf[i] = Isis::NULL8;
77 else if (sbuf[i] == Isis::LOW_INSTR_SAT2) dbuf[i] = Isis::LOW_INSTR_SAT8;
78 else if (sbuf[i] == Isis::LOW_REPR_SAT2) dbuf[i] = Isis::LOW_REPR_SAT8;
79 else if (sbuf[i] == Isis::HIGH_INSTR_SAT2) dbuf[i] = Isis::HIGH_INSTR_SAT8;
80 else if (sbuf[i] == Isis::HIGH_REPR_SAT2) dbuf[i] = Isis::HIGH_REPR_SAT8;
81 else dbuf[i] = Isis::LOW_REPR_SAT8;
84 dbuf[i] = (double) sbuf[i] * cube.multiplier() + cube.base();
89 double *dbuf = rbuf.DoubleBuffer();
90 float *fbuf = (
float *) rbuf.RawBuffer();
91 for (
int i=0; i<rbuf.size(); i++) {
92 if (fbuf[i] < Isis::VALID_MIN4) {
93 if (fbuf[i] == Isis::NULL4) dbuf[i] = Isis::NULL8;
94 else if (fbuf[i] == Isis::LOW_INSTR_SAT4) dbuf[i] = Isis::LOW_INSTR_SAT8;
95 else if (fbuf[i] == Isis::LOW_REPR_SAT4) dbuf[i] = Isis::LOW_REPR_SAT8;
96 else if (fbuf[i] == Isis::HIGH_INSTR_SAT4) dbuf[i] = Isis::HIGH_INSTR_SAT8;
97 else if (fbuf[i] == Isis::HIGH_REPR_SAT4) dbuf[i] = Isis::HIGH_REPR_SAT8;
98 else dbuf[i] = Isis::LOW_REPR_SAT8;
101 dbuf[i] = (double) fbuf[i];
112 T *ptr(static_cast<T *> (b.DoubleBuffer()));
113 for (
int i = 0 ; i < b.size() ; i++) {
119 void Inject(Brick &b, T *data, Cube &cube) {
120 T *ptr(static_cast<T *> (b.DoubleBuffer()));
121 for (
int i = 0 ; i < b.size() ; i++) {
133 CubeDims(
const int &ns,
const int &nl,
const int &nb = 1) :
160 s.SetSubArea(icube->lineCount(), icube->sampleCount(),
164 PvlGroup results(
"IDL_History");
165 s.UpdateLabel(icube, ocube, results);
175 template <
class>
class IOPolicy
186 void Read(Isis::Cube &cube, TNT::Array3D<T> &data) {
197 Brick brick(cube, ns, 1, 1);
198 for (
int b = 0 ; b < nb ; b++) {
199 for (
int l = 0 ; l < nl ; l++) {
200 brick.SetBasePosition(ss,sl+l,sb+b);
202 this->Extract(brick, data[b][l], cube);
207 void Write(TNT::Array3D<T> &data, Isis::Cube &cube) {
218 Brick brick(cube, ns, 1, 1);
219 for (
int b = 0 ; b < nb ; b++) {
220 for (
int l = 0 ; l < nl ; l++) {
221 brick.SetBasePosition(ss,sl+l,sb+b);
222 this->Inject(brick, data[b][l], cube);