Simplify sane_read, other fixes to mustek_usb2.c.

merge-requests/1/head
Jan Hauffa 2011-04-24 14:49:06 +02:00 zatwierdzone przez m. allan noah
rodzic 63793907e2
commit 6865eaf6ed
1 zmienionych plików z 33 dodań i 64 usunięć

Wyświetl plik

@ -138,7 +138,7 @@ static const Scanner_Model mustek_A2nu2_model = {
static void static void
calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget) calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget)
{ {
SANE_String val, val_source; SANE_String val;
float x1, y1, x2, y2; float x1, y1, x2, y2;
DBG_ENTER (); DBG_ENTER ();
@ -160,11 +160,11 @@ calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget)
pTarget->wLineartThreshold = s->val[OPT_THRESHOLD].w; pTarget->wLineartThreshold = s->val[OPT_THRESHOLD].w;
val_source = s->val[OPT_SOURCE].s; val = s->val[OPT_SOURCE].s;
DBG (DBG_DET, "scan source = %s\n", val_source); DBG (DBG_DET, "scan source = %s\n", val);
if (strcmp (val_source, source_list[SS_POSITIVE]) == 0) if (strcmp (val, source_list[SS_POSITIVE]) == 0)
pTarget->ssScanSource = SS_POSITIVE; pTarget->ssScanSource = SS_POSITIVE;
else if (strcmp (val_source, source_list[SS_NEGATIVE]) == 0) else if (strcmp (val, source_list[SS_NEGATIVE]) == 0)
pTarget->ssScanSource = SS_NEGATIVE; pTarget->ssScanSource = SS_NEGATIVE;
else else
pTarget->ssScanSource = SS_REFLECTIVE; pTarget->ssScanSource = SS_REFLECTIVE;
@ -579,8 +579,8 @@ SANE_Status
sane_control_option (SANE_Handle handle, SANE_Int option, sane_control_option (SANE_Handle handle, SANE_Int option,
SANE_Action action, void *val, SANE_Int * info) SANE_Action action, void *val, SANE_Int * info)
{ {
Mustek_Scanner *s = handle;
SANE_Status status; SANE_Status status;
Mustek_Scanner *s = handle;
SANE_Word cap; SANE_Word cap;
SANE_Int myinfo = 0; SANE_Int myinfo = 0;
TARGETIMAGE target; TARGETIMAGE target;
@ -591,9 +591,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
(action == SANE_ACTION_SET_AUTO) ? "set_auto" : "unknown", (action == SANE_ACTION_SET_AUTO) ? "set_auto" : "unknown",
s->opt[option].name, option); s->opt[option].name, option);
if (info)
*info = 0;
if (s->bIsScanning) if (s->bIsScanning)
{ {
DBG (DBG_ERR, "scanner is busy\n"); DBG (DBG_ERR, "scanner is busy\n");
@ -641,17 +638,9 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_BUTTON_3: case OPT_BUTTON_3:
case OPT_BUTTON_4: case OPT_BUTTON_4:
case OPT_BUTTON_5: case OPT_BUTTON_5:
if ((option - OPT_BUTTON_1) < s->model.buttons) update_button_status (s);
{ *(SANE_Bool *) val = s->val[option].b;
update_button_status (s); s->val[option].b = SANE_FALSE;
*(SANE_Bool *) val = s->val[option].b;
s->val[option].b = SANE_FALSE;
}
else
{
DBG (DBG_WARN, "invalid button option %d\n", option);
*(SANE_Bool *) val = SANE_FALSE;
}
break; break;
default: default:
DBG (DBG_ERR, "unknown option %d\n", option); DBG (DBG_ERR, "unknown option %d\n", option);
@ -741,6 +730,9 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
default: default:
DBG (DBG_ERR, "unknown option %d\n", option); DBG (DBG_ERR, "unknown option %d\n", option);
} }
if (info)
*info = myinfo;
} }
else else
{ {
@ -748,9 +740,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
if (info)
*info = myinfo;
DBG_LEAVE (); DBG_LEAVE ();
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
@ -789,12 +778,7 @@ sane_start (SANE_Handle handle)
return SANE_FALSE; return SANE_FALSE;
} }
status = Scanner_Reset (&s->state);
if (status != SANE_STATUS_GOOD)
return status;
calc_parameters (s, &target); calc_parameters (s, &target);
DBG (DBG_INFO, "target.wX=%d\n", target.wX); DBG (DBG_INFO, "target.wX=%d\n", target.wX);
DBG (DBG_INFO, "target.wY=%d\n", target.wY); DBG (DBG_INFO, "target.wY=%d\n", target.wY);
DBG (DBG_INFO, "target.wWidth=%d\n", target.wWidth); DBG (DBG_INFO, "target.wWidth=%d\n", target.wWidth);
@ -817,6 +801,10 @@ sane_start (SANE_Handle handle)
return SANE_STATUS_NO_MEM; return SANE_STATUS_NO_MEM;
s->scan_buf_len = 0; s->scan_buf_len = 0;
status = Scanner_Reset (&s->state);
if (status != SANE_STATUS_GOOD)
return status;
if (target.ssScanSource == SS_REFLECTIVE) if (target.ssScanSource == SS_REFLECTIVE)
status = Scanner_PowerControl (&s->state, SANE_TRUE, SANE_FALSE); status = Scanner_PowerControl (&s->state, SANE_TRUE, SANE_FALSE);
else else
@ -836,19 +824,11 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
{ {
SANE_Status status; SANE_Status status;
Mustek_Scanner *s = handle; Mustek_Scanner *s = handle;
SANE_Byte *tempbuf; unsigned short lines;
long int tempbuf_size; SANE_Int bytes_read;
SANE_Int lines, lines_read;
unsigned short lines_received;
DBG_ENTER (); DBG_ENTER ();
DBG (DBG_FUNC, "max_len=%d\n", max_len); DBG (DBG_FUNC, "max_len=%d\n", max_len);
if (!buf || !len)
{
DBG (DBG_ERR, "output parameter is null!\n");
return SANE_STATUS_INVAL;
}
*len = 0; *len = 0;
if (!s->bIsScanning) if (!s->bIsScanning)
@ -858,7 +838,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
return SANE_STATUS_CANCELLED; return SANE_STATUS_CANCELLED;
} }
DBG (DBG_DBG, "before read data, read_row=%d\n", s->read_rows); DBG (DBG_DBG, "before read data, read_rows=%d\n", s->read_rows);
if (s->scan_buf_len == 0) if (s->scan_buf_len == 0)
{ {
if (s->read_rows > 0) if (s->read_rows > 0)
@ -866,16 +846,8 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
lines = SCAN_BUFFER_SIZE / s->params.bytes_per_line; lines = SCAN_BUFFER_SIZE / s->params.bytes_per_line;
lines = _MIN (lines, s->read_rows); lines = _MIN (lines, s->read_rows);
tempbuf_size = lines * s->params.bytes_per_line + 3 * 1024 + 1;
tempbuf = malloc (tempbuf_size);
if (!tempbuf)
return SANE_STATUS_NO_MEM;
memset (tempbuf, 0, tempbuf_size);
DBG (DBG_INFO, "buffer size is %ld\n", tempbuf_size);
s->bIsReading = SANE_TRUE; s->bIsReading = SANE_TRUE;
lines_received = (unsigned short) lines; status = Scanner_GetRows (&s->state, s->scan_buf, &lines,
status = Scanner_GetRows (&s->state, tempbuf, &lines_received,
s->model.isRGBInvert); s->model.isRGBInvert);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
@ -883,20 +855,17 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
return status; return status;
} }
s->scan_buf_len = lines_received * s->params.bytes_per_line; s->scan_buf_len = lines * s->params.bytes_per_line;
DBG (DBG_INFO, "scan_buf_len=%ld\n", (long int) s->scan_buf_len); DBG (DBG_INFO, "scan_buf_len=%d\n", s->scan_buf_len);
memcpy (s->scan_buf, tempbuf, s->scan_buf_len);
if (s->scan_buf_len < SCAN_BUFFER_SIZE) if (s->scan_buf_len < SCAN_BUFFER_SIZE)
{ {
memset (s->scan_buf + s->scan_buf_len, 0, memset (s->scan_buf + s->scan_buf_len, 0,
SCAN_BUFFER_SIZE - s->scan_buf_len); SCAN_BUFFER_SIZE - s->scan_buf_len);
} }
DBG (DBG_DBG, "after memcpy\n");
free (tempbuf);
s->scan_buf_start = s->scan_buf; s->scan_buf_start = s->scan_buf;
s->read_rows -= lines_received; s->read_rows -= lines;
s->bIsReading = SANE_FALSE; s->bIsReading = SANE_FALSE;
} }
else else
@ -912,13 +881,13 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
} }
} }
lines_read = _MIN (max_len, s->scan_buf_len); bytes_read = _MIN (max_len, s->scan_buf_len);
DBG (DBG_DBG, "lines_read=%d\n", lines_read); DBG (DBG_DBG, "bytes_read=%d\n", bytes_read);
*len = lines_read; *len = bytes_read;
memcpy (buf, s->scan_buf_start, lines_read); memcpy (buf, s->scan_buf_start, bytes_read);
s->scan_buf_len -= lines_read; s->scan_buf_len -= bytes_read;
s->scan_buf_start += lines_read; s->scan_buf_start += bytes_read;
DBG_LEAVE (); DBG_LEAVE ();
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -951,7 +920,6 @@ sane_cancel (SANE_Handle handle)
free (s->scan_buf); free (s->scan_buf);
s->scan_buf = NULL; s->scan_buf = NULL;
s->scan_buf_start = NULL;
s->read_rows = 0; s->read_rows = 0;
s->scan_buf_len = 0; s->scan_buf_len = 0;
} }
@ -964,10 +932,11 @@ sane_cancel (SANE_Handle handle)
} }
SANE_Status SANE_Status
sane_set_io_mode (SANE_Handle __sane_unused__ handle, sane_set_io_mode (SANE_Handle __sane_unused__ handle, SANE_Bool non_blocking)
SANE_Bool __sane_unused__ non_blocking)
{ {
return SANE_STATUS_UNSUPPORTED; if (non_blocking)
return SANE_STATUS_UNSUPPORTED;
return SANE_STATUS_GOOD;
} }
SANE_Status SANE_Status