diff options
author | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2018-01-05 15:38:54 +0100 |
---|---|---|
committer | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2018-01-05 15:38:54 +0100 |
commit | a2c42b35846f3c54c1e77ef8dc90766a2658f475 (patch) | |
tree | 944082bd892148d7ac9e26334a2b7ac6d18e67d7 | |
parent | b77a55940bf24bdfd1e0271df9f9b02654f678a7 (diff) | |
download | ufo-filters-a2c42b35846f3c54c1e77ef8dc90766a2658f475.tar.gz ufo-filters-a2c42b35846f3c54c1e77ef8dc90766a2658f475.tar.bz2 ufo-filters-a2c42b35846f3c54c1e77ef8dc90766a2658f475.tar.xz ufo-filters-a2c42b35846f3c54c1e77ef8dc90766a2658f475.zip |
Fix #153: handle 64 bit TIFFs gracefully
-rw-r--r-- | .travis.yml | 2 | ||||
-rw-r--r-- | src/readers/ufo-tiff-reader.c | 70 | ||||
-rw-r--r-- | src/ufo-read-task.c | 7 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/meson.build | 1 | ||||
-rwxr-xr-x | tests/test-153.sh | 6 |
6 files changed, 71 insertions, 18 deletions
diff --git a/.travis.yml b/.travis.yml index 09c88cd..cb710d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ env: before_install: - sudo apt-get install opencl-headers ocl-icd-opencl-dev libjson-glib-dev libzmq3-dev autoconf-archive libgl1-mesa-dev - - sudo apt-get install libtiff4-dev libhdf5-serial-dev libjpeg-dev libgsl0-dev libtiff-tools + - sudo apt-get install libtiff4-dev libhdf5-serial-dev libjpeg-dev libgsl0-dev libtiff-tools python-numpy python-tifffile - wget http://s3.amazonaws.com/omnia-ci/AMD-APP-SDKInstaller-v3.0.130.135-GA-linux64.tar.bz2; - tar -xjf AMD-APP-SDK*.tar.bz2; - AMDAPPSDK=${HOME}/AMDAPPSDK; diff --git a/src/readers/ufo-tiff-reader.c b/src/readers/ufo-tiff-reader.c index c801710..ea73d78 100644 --- a/src/readers/ufo-tiff-reader.c +++ b/src/readers/ufo-tiff-reader.c @@ -87,6 +87,55 @@ ufo_tiff_reader_data_available (UfoReader *reader) } static void +read_data (UfoTiffReaderPrivate *priv, + UfoBuffer *buffer, + UfoRequisition *requisition, + guint16 bits, + guint roi_y, + guint roi_height, + guint roi_step) +{ + gchar *dst; + gsize step; + gsize offset; + + step = requisition->dims[0] * bits / 8; + dst = (gchar *) ufo_buffer_get_host_array (buffer, NULL); + offset = 0; + + for (guint i = roi_y; i < roi_y + roi_height; i += roi_step) { + TIFFReadScanline (priv->tiff, dst + offset, i, 0); + offset += step; + } +} + +static void +read_64_bit_data (UfoTiffReaderPrivate *priv, + UfoBuffer *buffer, + UfoRequisition *requisition, + guint roi_y, + guint roi_height, + guint roi_step) +{ + gdouble *src; + gfloat *dst; + + dst = ufo_buffer_get_host_array (buffer, NULL); + src = g_new0 (gdouble, requisition->dims[0]); + + for (guint i = roi_y; i < roi_y + roi_height; i += roi_step) { + TIFFReadScanline (priv->tiff, src, i, 0); + + for (guint j = 0; j < requisition->dims[0]; j++) + dst[j] = (gfloat) src[j]; + + dst += requisition->dims[0]; + } + + g_free (src); +} + +static void ufo_tiff_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, @@ -95,29 +144,16 @@ ufo_tiff_reader_read (UfoReader *reader, guint roi_step) { UfoTiffReaderPrivate *priv; - gchar *data; - tsize_t result; - gsize offset; guint16 bits; - gsize step; priv = UFO_TIFF_READER_GET_PRIVATE (reader); TIFFGetField (priv->tiff, TIFFTAG_BITSPERSAMPLE, &bits); - step = requisition->dims[0] * bits / 8; - data = (gchar *) ufo_buffer_get_host_array (buffer, NULL); - offset = 0; - - for (guint i = roi_y; i < roi_y + roi_height; i += roi_step) { - result = TIFFReadScanline (priv->tiff, data + offset, i, 0); - - if (result == -1) { - g_warning ("Cannot read scanline"); - return; - } - offset += step; - } + if (bits == 64) + read_64_bit_data (priv, buffer, requisition, roi_y, roi_height, roi_step); + else + read_data (priv, buffer, requisition, bits, roi_y, roi_height, roi_step); priv->more = TIFFReadDirectory (priv->tiff) == 1; } diff --git a/src/ufo-read-task.c b/src/ufo-read-task.c index e2127ba..84b29d0 100644 --- a/src/ufo-read-task.c +++ b/src/ufo-read-task.c @@ -317,6 +317,13 @@ ufo_read_task_get_requisition (UfoTask *task, ufo_reader_get_meta (priv->reader, &width, &height, &priv->depth); + if (priv->depth > 32) + /* + * We have to take care of this in the writers, because we cannot + * allocate larger buffers than those with float elements. + */ + priv->depth = UFO_BUFFER_DEPTH_32F; + if (priv->roi_y >= height) { g_warning ("read: vertical ROI start %i >= height %zu", priv->roi_y, height); priv->roi_y = 0; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 97f2a71..537eb88 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,3 +8,6 @@ add_test(test_142 add_test(test_149 ${BASH} "${CMAKE_CURRENT_SOURCE_DIR}/test-149.sh") + +add_test(test_153 + ${BASH} "${CMAKE_CURRENT_SOURCE_DIR}/test-153.sh") diff --git a/tests/meson.build b/tests/meson.build index 25d0d69..add1c02 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,3 +1,4 @@ test('test-file-write-regression', find_program('test-file-write-regression.sh')) test('test-142', find_program('test-142.sh')) test('test-149', find_program('test-149.sh')) +test('test-153', find_program('test-153.sh')) diff --git a/tests/test-153.sh b/tests/test-153.sh new file mode 100755 index 0000000..d960c6f --- /dev/null +++ b/tests/test-153.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +python -c "import numpy; import tifffile; tifffile.imsave('d64.tif', numpy.arange(0, 64).reshape((8, 8)).astype(numpy.float64))" + +ufo-launch -q read path=d64.tif ! null +exit $? |