summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml2
-rw-r--r--src/readers/ufo-tiff-reader.c70
-rw-r--r--src/ufo-read-task.c7
-rw-r--r--tests/CMakeLists.txt3
-rw-r--r--tests/meson.build1
-rwxr-xr-xtests/test-153.sh6
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 $?