gnome-scan r754 - in trunk: . modules/gsane



Author: bersace
Date: Thu Dec 25 21:41:43 2008
New Revision: 754
URL: http://svn.gnome.org/viewvc/gnome-scan?rev=754&view=rev

Log:
Added preliminary area option handler.

Added:
   trunk/modules/gsane/gsane-option-area.c
   trunk/modules/gsane/gsane-option-area.h
Modified:
   trunk/ChangeLog
   trunk/modules/gsane/Makefile.am
   trunk/modules/gsane/gsane-module.c

Modified: trunk/modules/gsane/Makefile.am
==============================================================================
--- trunk/modules/gsane/Makefile.am	(original)
+++ trunk/modules/gsane/Makefile.am	Thu Dec 25 21:41:43 2008
@@ -20,6 +20,8 @@
 	gsane-option-handler-generic.c	\
 	gsane-option-source.h		\
 	gsane-option-source.c		\
+	gsane-option-area.h		\
+	gsane-option-area.c		\
 	gsane-option-primary.h		\
 	gsane-option-primary.c		\
 	gsane-option-manager.h		\

Modified: trunk/modules/gsane/gsane-module.c
==============================================================================
--- trunk/modules/gsane/gsane-module.c	(original)
+++ trunk/modules/gsane/gsane-module.c	Thu Dec 25 21:41:43 2008
@@ -32,6 +32,7 @@
 #include "gsane-option-handler-generic.h"
 #include "gsane-option-source.h"
 #include "gsane-option-primary.h"
+#include "gsane-option-area.h"
 #include "gsane-backend.h"
 #include "gsane-scanner.h"
 
@@ -68,6 +69,7 @@
 	gsane_option_manager_add_rule_by_type(gsane_option_manager, SANE_TYPE_STRING, GSANE_TYPE_OPTION_HANDLER_GENERIC);
 	gsane_option_manager_add_rules_by_name(gsane_option_manager, GSANE_TYPE_OPTION_SOURCE, "source", "doc-source", NULL);
 	gsane_option_manager_add_rules_by_name(gsane_option_manager, GSANE_TYPE_OPTION_PRIMARY, "resolution", "mode", NULL);
+	gsane_option_manager_add_rules_by_name(gsane_option_manager, GSANE_TYPE_OPTION_AREA, "tl-x", "tl-y", "br-x", "br-y", NULL);
 }
 
 G_MODULE_EXPORT void

Added: trunk/modules/gsane/gsane-option-area.c
==============================================================================
--- (empty file)
+++ trunk/modules/gsane/gsane-option-area.c	Thu Dec 25 21:41:43 2008
@@ -0,0 +1,234 @@
+/* GSane - SANE GNOME Scan backend 
+ * Copyright  2007-2008  Ãtienne Bersac <bersace gnome org>
+ *
+ * GSane is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * GSane 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
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GSane.  If not, write to:
+ *
+ *	the Free Software Foundation, Inc.
+ *	51 Franklin Street, Fifth Floor
+ *	Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include "gsane-option-area.h"
+
+#define GSANE_OPTION_AREA_GET_PRIVATE(o)	(G_TYPE_INSTANCE_GET_PRIVATE((o), GSANE_TYPE_OPTION_AREA, GSaneOptionAreaPrivate))
+
+struct _GSaneOptionAreaPrivate {
+	GSANE_OPTION_HANDLER_DEFINE_OPTION(tl_x);
+	GSANE_OPTION_HANDLER_DEFINE_OPTION(tl_y);
+	GSANE_OPTION_HANDLER_DEFINE_OPTION(br_x);
+	GSANE_OPTION_HANDLER_DEFINE_OPTION(br_y);
+	guint count;
+	GnomeScanOption* origin;
+	GnomeScanOption* paper_size;
+	GnomeScanOption* page_orientation;
+};
+
+G_DEFINE_TYPE(GSaneOptionArea, gsane_option_area, GSANE_TYPE_OPTION_HANDLER)
+
+static void
+gsane_option_area_install_origin(GSaneOptionArea *self)
+{
+	GSaneOptionHandler* handler = (GSaneOptionHandler*) self;
+	/* TODO: convert from non MM unit */
+	GnomeScanPoint point = {
+		.x = gsane_option_handler_get_double(handler, self->priv->tl_x_desc, self->priv->tl_x_index, NULL),
+		.y = gsane_option_handler_get_double(handler, self->priv->tl_y_desc, self->priv->tl_y_index, NULL)
+	};
+
+	self->priv->origin = GNOME_SCAN_OPTION(gnome_scan_option_pointer_new("origin", _("Origin"), _("Coordinate of the top left corner of the paper."), GNOME_SCAN_OPTION_GROUP_FORMAT, GETTEXT_PACKAGE,
+									     gnome_scan_point_dup(&point), GNOME_SCAN_OPTION_HINT_HIDDEN));
+	gnome_scan_node_install_option(GNOME_SCAN_NODE(handler->scanner), self->priv->origin);
+}
+
+static void
+gsane_option_area_update(GSaneOptionArea* self)
+{
+	GSaneOptionHandler* handler = GSANE_OPTION_HANDLER(self);
+	GtkPaperSize* ps;
+	GnomeScanEnumValue* value;
+	gdouble tl_x, tl_y, br_x, br_y;
+	GnomeScanPoint *origin;
+	
+	gnome_scan_option_enum_get_value(GNOME_SCAN_OPTION_ENUM(self->priv->paper_size), &value);
+	ps = g_value_get_boxed(&value->value);
+	origin = gnome_scan_option_pointer_get_value(GNOME_SCAN_OPTION_POINTER(self->priv->origin));
+
+	tl_x = origin->x;
+	tl_y = origin->y;
+	br_x = origin->x + gtk_paper_size_get_width(ps, GTK_UNIT_MM);
+	br_y = origin->x + gtk_paper_size_get_height(ps, GTK_UNIT_MM);
+
+	/* TODO: convert to non MM unit */
+	gsane_option_handler_set_double(handler, self->priv->tl_x_desc, self->priv->tl_x_index, tl_x, NULL);
+	gsane_option_handler_set_double(handler, self->priv->tl_y_desc, self->priv->tl_y_index, tl_y, NULL);
+	gsane_option_handler_set_double(handler, self->priv->br_x_desc, self->priv->br_x_index, br_x, NULL);
+	gsane_option_handler_set_double(handler, self->priv->br_y_desc, self->priv->br_y_index, br_y, NULL);
+}
+
+static void
+gsane_option_area_paper_size_changed(GSaneOptionArea* self, GParamSpec* pspec, GObject* option)
+{
+	gsane_option_area_update(self);
+}
+
+static GSList*
+gsane_option_area_add_paper_size(GSaneOptionArea* self, GSList* values, const gchar* paper_name, gdouble width, gdouble height, GtkUnit unit)
+{
+	GtkPaperSize* ps;
+	GnomeScanEnumValue evalue;
+	GValue* value;
+
+	ps = gtk_paper_size_new(paper_name);
+
+	g_debug("%s is %.2fx%.2f %s",
+		gtk_paper_size_get_display_name(ps),
+		gtk_paper_size_get_width(ps, unit),
+		gtk_paper_size_get_height(ps, unit),
+		gnome_scan_unit_to_string(unit));
+
+	if (gtk_paper_size_get_width(ps, unit) > width
+	    || gtk_paper_size_get_height(ps, unit) > height) {
+		g_debug("%s is too wide", gtk_paper_size_get_display_name(ps));
+		gtk_paper_size_free(ps);
+		return values;
+	}
+
+	value = g_new0(GValue, 1);
+	g_value_init(value, GTK_TYPE_PAPER_SIZE);
+	g_value_set_boxed(value, ps);
+	gnome_scan_enum_value_init(&evalue, value, gtk_paper_size_get_display_name(ps), NULL);
+	values = g_slist_append(values, gnome_scan_enum_value_dup(&evalue));
+	gnome_scan_enum_value_destroy(&evalue);
+	g_value_reset(value);
+	g_free(value);
+
+	return values;
+}
+
+static void
+gsane_option_area_install_paper_size(GSaneOptionArea* self)
+{
+	GSaneOptionHandler* handler = (GSaneOptionHandler*)self;
+	GtkPaperSize* ps;
+	GnomeScanEnumValue evalue;
+	GValue* value;
+	GSList* values = NULL;
+	gdouble width, height;
+	GnomeScanUnit unit = gsane_option_unit(self->priv->tl_x_desc);
+
+	/* get width and height */
+	switch (self->priv->tl_x_desc->type) {
+	case SANE_TYPE_INT:
+		width = self->priv->br_x_desc->constraint.range->max;
+		height = self->priv->br_y_desc->constraint.range->max;
+		break;
+	case SANE_TYPE_FIXED:
+		width = SANE_UNFIX(self->priv->br_x_desc->constraint.range->max);
+		height = SANE_UNFIX(self->priv->br_y_desc->constraint.range->max);
+		break;
+	default:
+		g_warning("Unsupported coordinate type.");
+		return;
+		break;
+	}
+
+	g_debug("area is %.2fx%.2f %s", width, height, gnome_scan_unit_to_string(unit));
+
+	/* define max paper size */
+	value = g_new0(GValue, 1);
+	g_value_init(value, GTK_TYPE_PAPER_SIZE);
+	ps = gtk_paper_size_new_custom("max", _("Maximum"), width, height, unit);
+	g_value_set_boxed(value, ps);
+	gnome_scan_enum_value_init(&evalue, value, gtk_paper_size_get_display_name(ps), NULL);
+	values = g_slist_append(values, gnome_scan_enum_value_dup(&evalue));
+	gnome_scan_enum_value_destroy(&evalue);
+
+	/* A4 */
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_A4, width, height, unit);
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_A5, width, height, unit);
+
+	g_value_reset(value);
+	g_free(value);
+
+	self->priv->paper_size = GNOME_SCAN_OPTION(gnome_scan_option_enum_new("paper-size", _("Paper-Size"), _("Paper-Size"), GNOME_SCAN_OPTION_GROUP_FORMAT, GETTEXT_PACKAGE,
+									      values->data, values, GNOME_SCAN_OPTION_HINT_PRIMARY));
+	gnome_scan_node_install_option(GNOME_SCAN_NODE(handler->scanner), self->priv->paper_size);
+	g_signal_connect_swapped(self->priv->paper_size, "notify::value", G_CALLBACK(gsane_option_area_paper_size_changed), self);
+}
+
+static void
+gsane_option_handler_handle_matched(GSaneOptionHandler *handler, const SANE_Option_Descriptor* desc, SANE_Int n, const gchar*group)
+{
+	GSaneOptionArea* self = GSANE_OPTION_AREA (handler);
+
+	self->priv->count++;
+
+	if (self->priv->count < 4)
+		return;
+
+	/* we have matched all SANE option, actually install high level options */
+	gsane_option_area_install_origin(self);
+	gsane_option_area_install_paper_size(self);
+}
+
+static void
+gsane_option_area_handle_option(GSaneOptionHandler *handler, const SANE_Option_Descriptor* desc, SANE_Int n, const gchar*group)
+{
+	GSaneOptionArea* self = GSANE_OPTION_AREA (handler);
+	GSaneOptionAreaClass* klass = GSANE_OPTION_AREA_GET_CLASS(self);
+
+	GSANE_OPTION_HANDLER_MATCH_OPTION(self, klass, tl_x, desc, n, group); 
+	GSANE_OPTION_HANDLER_MATCH_OPTION(self, klass, tl_y, desc, n, group); 
+	GSANE_OPTION_HANDLER_MATCH_OPTION(self, klass, br_x, desc, n, group); 
+	GSANE_OPTION_HANDLER_MATCH_OPTION(self, klass, br_y, desc, n, group);
+}
+
+static void
+gsane_option_area_class_init(GSaneOptionAreaClass *klass)
+{
+	g_type_class_add_private(klass, sizeof(GSaneOptionAreaPrivate));
+	GSaneOptionHandlerClass *oh_class = GSANE_OPTION_HANDLER_CLASS(klass);
+	oh_class->unique	= TRUE;
+	oh_class->handle_option = gsane_option_area_handle_option;
+
+#define	gsane_option_handler_handle_tl_x	gsane_option_handler_handle_matched
+#define	gsane_option_handler_handle_tl_y	gsane_option_handler_handle_matched
+#define	gsane_option_handler_handle_br_x	gsane_option_handler_handle_matched
+#define	gsane_option_handler_handle_br_y	gsane_option_handler_handle_matched
+
+	GSANE_OPTION_HANDLER_CLASS_INSTALL_OPTION(klass, tl_x, "tl-x");
+	GSANE_OPTION_HANDLER_CLASS_INSTALL_OPTION(klass, tl_y, "tl-y");
+	GSANE_OPTION_HANDLER_CLASS_INSTALL_OPTION(klass, br_x, "br-x");
+	GSANE_OPTION_HANDLER_CLASS_INSTALL_OPTION(klass, br_y, "br-y");
+
+#undef gsane_option_handler_handle_tl_x
+#undef gsane_option_handler_handle_tl_y
+#undef gsane_option_handler_handle_br_x
+#undef gsane_option_handler_handle_br_y
+
+}
+
+static void
+gsane_option_area_init(GSaneOptionArea* self)
+{
+	self->priv = GSANE_OPTION_AREA_GET_PRIVATE(self);
+	self->priv->count = 0;
+}
+
+

Added: trunk/modules/gsane/gsane-option-area.h
==============================================================================
--- (empty file)
+++ trunk/modules/gsane/gsane-option-area.h	Thu Dec 25 21:41:43 2008
@@ -0,0 +1,54 @@
+/* GSane - SANE GNOME Scan backend 
+ * Copyright  2007-2008  Ãtienne Bersac <bersace gnome org>
+ *
+ * GSane is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ * 
+ * GSane 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
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GSane.  If not, write to:
+ *
+ *	the Free Software Foundation, Inc.
+ *	51 Franklin Street, Fifth Floor
+ *	Boston, MA 02110-1301, USA
+ */
+
+#ifndef _GSANE_OPTION_AREA_H_
+#define	_GSANE_OPTION_AREA_H_
+
+#include "gsane-option-handler.h"
+
+G_BEGIN_DECLS
+
+#define	GSANE_TYPE_OPTION_AREA		(gsane_option_area_get_type())
+#define	GSANE_OPTION_AREA(o)		(G_TYPE_CHECK_INSTANCE_CAST((o), GSANE_TYPE_OPTION_AREA, GSaneOptionArea))
+#define	GSANE_OPTION_AREA_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS((o), GSANE_TYPE_OPTION_AREA, GSaneOptionAreaClass))
+
+typedef struct _GSaneOptionAreaClass GSaneOptionAreaClass;
+typedef struct _GSaneOptionArea GSaneOptionArea;
+typedef struct _GSaneOptionAreaPrivate GSaneOptionAreaPrivate;
+
+struct _GSaneOptionAreaClass {
+	GSaneOptionHandler parent_class;
+	GSANE_OPTION_HANDLER_CLASS_DEFINE_HANDLER(tl_x);
+	GSANE_OPTION_HANDLER_CLASS_DEFINE_HANDLER(tl_y);
+	GSANE_OPTION_HANDLER_CLASS_DEFINE_HANDLER(br_x);
+	GSANE_OPTION_HANDLER_CLASS_DEFINE_HANDLER(br_y);
+};
+
+struct _GSaneOptionArea {
+	GSaneOptionHandler parent_instance;
+	GSaneOptionAreaPrivate *priv;
+};
+
+GType gsane_option_area_get_type(void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]