- bHeaderWritten = false;
- bDataWritten = false;
-}
-
-template<class T>
-Array2dFile<T>::~Array2dFile (void)
-{
- fileClose ();
-}
-
-
-template<class T>
-void
-Array2dFile<T>::fileClose (void)
-{
- if (m_pFS) {
- headerWrite ();
- m_pFS->close ();
- m_pFS = NULL;
- }
-}
-
-template<class T>
-bool
-Array2dFile<T>::fileCreate (void)
-{
- m_pFS = new frnetorderstream (filename.c_str(), ios::out | ios::in | ios::trunc | ios::binary);
- if (! m_pFS) {
- sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", filename.c_str());
- return (false);
- }
- headerWrite();
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::fileRead (void)
-{
- m_pFS = new frnetorderstream (filename.c_str(), ios::out | ios::in | ios::binary | ios::nocreate);
- if (m_pFS->fail()) {
- sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", filename.c_str());
- return (false);
- }
-
- if (! headerRead())
- return false;
-
- array.initSetSize(mNX, mNY);
-
- arrayDataRead();
-
- return (true);
-}
-
-template<class T>
-void
-Array2dFile<T>::setAxisIncrement (double incX, double incY)
-{
- axis_increment_known = true;
- mIncX = incX;
- mIncY = incY;
-}
-
-template<class T>
-void
-Array2dFile<T>::setAxisExtent (double minX, double maxX, double minY, double maxY)
-{
- axis_extent_known = true;
- mMinX = minX;
- mMaxY = maxX;
- mMinX = minX;
- mMaxY = maxY;
-}
-
-template<class T>
-void
-Array2dFile<T>::getPixelValueRange (T& pvmin, T& pvmax) const
-{
- T** da = array.getArray();
- if (da) {
- pvmax = pvmin = da[0][0];
- for (int ix = 0; ix < mNX; ix++)
- for (int iy = 0; iy < mNY; iy++)
- if (pvmax < da[ix][iy])
- pvmax = da[ix][iy];
- else if (pvmin > da[ix][iy])
- pvmin = da[ix][iy];
- }
-}
-
-template<class T>
-void
-Array2dFile<T>::doPixelOffsetScale (double offset, double scale)
-{
- T** ad = array.getArray();
- if (ad) {
- mOffsetPV = offset;
- mScalePV = scale;
-
- for (unsigned int ix = 0; ix < mNX; ix++)
- for (unsigned int iy = 0; iy < mNY; iy++)
- ad[ix][iy] = (ad[ix][iy] - offset) * scale;
- }
-}
-
-template<class T>
-bool
-Array2dFile<T>::headerRead (void)
-{
- if (! m_pFS) {
- sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
- return (false);
- }
-
- m_pFS->seekg (0);
- kuint16 file_signature;
- kuint16 file_mPixelSize;
- kuint16 file_mPixelType;
-
- m_pFS->readInt16 (headersize);
- m_pFS->readInt16 (file_signature);
- m_pFS->readInt16 (num_labels);
- m_pFS->readInt16 (file_mPixelType);
- m_pFS->readInt16 (file_mPixelSize);
- m_pFS->readInt32 (mNX);
- m_pFS->readInt32 (mNY);
- m_pFS->readInt16 (axis_increment_known);
- m_pFS->readFloat64 (mIncX);
- m_pFS->readFloat64 (mIncY);
- m_pFS->readInt16 (axis_extent_known);
- m_pFS->readFloat64 (mMinX);
- m_pFS->readFloat64 (mMaxX);
- m_pFS->readFloat64 (mMinY);
- m_pFS->readFloat64 (mMaxY);
- m_pFS->readFloat64 (mOffsetPV);
- m_pFS->readFloat64 (mScalePV);
-
- int read_headersize = m_pFS->tellg();
- if (read_headersize != headersize) {
- sys_error (ERR_WARNING, "Read headersize %d != file headersize %d", read_headersize, headersize);
- return (false);
- }
- if (file_signature != signature) {
- sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, signature);
- return (false);
- }
- if (file_mPixelType != mPixelType) {
- sys_error (ERR_WARNING, "File pixel type %d != class pixel type %d", file_mPixelType, mPixelType);
- return (false);
- }
- if (file_mPixelSize != mPixelSize) {
- sys_error (ERR_WARNING, "File pixel size %d != class pixel size %d", file_mPixelSize, mPixelSize);
- return (false);
- }
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::headerWrite (void)
-{
- if (! m_pFS) {
- sys_error (ERR_WARNING, "Tried to write header with file closed");
- return (false);
- }
-
- m_pFS->seekp (0);
- m_pFS->writeInt16 (headersize);
- m_pFS->writeInt16 (signature);
- m_pFS->writeInt16 (num_labels);
- m_pFS->writeInt16 (mPixelType);
- m_pFS->writeInt16 (mPixelSize);
- m_pFS->writeInt32 (mNX);
- m_pFS->writeInt32 (mNY);
- m_pFS->writeInt16 (axis_increment_known);
- m_pFS->writeFloat64 (mIncX);
- m_pFS->writeFloat64 (mIncY);
- m_pFS->writeInt16 (axis_extent_known);
- m_pFS->writeFloat64 (mMinX);
- m_pFS->writeFloat64 (mMaxX);
- m_pFS->writeFloat64 (mMinY);
- m_pFS->writeFloat64 (mMaxY);
- m_pFS->writeFloat64 (mOffsetPV);
- m_pFS->writeFloat64 (mScalePV);
-
- headersize = m_pFS->tellp();
- m_pFS->writeInt16 (headersize);
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::arrayDataWrite (void)
-{
- if (! m_pFS) {
- sys_error (ERR_WARNING, "Tried to arrayDataWrite with !m_pFS");
- return (false);
- }
-
- T** da = array.getArray();
- if (! da)
- return (false);
-
- m_pFS->seekp (headersize);
- for (unsigned int ix = 0; ix < mNX; ix++) {
- if (NativeBigEndian()) {
- for (unsigned int iy = 0; iy < mNY; iy++) {
- T value = da[ix][iy];
- ConvertReverseNetworkOrder (&value, sizeof(T));
- m_pFS->write (&value, mPixelSize);
- }
- } else
- m_pFS->write (da[ix], sizeof(T) * mNY);
- }
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::arrayDataRead (void)
-{
- if (! m_pFS) {
- sys_error (ERR_WARNING, "Tried to arrayDataRead with !m_pFS");
- return (false);
- }
-
- T** da = array.getArray();
- if (! da)
- return (false);
-
- m_pFS->seekg (headersize);
- T pixelBuffer;
- for (int ix = 0; ix < mNX; ix++) {
- if (NativeBigEndian()) {
- for (unsigned int iy = 0; iy < mNY; iy++) {
- m_pFS->read (&pixelBuffer, mPixelSize);
- ConvertReverseNetworkOrder (&pixelBuffer, sizeof(T));
- da[ix][iy] = pixelBuffer;
- }
- } else
- m_pFS->read (da[ix], sizeof(T) * mNY);
- }
-
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::labelSeek (unsigned int label_num)
-{
- if (label_num > num_labels) {
- sys_error (ERR_WARNING, "label_num %d > num_labels %d [labelSeek]");
- return (false);
- }
-
- if (array.getArray() == NULL) { // Could not have written data if array not allocated
- sys_error (ERR_WARNING, "array == NULL [labelSeek]");
- return (false);
- }
-
- off_t pos = headersize + array.sizeofArray();
- m_pFS->seekg (pos);
-
- for (int i = 0; i < label_num; i++)
- {
- pos += 22; // Skip to string length
- m_pFS->seekg (pos);
-
- kuint16 strlength;
- m_pFS->readInt16 (strlength);
- pos += 2 + strlength; // Skip label string length + data
- m_pFS->seekg (pos);
- }
-
- if (! m_pFS)
- return false;
-
- return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::labelRead (Array2dFileLabel& label, unsigned int label_num)