brother_mfp: Added preview option.

Also fixed some warnings that affected the pipeline.
brother_mfp_backend
Ralph Little 2022-10-23 14:26:42 -07:00
rodzic a484c6ad93
commit 76481920c3
2 zmienionych plików z 55 dodań i 17 usunięć

Wyświetl plik

@ -399,7 +399,6 @@ class BrotherEncoderFamily2 : public BrotherEncoder
{
public:
BrotherEncoderFamily2(SANE_Word capabilities):
capabilities(capabilities),
colour_decoder(capabilities)
{
}
@ -461,7 +460,6 @@ private:
size_t *src_data_consumed, ScanDataHeader &header);
ScanDataHeader current_header;
SANE_Word capabilities;
BrotherJFIFDecoder jfif_decoder;
BrotherGrayRLengthDecoder gray_decoder;
@ -473,7 +471,6 @@ class BrotherEncoderFamily3 : public BrotherEncoder
{
public:
BrotherEncoderFamily3(SANE_Word capabilities):
capabilities(capabilities),
colour_decoder(capabilities)
{
}
@ -535,7 +532,6 @@ private:
size_t *src_data_consumed, ScanDataHeader &header);
ScanDataHeader current_header;
SANE_Word capabilities;
BrotherGrayRawDecoder gray_raw_decoder;
BrotherGrayRLengthDecoder gray_decoder;
@ -546,9 +542,9 @@ private:
class BrotherEncoderFamily4 : public BrotherEncoder
{
public:
BrotherEncoderFamily4(SANE_Word capabilities):
capabilities(capabilities)
BrotherEncoderFamily4(SANE_Word capabilities)
{
(void)capabilities;
}
~BrotherEncoderFamily4 ()
@ -598,7 +594,6 @@ private:
size_t *src_data_consumed, ScanDataHeader &header);
ScanDataHeader current_header;
SANE_Word capabilities;
BrotherJFIFDecoder jfif_decoder;
BrotherGrayRLengthDecoder gray_decoder;

Wyświetl plik

@ -92,8 +92,7 @@ enum Brother_Option
OPT_MODE,
OPT_X_RESOLUTION,
OPT_Y_RESOLUTION,
// OPT_PREVIEW,
// OPT_ENCODING,
OPT_PREVIEW,
OPT_GEOMETRY_GROUP,
OPT_TL_X, /* top-left x */
@ -481,6 +480,17 @@ init_options (BrotherDevice *device)
od->constraint.word_list = device->model->y_res_list;
device->val[OPT_Y_RESOLUTION].w = device->model->y_res_list[1];
od = &device->opt[OPT_PREVIEW];
od->name = SANE_NAME_PREVIEW;
od->title = SANE_TITLE_PREVIEW;
od->desc = SANE_DESC_PREVIEW;
od->type = SANE_TYPE_BOOL;
od->unit = SANE_UNIT_NONE;
od->size = 1 * sizeof(SANE_Bool);
od->constraint_type = SANE_CONSTRAINT_NONE;
od->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
device->val[OPT_PREVIEW].b = SANE_FALSE;
/* opt_geometry_group */
od = &device->opt[OPT_GEOMETRY_GROUP];
od->name = "";
@ -590,8 +600,7 @@ init_options (BrotherDevice *device)
od->type = SANE_TYPE_BOOL;
od->unit = SANE_UNIT_NONE;
od->size = 1 * sizeof(SANE_Bool);
od->constraint_type = SANE_CONSTRAINT_RANGE;
od->constraint.range = &constraint_brightness_contrast;
od->constraint_type = SANE_CONSTRAINT_NONE;
if ((device->model->capabilities & CAP_MODE_HAS_JPEG)
&& (device->model->capabilities & CAP_MODE_HAS_RAW))
od->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT | SANE_CAP_ADVANCED;
@ -999,6 +1008,20 @@ sane_control_option (SANE_Handle handle, SANE_Int option, SANE_Action action,
status = SANE_STATUS_GOOD;
break;
case OPT_PREVIEW:
if (device->val[option].b == *(SANE_Bool *) value)
{
DBG (DBG_DETAIL, "sane_control_option: option %d (%s) not changed\n",
option, device->opt[option].name);
break;
}
device->val[option].b = *(SANE_Bool *) value;
DBG (DBG_DETAIL, "sane_control_option: set option %d (%s) to %s\n",
option, device->opt[option].name, *(SANE_Bool *) value? "TRUE": "FALSE");
status = SANE_STATUS_GOOD;
break;
case OPT_MODE:
if (strcmp (device->val[option].s, (SANE_String)value) == 0)
{
@ -1082,6 +1105,12 @@ sane_control_option (SANE_Handle handle, SANE_Int option, SANE_Action action,
option, device->opt[option].name, *(SANE_Bool *) value? "TRUE": "FALSE");
break;
case OPT_PREVIEW:
*(SANE_Bool *) value = device->val[option].b;
DBG (DBG_DETAIL, "sane_control_option: get option %d (%s), value=%s\n",
option, device->opt[option].name, *(SANE_Bool *) value? "TRUE": "FALSE");
break;
case OPT_SENSOR_EMAIL:
case OPT_SENSOR_OCR:
case OPT_SENSOR_FILE:
@ -1151,14 +1180,28 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
DBG (DBG_EVENT, "sane_get_parameters\n");
/*
* Determine the resolutions to use.
* If --preview is selected, then just pick the lowest configured res.
*
*/
SANE_Word x_res = device->val[OPT_X_RESOLUTION].w;
SANE_Word y_res = device->val[OPT_Y_RESOLUTION].w;
if (device->val[OPT_PREVIEW].b)
{
x_res = device->model->x_res_list[1];
y_res = device->model->y_res_list[1];
}
/*
* Compute the geometry in terms of pixels at the selected resolution.
* This is how the scanner wants it.
*
*/
SANE_Int pixel_x_width = SANE_UNFIX (device->val[OPT_BR_X].w -
device->val[OPT_TL_X].w) / MM_IN_INCH *
device->val[OPT_X_RESOLUTION].w;
device->val[OPT_TL_X].w) / MM_IN_INCH *
x_res;
/*
* X coords must be a multiple of 8.
@ -1170,13 +1213,13 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
SANE_Int pixel_y_height = SANE_UNFIX (device->val[OPT_BR_Y].w -
device->val[OPT_TL_Y].w) / MM_IN_INCH *
device->val[OPT_Y_RESOLUTION].w;
y_res;
SANE_Int pixel_x_offset = SANE_UNFIX (device->val[OPT_TL_X].w) / MM_IN_INCH *
device->val[OPT_X_RESOLUTION].w;
x_res;
SANE_Int pixel_y_offset = SANE_UNFIX (device->val[OPT_TL_Y].w) / MM_IN_INCH *
device->val[OPT_Y_RESOLUTION].w;
y_res;
params->lines = pixel_y_height;
params->last_frame = SANE_TRUE;
@ -1194,7 +1237,7 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
return rc;
}
rc = device->driver->SetRes ((int)device->val[OPT_X_RESOLUTION].w, (int)device->val[OPT_Y_RESOLUTION].w);
rc = device->driver->SetRes ((SANE_Int)x_res, (SANE_Int)y_res);
if (rc != SANE_STATUS_GOOD)
{
return rc;