kopia lustrzana https://gitlab.com/sane-project/frontends
xcam.c
-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.cmerge-requests/2/head
rodzic
98320c775b
commit
98f467fd31
Plik diff jest za duży
Load Diff
|
@ -47,8 +47,7 @@
|
|||
#define DBG_info 3
|
||||
#define DBG_debug 4
|
||||
|
||||
#define DEBUG_NOT_STATIC
|
||||
#define BACKEND_NAME xscanimage
|
||||
#define BACKEND_NAME gtkglue
|
||||
#include "../include/sane/sanei_debug.h"
|
||||
|
||||
int gsg_message_dialog_active = 0;
|
||||
|
@ -63,11 +62,16 @@ unit_string (SANE_Unit unit)
|
|||
|
||||
switch (unit)
|
||||
{
|
||||
case SANE_UNIT_NONE: return "none";
|
||||
case SANE_UNIT_PIXEL: return "pixel";
|
||||
case SANE_UNIT_BIT: return "bit";
|
||||
case SANE_UNIT_DPI: return "dpi";
|
||||
case SANE_UNIT_PERCENT: return "%";
|
||||
case SANE_UNIT_NONE:
|
||||
return "none";
|
||||
case SANE_UNIT_PIXEL:
|
||||
return "pixel";
|
||||
case SANE_UNIT_BIT:
|
||||
return "bit";
|
||||
case SANE_UNIT_DPI:
|
||||
return "dpi";
|
||||
case SANE_UNIT_PERCENT:
|
||||
return "%";
|
||||
case SANE_UNIT_MM:
|
||||
d = preferences.length_unit;
|
||||
if (d > 9.9 && d < 10.1)
|
||||
|
@ -75,7 +79,8 @@ unit_string (SANE_Unit unit)
|
|||
else if (d > 25.3 && d < 25.5)
|
||||
return "in";
|
||||
return "mm";
|
||||
case SANE_UNIT_MICROSECOND: return "us";
|
||||
case SANE_UNIT_MICROSECOND:
|
||||
return "us";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -95,8 +100,7 @@ set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc)
|
|||
int
|
||||
gsg_make_path (size_t buf_size, char *buf,
|
||||
const char *prog_name,
|
||||
const char *prefix, const char *dev_name,
|
||||
const char *postfix)
|
||||
const char *prefix, const char *dev_name, const char *postfix)
|
||||
{
|
||||
struct passwd *pw;
|
||||
size_t len, extra;
|
||||
|
@ -299,7 +303,8 @@ gsg_get_filename (const char *label, const char *default_name,
|
|||
|
||||
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,
|
||||
&cancel);
|
||||
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button),
|
||||
|
@ -380,8 +385,7 @@ autobutton_new (GtkWidget *parent, GSGDialogElement *elem,
|
|||
gtk_container_border_width (GTK_CONTAINER (button), 0);
|
||||
gtk_widget_set_usize (button, 20, 20);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "toggled",
|
||||
(GtkSignalFunc) autobutton_update,
|
||||
elem);
|
||||
(GtkSignalFunc) autobutton_update, elem);
|
||||
set_tooltip (tooltips, button, "Turns on automatic mode.");
|
||||
|
||||
alignment = gtk_alignment_new (0.0, 1.0, 0.5, 0.5);
|
||||
|
@ -419,8 +423,7 @@ button_new (GtkWidget * parent, const char *name, SANE_Word val,
|
|||
button = gtk_check_button_new_with_label ((char *) name);
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), val);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "toggled",
|
||||
(GtkSignalFunc) button_update,
|
||||
elem);
|
||||
(GtkSignalFunc) button_update, elem);
|
||||
gtk_box_pack_start (GTK_BOX (parent), button, FALSE, TRUE, 0);
|
||||
if (!is_settable)
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
|
||||
|
@ -440,6 +443,11 @@ scale_update (GtkAdjustment * adj_data, GSGDialogElement * elem)
|
|||
double d;
|
||||
SANE_Status status;
|
||||
|
||||
DBG_INIT ();
|
||||
|
||||
DBG (DBG_debug, "scale_update\n");
|
||||
|
||||
|
||||
opt_num = elem - dialog->element;
|
||||
opt = sane_get_option_descriptor (dialog->dev, opt_num);
|
||||
switch (opt->type)
|
||||
|
@ -460,11 +468,13 @@ scale_update (GtkAdjustment * adj_data, GSGDialogElement * elem)
|
|||
return;
|
||||
}
|
||||
set_option (dialog, opt_num, &val, SANE_ACTION_SET_VALUE);
|
||||
status = sane_control_option (dialog->dev, opt_num, SANE_ACTION_GET_VALUE, &new_val,
|
||||
0);
|
||||
status =
|
||||
sane_control_option (dialog->dev, opt_num, SANE_ACTION_GET_VALUE,
|
||||
&new_val, 0);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -605,8 +615,7 @@ option_menu_callback (GtkWidget * widget, gpointer data)
|
|||
static void
|
||||
option_menu_new (GtkWidget * parent, const char *name, char *str_list[],
|
||||
const char *val, GSGDialogElement * elem,
|
||||
GtkTooltips *tooltips, const char *desc,
|
||||
gint is_settable)
|
||||
GtkTooltips * tooltips, const char *desc, gint is_settable)
|
||||
{
|
||||
GtkWidget *hbox, *label, *option_menu, *menu, *item;
|
||||
GSGMenuItem *menu_items;
|
||||
|
@ -687,8 +696,7 @@ text_entry_callback (GtkWidget *w, gpointer data)
|
|||
static void
|
||||
text_entry_new (GtkWidget * parent, const char *name, const char *val,
|
||||
GSGDialogElement * elem,
|
||||
GtkTooltips *tooltips, const char *desc,
|
||||
gint is_settable)
|
||||
GtkTooltips * tooltips, const char *desc, gint is_settable)
|
||||
{
|
||||
GtkWidget *hbox, *text, *label;
|
||||
|
||||
|
@ -1265,8 +1273,9 @@ panel_rebuild (GSGDialog * dialog)
|
|||
|
||||
GSGDialog *
|
||||
gsg_create_dialog (GtkWidget * window, const char *device_name,
|
||||
GSGCallback option_reload_callback, void *option_reload_arg,
|
||||
GSGCallback param_change_callback, void *param_change_arg)
|
||||
GSGCallback option_reload_callback,
|
||||
void *option_reload_arg, GSGCallback param_change_callback,
|
||||
void *param_change_arg)
|
||||
{
|
||||
SANE_Int num_elements;
|
||||
GSGDialog *dialog;
|
||||
|
@ -1339,8 +1348,7 @@ gsg_update_scan_window (GSGDialog *dialog)
|
|||
opt = sane_get_option_descriptor (dialog->dev, optnum);
|
||||
|
||||
status = sane_control_option (dialog->dev, optnum,
|
||||
SANE_ACTION_GET_VALUE,
|
||||
&word, 0);
|
||||
SANE_ACTION_GET_VALUE, &word, 0);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
continue; /* sliently ignore errors */
|
||||
|
||||
|
@ -1373,7 +1381,8 @@ gsg_update_scan_window (GSGDialog *dialog)
|
|||
sprintf (str, "%g", SANE_UNFIX (word));
|
||||
/* XXX maybe we should call this only when the value changes... */
|
||||
gtk_option_menu_set_history (GTK_OPTION_MENU (elem->widget),
|
||||
option_menu_lookup (elem->menu, str));
|
||||
option_menu_lookup (elem->menu,
|
||||
str));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1400,8 +1409,7 @@ gsg_sync (GSGDialog *dialog)
|
|||
if (!SANE_OPTION_IS_ACTIVE (opt->cap))
|
||||
continue;
|
||||
|
||||
if (opt->type != SANE_TYPE_INT &&
|
||||
opt->type != SANE_TYPE_FIXED)
|
||||
if (opt->type != SANE_TYPE_INT && opt->type != SANE_TYPE_FIXED)
|
||||
continue;
|
||||
|
||||
if (opt->size == sizeof (SANE_Word))
|
||||
|
@ -1465,8 +1473,7 @@ gsg_set_sensitivity (GSGDialog *dialog, int sensitive)
|
|||
opt = sane_get_option_descriptor (dialog->dev, i);
|
||||
|
||||
if (!SANE_OPTION_IS_ACTIVE (opt->cap)
|
||||
|| opt->type == SANE_TYPE_GROUP
|
||||
|| !dialog->element[i].widget)
|
||||
|| opt->type == SANE_TYPE_GROUP || !dialog->element[i].widget)
|
||||
continue;
|
||||
|
||||
if (!(opt->cap & SANE_CAP_ALWAYS_SETTABLE))
|
||||
|
|
|
@ -85,8 +85,7 @@
|
|||
#define DBG_info 3
|
||||
#define DBG_debug 4
|
||||
|
||||
#define DEBUG_DECLARE_ONLY
|
||||
#define BACKEND_NAME xscanimage
|
||||
#define BACKEND_NAME preview
|
||||
#include "../include/sane/sanei_debug.h"
|
||||
|
||||
#ifndef PATH_MAX
|
||||
|
@ -193,7 +192,8 @@ update_selection (Preview *p)
|
|||
normal /= (max - min);
|
||||
p->selection.active = TRUE;
|
||||
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])
|
||||
p->selection.coord[i + 2] = p->selection.coord[i];
|
||||
}
|
||||
|
@ -271,9 +271,12 @@ paint_image (Preview *p)
|
|||
if (x >= p->image_width)
|
||||
break;
|
||||
|
||||
p->preview_row[3*dst_x + 0] = p->image_data[src_offset + 3*x + 0];
|
||||
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];
|
||||
p->preview_row[3 * dst_x + 0] =
|
||||
p->image_data[src_offset + 3 * x + 0];
|
||||
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;
|
||||
}
|
||||
gtk_preview_draw_row (GTK_PREVIEW (p->window), p->preview_row,
|
||||
|
@ -367,7 +370,10 @@ preview_area_resize (GtkWidget *widget)
|
|||
if (p->surface_unit == SANE_UNIT_MM)
|
||||
{
|
||||
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);
|
||||
|
@ -513,7 +519,8 @@ set_option_bool (Preview *p, int option, SANE_Bool value)
|
|||
return;
|
||||
|
||||
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)
|
||||
{
|
||||
DBG (DBG_fatal, "set_option_bool: sane_control_option failed: %s\n",
|
||||
|
@ -560,6 +567,10 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
|
|||
SANE_Int len;
|
||||
int i, j;
|
||||
|
||||
DBG_INIT ();
|
||||
|
||||
DBG (DBG_debug, "input_available: enter\n");
|
||||
|
||||
dev = p->dialog->dev;
|
||||
while (1)
|
||||
{
|
||||
|
@ -718,12 +729,9 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
|
|||
guint16 value = buf[i];
|
||||
if ((i % 2) == 1)
|
||||
{
|
||||
p->image_data[p->image_offset++] =
|
||||
*(guint8 *) (&value);
|
||||
p->image_data[p->image_offset++] =
|
||||
*(guint8 *) (&value);
|
||||
p->image_data[p->image_offset++] =
|
||||
*(guint8 *) (&value);
|
||||
p->image_data[p->image_offset++] = *(guint8 *) (&value);
|
||||
p->image_data[p->image_offset++] = *(guint8 *) (&value);
|
||||
p->image_data[p->image_offset++] = *(guint8 *) (&value);
|
||||
}
|
||||
if (p->image_offset % 2 == 0)
|
||||
{
|
||||
|
@ -894,8 +902,7 @@ scan_start (Preview *p)
|
|||
|
||||
if ((p->params.format >= SANE_FRAME_RGB &&
|
||||
p->params.format <= SANE_FRAME_BLUE) &&
|
||||
p->params.depth == 1 &&
|
||||
p->params.pixels_per_line % 8 != 0)
|
||||
p->params.depth == 1 && p->params.pixels_per_line % 8 != 0)
|
||||
{
|
||||
snprintf (buf, sizeof (buf),
|
||||
"Can't handle unaligned 1 bit RGB or three-pass mode.");
|
||||
|
@ -944,7 +951,9 @@ scan_start (Preview *p)
|
|||
|
||||
if (sane_set_io_mode (dev, SANE_TRUE) == 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
|
||||
input_available (p, -1, GDK_INPUT_READ);
|
||||
}
|
||||
|
@ -966,7 +975,8 @@ establish_selection (Preview *p)
|
|||
if (max >= INF)
|
||||
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);
|
||||
dev_selection[i] = p->selection.coord[i] * normal + min;
|
||||
dev_selection[i + 2] = p->selection.coord[i + 2] * normal + min;
|
||||
|
@ -1009,8 +1019,7 @@ restore_preview_image (Preview *p)
|
|||
(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]",
|
||||
psurface + 0, psurface + 1, psurface + 2, psurface + 3,
|
||||
&psurface_type, &psurface_unit,
|
||||
&width, &height) != 8)
|
||||
&psurface_type, &psurface_unit, &width, &height) != 8)
|
||||
return;
|
||||
|
||||
if (GROSSLY_DIFFERENT (psurface[0], p->surface[0])
|
||||
|
@ -1223,8 +1232,7 @@ preview_new (GSGDialog *dialog)
|
|||
GDK_EXPOSURE_MASK |
|
||||
GDK_POINTER_MOTION_MASK |
|
||||
GDK_POINTER_MOTION_HINT_MASK |
|
||||
GDK_BUTTON_PRESS_MASK |
|
||||
GDK_BUTTON_RELEASE_MASK);
|
||||
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
|
||||
gtk_signal_connect (GTK_OBJECT (p->window), "event",
|
||||
(GtkSignalFunc) event_handler, p);
|
||||
gtk_signal_connect_after (GTK_OBJECT (p->window), "expose_event",
|
||||
|
|
867
src/xcam.c
867
src/xcam.c
Plik diff jest za duży
Load Diff
128
src/xscanimage.c
128
src/xscanimage.c
|
@ -45,7 +45,6 @@
|
|||
#include <sane/saneopts.h>
|
||||
#include "../include/sane/sanei.h"
|
||||
|
||||
#define DEBUG_DECLARE_ONLY
|
||||
#define BACKEND_NAME xscanimage
|
||||
#include "../include/sane/sanei_debug.h"
|
||||
|
||||
|
@ -96,8 +95,7 @@ static void run (char *name, int nparams, GimpParam * param,
|
|||
int *nreturn_vals, GimpParam ** return_vals);
|
||||
#endif /* !ENABLE_GIMP_1_2 */
|
||||
|
||||
GimpPlugInInfo PLUG_IN_INFO =
|
||||
{
|
||||
GimpPlugInInfo PLUG_IN_INFO = {
|
||||
NULL, /* init_proc */
|
||||
NULL, /* quit_proc */
|
||||
query, /* query_proc */
|
||||
|
@ -161,8 +159,7 @@ static gint seldev = -1; /* The selected device */
|
|||
static gint defdev = -1; /* The default device */
|
||||
static gint ndevs; /* The number of available devices */
|
||||
static gboolean little_endian; /* Is this computer little-endian ? */
|
||||
static struct option long_options[] =
|
||||
{
|
||||
static struct option long_options[] = {
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
{0, 0, 0, 0}
|
||||
|
@ -201,6 +198,8 @@ encode_devname (const char *devname, int n, char *buf)
|
|||
const char *src;
|
||||
char ch;
|
||||
|
||||
DBG_INIT ();
|
||||
|
||||
DBG (DBG_debug, "encode_devname\n");
|
||||
limit = buf + n;
|
||||
for (src = devname, dst = buf; *src; ++src)
|
||||
|
@ -212,8 +211,7 @@ encode_devname (const char *devname, int n, char *buf)
|
|||
/* don't use the ctype.h macros here since we don't want to
|
||||
allow anything non-ASCII here... */
|
||||
if ((ch >= '0' && ch <= '9')
|
||||
|| (ch >= 'a' && ch <= 'z')
|
||||
|| (ch >= 'A' && ch <= 'Z'))
|
||||
|| (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
|
||||
*dst++ = ch;
|
||||
else
|
||||
{
|
||||
|
@ -248,6 +246,8 @@ decode_devname (const char *encoded_devname, int n, char *buf)
|
|||
const char *src;
|
||||
char ch, val;
|
||||
|
||||
DBG_INIT ();
|
||||
|
||||
DBG (DBG_debug, "decode_devname\n");
|
||||
limit = buf + n;
|
||||
for (src = encoded_devname, dst = buf; *src; ++dst)
|
||||
|
@ -297,8 +297,7 @@ decode_devname (const char *encoded_devname, int n, char *buf)
|
|||
static void
|
||||
query (void)
|
||||
{
|
||||
static GimpParamDef args[] =
|
||||
{
|
||||
static GimpParamDef args[] = {
|
||||
{GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive"},
|
||||
};
|
||||
static GimpParamDef *return_vals = NULL;
|
||||
|
@ -310,9 +309,10 @@ query (void)
|
|||
int i, j;
|
||||
SANE_Status status;
|
||||
|
||||
DBG_INIT ();
|
||||
|
||||
DBG (DBG_debug, "query\n");
|
||||
gimp_install_procedure (
|
||||
"xscanimage",
|
||||
gimp_install_procedure ("xscanimage",
|
||||
"Front-end to the SANE interface",
|
||||
"This function provides access to scanners and other image acquisition "
|
||||
"devices through the SANE (Scanner Access Now Easy) interface.",
|
||||
|
@ -322,27 +322,29 @@ query (void)
|
|||
"<Toolbox>/File/Acquire/xscanimage/Device dialog...",
|
||||
"RGB, GRAY",
|
||||
GIMP_EXTENSION,
|
||||
nargs, nreturn_vals,
|
||||
args, return_vals);
|
||||
nargs, nreturn_vals, args, return_vals);
|
||||
|
||||
status = sane_init (0, 0);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_fatal, "query: sane_init failed: %s\n", sane_strstatus (status));
|
||||
DBG (DBG_fatal, "query: sane_init failed: %s\n",
|
||||
sane_strstatus (status));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
status = sane_get_devices (&devlist, SANE_FALSE);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_fatal, "query: sane_get_devices failed: %s\n", sane_strstatus (status));
|
||||
DBG (DBG_fatal, "query: sane_get_devices failed: %s\n",
|
||||
sane_strstatus (status));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
for (i = 0; devlist[i]; ++i)
|
||||
{
|
||||
strcpy (name, "xscanimage-");
|
||||
if (encode_devname (devlist[i]->name, sizeof (name) - 11, name + 11) < 0)
|
||||
if (encode_devname (devlist[i]->name, sizeof (name) - 11, name + 11) <
|
||||
0)
|
||||
continue; /* name too long... */
|
||||
|
||||
strncpy (mpath, "<Toolbox>/File/Acquire/xscanimage/", sizeof (mpath));
|
||||
|
@ -442,8 +444,8 @@ null_print_func (const gchar *msg)
|
|||
|
||||
#endif /* HAVE_LIBGIMP_GIMP_H */
|
||||
|
||||
static
|
||||
SANE_Word get_resolution (SANE_Handle dev)
|
||||
static SANE_Word
|
||||
get_resolution (SANE_Handle dev)
|
||||
{
|
||||
SANE_Status status;
|
||||
SANE_Word resolution;
|
||||
|
@ -451,7 +453,8 @@ SANE_Word get_resolution (SANE_Handle dev)
|
|||
const SANE_Option_Descriptor *option_desc;
|
||||
|
||||
DBG (DBG_debug, "get_resolution\n");
|
||||
status = sane_control_option (dev, 0, SANE_ACTION_GET_VALUE, &num_options, 0);
|
||||
status =
|
||||
sane_control_option (dev, 0, SANE_ACTION_GET_VALUE, &num_options, 0);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
return 0;
|
||||
|
||||
|
@ -512,7 +515,8 @@ update_param (GSGDialog *dialog, void *arg)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (params.format >= SANE_FRAME_RED && params.format <= SANE_FRAME_BLUE)
|
||||
if (params.format >= SANE_FRAME_RED
|
||||
&& params.format <= SANE_FRAME_BLUE)
|
||||
size *= 3;
|
||||
|
||||
if (size >= 1024 * 1024)
|
||||
|
@ -525,8 +529,8 @@ update_param (GSGDialog *dialog, void *arg)
|
|||
size /= 1024;
|
||||
unit = "KB";
|
||||
}
|
||||
snprintf (buf, sizeof(buf), "%dx%d: %1.1f %s", params.pixels_per_line,
|
||||
params.lines, size, unit);
|
||||
snprintf (buf, sizeof (buf), "%dx%d: %1.1f %s",
|
||||
params.pixels_per_line, params.lines, size, unit);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -675,7 +679,8 @@ advance (void)
|
|||
{
|
||||
gimp_pixel_rgn_set_rect (&scan_win.region, scan_win.tile,
|
||||
0, scan_win.y - tile_height,
|
||||
scan_win.param.pixels_per_line, tile_height);
|
||||
scan_win.param.pixels_per_line,
|
||||
tile_height);
|
||||
if (scan_win.param.format >= SANE_FRAME_RED
|
||||
&& scan_win.param.format <= SANE_FRAME_BLUE)
|
||||
{
|
||||
|
@ -1119,11 +1124,21 @@ scan_start (void)
|
|||
|
||||
switch (scan_win.param.format)
|
||||
{
|
||||
case SANE_FRAME_RGB: frame_type = "RGB"; break;
|
||||
case SANE_FRAME_RED: frame_type = "red"; break;
|
||||
case SANE_FRAME_GREEN: frame_type = "green"; break;
|
||||
case SANE_FRAME_BLUE: frame_type = "blue"; break;
|
||||
case SANE_FRAME_GRAY: frame_type = "gray"; break;
|
||||
case SANE_FRAME_RGB:
|
||||
frame_type = "RGB";
|
||||
break;
|
||||
case SANE_FRAME_RED:
|
||||
frame_type = "red";
|
||||
break;
|
||||
case SANE_FRAME_GREEN:
|
||||
frame_type = "green";
|
||||
break;
|
||||
case SANE_FRAME_BLUE:
|
||||
frame_type = "blue";
|
||||
break;
|
||||
case SANE_FRAME_GRAY:
|
||||
frame_type = "gray";
|
||||
break;
|
||||
}
|
||||
|
||||
if (scan_win.mode == STANDALONE)
|
||||
|
@ -1145,8 +1160,7 @@ scan_start (void)
|
|||
scan_done ();
|
||||
return;
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
case SANE_FRAME_RGB:
|
||||
/*FALLTHROUGH*/ case SANE_FRAME_RGB:
|
||||
fprintf (scan_win.out, "P6\n# SANE data follows\n%d %d\n%d\n",
|
||||
scan_win.param.pixels_per_line, scan_win.param.lines,
|
||||
(scan_win.param.depth <= 8) ? 255 : 65535);
|
||||
|
@ -1155,7 +1169,8 @@ scan_start (void)
|
|||
case SANE_FRAME_GRAY:
|
||||
if (scan_win.param.depth == 1)
|
||||
fprintf (scan_win.out, "P4\n# SANE data follows\n%d %d\n",
|
||||
scan_win.param.pixels_per_line, scan_win.param.lines);
|
||||
scan_win.param.pixels_per_line,
|
||||
scan_win.param.lines);
|
||||
else
|
||||
fprintf (scan_win.out, "P5\n# SANE data follows\n%d %d\n%d\n",
|
||||
scan_win.param.pixels_per_line, scan_win.param.lines,
|
||||
|
@ -1207,7 +1222,8 @@ scan_start (void)
|
|||
}
|
||||
|
||||
scan_win.image_ID = gimp_image_new (scan_win.param.pixels_per_line,
|
||||
scan_win.param.lines, image_type);
|
||||
scan_win.param.lines,
|
||||
image_type);
|
||||
|
||||
/* the following is supported since gimp-1.1.0 */
|
||||
#ifdef GIMP_HAVE_RESOLUTION_INFO
|
||||
|
@ -1244,7 +1260,8 @@ scan_start (void)
|
|||
scan_win.input_tag = -1;
|
||||
if (sane_set_io_mode (dev, SANE_TRUE) == SANE_STATUS_GOOD
|
||||
&& sane_get_select_fd (dev, &fd) == SANE_STATUS_GOOD)
|
||||
scan_win.input_tag = gdk_input_add (fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION,
|
||||
scan_win.input_tag =
|
||||
gdk_input_add (fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION,
|
||||
input_available, 0);
|
||||
else
|
||||
{
|
||||
|
@ -1278,7 +1295,8 @@ scan_dialog (GtkWidget * widget, gpointer call_data)
|
|||
(!strncmp (testfilename, "MBP.", 4)) ||
|
||||
(!strncmp (testfilename, "MPP.", 4))))
|
||||
{
|
||||
snprintf (buf, sizeof (buf), "Failed to scan, wrong file extension, use pnm, pgm, pbm or ppm `%s'",
|
||||
snprintf (buf, sizeof (buf),
|
||||
"Failed to scan, wrong file extension, use pnm, pgm, pbm or ppm `%s'",
|
||||
preferences.filename);
|
||||
gsg_error (buf);
|
||||
return;
|
||||
|
@ -1303,8 +1321,7 @@ static void
|
|||
zoom_in_preview (GtkWidget * widget, gpointer data)
|
||||
{
|
||||
if (Selection.x1 >= Selection.x2
|
||||
|| Selection.y1 >= Selection.y2
|
||||
|| !Selection.active)
|
||||
|| Selection.y1 >= Selection.y2 || !Selection.active)
|
||||
return;
|
||||
|
||||
Selection.active = FALSE;
|
||||
|
@ -1414,7 +1431,8 @@ preview_options_ok_callback (GtkWidget *widget, gpointer data)
|
|||
/* gamma min, max test */
|
||||
if (preferences.preview_gamma < 0.0 || preferences.preview_gamma > 255.0)
|
||||
{
|
||||
snprintf (buf, sizeof (buf), "Gamma value %g is < 0 or > 255, please change!",
|
||||
snprintf (buf, sizeof (buf),
|
||||
"Gamma value %g is < 0 or > 255, please change!",
|
||||
preferences.preview_gamma);
|
||||
gsg_warning (buf);
|
||||
return;
|
||||
|
@ -1515,7 +1533,8 @@ preview_options_dialog (GtkWidget *widget, gpointer data)
|
|||
|
||||
button = gtk_button_new_with_label ("Cancel");
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
(GtkSignalFunc) preview_options_cancel_callback, dialog);
|
||||
(GtkSignalFunc) preview_options_cancel_callback,
|
||||
dialog);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
|
@ -1735,7 +1754,8 @@ filename_changed_callback (GtkWidget *widget, gpointer data)
|
|||
static void
|
||||
device_dialog (void)
|
||||
{
|
||||
GtkWidget *vbox, *hbox, *button, *frame, *scrolled_window, *dialog_window, *label, *text;
|
||||
GtkWidget *vbox, *hbox, *button, *frame, *scrolled_window, *dialog_window,
|
||||
*label, *text;
|
||||
GtkWidget *menubar_item;
|
||||
const gchar *devname;
|
||||
|
||||
|
@ -1819,8 +1839,8 @@ device_dialog (void)
|
|||
gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolled_window),
|
||||
GTK_CORNER_TOP_RIGHT);
|
||||
dialog_window = gtk_hbox_new ( /* homogeneous */ FALSE, 0);
|
||||
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),
|
||||
dialog_window);
|
||||
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW
|
||||
(scrolled_window), dialog_window);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
|
||||
gtk_widget_show (scrolled_window);
|
||||
|
@ -1859,13 +1879,13 @@ device_dialog (void)
|
|||
/* The Scan button */
|
||||
scan_win.scan_button = gtk_button_new_with_label ("Scan");
|
||||
gtk_signal_connect (GTK_OBJECT (scan_win.scan_button), "clicked",
|
||||
(GtkSignalFunc) scan_dialog,
|
||||
NULL);
|
||||
(GtkSignalFunc) scan_dialog, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), scan_win.scan_button, TRUE, TRUE, 0);
|
||||
gtk_widget_show (scan_win.scan_button);
|
||||
|
||||
/* The Preview button */
|
||||
scan_win.preview_button = gtk_toggle_button_new_with_label ("Preview Window");
|
||||
scan_win.preview_button =
|
||||
gtk_toggle_button_new_with_label ("Preview Window");
|
||||
gtk_signal_connect (GTK_OBJECT (scan_win.preview_button), "clicked",
|
||||
(GtkSignalFunc) scan_preview, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), scan_win.preview_button, TRUE, TRUE, 0);
|
||||
|
@ -1875,16 +1895,14 @@ device_dialog (void)
|
|||
/* The Zoom in button */
|
||||
button = gtk_button_new_with_label ("Zoom");
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
(GtkSignalFunc) zoom_in_preview,
|
||||
NULL);
|
||||
(GtkSignalFunc) zoom_in_preview, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
/* The Zoom out button */
|
||||
button = gtk_button_new_with_label ("Zoom out");
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
(GtkSignalFunc) zoom_out_preview,
|
||||
NULL);
|
||||
(GtkSignalFunc) zoom_out_preview, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show (button);
|
||||
#endif
|
||||
|
@ -1958,8 +1976,7 @@ choose_device (void)
|
|||
button = gtk_button_new_with_label ("OK");
|
||||
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
|
||||
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
||||
(GtkSignalFunc) ok_choose_dialog_callback,
|
||||
NULL);
|
||||
(GtkSignalFunc) ok_choose_dialog_callback, NULL);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_grab_default (button);
|
||||
gtk_widget_show (button);
|
||||
|
@ -1995,6 +2012,8 @@ init (int argc, char **argv)
|
|||
struct stat st;
|
||||
SANE_Status status;
|
||||
|
||||
DBG_INIT ();
|
||||
|
||||
DBG (DBG_debug, "init\n");
|
||||
gtk_init (&argc, &argv);
|
||||
#ifdef HAVE_LIBGIMP_GIMP_H
|
||||
|
@ -2024,7 +2043,8 @@ init (int argc, char **argv)
|
|||
status = sane_init (0, 0);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_fatal, "init: sane_init failed: %s\n", sane_strstatus (status));
|
||||
DBG (DBG_fatal, "init: sane_init failed: %s\n",
|
||||
sane_strstatus (status));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
|
@ -2073,7 +2093,8 @@ init (int argc, char **argv)
|
|||
status = sane_get_devices (&devlist, SANE_FALSE);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_fatal, "init: sane_get_devices failed: %s\n", sane_strstatus (status));
|
||||
DBG (DBG_fatal, "init: sane_get_devices failed: %s\n",
|
||||
sane_strstatus (status));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
|
@ -2137,7 +2158,8 @@ interface (int argc, char **argv)
|
|||
}
|
||||
else
|
||||
{
|
||||
DBG (DBG_fatal, "No scanners were identified. If you were expecting something\n"
|
||||
DBG (DBG_fatal,
|
||||
"No scanners were identified. If you were expecting something\n"
|
||||
" different, check that the scanner is plugged in, turned on and\n"
|
||||
" detected by sane-find-scanner (if appropriate). Please read\n"
|
||||
" the documentation which came with this software (README, FAQ,\n"
|
||||
|
|
Ładowanie…
Reference in New Issue