Skip to content
Snippets Groups Projects
Commit a34f8026 authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

cleanup ctd

parent 07fee311
No related branches found
No related tags found
1 merge request!1628simplify and unify API and code for reading or writing data files
......@@ -86,19 +86,17 @@ void IO::writeTiff(const Datafield& data, std::ostream& output_stream)
Datafield* IO::readTiff(std::istream& input_stream)
{
TIFF* m_tiff;
uint16_t m_bitsPerSample, m_samplesPerPixel, m_sampleFormat;
std::unique_ptr<Datafield> m_data;
m_tiff = TIFFStreamOpen("MemTIFF", &input_stream);
if (!m_tiff)
TIFF* tiffstream = TIFFStreamOpen("MemTIFF", &input_stream);
if (!tiffstream)
throw std::runtime_error("Cannot open the TIFF file");
//... Read header.
uint32_t w, h;
if (!TIFFGetField(m_tiff, TIFFTAG_IMAGEWIDTH, &w)
|| !TIFFGetField(m_tiff, TIFFTAG_IMAGELENGTH, &h)) {
if (!TIFFGetField(tiffstream, TIFFTAG_IMAGEWIDTH, &w)
|| !TIFFGetField(tiffstream, TIFFTAG_IMAGELENGTH, &h)) {
throw std::runtime_error("Cannot read TIFF file: missing width/height in header");
}
......@@ -106,23 +104,23 @@ Datafield* IO::readTiff(std::istream& input_stream)
const size_t height = (size_t)h;
uint16_t orientationTag(0);
TIFFGetField(m_tiff, TIFFTAG_ORIENTATION, &orientationTag);
TIFFGetField(tiffstream, TIFFTAG_ORIENTATION, &orientationTag);
bool good = true;
// BitsPerSample defaults to 1 according to the TIFF spec.
if (!TIFFGetField(m_tiff, TIFFTAG_BITSPERSAMPLE, &m_bitsPerSample))
if (!TIFFGetField(tiffstream, TIFFTAG_BITSPERSAMPLE, &m_bitsPerSample))
m_bitsPerSample = 1;
if (8 != m_bitsPerSample && 16 != m_bitsPerSample && 32 != m_bitsPerSample)
good = false;
// they may be e.g. grayscale with 2 samples per pixel
if (!TIFFGetField(m_tiff, TIFFTAG_SAMPLESPERPIXEL, &m_samplesPerPixel))
if (!TIFFGetField(tiffstream, TIFFTAG_SAMPLESPERPIXEL, &m_samplesPerPixel))
m_samplesPerPixel = 1;
if (m_samplesPerPixel != 1)
good = false;
if (!TIFFGetField(m_tiff, TIFFTAG_SAMPLEFORMAT, &m_sampleFormat))
if (!TIFFGetField(tiffstream, TIFFTAG_SAMPLEFORMAT, &m_sampleFormat))
m_sampleFormat = 1;
switch (m_sampleFormat) {
......@@ -150,7 +148,7 @@ Datafield* IO::readTiff(std::istream& input_stream)
ASSERT(0 == m_bitsPerSample % 8);
uint16_t bytesPerSample = m_bitsPerSample / 8;
tmsize_t buf_size = TIFFScanlineSize(m_tiff);
tmsize_t buf_size = TIFFScanlineSize(tiffstream);
tmsize_t expected_size = bytesPerSample * width;
if (buf_size != expected_size)
throw std::runtime_error("Cannot read TIFF file: wrong scanline size");
......@@ -159,8 +157,9 @@ Datafield* IO::readTiff(std::istream& input_stream)
if (!buf)
throw std::runtime_error("Cannot read TIFF file: failed allocating buffer");
m_data.reset(new Datafield({newEquiDivision("x", width, 0.0, double(width)),
newEquiDivision("y", height, 0.0, double(height))}));
auto data = std::make_unique<Datafield>(
std::vector<const Scale*>{newEquiDivision("x", width, 0.0, double(width)),
newEquiDivision("y", height, 0.0, double(height))});
std::vector<int8_t> line_buf;
line_buf.resize(buf_size, 0);
......@@ -168,7 +167,7 @@ Datafield* IO::readTiff(std::istream& input_stream)
std::vector<unsigned> axes_indices(2);
for (uint32_t row = 0; row < (uint32_t)height; row++) {
if (TIFFReadScanline(m_tiff, buf, row) < 0)
if (TIFFReadScanline(tiffstream, buf, row) < 0)
throw std::runtime_error("Cannot read TIFF file: error in scanline.");
memcpy(&line_buf[0], buf, buf_size);
......@@ -176,7 +175,7 @@ Datafield* IO::readTiff(std::istream& input_stream)
for (unsigned col = 0; col < width; ++col) {
axes_indices[0] = col;
axes_indices[1] = static_cast<unsigned>(height) - 1 - row;
size_t global_index = m_data->frame().toGlobalIndex(axes_indices);
size_t global_index = data->frame().toGlobalIndex(axes_indices);
void* incoming = &line_buf[col * bytesPerSample];
double sample = 0;
......@@ -215,13 +214,13 @@ Datafield* IO::readTiff(std::istream& input_stream)
throw std::runtime_error("Cannot read TIFF file: unexpected sample format");
}
(*m_data)[global_index] = sample;
(*data)[global_index] = sample;
}
}
_TIFFfree(buf);
TIFFClose(m_tiff);
TIFFClose(tiffstream);
return m_data->clone();
return data.release();
}
#endif // BA_TIFF_SUPPORT
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment