summarylogtreecommitdiffstats
path: root/hpscan-ledm-raw.patch
blob: 255bfe0094a5ebe81ed2baa820b790e29cc69220 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
diff --git a/scan/sane/bb_ledm.c b/scan/sane/bb_ledm.c
index bf2c093..318ea5c 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 af86bff..65a7447 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;