Author: post
Date: 2010-10-31 16:15:37 +0100 (Sun, 31 Oct 2010)
New Revision: 3599
Modified:
trunk/plugins/colorspace-prophoto/colorspace-prophoto.c
Log:
Add correct gamma function to Prophoto RGB.
Modified: trunk/plugins/colorspace-prophoto/colorspace-prophoto.c
===================================================================
--- trunk/plugins/colorspace-prophoto/colorspace-prophoto.c 2010-10-31
15:14:46 UTC (rev 3598)
+++ trunk/plugins/colorspace-prophoto/colorspace-prophoto.c 2010-10-31
15:15:37 UTC (rev 3599)
@@ -22,6 +22,7 @@
#include <rawstudio.h>
#include "config.h"
#include "gettext.h"
+#include <math.h> /* pow() */
#define RS_TYPE_PROPHOTO (rs_prophoto_type)
#define RS_PROPHOTO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RS_TYPE_PROPHOTO,
RSProphoto))
@@ -43,6 +44,7 @@
RS_DEFINE_COLOR_SPACE(rs_prophoto, RSProphoto)
static const RSIccProfile *get_icc_profile(const RSColorSpace *color_space,
gboolean linear_profile);
+static const RS1dFunction *get_gamma_function(const RSColorSpace *color_space);
G_MODULE_EXPORT void
rs_plugin_load(RSPlugin *plugin)
@@ -58,6 +60,7 @@
colorclass->get_icc_profile = get_icc_profile;
colorclass->name = "ProPhoto RGB";
colorclass->description = _("Large gamut color space");
+ colorclass->get_gamma_function = get_gamma_function;
klass->icc_profile = rs_icc_profile_new_from_file(PACKAGE_DATA_DIR "/"
PACKAGE "/profiles/prophoto.icc");
klass->icc_profile_linear =
rs_icc_profile_new_from_file(PACKAGE_DATA_DIR "/" PACKAGE
"/profiles/prophoto-linear.icc");
@@ -86,3 +89,74 @@
else
return RS_PROPHOTO_GET_CLASS(prophoto)->icc_profile;
}
+
+
+/* Gamma */
+
+static gdouble evaluate(const RS1dFunction *func, const gdouble x);
+static gdouble evaluate_inverse(const RS1dFunction *func, const gdouble y);
+
+#define RS_TYPE_PROPHOTO_GAMMA rs_prophoto_gamma_get_type()
+#define RS_PROPHOTO_GAMMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
RS_TYPE_PROPHOTO_GAMMA, RSProphotoGamma))
+#define RS_PROPHOTO_GAMMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
RS_TYPE_PROPHOTO_GAMMA, RSProphotoGammaClass))
+#define RS_IS_PROPHOTO_GAMMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
RS_TYPE_PROPHOTO_GAMMA))
+
+typedef struct {
+ RS1dFunction parent;
+} RSProphotoGamma;
+
+typedef struct {
+ RS1dFunctionClass parent_class;
+} RSProphotoGammaClass;
+
+GType rs_prophoto_gamma_get_type(void);
+
+RS1dFunction *rs_prophoto_gamma_new(void);
+
+G_DEFINE_TYPE (RSProphotoGamma, rs_prophoto_gamma, RS_TYPE_1D_FUNCTION)
+
+static void
+rs_prophoto_gamma_class_init(RSProphotoGammaClass *klass)
+{
+ RS1dFunctionClass *fclass = RS_1D_FUNCTION_CLASS(klass);
+
+ fclass->evaluate = evaluate;
+ fclass->evaluate_inverse = evaluate_inverse;
+}
+
+static void
+rs_prophoto_gamma_init(RSProphotoGamma *gamma)
+{
+}
+
+RS1dFunction *
+rs_prophoto_gamma_new(void)
+{
+ return RS_1D_FUNCTION(g_object_new(RS_TYPE_PROPHOTO_GAMMA, NULL));
+}
+
+static const RS1dFunction *
+get_gamma_function(const RSColorSpace *color_space)
+{
+ static GStaticMutex lock = G_STATIC_MUTEX_INIT;
+ static RS1dFunction *func = NULL;
+
+ g_static_mutex_lock(&lock);
+ if (!func)
+ func = rs_prophoto_gamma_new();
+ g_static_mutex_unlock(&lock);
+
+ return func;
+}
+
+static gdouble
+evaluate(const RS1dFunction *func, const gdouble x)
+{
+ return pow(x, 1.0/1.8);
+}
+
+static gdouble
+evaluate_inverse(const RS1dFunction *func, const gdouble y)
+{
+ return pow(y, 1.8);
+}
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit