Author: abrander
Date: 2010-02-14 16:59:28 +0100 (Sun, 14 Feb 2010)
New Revision: 3224
Added:
trunk/librawstudio/rs-color-space-selector.c
trunk/librawstudio/rs-color-space-selector.h
Modified:
trunk/librawstudio/Makefile.am
trunk/librawstudio/rawstudio.h
trunk/librawstudio/rs-output.c
Log:
Added generic profile selection to output profiles.
Modified: trunk/librawstudio/Makefile.am
===================================================================
--- trunk/librawstudio/Makefile.am 2010-02-14 15:22:54 UTC (rev 3223)
+++ trunk/librawstudio/Makefile.am 2010-02-14 15:59:28 UTC (rev 3224)
@@ -98,6 +98,7 @@
rs-profile-factory.c rs-profile-factory.h rs-profile-factory-model.h \
rs-profile-selector.c rs-profile-selector.h \
rs-profile-camera.c rs-profile-camera.h \
+ rs-color-space-selector.c rs-color-space-selector.h \
rs-stock.c rs-stock.h
librawstudio_1_1_la_LIBADD = @PACKAGE_LIBS@ @LIBJPEG@ @LIBTIFF@ $(INTLLIBS)
Modified: trunk/librawstudio/rawstudio.h
===================================================================
--- trunk/librawstudio/rawstudio.h 2010-02-14 15:22:54 UTC (rev 3223)
+++ trunk/librawstudio/rawstudio.h 2010-02-14 15:59:28 UTC (rev 3224)
@@ -70,6 +70,7 @@
#include "rs-dcp-file.h"
#include "rs-profile-factory.h"
#include "rs-profile-selector.h"
+#include "rs-color-space-selector.h"
#include "x86-cpu.h"
Added: trunk/librawstudio/rs-color-space-selector.c
===================================================================
--- trunk/librawstudio/rs-color-space-selector.c
(rev 0)
+++ trunk/librawstudio/rs-color-space-selector.c 2010-02-14 15:59:28 UTC
(rev 3224)
@@ -0,0 +1,183 @@
+/*
+ * * Copyright (C) 2006-2010 Anders Brander <[email protected]>,
+ * * Anders Kvist <[email protected]> and Klaus Post <[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 <glib.h>
+#include <gtk/gtk.h>
+#include "rawstudio.h"
+#include "rs-color-space-selector.h"
+
+G_DEFINE_TYPE(RSColorSpaceSelector, rs_color_space_selector,
GTK_TYPE_COMBO_BOX)
+
+enum {
+ COLUMN_TEXT,
+ COLUMN_TYPENAME,
+ COLUMN_COLORSPACE,
+ NUM_COLUMNS
+};
+
+enum {
+ SELECTED_SIGNAL,
+ SIGNAL_LAST
+};
+
+static gint signals[SIGNAL_LAST];
+
+#define COLOR_SPACE_SELECTOR_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o),
RS_TYPE_COLOR_SPACE_SELECTOR, RSColorSpaceSelectorPrivate))
+
+struct _RSColorSpaceSelectorPrivate {
+ GtkTreeModel *model;
+
+ gboolean dispose_has_run;
+};
+
+static void
+rs_color_space_selector_dispose(GObject *object)
+{
+ RSColorSpaceSelector *selector = RS_COLOR_SPACE_SELECTOR(object);
+
+ if (!selector->priv->dispose_has_run)
+ {
+ selector->priv->dispose_has_run = TRUE;
+ }
+
+ G_OBJECT_CLASS(rs_color_space_selector_parent_class)->dispose(object);
+}
+
+static void
+changed(GtkComboBox *combo_box)
+{
+ RSColorSpace *colorspace = NULL;
+ GtkTreeIter iter;
+ RSColorSpaceSelector *selector = RS_COLOR_SPACE_SELECTOR(combo_box);
+
+ if (gtk_combo_box_get_active_iter(combo_box, &iter))
+ {
+ gtk_tree_model_get(selector->priv->model, &iter,
COLUMN_COLORSPACE, &colorspace, -1);
+
+ if (colorspace)
+ g_signal_emit(selector, signals[SELECTED_SIGNAL], 0,
colorspace);
+ }
+}
+
+static void
+rs_color_space_selector_class_init(RSColorSpaceSelectorClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GtkComboBoxClass *combo_class = GTK_COMBO_BOX_CLASS(klass);
+
+ g_type_class_add_private(klass, sizeof(RSColorSpaceSelectorPrivate));
+
+ object_class->dispose = rs_color_space_selector_dispose;
+
+ combo_class->changed = changed;
+
+ signals[SELECTED_SIGNAL] = g_signal_new("colorspace-selected",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, RS_TYPE_COLOR_SPACE);
+}
+
+static void
+rs_color_space_selector_init(RSColorSpaceSelector *selector)
+{
+ GtkComboBox *combo = GTK_COMBO_BOX(selector);
+
+ selector->priv = COLOR_SPACE_SELECTOR_PRIVATE(selector);
+
+ selector->priv->model = GTK_TREE_MODEL(gtk_list_store_new(NUM_COLUMNS,
G_TYPE_STRING, G_TYPE_STRING, RS_TYPE_COLOR_SPACE));
+
+ GtkCellRenderer *cell = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), cell, TRUE );
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), cell,
+ "markup", COLUMN_TEXT,
+ NULL);
+
+ gtk_combo_box_set_model(combo, selector->priv->model);
+
+}
+
+GtkWidget *
+rs_color_space_selector_new(void)
+{
+ return g_object_new(RS_TYPE_COLOR_SPACE_SELECTOR, NULL);
+}
+
+void
+rs_color_space_selector_add_all(RSColorSpaceSelector *selector)
+{
+ GType *spaces;
+ guint n_spaces, i;
+ GtkTreeIter iter;
+
+ g_return_if_fail(RS_IS_COLOR_SPACE_SELECTOR(selector));
+
+ spaces = g_type_children (RS_TYPE_COLOR_SPACE, &n_spaces);
+ for (i = 0; i < n_spaces; i++)
+ {
+ RSColorSpaceClass *klass;
+ klass = g_type_class_ref(spaces[i]);
+
+ gtk_list_store_append(GTK_LIST_STORE(selector->priv->model),
&iter);
+ gtk_list_store_set(GTK_LIST_STORE(selector->priv->model), &iter,
+ COLUMN_TEXT, klass->name,
+ COLUMN_TYPENAME, g_type_name(spaces[i]),
+ COLUMN_COLORSPACE,
rs_color_space_new_singleton(g_type_name(spaces[i])),
+ -1);
+
+ g_type_class_unref(klass);
+ }
+}
+
+RSColorSpace *
+rs_color_space_selector_set_selected_by_name(RSColorSpaceSelector *selector,
const gchar *type_name)
+{
+
+
+ RSColorSpace *ret = NULL;
+ GtkTreeIter iter;
+ gchar *type_name_haystack;
+
+ g_return_val_if_fail(RS_IS_COLOR_SPACE_SELECTOR(selector), NULL);
+ g_return_val_if_fail(type_name != NULL, NULL);
+
+ if (gtk_tree_model_get_iter_first(selector->priv->model, &iter))
+ {
+ do {
+ gtk_tree_model_get(selector->priv->model, &iter,
+ COLUMN_TYPENAME,
&type_name_haystack,
+ COLUMN_COLORSPACE,
&ret,
+ -1);
+ if (type_name_haystack)
+ {
+ if (g_strcmp0(type_name_haystack, type_name) ==
0)
+ {
+
gtk_combo_box_set_active_iter(GTK_COMBO_BOX(selector), &iter);
+ break;
+ }
+ g_free(type_name_haystack);
+ }
+ } while (gtk_tree_model_iter_next(selector->priv->model,
&iter));
+ }
+
+ return ret;
+}
\ No newline at end of file
Added: trunk/librawstudio/rs-color-space-selector.h
===================================================================
--- trunk/librawstudio/rs-color-space-selector.h
(rev 0)
+++ trunk/librawstudio/rs-color-space-selector.h 2010-02-14 15:59:28 UTC
(rev 3224)
@@ -0,0 +1,60 @@
+/*
+ * * Copyright (C) 2006-2010 Anders Brander <[email protected]>,
+ * * Anders Kvist <[email protected]> and Klaus Post <[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 RSCOLOR_SPACE_SELECTOR_H
+#define RSCOLOR_SPACE_SELECTOR_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define RS_TYPE_COLOR_SPACE_SELECTOR rs_color_space_selector_get_type()
+#define RS_COLOR_SPACE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
RS_TYPE_COLOR_SPACE_SELECTOR, RSColorSpaceSelector))
+#define RS_COLOR_SPACE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST
((klass), RS_TYPE_COLOR_SPACE_SELECTOR, RSColorSpaceSelectorClass))
+#define RS_IS_COLOR_SPACE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
RS_TYPE_COLOR_SPACE_SELECTOR))
+#define RS_IS_COLOR_SPACE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE
((klass), RS_TYPE_COLOR_SPACE_SELECTOR))
+#define RS_COLOR_SPACE_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS
((obj), RS_TYPE_COLOR_SPACE_SELECTOR, RSColorSpaceSelectorClass))
+
+typedef struct _RSColorSpaceSelectorPrivate RSColorSpaceSelectorPrivate;
+
+typedef struct {
+ GtkComboBox parent;
+
+ RSColorSpaceSelectorPrivate *priv;
+} RSColorSpaceSelector;
+
+typedef struct {
+ GtkComboBoxClass parent_class;
+} RSColorSpaceSelectorClass;
+
+GType
+rs_color_space_selector_get_type(void);
+
+GtkWidget *
+rs_color_space_selector_new(void);
+
+void
+rs_color_space_selector_add_all(RSColorSpaceSelector *selector);
+
+RSColorSpace *
+rs_color_space_selector_set_selected_by_name(RSColorSpaceSelector *selector,
const gchar *type_name);
+
+G_END_DECLS
+
+#endif /* RSCOLOR_SPACE_SELECTOR_H */
Modified: trunk/librawstudio/rs-output.c
===================================================================
--- trunk/librawstudio/rs-output.c 2010-02-14 15:22:54 UTC (rev 3223)
+++ trunk/librawstudio/rs-output.c 2010-02-14 15:59:28 UTC (rev 3224)
@@ -153,6 +153,21 @@
rs_conf_set_string(confpath, value);
}
+static void
+colorspace_changed(RSColorSpaceSelector *selector, RSColorSpace *color_space,
gpointer user_data)
+{
+ RSOutput *output = RS_OUTPUT(user_data);
+
+ const gchar *name = g_object_get_data(G_OBJECT(selector), "spec-name");
+ const gchar *confpath = g_object_get_data(G_OBJECT(selector),
"conf-path");
+
+ if (name)
+ g_object_set(output, name, color_space, NULL);
+
+ if (confpath)
+ rs_conf_set_string(confpath, G_OBJECT_TYPE_NAME(color_space));
+}
+
/**
* Load parameters from config for a RSOutput
* @param output A RSOutput
@@ -172,12 +187,25 @@
specs = g_object_class_list_properties(G_OBJECT_CLASS(klass), &n_specs);
for(i=0; i<n_specs; i++)
{
+ GType type = G_PARAM_SPEC_VALUE_TYPE(specs[i]);
gchar *confpath = NULL;
confpath = g_strdup_printf("%s:%s:%s", conf_prefix,
G_OBJECT_TYPE_NAME(output), specs[i]->name);
- switch (G_PARAM_SPEC_VALUE_TYPE(specs[i]))
+ if (type)
{
+ gchar *str;
+
+ if (confpath && (str = rs_conf_get_string(confpath)))
+ {
+ RSColorSpace *color_space;
+ color_space = rs_color_space_new_singleton(str);
+ if (color_space)
+ g_object_set(output, specs[i]->name,
color_space, NULL);
+ }
+ }
+ else switch (type)
+ {
case G_TYPE_BOOLEAN:
{
gboolean boolean = FALSE;
@@ -224,6 +252,7 @@
GParamSpec **specs;
guint n_specs = 0;
gint i;
+ gchar *str;
/* Maintain a reference to the RSOutput */
g_object_ref(output);
@@ -250,7 +279,26 @@
if (type == GTK_TYPE_WIDGET)
{
g_object_get(output, specs[i]->name, &widget, NULL);
- }
+ }
+ else if (type == RS_TYPE_COLOR_SPACE)
+ {
+ widget = rs_color_space_selector_new();
+ g_object_set_data(G_OBJECT(widget), "spec-name",
specs[i]->name);
+ g_object_set_data_full(G_OBJECT(widget), "conf-path",
confpath, g_free);
+
+
rs_color_space_selector_add_all(RS_COLOR_SPACE_SELECTOR(widget));
+
rs_color_space_selector_set_selected_by_name(RS_COLOR_SPACE_SELECTOR(widget),
"RSSrgb");
+
+ if (confpath && (str = rs_conf_get_string(confpath)))
+ {
+ RSColorSpace *color_space;
+ color_space =
rs_color_space_selector_set_selected_by_name(RS_COLOR_SPACE_SELECTOR(widget),
str);
+ if (color_space)
+ g_object_set(output, specs[i]->name,
color_space, NULL);
+ }
+
+ g_signal_connect(widget, "colorspace-selected",
G_CALLBACK(colorspace_changed), output);
+ }
else switch (type)
{
case G_TYPE_BOOLEAN:
@@ -305,7 +353,6 @@
}
case G_TYPE_STRING:
{
- gchar *str;
GtkWidget *label =
gtk_label_new(g_param_spec_get_blurb(specs[i]));
GtkWidget *entry = gtk_entry_new();
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit