diff options
Diffstat (limited to 'src/readers')
-rw-r--r-- | src/readers/ufo-edf-reader.c | 31 | ||||
-rw-r--r-- | src/readers/ufo-hdf5-reader.c | 13 | ||||
-rw-r--r-- | src/readers/ufo-raw-reader.c | 16 | ||||
-rw-r--r-- | src/readers/ufo-reader.c | 10 | ||||
-rw-r--r-- | src/readers/ufo-reader.h | 12 | ||||
-rw-r--r-- | src/readers/ufo-tiff-reader.c | 36 |
6 files changed, 92 insertions, 26 deletions
diff --git a/src/readers/ufo-edf-reader.c b/src/readers/ufo-edf-reader.c index cc52ef1..77d255b 100644 --- a/src/readers/ufo-edf-reader.c +++ b/src/readers/ufo-edf-reader.c @@ -26,6 +26,7 @@ struct _UfoEdfReaderPrivate { FILE *fp; + guint start; gssize size; gsize height; guint bytes_per_sample; @@ -68,6 +69,7 @@ ufo_edf_reader_open (UfoReader *reader, fseek (priv->fp, 0L, SEEK_END); priv->size = (gsize) ftell (priv->fp); fseek (priv->fp, 0L, SEEK_SET); + priv->start = start; return TRUE; } @@ -93,19 +95,22 @@ ufo_edf_reader_data_available (UfoReader *reader) return priv->fp != NULL && ftell (priv->fp) < priv->size; } -static void +static gsize ufo_edf_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step) + guint roi_step, + guint image_step) { UfoEdfReaderPrivate *priv; gsize num_bytes; gsize num_read; gssize offset; gchar *data; + gsize to_skip; + guint start = 0; priv = UFO_EDF_READER_GET_PRIVATE (reader); data = (gchar *) ufo_buffer_get_host_array (buffer, NULL); @@ -113,12 +118,16 @@ ufo_edf_reader_read (UfoReader *reader, /* size of the image width in bytes */ const gsize width = requisition->dims[0] * priv->bytes_per_sample; const guint num_rows = requisition->dims[1]; + if (priv->start) { + start = priv->start; + priv->start = 0; + } const gsize end_position = ftell (priv->fp) + priv->height * width; offset = 0; - /* Go to the first desired row */ - fseek (priv->fp, roi_y * width, SEEK_CUR); + /* Go to the first desired row at *start* image index */ + fseek (priv->fp, start * priv->height * width + roi_y * width, SEEK_CUR); if (roi_step == 1) { /* Read the full ROI at once if no stepping is specified */ @@ -126,14 +135,14 @@ ufo_edf_reader_read (UfoReader *reader, num_read = fread (data, 1, num_bytes, priv->fp); if (num_read != num_bytes) - return; + return 0; } else { for (guint i = 0; i < num_rows - 1; i++) { num_read = fread (data + offset, 1, width, priv->fp); if (num_read != width) - return; + return 0; offset += width; fseek (priv->fp, (roi_step - 1) * width, SEEK_CUR); @@ -144,12 +153,16 @@ ufo_edf_reader_read (UfoReader *reader, num_read = fread (data + offset, 1, width, priv->fp); if (num_read != width) - return; + return 0; } /* Go to the image end to be in a consistent state for the next read */ fseek (priv->fp, end_position, SEEK_SET); + /* Skip the desired number of images */ + to_skip = MIN (image_step - 1, (priv->size - (gsize) ftell (priv->fp)) / (priv->height * width)); + fseek (priv->fp, to_skip * priv->height * width, SEEK_CUR); + if ((G_BYTE_ORDER == G_LITTLE_ENDIAN) && priv->big_endian) { guint32 *conv = (guint32 *) ufo_buffer_get_host_array (buffer, NULL); guint n_pixels = requisition->dims[0] * requisition->dims[1]; @@ -157,6 +170,8 @@ ufo_edf_reader_read (UfoReader *reader, for (guint i = 0; i < n_pixels; i++) conv[i] = g_ntohl (conv[i]); } + + return to_skip + 1; } static void @@ -192,6 +207,7 @@ ufo_edf_reader_get_depth (const gchar *value, UfoBufferDepth *depth, guint *byte static gboolean ufo_edf_reader_get_meta (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, UfoBufferDepth *bitdepth, GError **error) { @@ -270,6 +286,7 @@ ufo_edf_reader_get_meta (UfoReader *reader, g_strfreev (key_value); } + *num_images = requisition->dims[0] * requisition->dims[1] * priv->bytes_per_sample / (priv->size - data_position); g_strfreev (tokens); g_free (header); return TRUE; diff --git a/src/readers/ufo-hdf5-reader.c b/src/readers/ufo-hdf5-reader.c index 039e520..e7c94df 100644 --- a/src/readers/ufo-hdf5-reader.c +++ b/src/readers/ufo-hdf5-reader.c @@ -116,18 +116,20 @@ ufo_hdf5_reader_data_available (UfoReader *reader) return priv->current < priv->dims[0]; } -static void +static gsize ufo_hdf5_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step) + guint roi_step, + guint image_step) { UfoHdf5ReaderPrivate *priv; gpointer data; hid_t dst_dataspace_id; hsize_t dst_dims[2]; + gsize num_read = 0; priv = UFO_HDF5_READER_GET_PRIVATE (reader); data = ufo_buffer_get_host_array (buffer, NULL); @@ -143,12 +145,16 @@ ufo_hdf5_reader_read (UfoReader *reader, H5Dread (priv->dataset_id, H5T_NATIVE_FLOAT, dst_dataspace_id, priv->src_dataspace_id, H5P_DEFAULT, data); H5Sclose (dst_dataspace_id); - priv->current++; + num_read = MIN (image_step, priv->dims[0] - priv->current); + priv->current += num_read; + + return num_read; } static gboolean ufo_hdf5_reader_get_meta (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, UfoBufferDepth *bitdepth, GError **error) { @@ -159,6 +165,7 @@ ufo_hdf5_reader_get_meta (UfoReader *reader, requisition->n_dims = 2; requisition->dims[0] = priv->dims[2]; requisition->dims[1] = priv->dims[1]; + *num_images = priv->dims[0]; *bitdepth = UFO_BUFFER_DEPTH_32F; return TRUE; } diff --git a/src/readers/ufo-raw-reader.c b/src/readers/ufo-raw-reader.c index d9b06b9..f57c0f8 100644 --- a/src/readers/ufo-raw-reader.c +++ b/src/readers/ufo-raw-reader.c @@ -123,19 +123,23 @@ ufo_raw_reader_data_available (UfoReader *reader) return priv->fp != NULL && pos >= 0 && (((gulong) pos) + priv->pre_offset + priv->frame_size) <= priv->total_size; } -static void +static gsize ufo_raw_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step) + guint roi_step, + guint image_step) { UfoRawReaderPrivate *priv; gchar *data; + gsize to_skip; + gsize page_size; priv = UFO_RAW_READER_GET_PRIVATE (reader); data = (gchar *) ufo_buffer_get_host_array (buffer, NULL); + page_size = priv->frame_size + priv->pre_offset + priv->post_offset; fseek (priv->fp, priv->pre_offset, SEEK_CUR); @@ -144,11 +148,18 @@ ufo_raw_reader_read (UfoReader *reader, g_warning ("Could not read enough data"); fseek (priv->fp, priv->post_offset, SEEK_CUR); + + /* Skip the desired number of images */ + to_skip = MIN (image_step - 1, (priv->total_size - (gsize) ftell (priv->fp)) / page_size); + fseek (priv->fp, to_skip * page_size, SEEK_CUR); + + return to_skip + 1; } static gboolean ufo_raw_reader_get_meta (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, UfoBufferDepth *bitdepth, GError **error) { @@ -158,6 +169,7 @@ ufo_raw_reader_get_meta (UfoReader *reader, requisition->n_dims = 2; requisition->dims[0] = priv->width; requisition->dims[1] = priv->height; + *num_images = priv->total_size / priv->frame_size; *bitdepth = priv->bitdepth; return TRUE; } diff --git a/src/readers/ufo-reader.c b/src/readers/ufo-reader.c index 499abf0..f831770 100644 --- a/src/readers/ufo-reader.c +++ b/src/readers/ufo-reader.c @@ -55,21 +55,23 @@ ufo_reader_data_available (UfoReader *reader) gboolean ufo_reader_get_meta (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, UfoBufferDepth *bitdepth, GError **error) { - return UFO_READER_GET_IFACE (reader)->get_meta (reader, requisition, bitdepth, error); + return UFO_READER_GET_IFACE (reader)->get_meta (reader, requisition, num_images, bitdepth, error); } -void +gsize ufo_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step) + guint roi_step, + guint image_step) { - UFO_READER_GET_IFACE (reader)->read (reader, buffer, requisition, roi_y, roi_height, roi_step); + return UFO_READER_GET_IFACE (reader)->read (reader, buffer, requisition, roi_y, roi_height, roi_step, image_step); } static void diff --git a/src/readers/ufo-reader.h b/src/readers/ufo-reader.h index 52c6c4b..0752506 100644 --- a/src/readers/ufo-reader.h +++ b/src/readers/ufo-reader.h @@ -48,14 +48,16 @@ struct _UfoReaderIface { gboolean (*data_available) (UfoReader *reader); gboolean (*get_meta) (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, guint *bitdepth, GError **error); - void (*read) (UfoReader *reader, + gsize (*read) (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step); + guint roi_step, + guint image_step); }; gboolean ufo_reader_can_open (UfoReader *reader, @@ -68,14 +70,16 @@ void ufo_reader_close (UfoReader *reader); gboolean ufo_reader_data_available (UfoReader *reader); gboolean ufo_reader_get_meta (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, UfoBufferDepth *bitdepth, GError **error); -void ufo_reader_read (UfoReader *reader, +gsize ufo_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step); + guint roi_step, + guint image_step); GType ufo_reader_get_type (void); diff --git a/src/readers/ufo-tiff-reader.c b/src/readers/ufo-tiff-reader.c index 0bac745..678a97b 100644 --- a/src/readers/ufo-tiff-reader.c +++ b/src/readers/ufo-tiff-reader.c @@ -26,6 +26,7 @@ struct _UfoTiffReaderPrivate { TIFF *tiff; gboolean more; + gsize num_images; }; static void ufo_reader_interface_init (UfoReaderIface *iface); @@ -59,8 +60,9 @@ ufo_tiff_reader_open (UfoReader *reader, UfoTiffReaderPrivate *priv; priv = UFO_TIFF_READER_GET_PRIVATE (reader); + priv->num_images = 0; priv->tiff = TIFFOpen (filename, "r"); - priv->more = TRUE; + priv->more = FALSE; if (priv->tiff == NULL) { g_set_error (error, UFO_TASK_ERROR, UFO_TASK_ERROR_SETUP, @@ -68,8 +70,18 @@ ufo_tiff_reader_open (UfoReader *reader, return FALSE; } - for (guint i = 0; i < start; i++) - priv->more = TIFFReadDirectory (priv->tiff) == 1; + do { + priv->num_images++; + } while (TIFFReadDirectory(priv->tiff)); + + if (start < priv->num_images) { + priv->more = TRUE; + if (TIFFSetDirectory (priv->tiff, start) != 1) { + g_set_error (error, UFO_TASK_ERROR, UFO_TASK_ERROR_SETUP, + "Cannot find first image in %s", filename); + return FALSE; + } + } return TRUE; } @@ -172,16 +184,18 @@ read_64_bit_data (UfoTiffReaderPrivate *priv, g_free (src); } -static void +static gsize ufo_tiff_reader_read (UfoReader *reader, UfoBuffer *buffer, UfoRequisition *requisition, guint roi_y, guint roi_height, - guint roi_step) + guint roi_step, + guint image_step) { UfoTiffReaderPrivate *priv; guint16 bits; + gsize num_read = 0; priv = UFO_TIFF_READER_GET_PRIVATE (reader); @@ -192,12 +206,21 @@ ufo_tiff_reader_read (UfoReader *reader, else read_data (priv, buffer, requisition, bits, roi_y, roi_height, roi_step); - priv->more = TIFFReadDirectory (priv->tiff) == 1; + do { + priv->more = TIFFReadDirectory (priv->tiff) == 1; + num_read++; + if (!priv->more) { + break; + } + } while (num_read < image_step); + + return num_read; } static gboolean ufo_tiff_reader_get_meta (UfoReader *reader, UfoRequisition *requisition, + gsize *num_images, UfoBufferDepth *bitdepth, GError **error) { @@ -219,6 +242,7 @@ ufo_tiff_reader_get_meta (UfoReader *reader, requisition->dims[0] = (gsize) width; requisition->dims[1] = (gsize) height; requisition->dims[2] = samples == 3 ? 3 : 0; + *num_images = priv->num_images; switch (bits_per_sample) { case 8: |