kopia lustrzana https://gitlab.com/sane-project/backends
- indent -gnu
- free (devlist) added so memory allocated by sane_get_devices() will be released (bugreport 300128) - added more DEBUG lines and some small fixes.merge-requests/1/head
rodzic
b3669f8d6e
commit
c33139cc82
|
@ -1,3 +1,8 @@
|
||||||
|
2005-05-06 Gerard Klaver <gerard at gkall dot hobby dot nl>
|
||||||
|
|
||||||
|
* backend/qcam.c -indent -gnu, bugreport 300128 free (devlist) added,
|
||||||
|
DEBUG output added and some small fixes.
|
||||||
|
|
||||||
2005-05-05 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
2005-05-05 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||||
|
|
||||||
* doc/descriptions/unsupported.desc: Added Dell 922.
|
* doc/descriptions/unsupported.desc: Added Dell 922.
|
||||||
|
|
245
backend/qcam.c
245
backend/qcam.c
|
@ -131,66 +131,58 @@ static int num_devices;
|
||||||
static QC_Device *first_dev;
|
static QC_Device *first_dev;
|
||||||
static QC_Scanner *first_handle;
|
static QC_Scanner *first_handle;
|
||||||
|
|
||||||
static const SANE_String_Const resolution_list[] =
|
static const SANE_String_Const resolution_list[] = {
|
||||||
{
|
|
||||||
"Low", /* million-mode */
|
"Low", /* million-mode */
|
||||||
"High", /* billion-mode */
|
"High", /* billion-mode */
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Int mono_depth_list[] =
|
static const SANE_Int mono_depth_list[] = {
|
||||||
{
|
|
||||||
2, /* # of elements */
|
2, /* # of elements */
|
||||||
4, 6
|
4, 6
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Int color_depth_list[] =
|
static const SANE_Int color_depth_list[] = {
|
||||||
{
|
/*2 */ 1,
|
||||||
/*2*/ 1, /* # of elements */
|
/* # of elements */
|
||||||
/*16,*/ 24 /* "thousand" mode not implemented yet */
|
/*16, */ 24
|
||||||
|
/* "thousand" mode not implemented yet */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Int xfer_scale_list[] =
|
static const SANE_Int xfer_scale_list[] = {
|
||||||
{
|
|
||||||
3, /* # of elements */
|
3, /* # of elements */
|
||||||
1, 2, 4
|
1, 2, 4
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Range u8_range =
|
static const SANE_Range u8_range = {
|
||||||
{
|
|
||||||
/* min, max, quantization */
|
/* min, max, quantization */
|
||||||
0, 255, 0
|
0, 255, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Range brightness_range =
|
static const SANE_Range brightness_range = {
|
||||||
{
|
|
||||||
/* min, max, quantization */
|
/* min, max, quantization */
|
||||||
0, 254, 0 /* 255 is bulb mode! */
|
0, 254, 0 /* 255 is bulb mode! */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Range x_range[] =
|
static const SANE_Range x_range[] = {
|
||||||
{
|
|
||||||
/* min, max, quantization */
|
/* min, max, quantization */
|
||||||
{0, 338, 2}, /* million mode */
|
{0, 338, 2}, /* million mode */
|
||||||
{0, 676, 4}, /* billion mode */
|
{0, 676, 4}, /* billion mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Range odd_x_range[] =
|
static const SANE_Range odd_x_range[] = {
|
||||||
{
|
|
||||||
/* min, max, quantization */
|
/* min, max, quantization */
|
||||||
{1, 339, 2}, /* million mode */
|
{1, 339, 2}, /* million mode */
|
||||||
{3, 683, 4}, /* billion mode */
|
{3, 683, 4}, /* billion mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Range y_range[] =
|
static const SANE_Range y_range[] = {
|
||||||
{
|
|
||||||
/* min, max, quantization */
|
/* min, max, quantization */
|
||||||
{0, 249, 1}, /* million mode */
|
{0, 249, 1}, /* million mode */
|
||||||
{0, 498, 2}, /* billion mode */
|
{0, 498, 2}, /* billion mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SANE_Range odd_y_range[] =
|
static const SANE_Range odd_y_range[] = {
|
||||||
{
|
|
||||||
/* min, max, quantization */
|
/* min, max, quantization */
|
||||||
{0, 249, 1}, /* million mode */
|
{0, 249, 1}, /* million mode */
|
||||||
{1, 499, 2}, /* billion mode */
|
{1, 499, 2}, /* billion mode */
|
||||||
|
@ -300,9 +292,7 @@ qc_lock_wait (QC_Device * q, int wait)
|
||||||
char lockfile[128];
|
char lockfile[128];
|
||||||
|
|
||||||
sprintf (lockfile, "/tmp/LOCK.qcam.0x%x", q->port);
|
sprintf (lockfile, "/tmp/LOCK.qcam.0x%x", q->port);
|
||||||
q->lock_fd = open (lockfile,
|
q->lock_fd = open (lockfile, O_WRONLY | O_CREAT | O_EXCL, 0666);
|
||||||
O_WRONLY | O_CREAT | O_EXCL
|
|
||||||
, 0666);
|
|
||||||
if (q->lock_fd < 0)
|
if (q->lock_fd < 0)
|
||||||
{
|
{
|
||||||
DBG (1, "qc_lock_wait: failed to open %s (%s)\n",
|
DBG (1, "qc_lock_wait: failed to open %s (%s)\n",
|
||||||
|
@ -329,6 +319,7 @@ qc_lock_wait (QC_Device * q, int wait)
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
qc_unlock (QC_Device * q)
|
qc_unlock (QC_Device * q)
|
||||||
{
|
{
|
||||||
|
SANE_Status status;
|
||||||
char lockfile[128];
|
char lockfile[128];
|
||||||
#ifdef F_SETLK
|
#ifdef F_SETLK
|
||||||
#ifndef HAVE_STRUCT_FLOCK
|
#ifndef HAVE_STRUCT_FLOCK
|
||||||
|
@ -344,30 +335,35 @@ qc_unlock (QC_Device *q)
|
||||||
struct flock sfl;
|
struct flock sfl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DBG(3, "qc_lock_wait: releasing lock for 0x%x\n", q->port);
|
DBG (3, "qc_unlock: releasing lock for 0x%x\n", q->port);
|
||||||
|
|
||||||
#ifdef F_SETLK
|
#ifdef F_SETLK
|
||||||
memset (&sfl, 0, sizeof (sfl));
|
memset (&sfl, 0, sizeof (sfl));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (q->lock_fd < 0)
|
if (q->lock_fd < 0)
|
||||||
return SANE_STATUS_INVAL; /* port was not locked */
|
{
|
||||||
|
DBG (3, "qc_unlock; port was not locked\n");
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
/* clear the exclusive lock */
|
/* clear the exclusive lock */
|
||||||
|
|
||||||
#ifdef F_SETLK
|
#ifdef F_SETLK
|
||||||
sfl.l_type = F_UNLCK;
|
sfl.l_type = F_UNLCK;
|
||||||
|
|
||||||
if (fcntl (q->lock_fd, F_SETLK, &sfl) != 0)
|
if (fcntl (q->lock_fd, F_SETLK, &sfl) != 0)
|
||||||
{
|
{
|
||||||
DBG(1, "qc_lock_wait: failed to release lock (%s)\n",
|
DBG (3, "qc_unlock: failed to release lock (%s)\n", strerror (errno));
|
||||||
strerror (errno));
|
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
sprintf (lockfile, "/tmp/LOCK.qcam.0x%x", q->port);
|
sprintf (lockfile, "/tmp/LOCK.qcam.0x%x", q->port);
|
||||||
|
DBG (1, "qc_unlock: /tmp/LOCK.qcam.0x%x\n", q->port);
|
||||||
unlink (lockfile);
|
unlink (lockfile);
|
||||||
close (q->lock_fd);
|
close (q->lock_fd);
|
||||||
q->lock_fd = -1;
|
q->lock_fd = -1;
|
||||||
return SANE_STATUS_GOOD;
|
DBG (1, "qc_unlock: exit\n");
|
||||||
|
status = SANE_STATUS_GOOD;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
|
@ -397,9 +393,11 @@ qc_waithand2 (QC_Device *q, int val)
|
||||||
{
|
{
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
status = read_lpdata (q);
|
status = read_lpdata (q);
|
||||||
} while ((status & CamRdy2) != (unsigned int) val);
|
}
|
||||||
|
while ((status & CamRdy2) != (unsigned int) val);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,23 +471,38 @@ qc_setscanmode (QC_Scanner *s, u_int *modep)
|
||||||
{
|
{
|
||||||
switch (s->val[OPT_XFER_SCALE].w)
|
switch (s->val[OPT_XFER_SCALE].w)
|
||||||
{
|
{
|
||||||
case 1: mode = 0; break;
|
case 1:
|
||||||
case 2: mode = 4; break;
|
mode = 0;
|
||||||
case 4: mode = 8; break;
|
break;
|
||||||
|
case 2:
|
||||||
|
mode = 4;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
mode = 8;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (s->val[OPT_DEPTH].w)
|
switch (s->val[OPT_DEPTH].w)
|
||||||
{
|
{
|
||||||
case 4: break;
|
case 4:
|
||||||
case 6: mode += 2; break;
|
break;
|
||||||
|
case 6:
|
||||||
|
mode += 2;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (s->val[OPT_XFER_SCALE].w)
|
switch (s->val[OPT_XFER_SCALE].w)
|
||||||
{
|
{
|
||||||
case 1: mode = 0; break;
|
case 1:
|
||||||
case 2: mode = 2; break;
|
mode = 0;
|
||||||
case 4: mode = 4; break;
|
break;
|
||||||
|
case 2:
|
||||||
|
mode = 2;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
mode = 4;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (s->resolution == QC_RES_LOW)
|
if (s->resolution == QC_RES_LOW)
|
||||||
mode |= 0x18; /* millions mode */
|
mode |= 0x18; /* millions mode */
|
||||||
|
@ -703,17 +716,20 @@ despeckle (int width, int height, SANE_Byte *in, SANE_Byte *out)
|
||||||
memcpy (&out[i * 3], &in[i * 3], 3);
|
memcpy (&out[i * 3], &in[i * 3], 3);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (R - (G+B)/2 > NO_LIGHTS + ((pR - (pG+pB)/2) + (nR - (nG+nB)/2)))
|
if (R - (G + B) / 2 >
|
||||||
|
NO_LIGHTS + ((pR - (pG + pB) / 2) + (nR - (nG + nB) / 2)))
|
||||||
out[i * 3] = (pR + nR) / 2;
|
out[i * 3] = (pR + nR) / 2;
|
||||||
else
|
else
|
||||||
out[i * 3] = R;
|
out[i * 3] = R;
|
||||||
|
|
||||||
if (G - (R+B)/2 > NO_LIGHTS + ((pG - (pR+pB)/2) + (nG - (nR+nB)/2)))
|
if (G - (R + B) / 2 >
|
||||||
|
NO_LIGHTS + ((pG - (pR + pB) / 2) + (nG - (nR + nB) / 2)))
|
||||||
out[i * 3 + 1] = (pG + nG) / 2;
|
out[i * 3 + 1] = (pG + nG) / 2;
|
||||||
else
|
else
|
||||||
out[i * 3 + 1] = G;
|
out[i * 3 + 1] = G;
|
||||||
|
|
||||||
if (B - (G+R)/2 > NO_LIGHTS + ((pB - (pG+pR)/2) + (nB - (nG+nR)/2)))
|
if (B - (G + R) / 2 >
|
||||||
|
NO_LIGHTS + ((pB - (pG + pR) / 2) + (nB - (nG + nR) / 2)))
|
||||||
out[i * 3 + 2] = (pB + nB) / 2;
|
out[i * 3 + 2] = (pB + nB) / 2;
|
||||||
else
|
else
|
||||||
out[i * 3 + 2] = B;
|
out[i * 3 + 2] = B;
|
||||||
|
@ -763,7 +779,8 @@ despeckle32 (int width, int height, SANE_Byte *in, SANE_Byte *out)
|
||||||
R instead: */
|
R instead: */
|
||||||
nR = R;
|
nR = R;
|
||||||
|
|
||||||
if (R - ((Ga+Gb)/2+B)/2 > NO_LIGHTS + ((pR - ((pGa+pGb)/2+pB)/2) +
|
if (R - ((Ga + Gb) / 2 + B) / 2 >
|
||||||
|
NO_LIGHTS + ((pR - ((pGa + pGb) / 2 + pB) / 2) +
|
||||||
(nR - ((nGa + nGb) / 2 + nB) / 2)))
|
(nR - ((nGa + nGb) / 2 + nB) / 2)))
|
||||||
out[i * 4 + 3] = (pR + nR) / 2;
|
out[i * 4 + 3] = (pR + nR) / 2;
|
||||||
else
|
else
|
||||||
|
@ -781,7 +798,8 @@ despeckle32 (int width, int height, SANE_Byte *in, SANE_Byte *out)
|
||||||
else
|
else
|
||||||
out[i * 4 + 2] = Gb;
|
out[i * 4 + 2] = Gb;
|
||||||
|
|
||||||
if (B - ((Ga+Gb)/2+R)/2 > NO_LIGHTS + ((pB - ((pGa+pGb)/2+pR)/2) +
|
if (B - ((Ga + Gb) / 2 + R) / 2 >
|
||||||
|
NO_LIGHTS + ((pB - ((pGa + pGb) / 2 + pR) / 2) +
|
||||||
(nB - ((nGa + nGb) / 2 + nR) / 2)))
|
(nB - ((nGa + nGb) / 2 + nR) / 2)))
|
||||||
out[i * 4 + 0] = (pB + nB) / 2;
|
out[i * 4 + 0] = (pB + nB) / 2;
|
||||||
else
|
else
|
||||||
|
@ -816,6 +834,8 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
SANE_Byte *src;
|
SANE_Byte *src;
|
||||||
FILE *ofp;
|
FILE *ofp;
|
||||||
|
|
||||||
|
DBG (5, "reader_process: enter\n");
|
||||||
|
|
||||||
enable_ports (q);
|
enable_ports (q);
|
||||||
|
|
||||||
ofp = fdopen (out_fd, "w");
|
ofp = fdopen (out_fd, "w");
|
||||||
|
@ -855,7 +875,8 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
qc_send (q, req.mode);
|
qc_send (q, req.mode);
|
||||||
|
|
||||||
if (req.despeckle
|
if (req.despeckle
|
||||||
&& (!extra || buffer_size < num_bytes || buffer_size >= 2*num_bytes))
|
&& (!extra || buffer_size < num_bytes
|
||||||
|
|| buffer_size >= 2 * num_bytes))
|
||||||
{
|
{
|
||||||
if (extra)
|
if (extra)
|
||||||
extra = realloc (extra, num_bytes);
|
extra = realloc (extra, num_bytes);
|
||||||
|
@ -863,7 +884,8 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
extra = malloc (num_bytes);
|
extra = malloc (num_bytes);
|
||||||
if (!extra)
|
if (!extra)
|
||||||
{
|
{
|
||||||
DBG(1, "reader_process: malloc(%ld) failed\n", (long) num_bytes);
|
DBG (1, "reader_process: malloc(%ld) failed\n",
|
||||||
|
(long) num_bytes);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -876,7 +898,8 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
buffer = malloc (num_bytes);
|
buffer = malloc (num_bytes);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
DBG(1, "reader_process: malloc(%ld) failed\n", (long) num_bytes);
|
DBG (1, "reader_process: malloc(%ld) failed\n",
|
||||||
|
(long) num_bytes);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
buffer_size = num_bytes;
|
buffer_size = num_bytes;
|
||||||
|
@ -975,7 +998,9 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
{
|
{
|
||||||
int red1, green1, blue1, green2, blue2;
|
int red1, green1, blue1, green2, blue2;
|
||||||
|
|
||||||
blue1 = src[0]; green1 = src[1]; red1 = src[3];
|
blue1 = src[0];
|
||||||
|
green1 = src[1];
|
||||||
|
red1 = src[3];
|
||||||
if (x >= width - 2)
|
if (x >= width - 2)
|
||||||
{
|
{
|
||||||
red1 = src[-1]; /* last red seems to be missing */
|
red1 = src[-1]; /* last red seems to be missing */
|
||||||
|
@ -989,8 +1014,12 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
}
|
}
|
||||||
src += 4;
|
src += 4;
|
||||||
|
|
||||||
buf[0] = red1; buf[1] = green1; buf[2] = blue1;
|
buf[0] = red1;
|
||||||
buf[3] = red1; buf[4] = green2; buf[5] = blue2;
|
buf[1] = green1;
|
||||||
|
buf[2] = blue1;
|
||||||
|
buf[3] = red1;
|
||||||
|
buf[4] = green2;
|
||||||
|
buf[5] = blue2;
|
||||||
if (fwrite (buf, 1, 6, ofp) != 6)
|
if (fwrite (buf, 1, 6, ofp) != 6)
|
||||||
{
|
{
|
||||||
perror ("fwrite: short write");
|
perror ("fwrite: short write");
|
||||||
|
@ -1029,8 +1058,12 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
}
|
}
|
||||||
src += 4;
|
src += 4;
|
||||||
|
|
||||||
buf[0] = red1; buf[1] = green3; buf[2] = blue3;
|
buf[0] = red1;
|
||||||
buf[3] = red1; buf[4] = green4; buf[5] = blue4;
|
buf[1] = green3;
|
||||||
|
buf[2] = blue3;
|
||||||
|
buf[3] = red1;
|
||||||
|
buf[4] = green4;
|
||||||
|
buf[5] = blue4;
|
||||||
if (fwrite (buf, 1, 6, ofp) != 6)
|
if (fwrite (buf, 1, 6, ofp) != 6)
|
||||||
{
|
{
|
||||||
perror ("fwrite: short write");
|
perror ("fwrite: short write");
|
||||||
|
@ -1059,6 +1092,7 @@ reader_process (QC_Scanner *s, int in_fd, int out_fd)
|
||||||
fflush (ofp);
|
fflush (ofp);
|
||||||
}
|
}
|
||||||
assert (SANE_FALSE); /* not reached */
|
assert (SANE_FALSE); /* not reached */
|
||||||
|
DBG (5, "reader_process: exit\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1066,10 +1100,11 @@ static SANE_Status
|
||||||
attach (const char *devname, QC_Device ** devp)
|
attach (const char *devname, QC_Device ** devp)
|
||||||
{
|
{
|
||||||
int i, n1, n2, s1, s2, cmd, port, force_unidir;
|
int i, n1, n2, s1, s2, cmd, port, force_unidir;
|
||||||
SANE_Status result;
|
SANE_Status result, status;
|
||||||
QC_Device *q;
|
QC_Device *q;
|
||||||
char *endp;
|
char *endp;
|
||||||
|
|
||||||
|
DBG (3, "attach: enter\n");
|
||||||
errno = 0;
|
errno = 0;
|
||||||
force_unidir = 0;
|
force_unidir = 0;
|
||||||
if (devname[0] == 'u')
|
if (devname[0] == 'u')
|
||||||
|
@ -1171,8 +1206,12 @@ attach (const char *devname, QC_Device **devp)
|
||||||
usleep (10000);
|
usleep (10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
qc_unlock (q);
|
status = qc_unlock (q);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (1, "attach: status qc_unlock NOK\n");
|
||||||
|
/* status = SANE_STATUS_GOOD; */
|
||||||
|
}
|
||||||
q->sane.name = strdup (devname);
|
q->sane.name = strdup (devname);
|
||||||
q->sane.vendor = "Connectix";
|
q->sane.vendor = "Connectix";
|
||||||
q->sane.model =
|
q->sane.model =
|
||||||
|
@ -1185,12 +1224,21 @@ attach (const char *devname, QC_Device **devp)
|
||||||
|
|
||||||
if (devp)
|
if (devp)
|
||||||
*devp = q;
|
*devp = q;
|
||||||
return SANE_STATUS_GOOD;
|
DBG (3, "attach: exit status OK\n");
|
||||||
|
status = SANE_STATUS_GOOD;
|
||||||
|
return status;
|
||||||
|
|
||||||
|
|
||||||
unlock_and_fail:
|
unlock_and_fail:
|
||||||
qc_unlock (q);
|
status = qc_unlock (q);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
DBG (1, "attach: unlock_and_fail status qc_unlock NOK\n");
|
||||||
|
}
|
||||||
free (q);
|
free (q);
|
||||||
return SANE_STATUS_INVAL;
|
DBG (3, "attach: exit status NOK\n");
|
||||||
|
status = SANE_STATUS_INVAL;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
|
@ -1198,6 +1246,8 @@ init_options (QC_Scanner *s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
DBG (3, "init_options: enter\n");
|
||||||
|
|
||||||
memset (s->opt, 0, sizeof (s->opt));
|
memset (s->opt, 0, sizeof (s->opt));
|
||||||
memset (s->val, 0, sizeof (s->val));
|
memset (s->val, 0, sizeof (s->val));
|
||||||
|
|
||||||
|
@ -1395,6 +1445,8 @@ init_options (QC_Scanner *s)
|
||||||
s->opt[OPT_SATURATION].constraint.range = &u8_range;
|
s->opt[OPT_SATURATION].constraint.range = &u8_range;
|
||||||
s->val[OPT_SATURATION].w = 100;
|
s->val[OPT_SATURATION].w = 100;
|
||||||
|
|
||||||
|
DBG (3, "init_options: exit\n");
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1404,11 +1456,12 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authorize)
|
||||||
char dev_name[PATH_MAX], *str;
|
char dev_name[PATH_MAX], *str;
|
||||||
size_t len;
|
size_t len;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
authorize = authorize; /* silence compilation warnings */
|
authorize = authorize; /* silence compilation warnings */
|
||||||
|
|
||||||
DBG_INIT ();
|
DBG_INIT ();
|
||||||
|
|
||||||
|
DBG (1, "sane_init: enter\n");
|
||||||
|
|
||||||
if (version_code)
|
if (version_code)
|
||||||
*version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, 0);
|
*version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, 0);
|
||||||
|
|
||||||
|
@ -1434,6 +1487,8 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authorize)
|
||||||
attach (dev_name, 0);
|
attach (dev_name, 0);
|
||||||
}
|
}
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
|
|
||||||
|
DBG (1, "sane_init: exit\n");
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1441,6 +1496,9 @@ void
|
||||||
sane_exit (void)
|
sane_exit (void)
|
||||||
{
|
{
|
||||||
QC_Device *dev, *next;
|
QC_Device *dev, *next;
|
||||||
|
static const SANE_Device **devlist;
|
||||||
|
|
||||||
|
DBG (5, "sane_exit: enter\n");
|
||||||
|
|
||||||
for (dev = first_dev; dev; dev = next)
|
for (dev = first_dev; dev; dev = next)
|
||||||
{
|
{
|
||||||
|
@ -1449,6 +1507,11 @@ sane_exit (void)
|
||||||
disable_ports (dev);
|
disable_ports (dev);
|
||||||
free (dev);
|
free (dev);
|
||||||
}
|
}
|
||||||
|
if (devlist) {
|
||||||
|
free (devlist);
|
||||||
|
devlist = NULL;
|
||||||
|
}
|
||||||
|
DBG (5, "sane_exit: exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
SANE_Status
|
SANE_Status
|
||||||
|
@ -1458,6 +1521,8 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
|
||||||
QC_Device *dev;
|
QC_Device *dev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
DBG (5, "sane_get_devices: enter\n");
|
||||||
|
|
||||||
local_only = local_only; /* silence compilation warnings */
|
local_only = local_only; /* silence compilation warnings */
|
||||||
|
|
||||||
if (devlist)
|
if (devlist)
|
||||||
|
@ -1473,6 +1538,9 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
|
||||||
devlist[i++] = 0;
|
devlist[i++] = 0;
|
||||||
|
|
||||||
*device_list = devlist;
|
*device_list = devlist;
|
||||||
|
|
||||||
|
DBG (5, "sane_get_devices: exit\n");
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1483,8 +1551,7 @@ sane_open (SANE_String_Const devicename, SANE_Handle *handle)
|
||||||
QC_Device *dev;
|
QC_Device *dev;
|
||||||
QC_Scanner *s;
|
QC_Scanner *s;
|
||||||
|
|
||||||
DBG(4, "open(%s)\n", devicename);
|
DBG (5, "sane_open: enter: (devicename = %s)\n", devicename);
|
||||||
|
|
||||||
if (devicename[0])
|
if (devicename[0])
|
||||||
{
|
{
|
||||||
status = attach (devicename, &dev);
|
status = attach (devicename, &dev);
|
||||||
|
@ -1551,6 +1618,9 @@ sane_open (SANE_String_Const devicename, SANE_Handle *handle)
|
||||||
first_handle = s;
|
first_handle = s;
|
||||||
|
|
||||||
*handle = s;
|
*handle = s;
|
||||||
|
|
||||||
|
DBG (5, "sane_open: exit\n");
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1559,6 +1629,8 @@ sane_close (SANE_Handle handle)
|
||||||
{
|
{
|
||||||
QC_Scanner *prev, *s;
|
QC_Scanner *prev, *s;
|
||||||
|
|
||||||
|
DBG (5, "sane_close: enter\n");
|
||||||
|
|
||||||
/* remove handle from list of open handles: */
|
/* remove handle from list of open handles: */
|
||||||
prev = 0;
|
prev = 0;
|
||||||
for (s = first_handle; s; s = s->next)
|
for (s = first_handle; s; s = s->next)
|
||||||
|
@ -1594,6 +1666,9 @@ sane_close (SANE_Handle handle)
|
||||||
close (s->read_fd);
|
close (s->read_fd);
|
||||||
|
|
||||||
free (s);
|
free (s);
|
||||||
|
|
||||||
|
DBG (5, "sane_close: exit\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const SANE_Option_Descriptor *
|
const SANE_Option_Descriptor *
|
||||||
|
@ -1601,8 +1676,13 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
||||||
{
|
{
|
||||||
QC_Scanner *s = handle;
|
QC_Scanner *s = handle;
|
||||||
|
|
||||||
|
DBG (5, "sane_get_option_descriptor: enter\n");
|
||||||
|
|
||||||
if ((unsigned) option >= NUM_OPTIONS)
|
if ((unsigned) option >= NUM_OPTIONS)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
DBG (5, "sane_get_option_descriptor: exit\n");
|
||||||
|
|
||||||
return s->opt + option;
|
return s->opt + option;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1617,6 +1697,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
char *old_val;
|
char *old_val;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
DBG (5, "sane_control_option: enter\n");
|
||||||
|
|
||||||
if (info)
|
if (info)
|
||||||
*info = 0;
|
*info = 0;
|
||||||
|
|
||||||
|
@ -1753,6 +1835,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
if (s->val[i].w > s->opt[i].constraint.range->max)
|
if (s->val[i].w > s->opt[i].constraint.range->max)
|
||||||
s->val[i].w = s->opt[i].constraint.range->max;
|
s->val[i].w = s->opt[i].constraint.range->max;
|
||||||
|
|
||||||
|
DBG (5, "sane_control_option: exit\n");
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1762,12 +1845,15 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
{
|
{
|
||||||
case OPT_BRIGHTNESS:
|
case OPT_BRIGHTNESS:
|
||||||
/* not implemented yet */
|
/* not implemented yet */
|
||||||
|
DBG (5, "sane_control_option: exit\n");
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBG (5, "sane_control_option: NOK exit\n");
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1779,6 +1865,8 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters *params)
|
||||||
int xfer_scale;
|
int xfer_scale;
|
||||||
size_t Bpp = 3; /* # of bytes per pixel */
|
size_t Bpp = 3; /* # of bytes per pixel */
|
||||||
|
|
||||||
|
DBG (5, "sane_get_parameters: enter\n");
|
||||||
|
|
||||||
if (!s->scanning)
|
if (!s->scanning)
|
||||||
{
|
{
|
||||||
/* Only compute new parameters when not scanning---allows
|
/* Only compute new parameters when not scanning---allows
|
||||||
|
@ -1810,6 +1898,8 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters *params)
|
||||||
if (params)
|
if (params)
|
||||||
*params = s->params;
|
*params = s->params;
|
||||||
|
|
||||||
|
DBG (5, "sane_get_parameters: exit\n");
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1821,6 +1911,8 @@ sane_start (SANE_Handle handle)
|
||||||
QC_Device *q = s->hw;
|
QC_Device *q = s->hw;
|
||||||
QC_Scan_Request req;
|
QC_Scan_Request req;
|
||||||
|
|
||||||
|
DBG (5, "sane_start: enter\n");
|
||||||
|
|
||||||
if (s->scanning)
|
if (s->scanning)
|
||||||
return SANE_STATUS_DEVICE_BUSY;
|
return SANE_STATUS_DEVICE_BUSY;
|
||||||
|
|
||||||
|
@ -2005,6 +2097,9 @@ sane_start (SANE_Handle handle)
|
||||||
|
|
||||||
s->scanning = SANE_TRUE;
|
s->scanning = SANE_TRUE;
|
||||||
s->deliver_eof = 0;
|
s->deliver_eof = 0;
|
||||||
|
|
||||||
|
DBG (5, "sane_start: exit\n");
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2012,11 +2107,14 @@ SANE_Status
|
||||||
sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
|
sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
|
||||||
SANE_Int * lenp)
|
SANE_Int * lenp)
|
||||||
{
|
{
|
||||||
|
SANE_Status status;
|
||||||
QC_Scanner *s = handle;
|
QC_Scanner *s = handle;
|
||||||
QC_Device *q = s->hw;
|
QC_Device *q = s->hw;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
|
DBG (5, "sane_read: enter\n");
|
||||||
|
|
||||||
*lenp = 0;
|
*lenp = 0;
|
||||||
|
|
||||||
if (s->deliver_eof)
|
if (s->deliver_eof)
|
||||||
|
@ -2049,7 +2147,9 @@ sane_read (SANE_Handle handle, SANE_Byte *buf, SANE_Int max_len,
|
||||||
|
|
||||||
if (nread > 0 && s->holding_lock)
|
if (nread > 0 && s->holding_lock)
|
||||||
{
|
{
|
||||||
qc_unlock (q); /* now we can unlock the camera */
|
status = qc_unlock (q); /* now we can unlock the camera */
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
DBG(3, "sane_read: qc_unlock error\n");
|
||||||
s->holding_lock = SANE_FALSE;
|
s->holding_lock = SANE_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2065,7 +2165,7 @@ sane_read (SANE_Handle handle, SANE_Byte *buf, SANE_Int max_len,
|
||||||
if (lenp)
|
if (lenp)
|
||||||
*lenp = nread;
|
*lenp = nread;
|
||||||
|
|
||||||
DBG(8, "read: got %d bytes\n", *lenp);
|
DBG (5, "sane_read: exit, read got %d bytes\n", *lenp);
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2074,6 +2174,9 @@ sane_cancel (SANE_Handle handle)
|
||||||
{
|
{
|
||||||
QC_Scanner *s = handle;
|
QC_Scanner *s = handle;
|
||||||
SANE_Bool was_scanning;
|
SANE_Bool was_scanning;
|
||||||
|
SANE_Status status;
|
||||||
|
|
||||||
|
DBG (5, "sane_cancel: enter\n");
|
||||||
|
|
||||||
was_scanning = s->scanning;
|
was_scanning = s->scanning;
|
||||||
s->scanning = SANE_FALSE;
|
s->scanning = SANE_FALSE;
|
||||||
|
@ -2122,9 +2225,12 @@ sane_cancel (SANE_Handle handle)
|
||||||
}
|
}
|
||||||
if (s->holding_lock)
|
if (s->holding_lock)
|
||||||
{
|
{
|
||||||
qc_unlock (s->hw);
|
status = qc_unlock (s->hw);
|
||||||
|
if (status != SANE_STATUS_GOOD)
|
||||||
|
DBG(3, "sane_cancel: qc_unlock error\n");
|
||||||
s->holding_lock = SANE_FALSE;
|
s->holding_lock = SANE_FALSE;
|
||||||
}
|
}
|
||||||
|
DBG (5, "sane_cancel: exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
SANE_Status
|
SANE_Status
|
||||||
|
@ -2132,11 +2238,14 @@ sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)
|
||||||
{
|
{
|
||||||
QC_Scanner *s = handle;
|
QC_Scanner *s = handle;
|
||||||
|
|
||||||
|
DBG (5, "sane_set_io_mode: enter\n");
|
||||||
|
|
||||||
if (!s->scanning)
|
if (!s->scanning)
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
|
|
||||||
if (fcntl (s->read_fd, F_SETFL, non_blocking ? O_NONBLOCK : 0) < 0)
|
if (fcntl (s->read_fd, F_SETFL, non_blocking ? O_NONBLOCK : 0) < 0)
|
||||||
return SANE_STATUS_IO_ERROR;
|
return SANE_STATUS_IO_ERROR;
|
||||||
|
DBG (5, "sane_set_io_mode: exit\n");
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2145,9 +2254,11 @@ sane_get_select_fd (SANE_Handle handle, SANE_Int *fd)
|
||||||
{
|
{
|
||||||
QC_Scanner *s = handle;
|
QC_Scanner *s = handle;
|
||||||
|
|
||||||
|
DBG (5, "sane_get_select_fd: enter\n");
|
||||||
if (!s->scanning)
|
if (!s->scanning)
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
|
|
||||||
*fd = s->read_fd;
|
*fd = s->read_fd;
|
||||||
|
DBG (5, "sane_get_select_fd: exit\n");
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue