Репозитории ALT
S: | 3.23.8-alt1 |
5.1: | 3.11.5-alt0.M51.1 |
4.1: | 2.8.10-alt2.M41.1 |
4.0: | 2.7.12-alt2.M40.1 |
+backports: | 2.8.10-alt2.M40.1 |
3.0: | |
+backports: | 1.6.6a-alt0.M30.4.1 |
Группа :: Издательство
Пакет: hplip
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: hpscan-deskjet-3520-aio-allow-non-jpeg-scanning.patch
Скачать
Скачать
From 8a7307aa50a69365a8d9ab72fede9bc2c666b0e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lubo=C5=A1=20Dole=C5=BEel?= <lubos@dolezel.info>
Date: Fri, 22 Jul 2016 09:33:05 +0200
Subject: Allow non-JPEG scanning on the HP DeskJet 3520 All-in-One and similar
devices
LP: #1245578
Patch-Name: hpscan-deskjet-3520-aio-allow-non-jpeg-scanning.patch
---
scan/sane/bb_ledm.c | 47 +++++++++++++++++++++++++++++++++++++++------
scan/sane/ledm.c | 12 +++++++-----
2 files changed, 48 insertions(+), 11 deletions(-)
diff --git a/scan/sane/bb_ledm.c b/scan/sane/bb_ledm.c
index b233d1e28..27d73a0c6 100644
--- a/scan/sane/bb_ledm.c
+++ b/scan/sane/bb_ledm.c
@@ -189,7 +189,7 @@ Keep-Alive: 20\r\nProxy-Connection: keep-alive\r\nCookie: AccessCounter=new\r\n0
<YStart>%d</YStart>\
<Height>%d</Height>\
<Format>%s</Format>\
-<CompressionQFactor>15</CompressionQFactor>\
+<CompressionQFactor>0</CompressionQFactor>\
<ColorSpace>%s</ColorSpace>\
<BitDepth>%d</BitDepth>\
<InputSource>%s</InputSource>\
@@ -234,6 +234,38 @@ Keep-Alive: 300\r\nProxy-Connection: keep-alive\r\nCookie: AccessCounter=new\r\n
# define JOBSTATE_COMPLETED "<j:JobState>Completed</j:JobState>"
# define PRESCANPAGE "<PreScanPage>"
+static int parse_status_elements(const char *payload, int size, struct wscn_create_scan_job_response *resp)
+{
+ char tag[512];
+ char value[128];
+ char *tail=(char *)payload;
+
+ while (1)
+ {
+ get_tag(tail, size-(tail-payload), tag, sizeof(tag), &tail);
+
+ if (!tag[0])
+ break;
+
+ if (strncmp(tag, "ImageWidth", 10) == 0)
+ {
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ resp->pixels_per_line = strtol(value, NULL, 10);
+ }
+ else if (strncmp(tag, "ImageHeight", 11) == 0)
+ {
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ resp->lines = strtol(value, NULL, 10);
+ }
+ else if (strncmp(tag, "BytesPerLine", 12) == 0)
+ {
+ get_element(tail, size-(tail-payload), value, sizeof(value), &tail);
+ resp->bytes_per_line = strtol(value, NULL, 10);
+ }
+ }
+ return 0;
+}
+
static int parse_scan_elements(const char *payload, int size, struct wscn_scan_elements *elements)
{
char tag[512];
@@ -762,8 +794,7 @@ int bb_get_parameters(struct ledm_session *ps, SANE_Parameters *pp, int option)
if (ps->currentCompression == SF_RAW && ps->currentScanMode != CE_GRAY8)
{
/* Set scan parameters based on scan job response values */
- //pp->lines = pbb->job.lines;
- pp->lines = (int)(SANE_UNFIX(ps->effectiveBry - ps->effectiveTly)/MM_PER_INCH*ps->currentResolution);
+ pp->lines = pbb->job.lines;
pp->pixels_per_line = pbb->job.pixels_per_line;
pp->bytes_per_line = pbb->job.bytes_per_line;
}
@@ -784,8 +815,8 @@ int bb_get_parameters(struct ledm_session *ps, SANE_Parameters *pp, int option)
break;
case SPO_BEST_GUESS: /* called by xsane & sane_start */
/* Set scan parameters based on best guess. */
- pp->lines = (int)round(SANE_UNFIX(ps->effectiveBry - ps->effectiveTly)/MM_PER_INCH*ps->currentResolution);
- pp->pixels_per_line = (int)round(SANE_UNFIX(ps->effectiveBrx -ps->effectiveTlx)/MM_PER_INCH*ps->currentResolution);
+ pp->lines = (int)(SANE_UNFIX(ps->effectiveBry - ps->effectiveTly)/MM_PER_INCH*ps->currentResolution);
+ pp->pixels_per_line = ps->image_traits.iPixelsPerRow;
pp->bytes_per_line = BYTES_PER_LINE(pp->pixels_per_line, pp->depth * factor);
break;
default:
@@ -889,7 +920,7 @@ SANE_Status bb_start_scan(struct ledm_session *ps)
(int) ((ps->currentBrx / 5548.7133) - (ps->currentTlx / 5548.7133)),//<Width>
(int) (ps->currentTly / 5548.7133),//<YStart>
(int) ((ps->currentBry / 5548.7133) - (ps->currentTly / 5548.7133)),//<Height>
- "Jpeg",//<Format>
+ (ps->currentCompression == SF_RAW) ? "Raw" : "Jpeg", //<Format>
(! strcmp(ce_element[ps->currentScanMode], "Color8")) ? "Color" : (! strcmp(ce_element[ps->currentScanMode], "Gray8")) ? "Gray" : "Gray",//<ColorSpace>
((! strcmp(ce_element[ps->currentScanMode], "Color8")) || (! strcmp(ce_element[ps->currentScanMode], "Gray8"))) ? 8: 8,//<BitDepth>
ps->currentInputSource == IS_PLATEN ? is_element[1] : is_element[2],//<InputSource>
@@ -987,6 +1018,7 @@ SANE_Status bb_start_scan(struct ledm_session *ps)
_DBG("bb_start_scan() read_http_payload FAILED len=%d buf=%s\n", len, buf);
break;
}
+
//For a new scan, buf must contain <PreScanPage>.
if (NULL == strstr(buf,PRESCANPAGE))
{ //i.e Paper is not present in Scanner
@@ -1005,6 +1037,9 @@ SANE_Status bb_start_scan(struct ledm_session *ps)
stat = SANE_STATUS_GOOD;
goto bugout;
}
+ // Parse buf here
+ parse_status_elements(buf, len, &pbb->job);
+
usleep(500000);//0.5 sec delay
}//end while()
diff --git a/scan/sane/ledm.c b/scan/sane/ledm.c
index 9a1ff02d1..8f0433853 100644
--- a/scan/sane/ledm.c
+++ b/scan/sane/ledm.c
@@ -170,11 +170,11 @@ static int set_scan_mode_side_effects(struct ledm_session *ps, enum COLOR_ENTRY
case CE_GRAY8:
case CE_COLOR8:
default:
-// ps->compressionList[j] = STR_COMPRESSION_NONE;
-// ps->compressionMap[j++] = SF_RAW;
+ ps->compressionList[j] = STR_COMPRESSION_NONE;
+ ps->compressionMap[j++] = SF_RAW;
ps->compressionList[j] = STR_COMPRESSION_JPEG;
ps->compressionMap[j++] = SF_JPEG;
- ps->currentCompression = SF_JPEG;
+ ps->currentCompression = SF_RAW;
ps->option[LEDM_OPTION_JPEG_QUALITY].cap |= SANE_CAP_SOFT_SELECT; /* enable jpeg quality */
break;
}
@@ -679,7 +679,7 @@ SANE_Status ledm_control_option(SANE_Handle handle, SANE_Int option, SANE_Action
}
else
{ /* Set default. */
- ps->currentCompression = SF_JPEG;
+ ps->currentCompression = SF_RAW;
stat = SANE_STATUS_GOOD;
}
break;
@@ -984,7 +984,9 @@ SANE_Status ledm_start(SANE_Handle handle)
}
}
else
- ipGetImageTraits(ps->ip_handle, NULL, &ps->image_traits); /* get valid image traits */
+ {
+ ipGetOutputTraits(ps->ip_handle, &ps->image_traits); /* get valid image traits */
+ }
stat = SANE_STATUS_GOOD;