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

Reply via email to