gnome-scan r816 - in trunk: . lib modules/gsane



Author: bersace
Date: Mon Feb  2 20:10:27 2009
New Revision: 816
URL: http://svn.gnome.org/viewvc/gnome-scan?rev=816&view=rev

Log:
Added hardware extent

Modified:
   trunk/ChangeLog
   trunk/lib/gnome-scan-common.vala
   trunk/lib/gnome-scan-scanner.vala
   trunk/modules/gsane/gsane-option-area.c

Modified: trunk/lib/gnome-scan-common.vala
==============================================================================
--- trunk/lib/gnome-scan-common.vala	(original)
+++ trunk/lib/gnome-scan-common.vala	Mon Feb  2 20:10:27 2009
@@ -79,6 +79,17 @@
 		public double y;
 	}
 
+	public struct Extent {
+		public double width;
+		public double height;
+
+		public Extent(double width, double height)
+		{
+			this.width = width;
+			this.height = height;
+		}
+	}
+
 	public struct Range {
 		public double min;
 		public double step;

Modified: trunk/lib/gnome-scan-scanner.vala
==============================================================================
--- trunk/lib/gnome-scan-scanner.vala	(original)
+++ trunk/lib/gnome-scan-scanner.vala	Mon Feb  2 20:10:27 2009
@@ -27,6 +27,11 @@
 		public string blurb		{set construct; get;}
 		public string icon_name {set construct; get;}
 		public Gegl.Buffer buffer {set; get;}
+		public Extent extent { set; get; }
+
+		construct {
+			this.extent = Extent(0.0, 0.0);
+		}
 
 		// return true while there is more work to do.
 		public virtual bool work(out double progress)

Modified: trunk/modules/gsane/gsane-option-area.c
==============================================================================
--- trunk/modules/gsane/gsane-option-area.c	(original)
+++ trunk/modules/gsane/gsane-option-area.c	Mon Feb  2 20:10:27 2009
@@ -39,8 +39,6 @@
 	GnomeScanOption* page_orientation;
 	GnomeScanUnit unit;
 	gdouble	fake_resolution;
-	gdouble width;
-	gdouble height;
 };
 
 G_DEFINE_TYPE(GSaneOptionArea, gsane_option_area, GSANE_TYPE_OPTION_HANDLER)
@@ -121,14 +119,14 @@
 }
 
 static GSList*
-gsane_option_area_add_paper_size(GSaneOptionArea* self, GSList* values, const gchar* paper_name, gdouble width, gdouble height)
+gsane_option_area_add_paper_size(GSaneOptionArea* self, GSList* values, const gchar* paper_name, GnomeScanExtent *extent)
 {
 	GtkPaperSize* ps;
 
 	ps = gtk_paper_size_new(paper_name);
 
-	if (gtk_paper_size_get_width(ps, GTK_UNIT_MM) > width
-	    || gtk_paper_size_get_height(ps, GTK_UNIT_MM) > height) {
+	if (gtk_paper_size_get_width(ps, GTK_UNIT_MM) > extent->width
+	    || gtk_paper_size_get_height(ps, GTK_UNIT_MM) > extent->height) {
 		g_message("Can't scan %s document, too wide for hardware extent.",
 			  gtk_paper_size_get_display_name(ps));
 		gtk_paper_size_free(ps);
@@ -141,18 +139,20 @@
 /* List common paper sizes. This will be extendable through
    Preselection */
 static GSList*
-gsane_option_area_list_paper_sizes(GSaneOptionArea *self)
+gsane_option_area_list_paper_sizes(GSaneOptionArea *self, GnomeScanExtent *extent)
 {
 	GSList *values = NULL;
 
+	gnome_scan_scanner_get_extent(GSANE_OPTION_HANDLER(self)->scanner, extent);
+
 	/* ISO format */
-	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_A4, self->priv->width, self->priv->height);
-	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_A5, self->priv->width, self->priv->height);
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_A4, extent);
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_A5, extent);
 
 	/* US bullshit non standard paper sizes */
-	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_LETTER, self->priv->width, self->priv->height);
-	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_LEGAL, self->priv->width, self->priv->height);
-	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_EXECUTIVE, self->priv->width, self->priv->height);
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_LETTER, extent);
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_LEGAL, extent);
+	values = gsane_option_area_add_paper_size(self, values, GTK_PAPER_NAME_EXECUTIVE, extent);
 
 	return values;
 }
@@ -163,7 +163,11 @@
 	GSaneOptionHandler* handler = (GSaneOptionHandler*)self;
 	GSList *ps_list = NULL, *it;
 	gdouble tlx, tly, brx, bry, width, height;
+	GnomeScanExtent extent;
+
+	gnome_scan_scanner_get_extent(GSANE_OPTION_HANDLER(self)->scanner, &extent);
 
+	/* Read hardware saved custom paper size */
 	tlx = gsane_option_handler_get_double(handler, self->priv->tl_x_desc, self->priv->tl_x_index, NULL);
 	tly = gsane_option_handler_get_double(handler, self->priv->tl_y_desc, self->priv->tl_y_index, NULL);
 	brx = gsane_option_handler_get_double(handler, self->priv->br_x_desc, self->priv->br_x_index, NULL);
@@ -182,7 +186,7 @@
 		height = gnome_scan_convert_to_mm(height, self->priv->unit, self->priv->fake_resolution);
 	}
 	else
-		ps_list = gsane_option_area_list_paper_sizes(self);
+		ps_list = gsane_option_area_list_paper_sizes(self, &extent);
 
 	/* define special paper sizes */
 
@@ -196,7 +200,7 @@
 	ps_list = g_slist_prepend(ps_list,
 				  /* Translator: maximum paper size display label */
 				  gtk_paper_size_new_custom("max", _("Maximum"),
-							    self->priv->width, self->priv->height,
+							    extent.width, extent.height,
 							    GTK_UNIT_MM));
 
 	GSList *enum_values = NULL;
@@ -278,7 +282,7 @@
 }
 
 static gboolean
-gsane_option_area_get_extent(GSaneOptionArea *self, gdouble *width, gdouble *height)
+gsane_option_area_get_extent(GSaneOptionArea *self, GnomeScanExtent *extent)
 {
 	gdouble min, max;
 
@@ -288,18 +292,18 @@
 	case SANE_TYPE_INT:
 		min = self->priv->br_x_desc->constraint.range->min;
 		max = self->priv->br_x_desc->constraint.range->max;
-		*width = max - min;
+		extent->width = max - min;
 		min = self->priv->br_y_desc->constraint.range->min;
 		max = self->priv->br_y_desc->constraint.range->max;
-		*height = max - min;
+		extent->height = max - min;
 		break;
 	case SANE_TYPE_FIXED:
 		min = SANE_UNFIX(self->priv->br_x_desc->constraint.range->min);
 		max = SANE_UNFIX(self->priv->br_x_desc->constraint.range->max);
-		*width = max - min;
+		extent->width = max - min;
 		min = SANE_UNFIX(self->priv->br_y_desc->constraint.range->min);
 		max = SANE_UNFIX(self->priv->br_y_desc->constraint.range->max);
-		*height = max - min;
+		extent->height = max - min;
 		break;
 	default:
 		g_warning("Unsupported coordinate unit.");
@@ -314,6 +318,7 @@
 gsane_option_handler_handle_matched(GSaneOptionHandler *handler, const SANE_Option_Descriptor* desc, SANE_Int n, const gchar*group)
 {
 	GSaneOptionArea* self = GSANE_OPTION_AREA (handler);
+	GnomeScanExtent extent;
 
 	self->priv->count++;
 
@@ -322,7 +327,7 @@
 
 	/* Here we have matched all SANE option we wanted */
 
-	if (!gsane_option_area_get_extent(self, &self->priv->width, &self->priv->height))
+	if (!gsane_option_area_get_extent(self, &extent))
 		return;
 
 	self->priv->unit = gsane_option_unit(self->priv->tl_x_desc);
@@ -331,19 +336,20 @@
 		   scanner extent. We assume the scanner can scan a US
 		   Legal-width paper. We compute a fake resolution
 		   based on this assumption. */
-		self->priv->fake_resolution = self->priv->width / (216. / 25.4);
+		self->priv->fake_resolution = extent.width / (216. / 25.4);
 
-		self->priv->width = gnome_scan_convert_to_mm(self->priv->width,
-							     self->priv->unit,
-							     self->priv->fake_resolution);
-		self->priv->height = gnome_scan_convert_to_mm(self->priv->height,
-							      self->priv->unit,
-							      self->priv->fake_resolution);
+		extent.width = gnome_scan_convert_to_mm(extent.width,
+							self->priv->unit,
+							self->priv->fake_resolution);
+		extent.height = gnome_scan_convert_to_mm(extent.height,
+							 self->priv->unit,
+							 self->priv->fake_resolution);
 	}
 
+	gnome_scan_scanner_set_extent(handler->scanner, gnome_scan_extent_dup(&extent));
 	g_debug("%s extent is %.2fx%.2f %s",
 		gnome_scan_scanner_get_name(handler->scanner),
-		self->priv->width, self->priv->height, gnome_scan_unit_to_string(self->priv->unit));
+		extent.width, extent.height, gnome_scan_unit_to_string(self->priv->unit));
 
 	/* Actually install high level options */
 	gsane_option_area_install_origin(self);



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