From 2428efd6af7586358809a5d9704fda32687c9396 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sat, 15 Feb 2020 14:12:44 +0200 Subject: [PATCH] genesys: Fix host-side calibration when scan start position is not zero --- backend/genesys/gl124.cpp | 2 +- backend/genesys/gl646.cpp | 2 +- backend/genesys/gl841.cpp | 2 +- backend/genesys/gl843.cpp | 2 +- backend/genesys/gl846.cpp | 2 +- backend/genesys/gl847.cpp | 2 +- backend/genesys/low.cpp | 10 ++++++++-- backend/genesys/low.h | 3 ++- 8 files changed, 16 insertions(+), 9 deletions(-) diff --git a/backend/genesys/gl124.cpp b/backend/genesys/gl124.cpp index 994fe952c..095aa301f 100644 --- a/backend/genesys/gl124.cpp +++ b/backend/genesys/gl124.cpp @@ -816,7 +816,7 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens dev->line_count = 0; - build_image_pipeline(dev, session); + build_image_pipeline(dev, sensor, session); // MAXWD is expressed in 2 words unit diff --git a/backend/genesys/gl646.cpp b/backend/genesys/gl646.cpp index 8e4ab2268..5f1febc89 100644 --- a/backend/genesys/gl646.cpp +++ b/backend/genesys/gl646.cpp @@ -550,7 +550,7 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene dev->read_buffer.clear(); dev->read_buffer.alloc(session.buffer_size_read); - build_image_pipeline(dev, session); + build_image_pipeline(dev, sensor, session); dev->read_active = true; diff --git a/backend/genesys/gl841.cpp b/backend/genesys/gl841.cpp index 6219dad76..dccf20c46 100644 --- a/backend/genesys/gl841.cpp +++ b/backend/genesys/gl841.cpp @@ -1615,7 +1615,7 @@ dummy \ scanned lines dev->read_buffer.clear(); dev->read_buffer.alloc(session.buffer_size_read); - build_image_pipeline(dev, session); + build_image_pipeline(dev, sensor, session); dev->read_active = true; diff --git a/backend/genesys/gl843.cpp b/backend/genesys/gl843.cpp index bed5cdc91..4987cd3ad 100644 --- a/backend/genesys/gl843.cpp +++ b/backend/genesys/gl843.cpp @@ -1240,7 +1240,7 @@ void CommandSetGl843::init_regs_for_scan_session(Genesys_Device* dev, const Gene dev->read_buffer.clear(); dev->read_buffer.alloc(session.buffer_size_read); - build_image_pipeline(dev, session); + build_image_pipeline(dev, sensor, session); dev->read_active = true; diff --git a/backend/genesys/gl846.cpp b/backend/genesys/gl846.cpp index 7d10fe35f..b39731d66 100644 --- a/backend/genesys/gl846.cpp +++ b/backend/genesys/gl846.cpp @@ -662,7 +662,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens reg->set16(REG_STRPIXEL, session.pixel_startx); reg->set16(REG_ENDPIXEL, session.pixel_endx); - build_image_pipeline(dev, session); + build_image_pipeline(dev, sensor, session); /* MAXWD is expressed in 4 words unit */ // BUG: we shouldn't multiply by channels here diff --git a/backend/genesys/gl847.cpp b/backend/genesys/gl847.cpp index c972a7ac9..1e2911fe5 100644 --- a/backend/genesys/gl847.cpp +++ b/backend/genesys/gl847.cpp @@ -669,7 +669,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens reg->set16(REG_STRPIXEL, session.pixel_startx); reg->set16(REG_ENDPIXEL, session.pixel_endx); - build_image_pipeline(dev, session); + build_image_pipeline(dev, sensor, session); /* MAXWD is expressed in 4 words unit */ // BUG: we shouldn't multiply by channels here diff --git a/backend/genesys/low.cpp b/backend/genesys/low.cpp index 565df871e..9540ce770 100644 --- a/backend/genesys/low.cpp +++ b/backend/genesys/low.cpp @@ -1252,7 +1252,8 @@ static FakeBufferModel get_fake_usb_buffer_model(const ScanSession& session) return model; } -void build_image_pipeline(Genesys_Device* dev, const ScanSession& session) +void build_image_pipeline(Genesys_Device* dev, const Genesys_Sensor& sensor, + const ScanSession& session) { static unsigned s_pipeline_index = 0; @@ -1361,9 +1362,14 @@ void build_image_pipeline(Genesys_Device* dev, const ScanSession& session) !has_flag(dev->model->flags, ModelFlag::NO_CALIBRATION) && !has_flag(session.params.flags, ScanFlag::DISABLE_SHADING)) { + unsigned pixel_shift = session.params.startx * dev->calib_session.params.xres / + sensor.optical_res; + if (dev->model->model_id == ModelId::CANON_4400F) { + pixel_shift = session.params.startx; + } dev->pipeline.push_node(dev->dark_average_data, dev->white_average_data, - dev->calib_session.params.startx * + pixel_shift * dev->calib_session.params.channels); if (DBG_LEVEL >= DBG_io2) { diff --git a/backend/genesys/low.h b/backend/genesys/low.h index f141cdfa7..2d4ffa765 100644 --- a/backend/genesys/low.h +++ b/backend/genesys/low.h @@ -407,7 +407,8 @@ extern void sanei_genesys_generate_gamma_buffer(Genesys_Device* dev, void compute_session(const Genesys_Device* dev, ScanSession& s, const Genesys_Sensor& sensor); -void build_image_pipeline(Genesys_Device* dev, const ScanSession& session); +void build_image_pipeline(Genesys_Device* dev, const Genesys_Sensor& sensor, + const ScanSession& session); std::uint8_t compute_frontend_gain(float value, float target_value, FrontendType frontend_type);