kopia lustrzana https://gitlab.com/sane-project/frontends
Added 16 bit support for stand-alone mode SANE_FRAME_GRAY and SANE_FRAME_RGB
(from Sergey Vlasov <vsu@altlinux.ru>.). Call scan_done if an error occurs during scan_start. Run sane_cancel even if sane_read wasn't called once.DEVEL_2_0_BRANCH-1 DEVEL_2_0_TRUNK-1
rodzic
5b796a36c4
commit
988a002348
|
@ -1,3 +1,11 @@
|
||||||
|
2002-11-14 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||||
|
|
||||||
|
* src/xscanimage.c: Added 16 bit support for stand-alone mode
|
||||||
|
SANE_FRAME_GRAY and SANE_FRAME_RGB (from Sergey Vlasov
|
||||||
|
<vsu@altlinux.ru>.). Call scan_done if an error occurs during
|
||||||
|
scan_start. Run sane_cancel even if sane_read wasn't called
|
||||||
|
once.
|
||||||
|
|
||||||
2002-10-24 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
2002-10-24 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||||
|
|
||||||
* configure configure.in: Addded extra version -cvs again.
|
* configure configure.in: Addded extra version -cvs again.
|
||||||
|
|
|
@ -126,6 +126,8 @@ static struct
|
||||||
GtkWidget *filename_entry;
|
GtkWidget *filename_entry;
|
||||||
FILE *out;
|
FILE *out;
|
||||||
long header_size;
|
long header_size;
|
||||||
|
gboolean have_odd_byte;
|
||||||
|
guint8 odd_byte;
|
||||||
#ifdef HAVE_LIBGIMP_GIMP_H
|
#ifdef HAVE_LIBGIMP_GIMP_H
|
||||||
/* for GIMP mode: */
|
/* for GIMP mode: */
|
||||||
gint32 image_ID;
|
gint32 image_ID;
|
||||||
|
@ -145,6 +147,7 @@ static const SANE_Device **devlist;
|
||||||
static gint seldev = -1; /* The selected device */
|
static gint seldev = -1; /* The selected device */
|
||||||
static gint defdev = -1; /* The default device */
|
static gint defdev = -1; /* The default device */
|
||||||
static gint ndevs; /* The number of available devices */
|
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'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
|
@ -163,6 +166,18 @@ static void interface (int argc, char **argv);
|
||||||
static void scan_start (void);
|
static void scan_start (void);
|
||||||
static void scan_done (void);
|
static void scan_done (void);
|
||||||
|
|
||||||
|
/* Test if this machine is little endian (from coolscan.c) */
|
||||||
|
static gboolean
|
||||||
|
calc_little_endian (void)
|
||||||
|
{
|
||||||
|
SANE_Int testvalue = 255;
|
||||||
|
u_int8_t *firstbyte = (u_int8_t *) & testvalue;
|
||||||
|
|
||||||
|
if (*firstbyte == 255)
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBGIMP_GIMP_H
|
#ifdef HAVE_LIBGIMP_GIMP_H
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -588,6 +603,40 @@ advance (void)
|
||||||
|
|
||||||
#endif /* HAVE_LIBGIMP_GIMP_H */
|
#endif /* HAVE_LIBGIMP_GIMP_H */
|
||||||
|
|
||||||
|
static void
|
||||||
|
write_swapped_words(FILE *f, char *buf, guint len)
|
||||||
|
{
|
||||||
|
char tmp_buf[2];
|
||||||
|
char tmp;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
return;
|
||||||
|
if (scan_win.have_odd_byte)
|
||||||
|
{
|
||||||
|
tmp_buf[0] = *buf++;
|
||||||
|
tmp_buf[1] = scan_win.odd_byte;
|
||||||
|
fwrite(tmp_buf, 1, 2, f);
|
||||||
|
--len;
|
||||||
|
scan_win.have_odd_byte = FALSE;
|
||||||
|
}
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
for (i = 1; i < len; i += 2)
|
||||||
|
{
|
||||||
|
tmp = buf[i];
|
||||||
|
buf[i] = buf[i - 1];
|
||||||
|
buf[i - 1] = tmp;
|
||||||
|
}
|
||||||
|
fwrite(buf, 1, len & ~1, f);
|
||||||
|
if (len & 1)
|
||||||
|
{
|
||||||
|
scan_win.have_odd_byte = TRUE;
|
||||||
|
scan_win.odd_byte = buf[len - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
input_available (gpointer data, gint source, GdkInputCondition cond)
|
input_available (gpointer data, gint source, GdkInputCondition cond)
|
||||||
{
|
{
|
||||||
|
@ -652,7 +701,12 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
|
||||||
{
|
{
|
||||||
case SANE_FRAME_GRAY:
|
case SANE_FRAME_GRAY:
|
||||||
if (scan_win.mode == STANDALONE)
|
if (scan_win.mode == STANDALONE)
|
||||||
|
{
|
||||||
|
if (scan_win.param.depth > 8 && little_endian)
|
||||||
|
write_swapped_words(scan_win.out, buf, len);
|
||||||
|
else
|
||||||
fwrite (buf, 1, len, scan_win.out);
|
fwrite (buf, 1, len, scan_win.out);
|
||||||
|
}
|
||||||
#ifdef HAVE_LIBGIMP_GIMP_H
|
#ifdef HAVE_LIBGIMP_GIMP_H
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -693,7 +747,12 @@ input_available (gpointer data, gint source, GdkInputCondition cond)
|
||||||
|
|
||||||
case SANE_FRAME_RGB:
|
case SANE_FRAME_RGB:
|
||||||
if (scan_win.mode == STANDALONE)
|
if (scan_win.mode == STANDALONE)
|
||||||
|
{
|
||||||
|
if (scan_win.param.depth > 8 && little_endian)
|
||||||
|
write_swapped_words(scan_win.out, buf, len);
|
||||||
|
else
|
||||||
fwrite (buf, 1, len, scan_win.out);
|
fwrite (buf, 1, len, scan_win.out);
|
||||||
|
}
|
||||||
#ifdef HAVE_LIBGIMP_GIMP_H
|
#ifdef HAVE_LIBGIMP_GIMP_H
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -816,6 +875,8 @@ scan_done (void)
|
||||||
scan_win.input_tag = -1;
|
scan_win.input_tag = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sane_cancel (gsg_dialog_get_device (dialog));
|
||||||
|
|
||||||
if (!scan_win.progress)
|
if (!scan_win.progress)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -849,7 +910,6 @@ scan_done (void)
|
||||||
scan_win.tile = 0;
|
scan_win.tile = 0;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LIBGIMP_GIMP_H */
|
#endif /* HAVE_LIBGIMP_GIMP_H */
|
||||||
sane_cancel (gsg_dialog_get_device (dialog));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -919,6 +979,7 @@ scan_start (void)
|
||||||
snprintf (buf, sizeof (buf), "Failed to get parameters: %s",
|
snprintf (buf, sizeof (buf), "Failed to get parameters: %s",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
gsg_error (buf);
|
gsg_error (buf);
|
||||||
|
scan_done ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -927,12 +988,13 @@ scan_start (void)
|
||||||
gsg_set_sensitivity (dialog, TRUE);
|
gsg_set_sensitivity (dialog, TRUE);
|
||||||
snprintf (buf, sizeof (buf), "Hand-Scanner mode not supported");
|
snprintf (buf, sizeof (buf), "Hand-Scanner mode not supported");
|
||||||
gsg_error (buf);
|
gsg_error (buf);
|
||||||
sane_cancel (dev);
|
scan_done ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_win.num_bytes = scan_win.param.lines * scan_win.param.bytes_per_line;
|
scan_win.num_bytes = scan_win.param.lines * scan_win.param.bytes_per_line;
|
||||||
scan_win.bytes_read = 0;
|
scan_win.bytes_read = 0;
|
||||||
|
scan_win.have_odd_byte = FALSE;
|
||||||
|
|
||||||
switch (scan_win.param.format)
|
switch (scan_win.param.format)
|
||||||
{
|
{
|
||||||
|
@ -949,10 +1011,21 @@ scan_start (void)
|
||||||
{
|
{
|
||||||
switch (scan_win.param.format)
|
switch (scan_win.param.format)
|
||||||
{
|
{
|
||||||
case SANE_FRAME_RGB:
|
|
||||||
case SANE_FRAME_RED:
|
case SANE_FRAME_RED:
|
||||||
case SANE_FRAME_GREEN:
|
case SANE_FRAME_GREEN:
|
||||||
case SANE_FRAME_BLUE:
|
case SANE_FRAME_BLUE:
|
||||||
|
if (scan_win.param.depth > 8)
|
||||||
|
{
|
||||||
|
gsg_set_sensitivity (dialog, TRUE);
|
||||||
|
snprintf (buf, sizeof (buf),
|
||||||
|
"Separate channel transfers are not supported "
|
||||||
|
"with %d bits/channel.", scan_win.param.depth);
|
||||||
|
gsg_error (buf);
|
||||||
|
scan_done ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
case SANE_FRAME_RGB:
|
||||||
fprintf (scan_win.out, "P6\n# SANE data follows\n%d %d\n%d\n",
|
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.pixels_per_line, scan_win.param.lines,
|
||||||
(scan_win.param.depth <= 8) ? 255 : 65535);
|
(scan_win.param.depth <= 8) ? 255 : 65535);
|
||||||
|
@ -1831,6 +1904,7 @@ main (int argc, char **argv)
|
||||||
DBG_INIT();
|
DBG_INIT();
|
||||||
DBG(DBG_error, "xscanimage (version: %s, package: %s) starting\n", VERSION,
|
DBG(DBG_error, "xscanimage (version: %s, package: %s) starting\n", VERSION,
|
||||||
PACKAGE);
|
PACKAGE);
|
||||||
|
little_endian = calc_little_endian();
|
||||||
scan_win.mode = STANDALONE;
|
scan_win.mode = STANDALONE;
|
||||||
gtk_quit_flag = 0;
|
gtk_quit_flag = 0;
|
||||||
prog_name = strrchr (argv[0], '/');
|
prog_name = strrchr (argv[0], '/');
|
||||||
|
|
Ładowanie…
Reference in New Issue