summaryrefslogtreecommitdiff
path: root/src/scanner.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/scanner.vala')
-rw-r--r--src/scanner.vala81
1 files changed, 70 insertions, 11 deletions
diff --git a/src/scanner.vala b/src/scanner.vala
index 722f308..4233337 100644
--- a/src/scanner.vala
+++ b/src/scanner.vala
@@ -80,6 +80,8 @@ public class ScanOptions
public ScanType type;
public int paper_width;
public int paper_height;
+ public int brightness;
+ public int contrast;
}
private class ScanJob
@@ -92,6 +94,8 @@ private class ScanJob
public ScanType type;
public int page_width;
public int page_height;
+ public int brightness;
+ public int contrast;
}
private class Request {}
@@ -207,7 +211,7 @@ public class Scanner
private static Scanner scanner_object = null;
/* Thread communicating with SANE */
- private unowned Thread<void*> thread;
+ private Thread<void*> thread;
/* Queue of requests from main thread */
private AsyncQueue<Request> request_queue;
@@ -340,7 +344,7 @@ public class Scanner
return;
}
- List<ScanDevice> devices = null;
+ var devices = new List<ScanDevice> ();
for (var i = 0; device_list[i] != null; i++)
{
debug ("Device: name=\"%s\" vendor=\"%s\" model=\"%s\" type=\"%s\"",
@@ -378,6 +382,25 @@ public class Scanner
notify (new NotifyUpdateDevices ((owned) devices));
}
+ private int scale_int (int source_min, int source_max, Sane.OptionDescriptor option, int value)
+ {
+ var v = value;
+
+ return_val_if_fail (option.type == Sane.ValueType.INT, value);
+
+ if (option.constraint_type == Sane.ConstraintType.RANGE && option.range.max != option.range.min)
+ {
+ v -= source_min;
+ v *= (int) (option.range.max - option.range.min);
+ v /= (source_max - source_min);
+ v += (int) option.range.min;
+ debug ("scale_int: scaling %d [min: %d, max: %d] to %d [min: %d, max: %d]",
+ value, source_min, source_max, v, (int) option.range.min, (int) option.range.max);
+ }
+
+ return v;
+ }
+
private bool set_default_option (Sane.Handle handle, Sane.OptionDescriptor option, Sane.Int option_index)
{
/* Check if supports automatic option */
@@ -841,6 +864,11 @@ public class Scanner
{
/* Pick source */
option = get_option_by_name (handle, Sane.NAME_SCAN_SOURCE, out index);
+ if (option == null)
+ {
+ debug ("SCAN_SOURCE not available, trying alternative \"doc-source\"");
+ option = get_option_by_name (handle, "doc-source", out index); /* Samsung unified driver. LP: #892915 */
+ }
if (option != null)
{
string[] flatbed_sources =
@@ -860,7 +888,8 @@ public class Scanner
Sane.I18N ("Automatic Document Feeder"),
"ADF",
"Automatic Document Feeder(left aligned)", /* Seen in the proprietary brother3 driver */
- "Automatic Document Feeder(centrally aligned)" /* Seen in the proprietary brother3 driver */
+ "Automatic Document Feeder(centrally aligned)", /* Seen in the proprietary brother3 driver */
+ "ADF Simplex" /* Samsung unified driver. LP: # 892915 */
};
string[] adf_front_sources =
@@ -878,7 +907,9 @@ public class Scanner
string[] adf_duplex_sources =
{
"ADF Duplex",
- Sane.I18N ("ADF Duplex")
+ Sane.I18N ("ADF Duplex"),
+ "ADF Duplex - Long-Edge Binding", /* Samsung unified driver. LP: # 892915 */
+ "ADF Duplex - Short-Edge Binding"
};
switch (job.type)
@@ -915,7 +946,8 @@ public class Scanner
{
Sane.VALUE_SCAN_MODE_COLOR,
"Color",
- "24bit Color" /* Seen in the proprietary brother3 driver */
+ "24bit Color", /* Seen in the proprietary brother3 driver */
+ "Color - 16 Million Colors" /* Samsung unified driver. LP: 892915 */
};
string[] gray_scan_modes =
{
@@ -923,7 +955,8 @@ public class Scanner
"Gray",
"Grayscale",
Sane.I18N ("Grayscale"),
- "True Gray" /* Seen in the proprietary brother3 driver */
+ "True Gray", /* Seen in the proprietary brother3 driver */
+ "Grayscale - 256 Levels" /* Samsung unified driver. LP: 892915 */
};
string[] lineart_scan_modes =
{
@@ -940,7 +973,9 @@ public class Scanner
"Gray",
"Grayscale",
Sane.I18N ("Grayscale"),
- "True Gray" /* Seen in the proprietary brother3 driver */
+ "True Gray", /* Seen in the proprietary brother3 driver */
+ "Black and White - Line Art", /* Samsung unified driver. LP: 892915 */
+ "Black and White - Halftone"
};
switch (job.scan_mode)
@@ -1060,6 +1095,24 @@ public class Scanner
set_int_option (handle, option, index, job.page_height / 10, null);
}
}
+ option = get_option_by_name (handle, Sane.NAME_BRIGHTNESS, out index);
+ if (option != null)
+ {
+ if (job.brightness != 0)
+ {
+ var brightness = scale_int (-100, 100, option, job.brightness);
+ set_int_option (handle, option, index, brightness, null);
+ }
+ }
+ option = get_option_by_name (handle, Sane.NAME_CONTRAST, out index);
+ if (option != null)
+ {
+ if (job.contrast != 0)
+ {
+ var contrast = scale_int (-100, 100, option, job.contrast);
+ set_int_option (handle, option, index, contrast, null);
+ }
+ }
/* Test scanner options (hoping will not effect other scanners...) */
if (current_device == "test")
@@ -1428,7 +1481,7 @@ public class Scanner
{
try
{
- thread = Thread.create<void*> (scan_thread, true);
+ thread = new Thread<void*>.try ("scan-thread", scan_thread);
}
catch (Error e)
{
@@ -1488,9 +1541,10 @@ public class Scanner
public void scan (string? device, ScanOptions options)
{
- debug ("Scanner.scan (\"%s\", dpi=%d, scan_mode=%s, depth=%d, type=%s, paper_width=%d, paper_height=%d)",
+ debug ("Scanner.scan (\"%s\", dpi=%d, scan_mode=%s, depth=%d, type=%s, paper_width=%d, paper_height=%d, brightness=%d, contrast=%d)",
device != null ? device : "(null)", options.dpi, get_scan_mode_string (options.scan_mode), options.depth,
- get_scan_type_string (options.type), options.paper_width, options.paper_height);
+ get_scan_type_string (options.type), options.paper_width, options.paper_height,
+ options.brightness, options.contrast);
var request = new RequestStartScan ();
request.job = new ScanJob ();
request.job.id = job_id++;
@@ -1501,6 +1555,8 @@ public class Scanner
request.job.type = options.type;
request.job.page_width = options.paper_width;
request.job.page_height = options.paper_height;
+ request.job.brightness = options.brightness;
+ request.job.contrast = options.contrast;
request_queue.push (request);
}
@@ -1517,8 +1573,11 @@ public class Scanner
request_queue.push (new RequestQuit ());
if (thread != null)
+ {
thread.join ();
-
+ thread = null;
+ }
+
Sane.exit ();
debug ("sane_exit ()");
}