summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/sinks.rst9
-rw-r--r--src/ufo-write-task.c14
-rw-r--r--src/writers/ufo-writer.c71
-rw-r--r--src/writers/ufo-writer.h1
4 files changed, 81 insertions, 14 deletions
diff --git a/docs/sinks.rst b/docs/sinks.rst
index c78d083..a100fe5 100644
--- a/docs/sinks.rst
+++ b/docs/sinks.rst
@@ -45,7 +45,8 @@ File writer
Possible values are 8 and 16 which are saved as integer types and 32 bit
float. By default, the minimum and maximum for scaling is determined
automatically, however depending on the use case you should override
- this with the ``minimum`` and ``maximum`` properties.
+ this with the ``minimum`` and ``maximum`` properties. To avoid
+ rescaling, set the ``rescale`` property to ``FALSE``.
.. gobj:prop:: minimum:float
@@ -57,6 +58,12 @@ File writer
This value will represent the largest possible value for discrete bit
depths, i.e. 8 and 16 bit.
+ .. gobj:prop:: rescale:boolean
+
+ If ``TRUE`` and ``bits`` is set to a value less than 32, rescale values
+ either by looking for minimum and maximum values or using the values
+ provided by the user.
+
For JPEG files the following property applies:
.. gobj:prop:: quality:uint
diff --git a/src/ufo-write-task.c b/src/ufo-write-task.c
index c4fb643..d56512a 100644
--- a/src/ufo-write-task.c
+++ b/src/ufo-write-task.c
@@ -58,6 +58,7 @@ struct _UfoWriteTaskPrivate {
UfoBufferDepth depth;
gfloat minimum;
gfloat maximum;
+ gboolean rescale;
gboolean multi_file;
gboolean opened;
@@ -100,6 +101,7 @@ enum {
PROP_BITS,
PROP_MINIMUM,
PROP_MAXIMUM,
+ PROP_RESCALE,
#ifdef HAVE_JPEG
PROP_JPEG_QUALITY,
#endif
@@ -340,6 +342,7 @@ ufo_write_task_process (UfoTask *task,
image.depth = priv->depth;
image.min = priv->minimum;
image.max = priv->maximum;
+ image.rescale = priv->rescale;
for (guint i = 0; i < num_frames; i++) {
retry:
@@ -421,6 +424,9 @@ ufo_write_task_set_property (GObject *object,
case PROP_MINIMUM:
priv->minimum = g_value_get_float (value);
break;
+ case PROP_RESCALE:
+ priv->rescale = g_value_get_boolean (value);
+ break;
#ifdef HAVE_JPEG
case PROP_JPEG_QUALITY:
priv->jpeg_quality = g_value_get_uint (value);
@@ -606,6 +612,13 @@ ufo_write_task_class_init (UfoWriteTaskClass *klass)
-G_MAXFLOAT, G_MAXFLOAT, -G_MAXFLOAT,
G_PARAM_READWRITE);
+ properties[PROP_RESCALE] =
+ g_param_spec_boolean ("rescale",
+ "If true rescale values automatically or according to set min and max",
+ "If true rescale values automatically or according to set min and max",
+ TRUE,
+ G_PARAM_READWRITE);
+
#ifdef HAVE_JPEG
properties[PROP_JPEG_QUALITY] =
g_param_spec_uint ("jpeg-quality",
@@ -632,6 +645,7 @@ ufo_write_task_init(UfoWriteTask *self)
self->priv->depth = UFO_BUFFER_DEPTH_32F;
self->priv->minimum = G_MAXFLOAT;
self->priv->maximum = -G_MAXFLOAT;
+ self->priv->rescale = TRUE;
self->priv->writer = NULL;
self->priv->opened = FALSE;
self->priv->filename = NULL;
diff --git a/src/writers/ufo-writer.c b/src/writers/ufo-writer.c
index 512c0d5..03239a9 100644
--- a/src/writers/ufo-writer.c
+++ b/src/writers/ufo-writer.c
@@ -78,12 +78,9 @@ get_min_max (UfoWriterImage *image, gfloat *src, gsize n_elements, gfloat *min,
*min = cmin;
}
-static void
-convert_to_8bit (UfoWriterImage *image)
+static gsize
+get_number_of_pixels (UfoWriterImage *image)
{
- gfloat *src;
- guint8 *dst;
- gfloat max, min, scale;
gsize size;
size = image->requisition->dims[0] * image->requisition->dims[1];
@@ -91,6 +88,18 @@ convert_to_8bit (UfoWriterImage *image)
if (image->requisition->n_dims == 3 && image->requisition->dims[2] == 3)
size *= image->requisition->dims[2];
+ return size;
+}
+
+static void
+convert_and_rescale_to_8bit (UfoWriterImage *image)
+{
+ gfloat *src;
+ guint8 *dst;
+ gfloat max, min, scale;
+ gsize size;
+
+ size = get_number_of_pixels (image);
src = (gfloat *) image->data;
dst = (guint8 *) src;
get_min_max (image, src, size, &min, &max);
@@ -122,18 +131,31 @@ convert_to_8bit (UfoWriterImage *image)
}
static void
-convert_to_16bit (UfoWriterImage *image)
+convert_to_8bit (UfoWriterImage *image)
{
gfloat *src;
- guint16 *dst;
- gfloat max, min, scale;
+ guint8 *dst;
gsize size;
- size = image->requisition->dims[0] * image->requisition->dims[1];
+ size = get_number_of_pixels (image);
+ src = (gfloat *) image->data;
+ dst = (guint8 *) src;
- if (image->requisition->n_dims == 3 && image->requisition->dims[2] == 3)
- size *= image->requisition->dims[2];
+ for (gsize i = 0; i < size; i++)
+ dst[i] = (guint8) src[i];
+ image->depth = UFO_BUFFER_DEPTH_8U;
+}
+
+static void
+convert_and_rescale_to_16bit (UfoWriterImage *image)
+{
+ gfloat *src;
+ guint16 *dst;
+ gfloat max, min, scale;
+ gsize size;
+
+ size = get_number_of_pixels (image);
src = (gfloat *) image->data;
dst = (guint16 *) src;
get_min_max (image, src, size, &min, &max);
@@ -163,6 +185,23 @@ convert_to_16bit (UfoWriterImage *image)
image->depth = UFO_BUFFER_DEPTH_16U;
}
+static void
+convert_to_16bit (UfoWriterImage *image)
+{
+ gfloat *src;
+ guint16 *dst;
+ gsize size;
+
+ size = get_number_of_pixels (image);
+ src = (gfloat *) image->data;
+ dst = (guint16 *) src;
+
+ for (gsize i = 0; i < size; i++)
+ dst[i] = (guint16) src[i];
+
+ image->depth = UFO_BUFFER_DEPTH_16U;
+}
+
void
ufo_writer_convert_inplace (UfoWriterImage *image)
{
@@ -172,11 +211,17 @@ ufo_writer_convert_inplace (UfoWriterImage *image)
*/
switch (image->depth) {
case UFO_BUFFER_DEPTH_8U:
- convert_to_8bit (image);
+ if (image->rescale)
+ convert_and_rescale_to_8bit (image);
+ else
+ convert_to_8bit (image);
break;
case UFO_BUFFER_DEPTH_16U:
case UFO_BUFFER_DEPTH_16S:
- convert_to_16bit (image);
+ if (image->rescale)
+ convert_and_rescale_to_16bit (image);
+ else
+ convert_to_16bit (image);
break;
default:
break;
diff --git a/src/writers/ufo-writer.h b/src/writers/ufo-writer.h
index 2a6d0fb..b0c0ff6 100644
--- a/src/writers/ufo-writer.h
+++ b/src/writers/ufo-writer.h
@@ -39,6 +39,7 @@ typedef struct {
UfoBufferDepth depth;
gfloat min;
gfloat max;
+ gboolean rescale;
} UfoWriterImage;
struct _UfoWriterIface {