-added TXT button for option text line adding to image
 with name, date and time info.
 font_6x11.h  file and add_text routine taken from the (GPLed)
 webcam.c file, part of xawtv, (c) 1998-2002 Gerd Knorr.
 add_text was modified for this program (xcam_add_text).

-added RGB/BGR button option to switch the colors if needed.

-solved segment fault when no usb scanner/vidcam devices
 is attached to system ( bug report from Henning Meier-Geinitz)

-patch update for recording feature (SANE bugreport 300224)
 added SAVE Frame button, output filename box.
 With Save Frame button image can be saved as
 .pnm .pgm .pbm or .ppm file

-added info row with x, y, image-size, fps count, fps, fps_ava

-added -V and -h option (version and help

-added option -B -buffersize so instead of default input buffer of
32*1024 a buffer of 1024*1024 can be chosen, so for vidcams for example
640x480, usb 2.0, 30fps less time is needed to fill input buffer.

fond_6x11.h file added

Also some small updates to (for debug output):
xscanimage.c
preview.c
gtkglue.c
merge-requests/2/head
Gerard Klaver 2005-04-11 20:09:04 +00:00
rodzic 98320c775b
commit 98f467fd31
5 zmienionych plików z 4768 dodań i 621 usunięć

3337
src/font_6x11.h 100644

Plik diff jest za duży Load Diff

Wyświetl plik

@ -32,7 +32,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> /* Apollo/DomainOS needs this _before_ sys/stat.h */ #include <sys/types.h> /* Apollo/DomainOS needs this _before_ sys/stat.h */
#include <sys/stat.h> #include <sys/stat.h>
#include "gtkglue.h" #include "gtkglue.h"
@ -47,8 +47,7 @@
#define DBG_info 3 #define DBG_info 3
#define DBG_debug 4 #define DBG_debug 4
#define DEBUG_NOT_STATIC #define BACKEND_NAME gtkglue
#define BACKEND_NAME xscanimage
#include "../include/sane/sanei_debug.h" #include "../include/sane/sanei_debug.h"
int gsg_message_dialog_active = 0; int gsg_message_dialog_active = 0;
@ -63,11 +62,16 @@ unit_string (SANE_Unit unit)
switch (unit) switch (unit)
{ {
case SANE_UNIT_NONE: return "none"; case SANE_UNIT_NONE:
case SANE_UNIT_PIXEL: return "pixel"; return "none";
case SANE_UNIT_BIT: return "bit"; case SANE_UNIT_PIXEL:
case SANE_UNIT_DPI: return "dpi"; return "pixel";
case SANE_UNIT_PERCENT: return "%"; case SANE_UNIT_BIT:
return "bit";
case SANE_UNIT_DPI:
return "dpi";
case SANE_UNIT_PERCENT:
return "%";
case SANE_UNIT_MM: case SANE_UNIT_MM:
d = preferences.length_unit; d = preferences.length_unit;
if (d > 9.9 && d < 10.1) if (d > 9.9 && d < 10.1)
@ -75,13 +79,14 @@ unit_string (SANE_Unit unit)
else if (d > 25.3 && d < 25.5) else if (d > 25.3 && d < 25.5)
return "in"; return "in";
return "mm"; return "mm";
case SANE_UNIT_MICROSECOND: return "us"; case SANE_UNIT_MICROSECOND:
return "us";
} }
return 0; return 0;
} }
static void static void
set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc) set_tooltip (GtkTooltips * tooltips, GtkWidget * widget, const char *desc)
{ {
if (desc && desc[0]) if (desc && desc[0])
#ifdef HAVE_GTK_TOOLTIPS_SET_TIPS #ifdef HAVE_GTK_TOOLTIPS_SET_TIPS
@ -95,8 +100,7 @@ set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc)
int int
gsg_make_path (size_t buf_size, char *buf, gsg_make_path (size_t buf_size, char *buf,
const char *prog_name, const char *prog_name,
const char *prefix, const char *dev_name, const char *prefix, const char *dev_name, const char *postfix)
const char *postfix)
{ {
struct passwd *pw; struct passwd *pw;
size_t len, extra; size_t len, extra;
@ -112,7 +116,7 @@ gsg_make_path (size_t buf_size, char *buf,
return -1; return -1;
} }
snprintf (buf, buf_size, "%s/.sane", pw->pw_dir); snprintf (buf, buf_size, "%s/.sane", pw->pw_dir);
mkdir (buf, 0777); /* ensure ~/.sane directory exists */ mkdir (buf, 0777); /* ensure ~/.sane directory exists */
len = strlen (buf); len = strlen (buf);
@ -146,8 +150,8 @@ gsg_make_path (size_t buf_size, char *buf,
if (dev_name) if (dev_name)
{ {
/* Turn devicename into valid filename by replacing slashes by /* Turn devicename into valid filename by replacing slashes by
"+-". A lonely `+' gets translated into "++" so we can tell "+-". A lonely `+' gets translated into "++" so we can tell
it from a substituted slash. */ it from a substituted slash. */
for (i = 0; dev_name[i]; ++i) for (i = 0; dev_name[i]; ++i)
{ {
@ -162,7 +166,7 @@ gsg_make_path (size_t buf_size, char *buf,
break; break;
#ifdef HAVE_OS2_H #ifdef HAVE_OS2_H
case ':': /* OS2 can not handle colons in filenames */ case ':': /* OS2 can not handle colons in filenames */
buf[len++] = '+'; buf[len++] = '+';
buf[len++] = '_'; buf[len++] = '_';
break; break;
@ -208,8 +212,8 @@ set_option (GSGDialog * dialog, int opt_num, void *val, SANE_Action action)
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
snprintf (buf, sizeof (buf), "Failed to set value of option %s: %s.", snprintf (buf, sizeof (buf), "Failed to set value of option %s: %s.",
sane_get_option_descriptor (dialog->dev, opt_num)->name, sane_get_option_descriptor (dialog->dev, opt_num)->name,
sane_strstatus (status)); sane_strstatus (status));
gsg_error (buf); gsg_error (buf);
return; return;
} }
@ -231,7 +235,7 @@ gsg_close_dialog_callback (GtkWidget * widget, gpointer data)
} }
void void
gsg_message (gchar *title, gchar *message) gsg_message (gchar * title, gchar * message)
{ {
GtkWidget *main_vbox, *label; GtkWidget *main_vbox, *label;
GtkWidget *button, *message_dialog; GtkWidget *button, *message_dialog;
@ -282,7 +286,7 @@ gsg_warning (gchar * warning)
} }
static void static void
get_filename_button_clicked (GtkWidget *w, gpointer data) get_filename_button_clicked (GtkWidget * w, gpointer data)
{ {
int *clicked = data; int *clicked = data;
*clicked = 1; *clicked = 1;
@ -297,9 +301,10 @@ gsg_get_filename (const char *label, const char *default_name,
filesel = gtk_file_selection_new ((char *) label); filesel = gtk_file_selection_new ((char *) label);
gtk_window_set_modal(GTK_WINDOW(filesel), TRUE); gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filesel)->cancel_button), gtk_signal_connect (GTK_OBJECT
(GTK_FILE_SELECTION (filesel)->cancel_button),
"clicked", (GtkSignalFunc) get_filename_button_clicked, "clicked", (GtkSignalFunc) get_filename_button_clicked,
&cancel); &cancel);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button), gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button),
@ -371,8 +376,8 @@ autobutton_update (GtkWidget * widget, GSGDialogElement * elem)
} }
static void static void
autobutton_new (GtkWidget *parent, GSGDialogElement *elem, autobutton_new (GtkWidget * parent, GSGDialogElement * elem,
GtkWidget *label, GtkTooltips *tooltips) GtkWidget * label, GtkTooltips * tooltips)
{ {
GtkWidget *button, *alignment; GtkWidget *button, *alignment;
@ -380,8 +385,7 @@ autobutton_new (GtkWidget *parent, GSGDialogElement *elem,
gtk_container_border_width (GTK_CONTAINER (button), 0); gtk_container_border_width (GTK_CONTAINER (button), 0);
gtk_widget_set_usize (button, 20, 20); gtk_widget_set_usize (button, 20, 20);
gtk_signal_connect (GTK_OBJECT (button), "toggled", gtk_signal_connect (GTK_OBJECT (button), "toggled",
(GtkSignalFunc) autobutton_update, (GtkSignalFunc) autobutton_update, elem);
elem);
set_tooltip (tooltips, button, "Turns on automatic mode."); set_tooltip (tooltips, button, "Turns on automatic mode.");
alignment = gtk_alignment_new (0.0, 1.0, 0.5, 0.5); alignment = gtk_alignment_new (0.0, 1.0, 0.5, 0.5);
@ -411,7 +415,7 @@ button_update (GtkWidget * widget, GSGDialogElement * elem)
static void static void
button_new (GtkWidget * parent, const char *name, SANE_Word val, button_new (GtkWidget * parent, const char *name, SANE_Word val,
GSGDialogElement * elem, GtkTooltips *tooltips, const char *desc, GSGDialogElement * elem, GtkTooltips * tooltips, const char *desc,
gint is_settable) gint is_settable)
{ {
GtkWidget *button; GtkWidget *button;
@ -419,8 +423,7 @@ button_new (GtkWidget * parent, const char *name, SANE_Word val,
button = gtk_check_button_new_with_label ((char *) name); button = gtk_check_button_new_with_label ((char *) name);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), val); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), val);
gtk_signal_connect (GTK_OBJECT (button), "toggled", gtk_signal_connect (GTK_OBJECT (button), "toggled",
(GtkSignalFunc) button_update, (GtkSignalFunc) button_update, elem);
elem);
gtk_box_pack_start (GTK_BOX (parent), button, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (parent), button, FALSE, TRUE, 0);
if (!is_settable) if (!is_settable)
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
@ -440,6 +443,11 @@ scale_update (GtkAdjustment * adj_data, GSGDialogElement * elem)
double d; double d;
SANE_Status status; SANE_Status status;
DBG_INIT ();
DBG (DBG_debug, "scale_update\n");
opt_num = elem - dialog->element; opt_num = elem - dialog->element;
opt = sane_get_option_descriptor (dialog->dev, opt_num); opt = sane_get_option_descriptor (dialog->dev, opt_num);
switch (opt->type) switch (opt->type)
@ -460,11 +468,13 @@ scale_update (GtkAdjustment * adj_data, GSGDialogElement * elem)
return; return;
} }
set_option (dialog, opt_num, &val, SANE_ACTION_SET_VALUE); set_option (dialog, opt_num, &val, SANE_ACTION_SET_VALUE);
status = sane_control_option (dialog->dev, opt_num, SANE_ACTION_GET_VALUE, &new_val, status =
0); sane_control_option (dialog->dev, opt_num, SANE_ACTION_GET_VALUE,
&new_val, 0);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_fatal, "scale_update: sane_control_option failed: %s\n", sane_strstatus (status)); DBG (DBG_fatal, "scale_update: sane_control_option failed: %s\n",
sane_strstatus (status));
return; return;
} }
@ -502,7 +512,7 @@ value_changed:
static void static void
scale_new (GtkWidget * parent, const char *name, gfloat val, scale_new (GtkWidget * parent, const char *name, gfloat val,
gfloat min, gfloat max, gfloat quant, int automatic, gfloat min, gfloat max, gfloat quant, int automatic,
GSGDialogElement * elem, GtkTooltips *tooltips, const char *desc, GSGDialogElement * elem, GtkTooltips * tooltips, const char *desc,
gint is_settable) gint is_settable)
{ {
GtkWidget *hbox, *label, *scale; GtkWidget *hbox, *label, *scale;
@ -603,10 +613,9 @@ option_menu_callback (GtkWidget * widget, gpointer data)
} }
static void static void
option_menu_new (GtkWidget *parent, const char *name, char *str_list[], option_menu_new (GtkWidget * parent, const char *name, char *str_list[],
const char *val, GSGDialogElement * elem, const char *val, GSGDialogElement * elem,
GtkTooltips *tooltips, const char *desc, GtkTooltips * tooltips, const char *desc, gint is_settable)
gint is_settable)
{ {
GtkWidget *hbox, *label, *option_menu, *menu, *item; GtkWidget *hbox, *label, *option_menu, *menu, *item;
GSGMenuItem *menu_items; GSGMenuItem *menu_items;
@ -657,7 +666,7 @@ option_menu_new (GtkWidget *parent, const char *name, char *str_list[],
} }
static void static void
text_entry_callback (GtkWidget *w, gpointer data) text_entry_callback (GtkWidget * w, gpointer data)
{ {
GSGDialogElement *elem = data; GSGDialogElement *elem = data;
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
@ -687,8 +696,7 @@ text_entry_callback (GtkWidget *w, gpointer data)
static void static void
text_entry_new (GtkWidget * parent, const char *name, const char *val, text_entry_new (GtkWidget * parent, const char *name, const char *val,
GSGDialogElement * elem, GSGDialogElement * elem,
GtkTooltips *tooltips, const char *desc, GtkTooltips * tooltips, const char *desc, gint is_settable)
gint is_settable)
{ {
GtkWidget *hbox, *text, *label; GtkWidget *hbox, *text, *label;
@ -716,9 +724,9 @@ text_entry_new (GtkWidget * parent, const char *name, const char *val,
} }
static GtkWidget * static GtkWidget *
group_new (GtkWidget *parent, const char * title) group_new (GtkWidget * parent, const char *title)
{ {
GtkWidget * frame, * vbox; GtkWidget *frame, *vbox;
frame = gtk_frame_new ((char *) title); frame = gtk_frame_new ((char *) title);
gtk_container_border_width (GTK_CONTAINER (frame), 4); gtk_container_border_width (GTK_CONTAINER (frame), 4);
@ -732,10 +740,10 @@ group_new (GtkWidget *parent, const char * title)
return vbox; return vbox;
} }
static GtkWidget* static GtkWidget *
curve_new (GSGDialog *dialog, int optnum) curve_new (GSGDialog * dialog, int optnum)
{ {
const SANE_Option_Descriptor * opt; const SANE_Option_Descriptor *opt;
gfloat fmin, fmax, val, *vector; gfloat fmin, fmax, val, *vector;
SANE_Word *optval, min, max; SANE_Word *optval, min, max;
GtkWidget *curve, *gamma; GtkWidget *curve, *gamma;
@ -747,7 +755,7 @@ curve_new (GSGDialog *dialog, int optnum)
curve = GTK_GAMMA_CURVE (gamma)->curve; curve = GTK_GAMMA_CURVE (gamma)->curve;
dev = dialog->dev; dev = dialog->dev;
opt = sane_get_option_descriptor (dev, optnum); opt = sane_get_option_descriptor (dev, optnum);
optlen = opt->size / sizeof (SANE_Word); optlen = opt->size / sizeof (SANE_Word);
vector = alloca (optlen * (sizeof (vector[0]) + sizeof (optval[0]))); vector = alloca (optlen * (sizeof (vector[0]) + sizeof (optval[0])));
optval = (SANE_Word *) (vector + optlen); optval = (SANE_Word *) (vector + optlen);
@ -818,7 +826,7 @@ curve_new (GSGDialog *dialog, int optnum)
} }
static void static void
vector_new (GSGDialog * dialog, GtkWidget *vbox, int num_vopts, int *vopts) vector_new (GSGDialog * dialog, GtkWidget * vbox, int num_vopts, int *vopts)
{ {
GtkWidget *notebook, *label, *curve; GtkWidget *notebook, *label, *curve;
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
@ -833,7 +841,7 @@ vector_new (GSGDialog * dialog, GtkWidget *vbox, int num_vopts, int *vopts)
opt = sane_get_option_descriptor (dialog->dev, vopts[i]); opt = sane_get_option_descriptor (dialog->dev, vopts[i]);
label = gtk_label_new ((char *) opt->title); label = gtk_label_new ((char *) opt->title);
vbox = gtk_vbox_new (/* homogeneous */ FALSE, 0); vbox = gtk_vbox_new ( /* homogeneous */ FALSE, 0);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
gtk_widget_show (vbox); gtk_widget_show (vbox);
gtk_widget_show (label); gtk_widget_show (label);
@ -863,7 +871,7 @@ panel_destroy (GSGDialog * dialog)
gtk_object_sink (GTK_OBJECT (dialog->tooltips)); gtk_object_sink (GTK_OBJECT (dialog->tooltips));
# else # else
gtk_object_unref (GTK_OBJECT (dialog->tooltips)); gtk_object_unref (GTK_OBJECT (dialog->tooltips));
# endif /* GTK_MAJOR_VERSION == 2 */ # endif /* GTK_MAJOR_VERSION == 2 */
#endif #endif
gtk_widget_destroy (dialog->main_hbox); gtk_widget_destroy (dialog->main_hbox);
@ -886,7 +894,7 @@ panel_destroy (GSGDialog * dialog)
} }
} }
memset (dialog->element, 0, memset (dialog->element, 0,
dialog->num_elements*sizeof (dialog->element[0])); dialog->num_elements * sizeof (dialog->element[0]));
} }
static void static void
@ -907,40 +915,40 @@ panel_build (GSGDialog * dialog)
int num_vector_opts = 0, *vector_opts; int num_vector_opts = 0, *vector_opts;
main_hbox = gtk_hbox_new (FALSE, 2); main_hbox = gtk_hbox_new (FALSE, 2);
if (dialog->twocolumn) if (dialog->twocolumn)
{ {
option_vbox = gtk_hbox_new (FALSE, 2); /* two column display */ option_vbox = gtk_hbox_new (FALSE, 2); /* two column display */
} }
else else
{ {
option_vbox = gtk_vbox_new (FALSE, 2); /* one column display */ option_vbox = gtk_vbox_new (FALSE, 2); /* one column display */
} }
gtk_box_pack_start (GTK_BOX (main_hbox), option_vbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (main_hbox), option_vbox, FALSE, FALSE, 0);
gtk_widget_show (option_vbox); gtk_widget_show (option_vbox);
/* standard options vbox */ /* standard options vbox */
standard_vbox = gtk_vbox_new (/* homogeneous */ FALSE, 0); standard_vbox = gtk_vbox_new ( /* homogeneous */ FALSE, 0);
gtk_widget_show (standard_vbox); gtk_widget_show (standard_vbox);
gtk_box_pack_start (GTK_BOX (option_vbox), standard_vbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (option_vbox), standard_vbox, FALSE, FALSE, 0);
/* advanced options page */ /* advanced options page */
advanced_vbox = gtk_vbox_new (/* homogeneous */ FALSE, 0); advanced_vbox = gtk_vbox_new ( /* homogeneous */ FALSE, 0);
gtk_box_pack_start (GTK_BOX (option_vbox), advanced_vbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (option_vbox), advanced_vbox, TRUE, TRUE, 0);
/* use black as foreground: */ /* use black as foreground: */
dialog->tooltips = gtk_tooltips_new (); dialog->tooltips = gtk_tooltips_new ();
dialog->tooltips_fg.red = 0; dialog->tooltips_fg.red = 0;
dialog->tooltips_fg.green = 0; dialog->tooltips_fg.green = 0;
dialog->tooltips_fg.blue = 0; dialog->tooltips_fg.blue = 0;
/* postit yellow (khaki) as background: */ /* postit yellow (khaki) as background: */
gdk_color_alloc (gtk_widget_get_colormap (main_hbox), &dialog->tooltips_fg); gdk_color_alloc (gtk_widget_get_colormap (main_hbox), &dialog->tooltips_fg);
dialog->tooltips_bg.red = 61669; dialog->tooltips_bg.red = 61669;
dialog->tooltips_bg.green = 59113; dialog->tooltips_bg.green = 59113;
dialog->tooltips_bg.blue = 35979; dialog->tooltips_bg.blue = 35979;
gdk_color_alloc (gtk_widget_get_colormap (main_hbox), &dialog->tooltips_bg); gdk_color_alloc (gtk_widget_get_colormap (main_hbox), &dialog->tooltips_bg);
/* GTK2 doesn't have the function (seems like it's not needed with GTK2 anyway) */ /* GTK2 doesn't have the function (seems like it's not needed with GTK2 anyway) */
@ -1027,7 +1035,7 @@ panel_build (GSGDialog * dialog)
goto get_value_failed; goto get_value_failed;
button_new (parent, title, val, elem, dialog->tooltips, opt->desc, button_new (parent, title, val, elem, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
@ -1058,7 +1066,7 @@ panel_build (GSGDialog * dialog)
opt->constraint.range->max, quant, opt->constraint.range->max, quant,
(opt->cap & SANE_CAP_AUTOMATIC), elem, (opt->cap & SANE_CAP_AUTOMATIC), elem,
dialog->tooltips, opt->desc, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
@ -1075,14 +1083,14 @@ panel_build (GSGDialog * dialog)
sprintf (str, "%d", val); sprintf (str, "%d", val);
option_menu_new (parent, title, str_list, str, elem, option_menu_new (parent, title, str_list, str, elem,
dialog->tooltips, opt->desc, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
free (str_list); free (str_list);
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
case SANE_CONSTRAINT_NONE: case SANE_CONSTRAINT_NONE:
/* having no constraint for an int is strange but allowed /* having no constraint for an int is strange but allowed
by the SANE standard so we just ignore such options here */ by the SANE standard so we just ignore such options here */
break; break;
default: default:
@ -1128,7 +1136,7 @@ panel_build (GSGDialog * dialog)
scale_new (parent, title, dval, dmin, dmax, dquant, scale_new (parent, title, dval, dmin, dmax, dquant,
(opt->cap & SANE_CAP_AUTOMATIC), elem, (opt->cap & SANE_CAP_AUTOMATIC), elem,
dialog->tooltips, opt->desc, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
@ -1146,14 +1154,14 @@ panel_build (GSGDialog * dialog)
sprintf (str, "%g", SANE_UNFIX (val)); sprintf (str, "%g", SANE_UNFIX (val));
option_menu_new (parent, title, str_list, str, elem, option_menu_new (parent, title, str_list, str, elem,
dialog->tooltips, opt->desc, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
free (str_list); free (str_list);
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
case SANE_CONSTRAINT_NONE: case SANE_CONSTRAINT_NONE:
/* having no constraint for a fixed is strange but allowed /* having no constraint for a fixed is strange but allowed
by the SANE standard so we just ignore such options here */ by the SANE standard so we just ignore such options here */
break; break;
default: default:
@ -1184,14 +1192,14 @@ panel_build (GSGDialog * dialog)
option_menu_new (parent, title, option_menu_new (parent, title,
(char **) opt->constraint.string_list, buf, (char **) opt->constraint.string_list, buf,
elem, dialog->tooltips, opt->desc, elem, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
case SANE_CONSTRAINT_NONE: case SANE_CONSTRAINT_NONE:
text_entry_new (parent, title, buf, elem, text_entry_new (parent, title, buf, elem,
dialog->tooltips, opt->desc, dialog->tooltips, opt->desc,
SANE_OPTION_IS_SETTABLE(opt->cap)); SANE_OPTION_IS_SETTABLE (opt->cap));
gtk_widget_show (parent->parent); gtk_widget_show (parent->parent);
break; break;
@ -1265,8 +1273,9 @@ panel_rebuild (GSGDialog * dialog)
GSGDialog * GSGDialog *
gsg_create_dialog (GtkWidget * window, const char *device_name, gsg_create_dialog (GtkWidget * window, const char *device_name,
GSGCallback option_reload_callback, void *option_reload_arg, GSGCallback option_reload_callback,
GSGCallback param_change_callback, void *param_change_arg) void *option_reload_arg, GSGCallback param_change_callback,
void *param_change_arg)
{ {
SANE_Int num_elements; SANE_Int num_elements;
GSGDialog *dialog; GSGDialog *dialog;
@ -1313,7 +1322,7 @@ gsg_create_dialog (GtkWidget * window, const char *device_name,
} }
void void
gsg_refresh_dialog (GSGDialog *dialog) gsg_refresh_dialog (GSGDialog * dialog)
{ {
panel_rebuild (dialog); panel_rebuild (dialog);
if (dialog->param_change_callback) if (dialog->param_change_callback)
@ -1321,7 +1330,7 @@ gsg_refresh_dialog (GSGDialog *dialog)
} }
void void
gsg_update_scan_window (GSGDialog *dialog) gsg_update_scan_window (GSGDialog * dialog)
{ {
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
double old_val, new_val; double old_val, new_val;
@ -1339,10 +1348,9 @@ gsg_update_scan_window (GSGDialog *dialog)
opt = sane_get_option_descriptor (dialog->dev, optnum); opt = sane_get_option_descriptor (dialog->dev, optnum);
status = sane_control_option (dialog->dev, optnum, status = sane_control_option (dialog->dev, optnum,
SANE_ACTION_GET_VALUE, SANE_ACTION_GET_VALUE, &word, 0);
&word, 0);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
continue; /* sliently ignore errors */ continue; /* sliently ignore errors */
switch (opt->constraint_type) switch (opt->constraint_type)
{ {
@ -1373,7 +1381,8 @@ gsg_update_scan_window (GSGDialog *dialog)
sprintf (str, "%g", SANE_UNFIX (word)); sprintf (str, "%g", SANE_UNFIX (word));
/* XXX maybe we should call this only when the value changes... */ /* XXX maybe we should call this only when the value changes... */
gtk_option_menu_set_history (GTK_OPTION_MENU (elem->widget), gtk_option_menu_set_history (GTK_OPTION_MENU (elem->widget),
option_menu_lookup (elem->menu, str)); option_menu_lookup (elem->menu,
str));
break; break;
default: default:
@ -1386,7 +1395,7 @@ gsg_update_scan_window (GSGDialog *dialog)
vectors, all option values are kept current. Vectors are vectors, all option values are kept current. Vectors are
downloaded into the device during this call. */ downloaded into the device during this call. */
void void
gsg_sync (GSGDialog *dialog) gsg_sync (GSGDialog * dialog)
{ {
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
gfloat val, *vector; gfloat val, *vector;
@ -1400,8 +1409,7 @@ gsg_sync (GSGDialog *dialog)
if (!SANE_OPTION_IS_ACTIVE (opt->cap)) if (!SANE_OPTION_IS_ACTIVE (opt->cap))
continue; continue;
if (opt->type != SANE_TYPE_INT && if (opt->type != SANE_TYPE_INT && opt->type != SANE_TYPE_FIXED)
opt->type != SANE_TYPE_FIXED)
continue; continue;
if (opt->size == sizeof (SANE_Word)) if (opt->size == sizeof (SANE_Word))
@ -1429,14 +1437,14 @@ gsg_sync (GSGDialog *dialog)
} }
void void
gsg_set_advanced (GSGDialog *dialog, int advanced) gsg_set_advanced (GSGDialog * dialog, int advanced)
{ {
dialog->advanced = advanced; dialog->advanced = advanced;
panel_rebuild (dialog); panel_rebuild (dialog);
} }
void void
gsg_set_tooltips (GSGDialog *dialog, int enable) gsg_set_tooltips (GSGDialog * dialog, int enable)
{ {
if (!dialog->tooltips) if (!dialog->tooltips)
return; return;
@ -1448,14 +1456,14 @@ gsg_set_tooltips (GSGDialog *dialog, int enable)
} }
void void
gsg_set_twocolumn (GSGDialog *dialog, int twocolumn) gsg_set_twocolumn (GSGDialog * dialog, int twocolumn)
{ {
dialog->twocolumn = twocolumn; dialog->twocolumn = twocolumn;
panel_rebuild (dialog); panel_rebuild (dialog);
} }
void void
gsg_set_sensitivity (GSGDialog *dialog, int sensitive) gsg_set_sensitivity (GSGDialog * dialog, int sensitive)
{ {
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
int i; int i;
@ -1465,8 +1473,7 @@ gsg_set_sensitivity (GSGDialog *dialog, int sensitive)
opt = sane_get_option_descriptor (dialog->dev, i); opt = sane_get_option_descriptor (dialog->dev, i);
if (!SANE_OPTION_IS_ACTIVE (opt->cap) if (!SANE_OPTION_IS_ACTIVE (opt->cap)
|| opt->type == SANE_TYPE_GROUP || opt->type == SANE_TYPE_GROUP || !dialog->element[i].widget)
|| !dialog->element[i].widget)
continue; continue;
if (!(opt->cap & SANE_CAP_ALWAYS_SETTABLE)) if (!(opt->cap & SANE_CAP_ALWAYS_SETTABLE))

Wyświetl plik

@ -85,8 +85,7 @@
#define DBG_info 3 #define DBG_info 3
#define DBG_debug 4 #define DBG_debug 4
#define DEBUG_DECLARE_ONLY #define BACKEND_NAME preview
#define BACKEND_NAME xscanimage
#include "../include/sane/sanei_debug.h" #include "../include/sane/sanei_debug.h"
#ifndef PATH_MAX #ifndef PATH_MAX
@ -111,11 +110,11 @@
#endif #endif
/* forward declarations */ /* forward declarations */
static void scan_start (Preview *p); static void scan_start (Preview * p);
static void scan_done (Preview *p); static void scan_done (Preview * p);
static void static void
draw_rect (GdkWindow *win, GdkGC *gc, int coord[4]) draw_rect (GdkWindow * win, GdkGC * gc, int coord[4])
{ {
gint x, y, w, h; gint x, y, w, h;
@ -137,7 +136,7 @@ draw_rect (GdkWindow *win, GdkGC *gc, int coord[4])
} }
static void static void
draw_selection (Preview *p) draw_selection (Preview * p)
{ {
if (!p->gc) if (!p->gc)
/* window isn't mapped yet */ /* window isn't mapped yet */
@ -153,7 +152,7 @@ draw_selection (Preview *p)
} }
static void static void
update_selection (Preview *p) update_selection (Preview * p)
{ {
float min, max, normal, dev_selection[4]; float min, max, normal, dev_selection[4];
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
@ -192,8 +191,9 @@ update_selection (Preview *p)
normal = ((i == 0) ? p->preview_width : p->preview_height) - 1; normal = ((i == 0) ? p->preview_width : p->preview_height) - 1;
normal /= (max - min); normal /= (max - min);
p->selection.active = TRUE; p->selection.active = TRUE;
p->selection.coord[i] = ((dev_selection[i] - min)*normal) + 0.5; p->selection.coord[i] = ((dev_selection[i] - min) * normal) + 0.5;
p->selection.coord[i + 2] = ((dev_selection[i + 2] - min)*normal) + 0.5; p->selection.coord[i + 2] =
((dev_selection[i + 2] - min) * normal) + 0.5;
if (p->selection.coord[i + 2] < p->selection.coord[i]) if (p->selection.coord[i + 2] < p->selection.coord[i])
p->selection.coord[i + 2] = p->selection.coord[i]; p->selection.coord[i + 2] = p->selection.coord[i];
} }
@ -201,7 +201,7 @@ update_selection (Preview *p)
} }
static void static void
get_image_scale (Preview *p, float *xscalep, float *yscalep) get_image_scale (Preview * p, float *xscalep, float *yscalep)
{ {
float xscale, yscale; float xscale, yscale;
@ -209,9 +209,9 @@ get_image_scale (Preview *p, float *xscalep, float *yscalep)
xscale = 1.0; xscale = 1.0;
else else
{ {
xscale = p->image_width/(float) p->preview_width; xscale = p->image_width / (float) p->preview_width;
if (p->image_height > 0 && p->preview_height*xscale < p->image_height) if (p->image_height > 0 && p->preview_height * xscale < p->image_height)
xscale = p->image_height/(float) p->preview_height; xscale = p->image_height / (float) p->preview_height;
} }
yscale = xscale; yscale = xscale;
@ -222,32 +222,32 @@ get_image_scale (Preview *p, float *xscalep, float *yscalep)
float swidth, sheight; float swidth, sheight;
assert (p->surface_type == SANE_TYPE_INT); assert (p->surface_type == SANE_TYPE_INT);
swidth = (p->surface[GSG_BR_X] - p->surface[GSG_TL_X] + 1); swidth = (p->surface[GSG_BR_X] - p->surface[GSG_TL_X] + 1);
sheight = (p->surface[GSG_BR_Y] - p->surface[GSG_TL_Y] + 1); sheight = (p->surface[GSG_BR_Y] - p->surface[GSG_TL_Y] + 1);
xscale = 1.0; xscale = 1.0;
yscale = 1.0; yscale = 1.0;
if (p->image_width > 0 && swidth < INF) if (p->image_width > 0 && swidth < INF)
xscale = p->image_width/swidth; xscale = p->image_width / swidth;
if (p->image_height > 0 && sheight < INF) if (p->image_height > 0 && sheight < INF)
yscale = p->image_height/sheight; yscale = p->image_height / sheight;
} }
*xscalep = xscale; *xscalep = xscale;
*yscalep = yscale; *yscalep = yscale;
} }
static void static void
paint_image (Preview *p) paint_image (Preview * p)
{ {
float xscale, yscale, src_x, src_y; float xscale, yscale, src_x, src_y;
int dst_x, dst_y, height, x, y, src_offset; int dst_x, dst_y, height, x, y, src_offset;
gint gwidth, gheight; gint gwidth, gheight;
gwidth = p->preview_width; gwidth = p->preview_width;
gheight = p->preview_height; gheight = p->preview_height;
get_image_scale (p, &xscale, &yscale); get_image_scale (p, &xscale, &yscale);
memset (p->preview_row, 0xff, 3*gwidth); memset (p->preview_row, 0xff, 3 * gwidth);
/* don't draw last line unless it's complete: */ /* don't draw last line unless it's complete: */
height = p->image_y; height = p->image_y;
@ -262,7 +262,7 @@ paint_image (Preview *p)
y = (int) (src_y + 0.5); y = (int) (src_y + 0.5);
if (y >= height) if (y >= height)
break; break;
src_offset = y*3*p->image_width; src_offset = y * 3 * p->image_width;
if (p->image_data) if (p->image_data)
for (dst_x = 0; dst_x < gwidth; ++dst_x) for (dst_x = 0; dst_x < gwidth; ++dst_x)
@ -271,9 +271,12 @@ paint_image (Preview *p)
if (x >= p->image_width) if (x >= p->image_width)
break; break;
p->preview_row[3*dst_x + 0] = p->image_data[src_offset + 3*x + 0]; p->preview_row[3 * dst_x + 0] =
p->preview_row[3*dst_x + 1] = p->image_data[src_offset + 3*x + 1]; p->image_data[src_offset + 3 * x + 0];
p->preview_row[3*dst_x + 2] = p->image_data[src_offset + 3*x + 2]; p->preview_row[3 * dst_x + 1] =
p->image_data[src_offset + 3 * x + 1];
p->preview_row[3 * dst_x + 2] =
p->image_data[src_offset + 3 * x + 2];
src_x += xscale; src_x += xscale;
} }
gtk_preview_draw_row (GTK_PREVIEW (p->window), p->preview_row, gtk_preview_draw_row (GTK_PREVIEW (p->window), p->preview_row,
@ -284,7 +287,7 @@ paint_image (Preview *p)
} }
static void static void
display_partial_image (Preview *p) display_partial_image (Preview * p)
{ {
paint_image (p); paint_image (p);
@ -293,8 +296,8 @@ display_partial_image (Preview *p)
GtkPreview *preview = GTK_PREVIEW (p->window); GtkPreview *preview = GTK_PREVIEW (p->window);
int src_x, src_y; int src_x, src_y;
src_x = (p->window->allocation.width - preview->buffer_width)/2; src_x = (p->window->allocation.width - preview->buffer_width) / 2;
src_y = (p->window->allocation.height - preview->buffer_height)/2; src_y = (p->window->allocation.height - preview->buffer_height) / 2;
gtk_preview_put (preview, p->window->window, p->window->style->black_gc, gtk_preview_put (preview, p->window->window, p->window->style->black_gc,
src_x, src_y, src_x, src_y,
0, 0, p->preview_width, p->preview_height); 0, 0, p->preview_width, p->preview_height);
@ -302,7 +305,7 @@ display_partial_image (Preview *p)
} }
static void static void
display_maybe (Preview *p) display_maybe (Preview * p)
{ {
time_t now; time_t now;
@ -315,13 +318,13 @@ display_maybe (Preview *p)
} }
static void static void
display_image (Preview *p) display_image (Preview * p)
{ {
if (p->params.lines <= 0 && p->image_y < p->image_height) if (p->params.lines <= 0 && p->image_y < p->image_height)
{ {
p->image_height = p->image_y; p->image_height = p->image_y;
p->image_data = realloc (p->image_data, p->image_data = realloc (p->image_data,
3*p->image_width*p->image_height); 3 * p->image_width * p->image_height);
assert (p->image_data); assert (p->image_data);
} }
display_partial_image (p); display_partial_image (p);
@ -329,20 +332,20 @@ display_image (Preview *p)
} }
static void static void
preview_area_resize (GtkWidget *widget) preview_area_resize (GtkWidget * widget)
{ {
float min_x, max_x, min_y, max_y, xscale, yscale, f; float min_x, max_x, min_y, max_y, xscale, yscale, f;
Preview *p; Preview *p;
p = gtk_object_get_data (GTK_OBJECT (widget), "PreviewPointer"); p = gtk_object_get_data (GTK_OBJECT (widget), "PreviewPointer");
p->preview_width = widget->allocation.width; p->preview_width = widget->allocation.width;
p->preview_height = widget->allocation.height; p->preview_height = widget->allocation.height;
if (p->preview_row) if (p->preview_row)
p->preview_row = realloc (p->preview_row, 3*p->preview_width); p->preview_row = realloc (p->preview_row, 3 * p->preview_width);
else else
p->preview_row = malloc (3*p->preview_width); p->preview_row = malloc (3 * p->preview_width);
/* set the ruler ranges: */ /* set the ruler ranges: */
@ -351,7 +354,7 @@ preview_area_resize (GtkWidget *widget)
min_x = 0.0; min_x = 0.0;
max_x = p->surface[GSG_BR_X]; max_x = p->surface[GSG_BR_X];
if (max_x >= INF) if (max_x >= INF)
max_x = p->preview_width - 1; max_x = p->preview_width - 1;
min_y = p->surface[GSG_TL_Y]; min_y = p->surface[GSG_TL_Y];
@ -359,35 +362,38 @@ preview_area_resize (GtkWidget *widget)
min_y = 0.0; min_y = 0.0;
max_y = p->surface[GSG_BR_Y]; max_y = p->surface[GSG_BR_Y];
if (max_y >= INF) if (max_y >= INF)
max_y = p->preview_height - 1; max_y = p->preview_height - 1;
/* convert mm to inches if that's what the user wants: */ /* convert mm to inches if that's what the user wants: */
if (p->surface_unit == SANE_UNIT_MM) if (p->surface_unit == SANE_UNIT_MM)
{ {
double factor = 1.0/preferences.length_unit; double factor = 1.0 / preferences.length_unit;
min_x *= factor; max_x *= factor; min_y *= factor; max_y *= factor; min_x *= factor;
max_x *= factor;
min_y *= factor;
max_y *= factor;
} }
get_image_scale (p, &xscale, &yscale); get_image_scale (p, &xscale, &yscale);
if (p->surface_unit == SANE_UNIT_PIXEL) if (p->surface_unit == SANE_UNIT_PIXEL)
f = 1.0/xscale; f = 1.0 / xscale;
else if (p->image_width) else if (p->image_width)
f = xscale*p->preview_width/p->image_width; f = xscale * p->preview_width / p->image_width;
else else
f = 1.0; f = 1.0;
gtk_ruler_set_range (GTK_RULER (p->hruler), f*min_x, f*max_x, f*min_x, gtk_ruler_set_range (GTK_RULER (p->hruler), f * min_x, f * max_x, f * min_x,
/* max_size */ 20); /* max_size */ 20);
if (p->surface_unit == SANE_UNIT_PIXEL) if (p->surface_unit == SANE_UNIT_PIXEL)
f = 1.0/yscale; f = 1.0 / yscale;
else if (p->image_height) else if (p->image_height)
f = yscale*p->preview_height/p->image_height; f = yscale * p->preview_height / p->image_height;
else else
f = 1.0; f = 1.0;
gtk_ruler_set_range (GTK_RULER (p->vruler), f*min_y, f*max_y, f*min_y, gtk_ruler_set_range (GTK_RULER (p->vruler), f * min_y, f * max_y, f * min_y,
/* max_size */ 20); /* max_size */ 20);
paint_image (p); paint_image (p);
@ -395,13 +401,13 @@ preview_area_resize (GtkWidget *widget)
} }
static void static void
get_bounds (const SANE_Option_Descriptor *opt, float *minp, float *maxp) get_bounds (const SANE_Option_Descriptor * opt, float *minp, float *maxp)
{ {
float min, max; float min, max;
int i; int i;
min = -INF; min = -INF;
max = INF; max = INF;
switch (opt->constraint_type) switch (opt->constraint_type)
{ {
case SANE_CONSTRAINT_RANGE: case SANE_CONSTRAINT_RANGE:
@ -410,7 +416,7 @@ get_bounds (const SANE_Option_Descriptor *opt, float *minp, float *maxp)
break; break;
case SANE_CONSTRAINT_WORD_LIST: case SANE_CONSTRAINT_WORD_LIST:
min = INF; min = INF;
max = -INF; max = -INF;
for (i = 1; i <= opt->constraint.word_list[0]; ++i) for (i = 1; i <= opt->constraint.word_list[0]; ++i)
{ {
@ -436,7 +442,7 @@ get_bounds (const SANE_Option_Descriptor *opt, float *minp, float *maxp)
} }
static void static void
save_option (Preview *p, int option, SANE_Word *save_loc, int *valid) save_option (Preview * p, int option, SANE_Word * save_loc, int *valid)
{ {
SANE_Status status; SANE_Status status;
@ -451,7 +457,7 @@ save_option (Preview *p, int option, SANE_Word *save_loc, int *valid)
} }
static void static void
restore_option (Preview *p, int option, SANE_Word saved_value, int valid) restore_option (Preview * p, int option, SANE_Word saved_value, int valid)
{ {
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
SANE_Status status; SANE_Status status;
@ -474,7 +480,7 @@ restore_option (Preview *p, int option, SANE_Word saved_value, int valid)
} }
static SANE_Status static SANE_Status
set_option_float (Preview *p, int option, float value) set_option_float (Preview * p, int option, float value)
{ {
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
SANE_Handle dev; SANE_Handle dev;
@ -504,7 +510,7 @@ set_option_float (Preview *p, int option, float value)
} }
static void static void
set_option_bool (Preview *p, int option, SANE_Bool value) set_option_bool (Preview * p, int option, SANE_Bool value)
{ {
SANE_Handle dev; SANE_Handle dev;
SANE_Status status; SANE_Status status;
@ -513,7 +519,8 @@ set_option_bool (Preview *p, int option, SANE_Bool value)
return; return;
dev = p->dialog->dev; dev = p->dialog->dev;
status = sane_control_option (dev, option, SANE_ACTION_SET_VALUE, &value, 0); status =
sane_control_option (dev, option, SANE_ACTION_SET_VALUE, &value, 0);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_fatal, "set_option_bool: sane_control_option failed: %s\n", DBG (DBG_fatal, "set_option_bool: sane_control_option failed: %s\n",
@ -523,7 +530,7 @@ set_option_bool (Preview *p, int option, SANE_Bool value)
} }
static int static int
increment_image_y (Preview *p) increment_image_y (Preview * p)
{ {
size_t extra_size, offset; size_t extra_size, offset;
char buf[256]; char buf[256];
@ -532,8 +539,8 @@ increment_image_y (Preview *p)
++p->image_y; ++p->image_y;
if (p->params.lines <= 0 && p->image_y >= p->image_height) if (p->params.lines <= 0 && p->image_y >= p->image_height)
{ {
offset = 3*p->image_width*p->image_height; offset = 3 * p->image_width * p->image_height;
extra_size = 3*32*p->image_width; extra_size = 3 * 32 * p->image_width;
p->image_height += 32; p->image_height += 32;
p->image_data = realloc (p->image_data, offset + extra_size); p->image_data = realloc (p->image_data, offset + extra_size);
if (!p->image_data) if (!p->image_data)
@ -560,6 +567,10 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
SANE_Int len; SANE_Int len;
int i, j; int i, j;
DBG_INIT ();
DBG (DBG_debug, "input_available: enter\n");
dev = p->dialog->dev; dev = p->dialog->dev;
while (1) while (1)
{ {
@ -596,7 +607,7 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
scan_done (p); scan_done (p);
return; return;
} }
if (!len) /* out of data for now */ if (!len) /* out of data for now */
{ {
if (p->input_tag < 0) if (p->input_tag < 0)
{ {
@ -618,7 +629,7 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
{ {
u_char mask = buf[i]; u_char mask = buf[i];
for (j = 7; j >= 0; --j) for (j = 7; j >= 0; --j)
{ {
u_char gl = (mask & (1 << j)) ? 0xff : 0x00; u_char gl = (mask & (1 << j)) ? 0xff : 0x00;
@ -649,7 +660,7 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
{ {
p->image_data[p->image_offset++] = buf[i]; p->image_data[p->image_offset++] = buf[i];
if (p->image_offset%3 == 0) if (p->image_offset % 3 == 0)
{ {
if (++p->image_x >= p->image_width if (++p->image_x >= p->image_width
&& increment_image_y (p) < 0) && increment_image_y (p) < 0)
@ -660,10 +671,10 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
case 16: case 16:
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
{ {
guint16 value = buf [i]; guint16 value = buf[i];
if ((i % 2) == 1) if ((i % 2) == 1)
p->image_data[p->image_offset++] = *(guint8 *) (&value); p->image_data[p->image_offset++] = *(guint8 *) (&value);
if (p->image_offset%6 == 0) if (p->image_offset % 6 == 0)
{ {
if (++p->image_x >= p->image_width if (++p->image_x >= p->image_width
&& increment_image_y (p) < 0) && increment_image_y (p) < 0)
@ -715,17 +726,14 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
case 16: case 16:
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
{ {
guint16 value = buf [i]; guint16 value = buf[i];
if ((i % 2) == 1) if ((i % 2) == 1)
{ {
p->image_data[p->image_offset++] = p->image_data[p->image_offset++] = *(guint8 *) (&value);
*(guint8 *) (&value); p->image_data[p->image_offset++] = *(guint8 *) (&value);
p->image_data[p->image_offset++] = p->image_data[p->image_offset++] = *(guint8 *) (&value);
*(guint8 *) (&value);
p->image_data[p->image_offset++] =
*(guint8 *) (&value);
} }
if (p->image_offset%2 == 0) if (p->image_offset % 2 == 0)
{ {
if (++p->image_x >= p->image_width if (++p->image_x >= p->image_width
&& increment_image_y (p) < 0) && increment_image_y (p) < 0)
@ -771,14 +779,14 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
return; return;
} }
break; break;
case 16: case 16:
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
{ {
guint16 value = buf [i]; guint16 value = buf[i];
if ((i % 2) == 1) if ((i % 2) == 1)
{ {
p->image_data[p->image_offset] = *(guint8 *) (&value); p->image_data[p->image_offset] = *(guint8 *) (&value);
p->image_offset += 3; p->image_offset += 3;
} }
if (p->image_offset % 2 == 0) if (p->image_offset % 2 == 0)
@ -820,7 +828,7 @@ bad_depth:
} }
static void static void
scan_done (Preview *p) scan_done (Preview * p)
{ {
int i; int i;
@ -846,7 +854,7 @@ scan_done (Preview *p)
} }
static void static void
scan_start (Preview *p) scan_start (Preview * p)
{ {
SANE_Handle dev = p->dialog->dev; SANE_Handle dev = p->dialog->dev;
SANE_Status status; SANE_Status status;
@ -859,7 +867,7 @@ scan_start (Preview *p)
gtk_widget_set_sensitive (p->dialog->window->parent->parent->parent, FALSE); gtk_widget_set_sensitive (p->dialog->window->parent->parent->parent, FALSE);
/* clear old preview: */ /* clear old preview: */
memset (p->preview_row, 0xff, 3*p->preview_width); memset (p->preview_row, 0xff, 3 * p->preview_width);
for (y = 0; y < p->preview_height; ++y) for (y = 0; y < p->preview_height; ++y)
gtk_preview_draw_row (GTK_PREVIEW (p->window), p->preview_row, gtk_preview_draw_row (GTK_PREVIEW (p->window), p->preview_row,
0, y, p->preview_width); 0, y, p->preview_width);
@ -892,10 +900,9 @@ scan_start (Preview *p)
return; return;
} }
if ((p->params.format >= SANE_FRAME_RGB && if ((p->params.format >= SANE_FRAME_RGB &&
p->params.format <= SANE_FRAME_BLUE) && p->params.format <= SANE_FRAME_BLUE) &&
p->params.depth == 1 && p->params.depth == 1 && p->params.pixels_per_line % 8 != 0)
p->params.pixels_per_line % 8 != 0)
{ {
snprintf (buf, sizeof (buf), snprintf (buf, sizeof (buf),
"Can't handle unaligned 1 bit RGB or three-pass mode."); "Can't handle unaligned 1 bit RGB or three-pass mode.");
@ -903,7 +910,7 @@ scan_start (Preview *p)
scan_done (p); scan_done (p);
return; return;
} }
p->image_offset = p->image_x = p->image_y = 0; p->image_offset = p->image_x = p->image_y = 0;
if (p->params.format >= SANE_FRAME_RED if (p->params.format >= SANE_FRAME_RED
@ -917,7 +924,7 @@ scan_start (Preview *p)
if (p->image_data) if (p->image_data)
free (p->image_data); free (p->image_data);
p->image_width = p->params.pixels_per_line; p->image_width = p->params.pixels_per_line;
p->image_height = p->params.lines; p->image_height = p->params.lines;
if (p->image_height < 0) if (p->image_height < 0)
p->image_height = 32; /* may have to adjust as we go... */ p->image_height = 32; /* may have to adjust as we go... */
@ -931,7 +938,7 @@ scan_start (Preview *p)
scan_done (p); scan_done (p);
return; return;
} }
memset (p->image_data, 0xff, 3*p->image_width*p->image_height); memset (p->image_data, 0xff, 3 * p->image_width * p->image_height);
} }
if (p->selection.active) if (p->selection.active)
@ -944,13 +951,15 @@ scan_start (Preview *p)
if (sane_set_io_mode (dev, SANE_TRUE) == SANE_STATUS_GOOD if (sane_set_io_mode (dev, SANE_TRUE) == SANE_STATUS_GOOD
&& sane_get_select_fd (dev, &fd) == SANE_STATUS_GOOD) && sane_get_select_fd (dev, &fd) == SANE_STATUS_GOOD)
p->input_tag = gdk_input_add (fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, input_available, p); p->input_tag =
gdk_input_add (fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION,
input_available, p);
else else
input_available (p, -1, GDK_INPUT_READ); input_available (p, -1, GDK_INPUT_READ);
} }
static void static void
establish_selection (Preview *p) establish_selection (Preview * p)
{ {
float min, max, normal, dev_selection[4]; float min, max, normal, dev_selection[4];
int i; int i;
@ -966,10 +975,11 @@ establish_selection (Preview *p)
if (max >= INF) if (max >= INF)
max = p->preview_width; max = p->preview_width;
normal = 1.0/(((i == 0) ? p->preview_width : p->preview_height) - 1); normal =
1.0 / (((i == 0) ? p->preview_width : p->preview_height) - 1);
normal *= (max - min); normal *= (max - min);
dev_selection[i] = p->selection.coord[i]*normal + min; dev_selection[i] = p->selection.coord[i] * normal + min;
dev_selection[i + 2] = p->selection.coord[i + 2]*normal + min; dev_selection[i + 2] = p->selection.coord[i + 2] * normal + min;
} }
for (i = 0; i < 4; ++i) for (i = 0; i < 4; ++i)
set_option_float (p, p->dialog->well_known.coord[i], dev_selection[i]); set_option_float (p, p->dialog->well_known.coord[i], dev_selection[i]);
@ -980,14 +990,14 @@ establish_selection (Preview *p)
} }
static int static int
make_preview_image_path (Preview *p, size_t filename_size, char *filename) make_preview_image_path (Preview * p, size_t filename_size, char *filename)
{ {
return gsg_make_path (filename_size, filename, 0, "preview-", return gsg_make_path (filename_size, filename, 0, "preview-",
p->dialog->dev_name, ".ppm"); p->dialog->dev_name, ".ppm");
} }
static void static void
restore_preview_image (Preview *p) restore_preview_image (Preview * p)
{ {
u_int psurface_type, psurface_unit; u_int psurface_type, psurface_unit;
char filename[PATH_MAX]; char filename[PATH_MAX];
@ -1009,8 +1019,7 @@ restore_preview_image (Preview *p)
(e.g., consider an image whose first image byte is 13 (`\r'). */ (e.g., consider an image whose first image byte is 13 (`\r'). */
if (fscanf (in, "P6\n# surface: %g %g %g %g %u %u\n%d %d\n255%*[\n]", if (fscanf (in, "P6\n# surface: %g %g %g %g %u %u\n%d %d\n255%*[\n]",
psurface + 0, psurface + 1, psurface + 2, psurface + 3, psurface + 0, psurface + 1, psurface + 2, psurface + 3,
&psurface_type, &psurface_unit, &psurface_type, &psurface_unit, &width, &height) != 8)
&width, &height) != 8)
return; return;
if (GROSSLY_DIFFERENT (psurface[0], p->surface[0]) if (GROSSLY_DIFFERENT (psurface[0], p->surface[0])
@ -1025,19 +1034,19 @@ restore_preview_image (Preview *p)
p->image_height = height; p->image_height = height;
if ((width == 0) || (height == 0)) if ((width == 0) || (height == 0))
return; return;
p->image_data = malloc (3*width*height); p->image_data = malloc (3 * width * height);
if (!p->image_data) if (!p->image_data)
return; return;
nread = fread (p->image_data, 3, width*height, in); nread = fread (p->image_data, 3, width * height, in);
p->image_y = nread/width; p->image_y = nread / width;
p->image_x = nread%width; p->image_x = nread % width;
} }
/* This is executed _after_ the gtkpreview's expose routine. */ /* This is executed _after_ the gtkpreview's expose routine. */
static gint static gint
expose_handler (GtkWidget *window, GdkEvent *event, gpointer data) expose_handler (GtkWidget * window, GdkEvent * event, gpointer data)
{ {
Preview *p = data; Preview *p = data;
@ -1047,7 +1056,7 @@ expose_handler (GtkWidget *window, GdkEvent *event, gpointer data)
} }
static gint static gint
event_handler (GtkWidget *window, GdkEvent *event, gpointer data) event_handler (GtkWidget * window, GdkEvent * event, gpointer data)
{ {
Preview *p = data; Preview *p = data;
int i, tmp; int i, tmp;
@ -1135,19 +1144,19 @@ event_handler (GtkWidget *window, GdkEvent *event, gpointer data)
} }
static void static void
start_button_clicked (GtkWidget *widget, gpointer data) start_button_clicked (GtkWidget * widget, gpointer data)
{ {
preview_scan (data); preview_scan (data);
} }
static void static void
cancel_button_clicked (GtkWidget *widget, gpointer data) cancel_button_clicked (GtkWidget * widget, gpointer data)
{ {
scan_done (data); scan_done (data);
} }
static void static void
top_destroyed (GtkWidget *widget, gpointer call_data) top_destroyed (GtkWidget * widget, gpointer call_data)
{ {
Preview *p = call_data; Preview *p = call_data;
@ -1155,7 +1164,7 @@ top_destroyed (GtkWidget *widget, gpointer call_data)
} }
Preview * Preview *
preview_new (GSGDialog *dialog) preview_new (GSGDialog * dialog)
{ {
static int first_time = 1; static int first_time = 1;
GtkWidget *table, *frame; GtkWidget *table, *frame;
@ -1200,7 +1209,7 @@ preview_new (GSGDialog *dialog)
/* padding */ 0); /* padding */ 0);
/* the empty box in the top-left corner */ /* the empty box in the top-left corner */
frame = gtk_frame_new (/* label */ 0); frame = gtk_frame_new ( /* label */ 0);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1, gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
@ -1223,8 +1232,7 @@ preview_new (GSGDialog *dialog)
GDK_EXPOSURE_MASK | GDK_EXPOSURE_MASK |
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_HINT_MASK |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
GDK_BUTTON_RELEASE_MASK);
gtk_signal_connect (GTK_OBJECT (p->window), "event", gtk_signal_connect (GTK_OBJECT (p->window), "event",
(GtkSignalFunc) event_handler, p); (GtkSignalFunc) event_handler, p);
gtk_signal_connect_after (GTK_OBJECT (p->window), "expose_event", gtk_signal_connect_after (GTK_OBJECT (p->window), "expose_event",
@ -1254,7 +1262,7 @@ preview_new (GSGDialog *dialog)
gtk_signal_connect_object (GTK_OBJECT (p->window), "motion_notify_event", gtk_signal_connect_object (GTK_OBJECT (p->window), "motion_notify_event",
signal_func, GTK_OBJECT (p->vruler)); signal_func, GTK_OBJECT (p->vruler));
p->viewport = gtk_frame_new (/* label */ 0); p->viewport = gtk_frame_new ( /* label */ 0);
gtk_frame_set_shadow_type (GTK_FRAME (p->viewport), GTK_SHADOW_IN); gtk_frame_set_shadow_type (GTK_FRAME (p->viewport), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (p->viewport), p->window); gtk_container_add (GTK_CONTAINER (p->viewport), p->window);
@ -1297,7 +1305,7 @@ preview_new (GSGDialog *dialog)
} }
void void
preview_update (Preview *p) preview_update (Preview * p)
{ {
float val, width, height, max_width, max_height; float val, width, height, max_width, max_height;
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
@ -1352,16 +1360,16 @@ preview_update (Preview *p)
/* guess the initial preview window size: */ /* guess the initial preview window size: */
width = p->surface[GSG_BR_X] - p->surface[GSG_TL_X]; width = p->surface[GSG_BR_X] - p->surface[GSG_TL_X];
height = p->surface[GSG_BR_Y] - p->surface[GSG_TL_Y]; height = p->surface[GSG_BR_Y] - p->surface[GSG_TL_Y];
if (p->surface_type == SANE_TYPE_INT) if (p->surface_type == SANE_TYPE_INT)
{ {
width += 1.0; width += 1.0;
height += 1.0; height += 1.0;
} }
else else
{ {
width += SANE_UNFIX (1.0); width += SANE_UNFIX (1.0);
height += SANE_UNFIX (1.0); height += SANE_UNFIX (1.0);
} }
@ -1370,46 +1378,46 @@ preview_update (Preview *p)
if (width >= INF || height >= INF) if (width >= INF || height >= INF)
p->aspect = 1.0; p->aspect = 1.0;
else else
p->aspect = width/height; p->aspect = width / height;
if (surface_changed) if (surface_changed)
{ {
max_width = 0.5 * gdk_screen_width(); max_width = 0.5 * gdk_screen_width ();
max_height = 0.5 * gdk_screen_height(); max_height = 0.5 * gdk_screen_height ();
} }
else else
{ {
max_width = p->window->allocation.width; max_width = p->window->allocation.width;
max_height = p->window->allocation.height; max_height = p->window->allocation.height;
} }
if (p->surface_unit != SANE_UNIT_PIXEL) if (p->surface_unit != SANE_UNIT_PIXEL)
{ {
width = max_width; width = max_width;
height = width / p->aspect; height = width / p->aspect;
if (height > max_height) if (height > max_height)
{ {
height = max_height; height = max_height;
width = height * p->aspect; width = height * p->aspect;
} }
} }
else else
{ {
if (width > max_width) if (width > max_width)
width = max_width; width = max_width;
if (height > max_height) if (height > max_height)
height = max_height; height = max_height;
} }
/* re-adjust so we maintain aspect without exceeding max size: */ /* re-adjust so we maintain aspect without exceeding max size: */
if (width/height != p->aspect) if (width / height != p->aspect)
{ {
if (p->aspect > 1.0) if (p->aspect > 1.0)
height = width/p->aspect; height = width / p->aspect;
else else
width = height*p->aspect; width = height * p->aspect;
} }
p->preview_width = width + 0.5; p->preview_width = width + 0.5;
@ -1428,7 +1436,7 @@ preview_update (Preview *p)
} }
void void
preview_scan (Preview *p) preview_scan (Preview * p)
{ {
float min, max, swidth, sheight, width, height, dpi = 0; float min, max, swidth, sheight, width, height, dpi = 0;
const SANE_Option_Descriptor *opt; const SANE_Option_Descriptor *opt;
@ -1450,25 +1458,25 @@ preview_scan (Preview *p)
opt = sane_get_option_descriptor (p->dialog->dev, opt = sane_get_option_descriptor (p->dialog->dev,
p->dialog->well_known.dpi); p->dialog->well_known.dpi);
gwidth = p->preview_width; gwidth = p->preview_width;
gheight = p->preview_height; gheight = p->preview_height;
height = gheight; height = gheight;
width = height*p->aspect; width = height * p->aspect;
if (width > gwidth) if (width > gwidth)
{ {
width = gwidth; width = gwidth;
height = width/p->aspect; height = width / p->aspect;
} }
swidth = (p->surface[GSG_BR_X] - p->surface[GSG_TL_X]); swidth = (p->surface[GSG_BR_X] - p->surface[GSG_TL_X]);
if (swidth < INF) if (swidth < INF)
dpi = MM_PER_INCH*width/swidth; dpi = MM_PER_INCH * width / swidth;
else else
{ {
sheight = (p->surface[GSG_BR_Y] - p->surface[GSG_TL_Y]); sheight = (p->surface[GSG_BR_Y] - p->surface[GSG_TL_Y]);
if (sheight < INF) if (sheight < INF)
dpi = MM_PER_INCH*height/sheight; dpi = MM_PER_INCH * height / sheight;
else else
dpi = 18.0; dpi = 18.0;
} }
@ -1493,7 +1501,7 @@ preview_scan (Preview *p)
} }
void void
preview_destroy (Preview *p) preview_destroy (Preview * p)
{ {
char filename[PATH_MAX]; char filename[PATH_MAX];
FILE *out; FILE *out;
@ -1512,7 +1520,7 @@ preview_destroy (Preview *p)
p->surface[0], p->surface[1], p->surface[2], p->surface[3], p->surface[0], p->surface[1], p->surface[2], p->surface[3],
p->surface_type, p->surface_unit, p->surface_type, p->surface_unit,
p->image_width, p->image_height); p->image_width, p->image_height);
fwrite (p->image_data, 3, p->image_width*p->image_height, out); fwrite (p->image_data, 3, p->image_width * p->image_height, out);
fclose (out); fclose (out);
} }
} }

1039
src/xcam.c

Plik diff jest za duży Load Diff

Plik diff jest za duży Load Diff