Author: abrander
Date: 2009-10-15 16:51:02 +0200 (Thu, 15 Oct 2009)
New Revision: 2717
Added:
trunk/librawstudio/rs-1d-function.c
trunk/librawstudio/rs-1d-function.h
Modified:
trunk/librawstudio/Makefile.am
trunk/librawstudio/rawstudio.h
Log:
Added RS1dFunction.
Modified: trunk/librawstudio/Makefile.am
===================================================================
--- trunk/librawstudio/Makefile.am 2009-10-14 14:26:41 UTC (rev 2716)
+++ trunk/librawstudio/Makefile.am 2009-10-15 14:51:02 UTC (rev 2717)
@@ -12,6 +12,7 @@
rs-plugin.h \
rs-rawfile.h \
rs-exif.h \
+ rs-1d-function.h \
rs-icc-profile.h \
rs-image.h \
rs-image16.h \
@@ -46,6 +47,7 @@
rs-plugin.c rs-plugin.h \
rs-rawfile.c rs-rawfile.h \
rs-exif.cc rs-exif.h \
+ rs-1d-function.c rs-1d-function.h \
rs-icc-profile.c rs-icc-profile.h \
rs-image.c rs-image.h \
rs-image16.c rs-image16.h \
Modified: trunk/librawstudio/rawstudio.h
===================================================================
--- trunk/librawstudio/rawstudio.h 2009-10-14 14:26:41 UTC (rev 2716)
+++ trunk/librawstudio/rawstudio.h 2009-10-15 14:51:02 UTC (rev 2717)
@@ -32,6 +32,7 @@
#include "rs-rawfile.h"
#include "rs-settings.h"
#include "rs-exif.h"
+#include "rs-1d-function.h"
#include "rs-icc-profile.h"
#include "rs-image.h"
#include "rs-image16.h"
Added: trunk/librawstudio/rs-1d-function.c
===================================================================
--- trunk/librawstudio/rs-1d-function.c (rev 0)
+++ trunk/librawstudio/rs-1d-function.c 2009-10-15 14:51:02 UTC (rev 2717)
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2006-2009 Anders Brander <[email protected]> and
+ * Anders Kvist <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA.
+ */
+
+#include "rs-1d-function.h"
+
+G_DEFINE_TYPE(RS1dFunction, rs_1d_function, G_TYPE_OBJECT)
+
+static void
+rs_1d_function_class_init(RS1dFunctionClass *klass)
+{
+}
+
+static void
+rs_1d_function_init(RS1dFunction *func)
+{
+}
+
+/**
+ * Instantiate a new RS1dFunction, it will behave as an identity function (y =
x)
+ * @return A new RS1dFunction with arefcount of 1.
+ */
+RS1dFunction *
+rs_1d_function_new(void)
+{
+ return g_object_new (RS_TYPE_1D_FUNCTION, NULL);
+}
+
+/**
+ * Behaves like #rs_1d_function_new but returns a singleton
+ * @return A new RS1dFunction singleton which should not be unreffed
+ */
+RS1dFunction *
+rs_1d_function_new_singleton(void)
+{
+ static GStaticMutex lock = G_STATIC_MUTEX_INIT;
+ static RS1dFunction *func = NULL;
+
+ g_static_mutex_lock(&lock);
+ if (!func)
+ func = rs_1d_function_new();
+ g_static_mutex_unlock(&lock);
+
+ return func;
+}
+
+/**
+ * Map x to a new y value
+ * @param func A RS1dFunction
+ * @param x An input parameter in the range 0.0-1.0
+ * @return Mapped value for x
+ */
+gdouble
+rs_1d_function_evaluate(RS1dFunction *func, gdouble x)
+{
+ g_assert(RS_IS_1D_FUNCTION(func));
+
+ RS1dFunctionEvaluate *evaluate =
RS_1D_FUNCTION_GET_CLASS(func)->evaluate;
+
+ if (evaluate)
+ return evaluate(func, x);
+ else
+ return x;
+}
+
+/**
+ * Map y to a new x value
+ * @param func A RS1dFunction
+ * @param x An input parameter in the range 0.0-1.0
+ * @return Inverse value for y
+ */
+gdouble
+rs_1d_function_evaluate_inverse(RS1dFunction *func, gdouble y)
+{
+ g_assert(RS_IS_1D_FUNCTION(func));
+
+ RS1dFunctionEvaluate *evaluate_inverse =
RS_1D_FUNCTION_GET_CLASS(func)->evaluate_inverse;
+
+ if (evaluate_inverse)
+ return evaluate_inverse(func, y);
+ else
+ return y;
+}
+
+/**
+ * Return TRUE if rs_1d_function_evaluate(#func, x) == x for all x
+ * @param func A RS1dFunction
+ * @return TRUE if rs_1d_function_evaluate(#func, x) == x for all x, FALSE
otherwise
+ */
+gboolean
+rs_1d_function_is_identity(RS1dFunction *func)
+{
+ g_assert(RS_IS_1D_FUNCTION(func));
+
+ RS1dFunctionIsIdentity *is_identity =
RS_1D_FUNCTION_GET_CLASS(func)->is_identity;
+ RS1dFunctionEvaluate *evaluate =
RS_1D_FUNCTION_GET_CLASS(func)->evaluate;
+
+ if (!is_identity && !evaluate)
+ return TRUE;
+ else if (is_identity)
+ return is_identity(func);
+ else
+ return FALSE;
+}
Added: trunk/librawstudio/rs-1d-function.h
===================================================================
--- trunk/librawstudio/rs-1d-function.h (rev 0)
+++ trunk/librawstudio/rs-1d-function.h 2009-10-15 14:51:02 UTC (rev 2717)
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2006-2009 Anders Brander <[email protected]> and
+ * Anders Kvist <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA.
+ */
+
+#ifndef RS_1D_FUNCTION_H
+#define RS_1D_FUNCTION_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define RS_TYPE_1D_FUNCTION rs_1d_function_get_type()
+#define RS_1D_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
RS_TYPE_1D_FUNCTION, RS1dFunction))
+#define RS_1D_FUNCTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
RS_TYPE_1D_FUNCTION, RS1dFunctionClass))
+#define RS_IS_1D_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
RS_TYPE_1D_FUNCTION))
+#define RS_IS_1D_FUNCTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
RS_TYPE_1D_FUNCTION))
+#define RS_1D_FUNCTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
RS_TYPE_1D_FUNCTION, RS1dFunctionClass))
+
+typedef struct {
+ GObject parent;
+} RS1dFunction;
+
+typedef gdouble (RS1dFunctionEvaluate)(RS1dFunction *func, gdouble x);
+typedef gboolean (RS1dFunctionIsIdentity)(RS1dFunction *func);
+
+typedef struct {
+ GObjectClass parent_class;
+
+ RS1dFunctionIsIdentity *is_identity;
+ RS1dFunctionEvaluate *evaluate;
+ RS1dFunctionEvaluate *evaluate_inverse;
+} RS1dFunctionClass;
+
+GType rs_1d_function_get_type(void);
+
+/**
+ * Instantiate a new RS1dFunction, it will behave as an identity function (y =
x)
+ * @return A new RS1dFunction with arefcount of 1.
+ */
+RS1dFunction *
+rs_1d_function_new(void);
+
+/**
+ * Behaves like #rs_1d_function_new but returns a singleton
+ * @return A new RS1dFunction singleton which should not be unreffed
+ */
+RS1dFunction *
+rs_1d_function_new_singleton(void);
+
+/**
+ * Map x to a new y value
+ * @param func A RS1dFunction
+ * @param x An input parameter in the range 0.0-1.0
+ * @return Mapped value for x
+ */
+gdouble
+rs_1d_function_evaluate(RS1dFunction *func, gdouble x);
+
+/**
+ * Map y to a new x value
+ * @param func A RS1dFunction
+ * @param x An input parameter in the range 0.0-1.0
+ * @return Inverse value for y
+ */
+gdouble
+rs_1d_function_evaluate_inverse(RS1dFunction *func, gdouble y);
+
+/**
+ * Return TRUE if rs_1d_function_evaluate(#func, x) == x for all x
+ * @param func A RS1dFunction
+ * @return TRUE if rs_1d_function_evaluate(#func, x) == x for all x, FALSE
otherwise
+ */
+gboolean
+rs_1d_function_is_identity(RS1dFunction *func);
+
+G_END_DECLS
+
+#endif /* RS_1D_FUNCTION_H */
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit