summaryrefslogtreecommitdiff
path: root/backend/genesys/tables_sensor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backend/genesys/tables_sensor.cpp')
-rw-r--r--backend/genesys/tables_sensor.cpp4474
1 files changed, 2345 insertions, 2129 deletions
diff --git a/backend/genesys/tables_sensor.cpp b/backend/genesys/tables_sensor.cpp
index bbbe441..b90355c 100644
--- a/backend/genesys/tables_sensor.cpp
+++ b/backend/genesys/tables_sensor.cpp
@@ -44,71 +44,10 @@
#define DEBUG_DECLARE_ONLY
#include "low.h"
+#include <map>
namespace genesys {
-inline unsigned default_get_logical_hwdpi(const Genesys_Sensor& sensor, unsigned xres)
-{
- if (sensor.logical_dpihw_override)
- return sensor.logical_dpihw_override;
-
- // can't be below 600 dpi
- if (xres <= 600) {
- return 600;
- }
- if (xres <= static_cast<unsigned>(sensor.optical_res) / 4) {
- return sensor.optical_res / 4;
- }
- if (xres <= static_cast<unsigned>(sensor.optical_res) / 2) {
- return sensor.optical_res / 2;
- }
- return sensor.optical_res;
-}
-
-inline unsigned get_sensor_optical_with_ccd_divisor(const Genesys_Sensor& sensor, unsigned xres)
-{
- unsigned hwres = sensor.optical_res / sensor.get_ccd_size_divisor_for_dpi(xres);
-
- if (xres <= hwres / 4) {
- return hwres / 4;
- }
- if (xres <= hwres / 2) {
- return hwres / 2;
- }
- return hwres;
-}
-
-inline unsigned default_get_ccd_size_divisor_for_dpi(const Genesys_Sensor& sensor, unsigned xres)
-{
- if (sensor.ccd_size_divisor >= 4 && xres * 4 <= static_cast<unsigned>(sensor.optical_res)) {
- return 4;
- }
- if (sensor.ccd_size_divisor >= 2 && xres * 2 <= static_cast<unsigned>(sensor.optical_res)) {
- return 2;
- }
- return 1;
-}
-
-inline unsigned get_ccd_size_divisor_exact(const Genesys_Sensor& sensor, unsigned xres)
-{
- (void) xres;
- return sensor.ccd_size_divisor;
-}
-
-inline unsigned get_ccd_size_divisor_gl124(const Genesys_Sensor& sensor, unsigned xres)
-{
- // we have 2 domains for ccd: xres below or above half ccd max dpi
- if (xres <= 300 && sensor.ccd_size_divisor > 1) {
- return 2;
- }
- return 1;
-}
-
-inline unsigned default_get_hwdpi_divisor_for_dpi(const Genesys_Sensor& sensor, unsigned xres)
-{
- return sensor.optical_res / default_get_logical_hwdpi(sensor, xres);
-}
-
StaticInit<std::vector<Genesys_Sensor>> s_sensors;
void genesys_init_sensor_tables()
@@ -118,444 +57,231 @@ void genesys_init_sensor_tables()
Genesys_Sensor sensor;
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_UMAX;
- sensor.optical_res = 1200;
+ sensor.sensor_id = SensorId::CCD_UMAX; // gl646
+ sensor.full_resolution = 1200;
sensor.black_pixels = 48;
sensor.dummy_pixel = 64;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10800;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.custom_regs = {
- { 0x08, 0x01 },
- { 0x09, 0x03 },
- { 0x0a, 0x05 },
- { 0x0b, 0x07 },
- { 0x16, 0x33 },
- { 0x17, 0x05 },
- { 0x18, 0x31 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x13 },
- { 0x53, 0x17 },
- { 0x54, 0x03 },
- { 0x55, 0x07 },
- { 0x56, 0x0b },
- { 0x57, 0x0f },
- { 0x58, 0x23 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 },
+ { 0x08, 0x01 }, { 0x09, 0x03 }, { 0x0a, 0x05 }, { 0x0b, 0x07 },
+ { 0x16, 0x33 }, { 0x17, 0x05 }, { 0x18, 0x31 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x13 }, { 0x53, 0x17 }, { 0x54, 0x03 }, { 0x55, 0x07 },
+ { 0x56, 0x0b }, { 0x57, 0x0f }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 150, 4 },
+ { { 150 }, 300, 8 },
+ { { 300 }, 600, 16 },
+ { { 600 }, 1200, 32 },
+ { { 1200 }, 2400, 64 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_ST12;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_ST12; // gl646
+ sensor.full_resolution = 600;
sensor.black_pixels = 48;
sensor.dummy_pixel = 85;
- sensor.ccd_start_xoffset = 152;
- sensor.sensor_pixels = 5416;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.custom_regs = {
- { 0x08, 0x02 },
- { 0x09, 0x00 },
- { 0x0a, 0x06 },
- { 0x0b, 0x04 },
- { 0x16, 0x2b },
- { 0x17, 0x08 },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x0c },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 },
+ { 0x08, 0x02 }, { 0x09, 0x00 }, { 0x0a, 0x06 }, { 0x0b, 0x04 },
+ { 0x16, 0x2b }, { 0x17, 0x08 }, { 0x18, 0x20 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x0c }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 10 },
+ { { 150 }, 21 },
+ { { 300 }, 42 },
+ { { 600 }, 85 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_ST24;
- sensor.optical_res = 1200;
+ sensor.sensor_id = SensorId::CCD_ST24; // gl646
+ sensor.full_resolution = 1200;
sensor.black_pixels = 48;
sensor.dummy_pixel = 64;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10800;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.custom_regs = {
- { 0x08, 0x0e },
- { 0x09, 0x0c },
- { 0x0a, 0x00 },
- { 0x0b, 0x0c },
- { 0x16, 0x33 },
- { 0x17, 0x08 },
- { 0x18, 0x31 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x17 },
- { 0x53, 0x03 },
- { 0x54, 0x07 },
- { 0x55, 0x0b },
- { 0x56, 0x0f },
- { 0x57, 0x13 },
- { 0x58, 0x03 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 },
+ { 0x08, 0x0e }, { 0x09, 0x0c }, { 0x0a, 0x00 }, { 0x0b, 0x0c },
+ { 0x16, 0x33 }, { 0x17, 0x08 }, { 0x18, 0x31 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x17 }, { 0x53, 0x03 }, { 0x54, 0x07 }, { 0x55, 0x0b },
+ { 0x56, 0x0f }, { 0x57, 0x13 }, { 0x58, 0x03 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 150, 4 },
+ { { 150 }, 300, 8 },
+ { { 300 }, 600, 16 },
+ { { 600 }, 1200, 32 },
+ { { 1200 }, 2400, 64 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_5345;
- sensor.optical_res = 1200;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CCD_5345; // gl646
+ sensor.full_resolution = 1200;
sensor.black_pixels = 48;
sensor.dummy_pixel = 16;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10872;
sensor.fau_gain_white_ref = 190;
sensor.gain_white_ref = 190;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
- sensor.stagger_config = StaggerConfig{ 1200, 4 }; // FIXME: may be incorrect
- sensor.custom_base_regs = {
- { 0x08, 0x0d },
- { 0x09, 0x0f },
- { 0x0a, 0x11 },
- { 0x0b, 0x13 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x30 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x23 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 },
- };
sensor.gamma = { 2.38f, 2.35f, 2.34f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
unsigned exposure_lperiod;
- unsigned ccd_size_divisor;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ StaggerConfig stagger_y; // FIXME: may be incorrect
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 50 }, 12000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 75 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 100 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 150 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 200 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 300 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 400 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 600 }, 11000, 2, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x28 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 1200 }, 11000, 1, {
- { 0x08, 0x0d },
- { 0x09, 0x0f },
- { 0x0a, 0x11 },
- { 0x0b, 0x13 },
- { 0x16, 0x0b },
- { 0x17, 0x0a },
- { 0x18, 0x30 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x03 },
- { 0x52, 0x03 },
- { 0x53, 0x07 },
- { 0x54, 0x0b },
- { 0x55, 0x0f },
- { 0x56, 0x13 },
- { 0x57, 0x17 },
- { 0x58, 0x23 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
+ { { 50 }, 600, 100, 12000, Ratio{1, 2}, 0, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 75 }, 600, 150, 11000, Ratio{1, 2}, 1, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 100 }, 600, 200, 11000, Ratio{1, 2}, 1, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 150 }, 600, 300, 11000, Ratio{1, 2}, 2, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 200 }, 600, 400, 11000, Ratio{1, 2}, 2, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 300 }, 600, 600, 11000, Ratio{1, 2}, 4, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 400 }, 600, 800, 11000, Ratio{1, 2}, 5, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 600 }, 600, 1200, 11000, Ratio{1, 2}, 8, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 1200 }, 1200, 1200, 11000, Ratio{1, 1}, 16, StaggerConfig{4, 0}, {
+ { 0x08, 0x0d }, { 0x09, 0x0f }, { 0x0a, 0x11 }, { 0x0b, 0x13 },
+ { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x30 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f },
+ { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
}
},
};
@@ -563,8 +289,12 @@ void genesys_init_sensor_tables()
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.ccd_size_divisor = setting.ccd_size_divisor;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
}
@@ -572,223 +302,79 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_HP2400;
- sensor.optical_res = 1200;
+ sensor.sensor_id = SensorId::CCD_HP2400; // gl646
+ sensor.full_resolution = 1200;
sensor.black_pixels = 48;
sensor.dummy_pixel = 15;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10872;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
- sensor.stagger_config = StaggerConfig{1200, 4}; // FIXME: may be incorrect
- sensor.custom_base_regs = {
- { 0x08, 0x14 },
- { 0x09, 0x15 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x3f },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x0e },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 },
- };
sensor.gamma = { 2.1f, 2.1f, 2.1f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
unsigned exposure_lperiod;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ StaggerConfig stagger_y;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 50 }, 7211, {
- { 0x08, 0x14 },
- { 0x09, 0x15 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x3f },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 100 }, 7211, {
- { 0x08, 0x14 },
- { 0x09, 0x15 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x3f },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 150 }, 7211, {
- { 0x08, 0x14 },
- { 0x09, 0x15 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x3f },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 300 }, 8751, {
- { 0x08, 0x14 },
- { 0x09, 0x15 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x3f },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 600 }, 18760, {
- { 0x08, 0x0e },
- { 0x09, 0x0f },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x31 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x03 },
- { 0x53, 0x07 },
- { 0x54, 0x0b },
- { 0x55, 0x0f },
- { 0x56, 0x13 },
- { 0x57, 0x17 },
- { 0x58, 0x23 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 1200 }, 21749, {
- { 0x08, 0x02 },
- { 0x09, 0x04 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0xbf },
- { 0x17, 0x08 },
- { 0x18, 0x30 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x42 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x0e },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
+ { { 50 }, 200, 7211, Ratio{1, 4}, 0, StaggerConfig{}, {
+ { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
+ { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 },
+ { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 100 }, 400, 7211, Ratio{1, 4}, 1, StaggerConfig{}, {
+ { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
+ { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 },
+ { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 150 }, 600, 7211, Ratio{1, 4}, 1, StaggerConfig{}, {
+ { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
+ { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 },
+ { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 300 }, 1200, 8751, Ratio{1, 4}, 3, StaggerConfig{}, {
+ { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
+ { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 },
+ { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 600 }, 1200, 18760, Ratio{1, 2}, 7, StaggerConfig{}, {
+ { 0x08, 0x0e }, { 0x09, 0x0f }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
+ { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x31 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f },
+ { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 1200 }, 1200, 21749, Ratio{1, 1}, 15, StaggerConfig{4, 0}, {
+ { 0x08, 0x02 }, { 0x09, 0x04 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
+ { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x30 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0xc0 }, { 0x1d, 0x42 },
+ { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 },
+ { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x0e }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
}
},
};
@@ -796,7 +382,11 @@ void genesys_init_sensor_tables()
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
sensor.exposure_lperiod = setting.exposure_lperiod;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
}
@@ -804,168 +394,61 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_HP2300;
- sensor.optical_res = 600;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CCD_HP2300; // gl646
+ sensor.full_resolution = 600;
sensor.black_pixels = 48;
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 5368;
sensor.fau_gain_white_ref = 180;
sensor.gain_white_ref = 180;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
- sensor.custom_base_regs = {
- { 0x08, 0x16 },
- { 0x09, 0x00 },
- { 0x0a, 0x01 },
- { 0x0b, 0x03 },
- { 0x16, 0xb7 },
- { 0x17, 0x0a },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x6a },
- { 0x1b, 0x8a },
- { 0x1c, 0x00 },
- { 0x1d, 0x05 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x06 },
- { 0x5c, 0x0b },
- { 0x5d, 0x10 },
- { 0x5e, 0x16 },
- };
sensor.gamma = { 2.1f, 2.1f, 2.1f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
unsigned exposure_lperiod;
- unsigned ccd_size_divisor;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75 }, 4480, 2, {
- { 0x08, 0x16 },
- { 0x09, 0x00 },
- { 0x0a, 0x01 },
- { 0x0b, 0x03 },
- { 0x16, 0xb7 },
- { 0x17, 0x0a },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x6a },
- { 0x1b, 0x8a },
- { 0x1c, 0x00 },
- { 0x1d, 0x85 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x06 },
- { 0x5c, 0x0b },
- { 0x5d, 0x10 },
- { 0x5e, 0x16 }
- }
- },
- { { 150 }, 4350, 2, {
- { 0x08, 0x16 },
- { 0x09, 0x00 },
- { 0x0a, 0x01 },
- { 0x0b, 0x03 },
- { 0x16, 0xb7 },
- { 0x17, 0x0a },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x6a },
- { 0x1b, 0x8a },
- { 0x1c, 0x00 },
- { 0x1d, 0x85 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x06 },
- { 0x5c, 0x0b },
- { 0x5d, 0x10 },
- { 0x5e, 0x16 }
- }
- },
- { { 300 }, 4350, 2, {
- { 0x08, 0x16 },
- { 0x09, 0x00 },
- { 0x0a, 0x01 },
- { 0x0b, 0x03 },
- { 0x16, 0xb7 },
- { 0x17, 0x0a },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x6a },
- { 0x1b, 0x8a },
- { 0x1c, 0x00 },
- { 0x1d, 0x85 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x06 },
- { 0x5c, 0x0b },
- { 0x5d, 0x10 },
- { 0x5e, 0x16 }
- }
- },
- { { 600 }, 8700, 1, {
- { 0x08, 0x01 },
- { 0x09, 0x03 },
- { 0x0a, 0x04 },
- { 0x0b, 0x06 },
- { 0x16, 0xb7 },
- { 0x17, 0x0a },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x6a },
- { 0x1b, 0x8a },
- { 0x1c, 0x00 },
- { 0x1d, 0x05 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x06 },
- { 0x5c, 0x0b },
- { 0x5d, 0x10 },
- { 0x5e, 0x16 }
+ { { 75 }, 300, 150, 4480, Ratio{1, 2}, 2, {
+ { 0x08, 0x16 }, { 0x09, 0x00 }, { 0x0a, 0x01 }, { 0x0b, 0x03 },
+ { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a },
+ { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x85 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 }
+ }
+ },
+ { { 150 }, 300, 300, 4350, Ratio{1, 2}, 5, {
+ { 0x08, 0x16 }, { 0x09, 0x00 }, { 0x0a, 0x01 }, { 0x0b, 0x03 },
+ { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a },
+ { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x85 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 }
+ }
+ },
+ { { 300 }, 300, 600, 4350, Ratio{1, 2}, 10, {
+ { 0x08, 0x16 }, { 0x09, 0x00 }, { 0x0a, 0x01 }, { 0x0b, 0x03 },
+ { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a },
+ { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x85 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 }
+ }
+ },
+ { { 600 }, 600, 600, 8700, Ratio{1, 1}, 20, {
+ { 0x08, 0x01 }, { 0x09, 0x03 }, { 0x0a, 0x04 }, { 0x0b, 0x06 },
+ { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a },
+ { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x05 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 }
}
},
};
@@ -973,8 +456,11 @@ void genesys_init_sensor_tables()
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.ccd_size_divisor = setting.ccd_size_divisor;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
}
@@ -982,399 +468,300 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_35;
- sensor.optical_res = 1200;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_35; // gl841
+ sensor.full_resolution = 1200;
+ sensor.register_dpihw = 1200;
sensor.black_pixels = 87;
sensor.dummy_pixel = 87;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10400;
sensor.fau_gain_white_ref = 0;
sensor.gain_white_ref = 0;
sensor.exposure = { 0x0400, 0x0400, 0x0400 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x00 },
- { 0x17, 0x02 },
- { 0x18, 0x00 },
- { 0x19, 0x50 },
- { 0x1a, 0x00 }, // TODO: 1a-1d: these do no harm, but may be neccessery for CCD
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x02 },
- { 0x52, 0x05 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x07 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x3a },
- { 0x59, 0x03 },
- { 0x5a, 0x40 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 },
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x00 }, { 0x19, 0x50 },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x05 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x3a }, { 0x59, 0x03 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, 150, 600, 11 },
+ { { 100 }, 600, 200, 600, 14 },
+ { { 150 }, 600, 300, 600, 22 },
+ { { 200 }, 600, 400, 600, 29 },
+ { { 300 }, 600, 600, 600, 44 },
+ { { 600 }, 600, 1200, 600, 88 },
+ { { 1200 }, 1200, 1200, 1200, 88 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_XP200;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_60; // gl841
+ sensor.full_resolution = 1200;
+ sensor.register_dpihw = 1200;
+ sensor.black_pixels = 87;
+ sensor.dummy_pixel = 87;
+ sensor.fau_gain_white_ref = 0;
+ sensor.gain_white_ref = 0;
+ sensor.exposure = { 0x0400, 0x0400, 0x0400 };
+ sensor.custom_regs = {
+ { 0x16, 0x00 }, { 0x17, 0x01 }, { 0x18, 0x00 }, { 0x19, 0x50 },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 },
+ { 0x52, 0x05 }, { 0x53, 0x07 }, { 0x54, 0x03 }, { 0x55, 0x05 },
+ { 0x56, 0x02 }, { 0x57, 0x05 }, { 0x58, 0x3a }, { 0x59, 0x03 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
+ };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, 150, 600, 11 },
+ { { 100 }, 600, 200, 600, 14 },
+ { { 150 }, 600, 300, 600, 22 },
+ { { 200 }, 600, 400, 600, 29 },
+ { { 300 }, 600, 600, 600, 44 },
+ { { 600 }, 600, 1200, 600, 88 },
+ { { 1200 }, 1200, 1200, 1200, 88 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
+
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_90; // gl842
+ sensor.full_resolution = 2400;
+ sensor.black_pixels = 20;
+ sensor.dummy_pixel = 253;
+ sensor.fau_gain_white_ref = 150;
+ sensor.gain_white_ref = 150;
+ sensor.use_host_side_calib = true;
+ sensor.custom_regs = {
+ { 0x16, 0x20 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x24 }, { 0x1c, 0x00 }, { 0x1d, 0x04 },
+ { 0x52, 0x02 }, { 0x53, 0x04 }, { 0x54, 0x02 }, { 0x55, 0x04 },
+ { 0x56, 0x02 }, { 0x57, 0x04 }, { 0x58, 0x0a }, { 0x59, 0x71 }, { 0x5a, 0x55 },
+ { 0x70, 0x00 }, { 0x71, 0x05 }, { 0x72, 0x07 }, { 0x73, 0x09 },
+ { 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x3f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x1e }, { 0x7d, 0x11 }, { 0x7f, 0x50 }
+ };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
+ unsigned shading_factor;
+ int output_pixel_offset;
+ SensorExposure exposure;
+ unsigned exposure_lperiod;
+ unsigned segment_size;
+ std::vector<unsigned> segment_order;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 300 }, 300, 600, 600, 300, 2, 280, { 955, 1235, 675 }, 6500, 5152,
+ std::vector<unsigned>{} },
+ { { 600 }, 600, 600, 600, 600, 1, 250, { 1655, 2075, 1095 }, 6536, 5152,
+ std::vector<unsigned>{} },
+ { { 1200 }, 1200, 1200, 1200, 1200, 1, 500, { 3055, 4175, 1935 }, 12688, 5152,
+ {0, 1} },
+ { { 2400 }, 2400, 2400, 2400, 2400, 1, 1000, { 5855, 7535, 3615 }, 21500, 5152,
+ {0, 1, 2, 3} },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.exposure = setting.exposure;
+ sensor.exposure_lperiod = setting.exposure_lperiod;
+ sensor.segment_size = setting.segment_size;
+ sensor.segment_order = setting.segment_order;
+ s_sensors->push_back(sensor);
+ }
+ }
+
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CIS_XP200; // gl646
+ sensor.full_resolution = 600;
sensor.black_pixels = 5;
sensor.dummy_pixel = 38;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 5200;
sensor.fau_gain_white_ref = 200;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x1450, 0x0c80, 0x0a28 };
- sensor.custom_base_regs = {
- { 0x08, 0x16 },
- { 0x09, 0x00 },
- { 0x0a, 0x01 },
- { 0x0b, 0x03 },
- { 0x16, 0xb7 },
- { 0x17, 0x0a },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x6a },
- { 0x1b, 0x8a },
- { 0x1c, 0x00 },
- { 0x1d, 0x05 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x06 },
- { 0x5c, 0x0b },
- { 0x5d, 0x10 },
- { 0x5e, 0x16 },
- };
sensor.custom_regs = {
- { 0x08, 0x06 },
- { 0x09, 0x07 },
- { 0x0a, 0x0a },
- { 0x0b, 0x04 },
- { 0x16, 0x24 },
- { 0x17, 0x04 },
- { 0x18, 0x00 },
- { 0x19, 0x2a },
- { 0x1a, 0x0a },
- { 0x1b, 0x0a },
- { 0x1c, 0x00 },
- { 0x1d, 0x11 },
- { 0x52, 0x08 },
- { 0x53, 0x02 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x1a },
- { 0x59, 0x51 },
- { 0x5a, 0x00 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
+ { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 },
+ { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 },
+ { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
};
sensor.gamma = { 2.1f, 2.1f, 2.1f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
std::vector<unsigned> channels;
unsigned exposure_lperiod;
SensorExposure exposure;
+ int output_pixel_offset;
};
CustomSensorSettings custom_settings[] = {
- { { 75 }, { 3 }, 5700, { 0x1644, 0x0c80, 0x092e } },
- { { 100 }, { 3 }, 5700, { 0x1644, 0x0c80, 0x092e } },
- { { 200 }, { 3 }, 5700, { 0x1644, 0x0c80, 0x092e } },
- { { 300 }, { 3 }, 9000, { 0x1644, 0x0c80, 0x092e } },
- { { 600 }, { 3 }, 16000, { 0x1644, 0x0c80, 0x092e } },
- { { 75 }, { 1 }, 16000, { 0x050a, 0x0fa0, 0x1010 } },
- { { 100 }, { 1 }, 7800, { 0x050a, 0x0fa0, 0x1010 } },
- { { 200 }, { 1 }, 11000, { 0x050a, 0x0fa0, 0x1010 } },
- { { 300 }, { 1 }, 13000, { 0x050a, 0x0fa0, 0x1010 } },
- { { 600 }, { 1 }, 24000, { 0x050a, 0x0fa0, 0x1010 } },
+ { { 75 }, { 3 }, 5700, { 0x1644, 0x0c80, 0x092e }, 4 },
+ { { 100 }, { 3 }, 5700, { 0x1644, 0x0c80, 0x092e }, 6 },
+ { { 200 }, { 3 }, 5700, { 0x1644, 0x0c80, 0x092e }, 12 },
+ { { 300 }, { 3 }, 9000, { 0x1644, 0x0c80, 0x092e }, 19 },
+ { { 600 }, { 3 }, 16000, { 0x1644, 0x0c80, 0x092e }, 38 },
+ { { 75 }, { 1 }, 16000, { 0x050a, 0x0fa0, 0x1010 }, 4 },
+ { { 100 }, { 1 }, 7800, { 0x050a, 0x0fa0, 0x1010 }, 6 },
+ { { 200 }, { 1 }, 11000, { 0x050a, 0x0fa0, 0x1010 }, 12 },
+ { { 300 }, { 1 }, 13000, { 0x050a, 0x0fa0, 0x1010 }, 19 },
+ { { 600 }, { 1 }, 24000, { 0x050a, 0x0fa0, 0x1010 }, 38 },
};
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
sensor.channels = setting.channels;
+ sensor.register_dpiset = setting.resolutions.values()[0];
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
s_sensors->push_back(sensor);
}
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_HP3670;
- sensor.optical_res = 1200;
+ sensor.sensor_id = SensorId::CCD_HP3670; // gl646
+ sensor.full_resolution = 1200;
sensor.black_pixels = 48;
sensor.dummy_pixel = 16;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10872;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0, 0, 0 };
- sensor.stagger_config = StaggerConfig{1200, 4}; // FIXME: may be incorrect
- sensor.custom_base_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x0a },
- { 0x0a, 0x0b },
- { 0x0b, 0x0d },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x20 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x00 },
- { 0x5a, 0x15 },
- { 0x5b, 0x05 },
- { 0x5c, 0x0a },
- { 0x5d, 0x0f },
- { 0x5e, 0x00 },
- };
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
unsigned exposure_lperiod;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ StaggerConfig stagger_y;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 50 }, 5758, {
- { 0x08, 0x00 },
- { 0x09, 0x0a },
- { 0x0a, 0x0b },
- { 0x0b, 0x0d },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x33 },
- { 0x19, 0x2a },
- { 0x1a, 0x02 },
- { 0x1b, 0x13 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x15 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x05 },
- { 0x5c, 0x0a },
- { 0x5d, 0x0f },
- { 0x5e, 0x00 }
- }
- },
- { { 75 }, 4879, {
- { 0x08, 0x00 },
- { 0x09, 0x0a },
- { 0x0a, 0x0b },
- { 0x0b, 0x0d },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x33 },
- { 0x19, 0x2a },
- { 0x1a, 0x02 },
- { 0x1b, 0x13 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x15 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x05 },
- { 0x5c, 0x0a },
- { 0x5d, 0x0f },
- { 0x5e, 0x00 }
- }
- },
- { { 100 }, 4487, {
- { 0x08, 0x00 },
- { 0x09, 0x0a },
- { 0x0a, 0x0b },
- { 0x0b, 0x0d },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x33 },
- { 0x19, 0x2a },
- { 0x1a, 0x02 },
- { 0x1b, 0x13 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x15 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x05 },
- { 0x5c, 0x0a },
- { 0x5d, 0x0f },
- { 0x5e, 0x00 }
- }
- },
- { { 150 }, 4879, {
- { 0x08, 0x00 },
- { 0x09, 0x0a },
- { 0x0a, 0x0b },
- { 0x0b, 0x0d },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x33 },
- { 0x19, 0x2a },
- { 0x1a, 0x02 },
- { 0x1b, 0x13 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x15 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x05 },
- { 0x5c, 0x0a },
- { 0x5d, 0x0f },
- { 0x5e, 0x00 }
- }
- },
- { { 300 }, 4503, {
- { 0x08, 0x00 },
- { 0x09, 0x0a },
- { 0x0a, 0x0b },
- { 0x0b, 0x0d },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x33 },
- { 0x19, 0x2a },
- { 0x1a, 0x02 },
- { 0x1b, 0x13 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0f },
- { 0x53, 0x13 },
- { 0x54, 0x17 },
- { 0x55, 0x03 },
- { 0x56, 0x07 },
- { 0x57, 0x0b },
- { 0x58, 0x83 },
- { 0x59, 0x15 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x05 },
- { 0x5c, 0x0a },
- { 0x5d, 0x0f },
- { 0x5e, 0x00 }
- }
- },
- { { 600 }, 10251, {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x06 },
- { 0x0b, 0x08 },
- { 0x16, 0x33 },
- { 0x17, 0x07 },
- { 0x18, 0x31 },
- { 0x19, 0x2a },
- { 0x1a, 0x02 },
- { 0x1b, 0x0e },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x0b },
- { 0x53, 0x0f },
- { 0x54, 0x13 },
- { 0x55, 0x17 },
- { 0x56, 0x03 },
- { 0x57, 0x07 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x02 },
- { 0x5c, 0x0e },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
- }
- },
- { { 1200 }, 12750, {
- { 0x08, 0x0d },
- { 0x09, 0x0f },
- { 0x0a, 0x11 },
- { 0x0b, 0x13 },
- { 0x16, 0x2b },
- { 0x17, 0x07 },
- { 0x18, 0x30 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x43 },
- { 0x52, 0x03 },
- { 0x53, 0x07 },
- { 0x54, 0x0b },
- { 0x55, 0x0f },
- { 0x56, 0x13 },
- { 0x57, 0x17 },
- { 0x58, 0x23 },
- { 0x59, 0x00 },
- { 0x5a, 0xc1 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x00 }
+ { { 50 }, 200, 5758, Ratio{1, 4}, 0, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d },
+ { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a },
+ { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 }
+ }
+ },
+ { { 75 }, 300, 4879, Ratio{1, 4}, 1, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d },
+ { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a },
+ { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 }
+ }
+ },
+ { { 100 }, 400, 4487, Ratio{1, 4}, 1, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d },
+ { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a },
+ { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 }
+ }
+ },
+ { { 150 }, 600, 4879, Ratio{1, 4}, 2, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d },
+ { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a },
+ { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 }
+ }
+ },
+ { { 300 }, 1200, 4503, Ratio{1, 4}, 4, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d },
+ { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a },
+ { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 },
+ { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 }
+ }
+ },
+ { { 600 }, 1200, 10251, Ratio{1, 2}, 8, StaggerConfig{}, {
+ { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 },
+ { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x31 }, { 0x19, 0x2a },
+ { 0x1a, 0x02 }, { 0x1b, 0x0e }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 },
+ { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x02 }, { 0x5c, 0x0e }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
+ }
+ },
+ { { 1200 }, 1200, 12750, Ratio{1, 1}, 16, StaggerConfig{4, 0}, {
+ { 0x08, 0x0d }, { 0x09, 0x0f }, { 0x0a, 0x11 }, { 0x0b, 0x13 },
+ { 0x16, 0x2b }, { 0x17, 0x07 }, { 0x18, 0x30 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f },
+ { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 },
+ { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 }
}
},
};
@@ -1382,7 +769,11 @@ void genesys_init_sensor_tables()
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
sensor.exposure_lperiod = setting.exposure_lperiod;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
}
@@ -1390,251 +781,278 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_DP665;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_DP665; // gl841
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 600;
+ sensor.shading_resolution = 600;
sensor.black_pixels = 27;
sensor.dummy_pixel = 27;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 2496;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x1100, 0x1100, 0x1100 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x00 },
- { 0x17, 0x02 },
- { 0x18, 0x04 },
- { 0x19, 0x50 },
- { 0x1a, 0x10 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x02 },
- { 0x52, 0x04 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x05 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x54 },
- { 0x59, 0x03 },
- { 0x5a, 0x00 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x01 },
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x04 }, { 0x19, 0x50 },
+ { 0x1a, 0x10 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x05 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x54 }, { 0x59, 0x03 }, { 0x5a, 0x00 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 75, 1 },
+ { { 150 }, 150, 3 },
+ { { 300 }, 300, 7 },
+ { { 600 }, 600, 14 },
+ { { 1200 }, 1200, 28 },
+ };
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_ROADWARRIOR;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_ROADWARRIOR; // gl841
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 600;
+ sensor.shading_resolution = 600;
sensor.black_pixels = 27;
sensor.dummy_pixel = 27;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 5200;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x1100, 0x1100, 0x1100 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x00 },
- { 0x17, 0x02 },
- { 0x18, 0x04 },
- { 0x19, 0x50 },
- { 0x1a, 0x10 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x02 },
- { 0x52, 0x04 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x05 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x54 },
- { 0x59, 0x03 },
- { 0x5a, 0x00 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x01 },
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x04 }, { 0x19, 0x50 },
+ { 0x1a, 0x10 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x05 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x54 }, { 0x59, 0x03 }, { 0x5a, 0x00 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 75, 1 },
+ { { 150 }, 150, 3 },
+ { { 300 }, 300, 7 },
+ { { 600 }, 600, 14 },
+ { { 1200 }, 1200, 28 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_DSMOBILE600;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_DSMOBILE600; // gl841
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 600;
+ sensor.shading_resolution = 600;
sensor.black_pixels = 28;
sensor.dummy_pixel = 28;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 5200;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x1544, 0x1544, 0x1544 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x00 },
- { 0x17, 0x02 },
- { 0x18, 0x04 },
- { 0x19, 0x50 },
- { 0x1a, 0x10 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x02 },
- { 0x52, 0x04 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x05 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x54 },
- { 0x59, 0x03 },
- { 0x5a, 0x00 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x01 },
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x04 }, { 0x19, 0x50 },
+ { 0x1a, 0x10 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x05 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x54 }, { 0x59, 0x03 }, { 0x5a, 0x00 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
+ };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 75, 3 },
+ { { 150 }, 150, 7 },
+ { { 300 }, 300, 14 },
+ { { 600 }, 600, 29 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
+
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CCD_XP300; // gl841
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 1200; // FIXME: could be incorrect, but previous code used this value
+ sensor.shading_resolution = 600;
+ sensor.black_pixels = 27;
+ sensor.dummy_pixel = 27;
+ sensor.fau_gain_white_ref = 210;
+ sensor.gain_white_ref = 200;
+ sensor.exposure = { 0x1100, 0x1100, 0x1100 };
+ sensor.custom_regs = {
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x04 }, { 0x19, 0x50 },
+ { 0x1a, 0x10 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x05 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x54 }, { 0x59, 0x03 }, { 0x5a, 0x00 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 150, 3 },
+ { { 150 }, 300, 7 },
+ { { 300 }, 600, 14 },
+ { { 600 }, 1200, 28 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_XP300;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_DOCKETPORT_487; // gl841
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 600;
+ sensor.shading_resolution = 600;
sensor.black_pixels = 27;
sensor.dummy_pixel = 27;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10240;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x1100, 0x1100, 0x1100 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x00 },
- { 0x17, 0x02 },
- { 0x18, 0x04 },
- { 0x19, 0x50 },
- { 0x1a, 0x10 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x02 },
- { 0x52, 0x04 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x05 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x54 },
- { 0x59, 0x03 },
- { 0x5a, 0x00 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x01 },
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x04 }, { 0x19, 0x50 },
+ { 0x1a, 0x10 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x05 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x54 }, { 0x59, 0x03 }, { 0x5a, 0x00 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 150, 3 },
+ { { 150 }, 300, 7 },
+ { { 300 }, 600, 14 },
+ { { 600 }, 600, 28 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_DP685;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_DP685; // gl841
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 600;
+ sensor.shading_resolution = 600;
+ sensor.full_resolution = 600;
sensor.black_pixels = 27;
sensor.dummy_pixel = 27;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 5020;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x1100, 0x1100, 0x1100 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x00 },
- { 0x17, 0x02 },
- { 0x18, 0x04 },
- { 0x19, 0x50 },
- { 0x1a, 0x10 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x02 },
- { 0x52, 0x04 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x05 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x54 },
- { 0x59, 0x03 },
- { 0x5a, 0x00 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x01 },
+ { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x04 }, { 0x19, 0x50 },
+ { 0x1a, 0x10 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x05 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x54 }, { 0x59, 0x03 }, { 0x5a, 0x00 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 75, 3 },
+ { { 150 }, 150, 6 },
+ { { 300 }, 300, 13 },
+ { { 600 }, 600, 27 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_200;
- sensor.optical_res = 4800;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_200; // gl847
+ sensor.full_resolution = 4800;
sensor.black_pixels = 87*4;
sensor.dummy_pixel = 16*4;
- sensor.ccd_start_xoffset = 320*8;
- sensor.sensor_pixels = 5136*8;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.gamma = { 2.2f, 2.2f, 2.2f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
+ int output_pixel_offset;
unsigned segment_size;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
@@ -1642,7 +1060,44 @@ void genesys_init_sensor_tables()
CustomSensorSettings custom_settings[] = {
// Note: Windows driver uses 1424 lperiod and enables dummy line (0x17)
- { { 75, 100, 150, 200 }, 2848, { 304, 203, 180 }, 5136, std::vector<unsigned>{}, {
+ { { 75 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 8, 40, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ // Note: Windows driver uses 1424 lperiod and enables dummy line (0x17)
+ { { 100 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 6, 53, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ // Note: Windows driver uses 1424 lperiod and enables dummy line (0x17)
+ { { 150 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 4, 80, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ // Note: Windows driver uses 1424 lperiod and enables dummy line (0x17)
+ { { 200 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 3, 106, 5136,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1653,7 +1108,8 @@ void genesys_init_sensor_tables()
}
},
// Note: Windows driver uses 788 lperiod and enables dummy line (0x17)
- { { 300, 400 }, 1424, { 304, 203, 180 }, 5136, std::vector<unsigned>{}, {
+ { { 300 }, 600, 1424, { 304, 203, 180 }, Ratio{1, 8}, 2, 160, 5136,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1663,7 +1119,9 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 600 }, 1432, { 492, 326, 296 }, 5136, std::vector<unsigned>{}, {
+ // Note: Windows driver uses 788 lperiod and enables dummy line (0x17)
+ { { 400 }, 600, 1424, { 304, 203, 180 }, Ratio{1, 8}, 1, 213, 5136,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1673,7 +1131,19 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 1200 }, 2712, { 935, 592, 538 }, 5136, { 0, 1 }, {
+ { { 600 }, 600, 1432, { 492, 326, 296 }, Ratio{1, 8}, 1, 320, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 1200 }, 1200, 2712, { 935, 592, 538 }, Ratio{1, 8}, 1, 640, 5136,
+ { 0, 1 }, {
{ 0x16, 0x10 }, { 0x17, 0x08 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1683,7 +1153,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 2400 }, 5280, { 1777, 1125, 979 }, 5136, { 0, 2, 1, 3 }, {
+ { { 2400 }, 2400, 5280, { 1777, 1125, 979 }, Ratio{1, 8}, 1, 1280, 5136,
+ { 0, 2, 1, 3 }, {
{ 0x16, 0x10 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1693,7 +1164,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 4800 }, 10416, { 3377, 2138, 1780 }, 5136, { 0, 2, 4, 6, 1, 3, 5, 7 }, {
+ { { 4800 }, 4800, 10416, { 3377, 2138, 1780 }, Ratio{1, 8}, 1, 2560, 5136,
+ { 0, 2, 4, 6, 1, 3, 5, 7 }, {
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1707,8 +1179,14 @@ void genesys_init_sensor_tables()
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.shading_resolution = setting.register_dpihw;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
sensor.segment_size = setting.segment_size;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
@@ -1718,34 +1196,64 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_700F;
- sensor.optical_res = 4800;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_700F; // gl847
+ sensor.full_resolution = 4800;
sensor.black_pixels = 73*8; // black pixels 73 at 600 dpi
sensor.dummy_pixel = 16*8;
- // 384 at 600 dpi
- sensor.ccd_start_xoffset = 384*8;
- // 8x5570 segments, 5187+1 for rounding
- sensor.sensor_pixels = 5188*8;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
+ int output_pixel_offset;
unsigned segment_size;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75, 100, 150, 200 }, 2848, { 465, 310, 239 }, 5187, std::vector<unsigned>{}, {
+ { { 75 }, 600, 2848, { 465, 310, 239 }, Ratio{1, 8}, 8, 48, 5187,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x87 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0xf9 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 100 }, 600, 2848, { 465, 310, 239 }, Ratio{1, 8}, 6, 64, 5187,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x87 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0xf9 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 150 }, 600, 2848, { 465, 310, 239 }, Ratio{1, 8}, 4, 96, 5187,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x87 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0xf9 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 200 }, 600, 2848, { 465, 310, 239 }, Ratio{1, 8}, 3, 128, 5187,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1755,7 +1263,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 300 }, 1424, { 465, 310, 239 }, 5187, std::vector<unsigned>{}, {
+ { { 300 }, 600, 1424, { 465, 310, 239 }, Ratio{1, 8}, 2, 192, 5187,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1765,7 +1274,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 600 }, 1504, { 465, 310, 239 }, 5187, std::vector<unsigned>{}, {
+ { { 600 }, 600, 1504, { 465, 310, 239 }, Ratio{1, 8}, 1, 384, 5187,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1775,7 +1285,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 1200 }, 2696, { 1464, 844, 555 }, 5187, { 0, 1 }, {
+ { { 1200 }, 1200, 2696, { 1464, 844, 555 }, Ratio{1, 8}, 1, 768, 5187,
+ { 0, 1 }, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1785,7 +1296,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 2400 }, 10576, { 2798, 1558, 972 }, 5187, { 0, 1, 2, 3 }, {
+ { { 2400 }, 2400, 10576, { 2798, 1558, 972 }, Ratio{1, 8}, 1, 1536, 5187,
+ { 0, 1, 2, 3 }, {
{ 0x16, 0x10 }, { 0x17, 0x08 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1795,7 +1307,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 4800 }, 10576, { 2798, 1558, 972 }, 5187, { 0, 1, 4, 5, 2, 3, 6, 7 }, {
+ { { 4800 }, 4800, 10576, { 2798, 1558, 972 }, Ratio{1, 8}, 1, 3072, 5187,
+ { 0, 1, 4, 5, 2, 3, 6, 7 }, {
{ 0x16, 0x10 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x07 }, { 0x53, 0x03 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1809,8 +1322,14 @@ void genesys_init_sensor_tables()
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.shading_resolution = setting.register_dpihw;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
sensor.segment_size = setting.segment_size;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
@@ -1820,33 +1339,32 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_100;
- sensor.optical_res = 2400;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_100; // gl847
+ sensor.full_resolution = 2400;
sensor.black_pixels = 87*4;
sensor.dummy_pixel = 16*4;
- sensor.ccd_start_xoffset = 320*4;
- sensor.sensor_pixels = 5136*4;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x01c1, 0x0126, 0x00e5 };
sensor.gamma = { 2.2f, 2.2f, 2.2f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
+ int output_pixel_offset;
unsigned segment_size;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75, 100, 150, 200 }, 2304, { 423, 294, 242 }, 5136, std::vector<unsigned>{}, {
+ { { 75 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 8, 40, 5136,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1856,7 +1374,8 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 300 }, 1728, { 423, 294, 242 }, 5136, std::vector<unsigned>{}, {
+ { { 100 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 6, 53, 5136,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1866,7 +1385,41 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 600 }, 1432, { 423, 294, 242 }, 5136, std::vector<unsigned>{}, {
+ { { 150 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 4, 80, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 200 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 3, 106, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 300 }, 600, 1728, { 423, 294, 242 }, Ratio{1, 4}, 2, 160, 5136,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
+ { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ }
+ },
+ { { 600 }, 600, 1432, { 423, 294, 242 }, Ratio{1, 4}, 1, 320, 5136,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1876,7 +1429,7 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
},
},
- { { 1200 }, 2712, { 791, 542, 403 }, 5136, {0, 1}, {
+ { { 1200 }, 1200, 2712, { 791, 542, 403 }, Ratio{1, 4}, 1, 640, 5136, {0, 1}, {
{ 0x16, 0x10 }, { 0x17, 0x08 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1886,7 +1439,7 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
}
},
- { { 2400 }, 5280, { 1504, 1030, 766 }, 5136, {0, 2, 1, 3}, {
+ { { 2400 }, 2400, 5280, { 1504, 1030, 766 }, Ratio{1, 4}, 1, 1280, 5136, {0, 2, 1, 3}, {
{ 0x16, 0x10 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0xff },
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 },
{ 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
@@ -1900,8 +1453,14 @@ void genesys_init_sensor_tables()
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.shading_resolution = setting.register_dpihw;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
sensor.segment_size = setting.segment_size;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
@@ -1910,12 +1469,12 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_KVSS080;
- sensor.optical_res = 600;
+ sensor.sensor_id = SensorId::CCD_KVSS080; // gl843
+ sensor.full_resolution = 600;
+ sensor.register_dpihw = 600;
+ sensor.shading_resolution = 600;
sensor.black_pixels = 38;
sensor.dummy_pixel = 38;
- sensor.ccd_start_xoffset = 152;
- sensor.sensor_pixels = 5376;
sensor.fau_gain_white_ref = 160;
sensor.gain_white_ref = 160;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
@@ -1946,191 +1505,170 @@ void genesys_init_sensor_tables()
{ 0x58, 0x6b },
{ 0x59, 0x00 },
{ 0x5a, 0xc0 },
+ { 0x7d, 0x90 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ };
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 75, Ratio{1, 1}, 4 },
+ { { 100 }, 100, Ratio{1, 1}, 6 },
+ { { 150 }, 150, Ratio{1, 1}, 9 },
+ { { 200 }, 200, Ratio{1, 1}, 12 },
+ { { 300 }, 300, Ratio{1, 1}, 19 },
+ { { 600 }, 600, Ratio{1, 1}, 38 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_G4050;
- sensor.optical_res = 4800;
+ sensor.sensor_id = SensorId::CCD_G4050; // gl843
+ sensor.full_resolution = 4800;
sensor.black_pixels = 50*8;
// 31 at 600 dpi dummy_pixels 58 at 1200
sensor.dummy_pixel = 58;
- sensor.ccd_start_xoffset = 152;
- sensor.sensor_pixels = 5360*8;
sensor.fau_gain_white_ref = 160;
sensor.gain_white_ref = 160;
sensor.exposure = { 0x2c09, 0x22b8, 0x10f0 };
- sensor.stagger_config = StaggerConfig{ 2400, 4 }; // FIXME: may be incorrect
sensor.custom_regs = {};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
int exposure_lperiod;
ScanMethod method;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ StaggerConfig stagger_y; // FIXME: may be incorrect
GenesysRegisterSettingSet extra_custom_regs;
};
+ GenesysRegisterSettingSet regs_100_to_600 = {
+ { 0x0c, 0x00 },
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
+ { 0x52, 0x0b }, { 0x53, 0x0e }, { 0x54, 0x11 }, { 0x55, 0x02 }, { 0x56, 0x05 },
+ { 0x57, 0x08 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x02 },
+ { 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
+ { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
+ { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
+ { 0x9e, 0x00 },
+ { 0xaa, 0x00 },
+ };
+
+ GenesysRegisterSettingSet regs_1200 = {
+ { 0x0c, 0x20 },
+ { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b }, { 0x56, 0x0e },
+ { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x08 }, { 0x71, 0x0c },
+ { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x01 }, { 0x79, 0xff },
+ { 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff }, { 0x7d, 0x90 },
+ { 0x9e, 0xc0 },
+ { 0xaa, 0x05 },
+ };
+
+ GenesysRegisterSettingSet regs_2400 = {
+ { 0x0c, 0x20 },
+ { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc0 }, { 0x1d, 0x08 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b }, { 0x56, 0x0e },
+ { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x08 }, { 0x71, 0x0a },
+ { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
+ { 0x9e, 0xc0 },
+ { 0xaa, 0x05 },
+ };
+
+ GenesysRegisterSettingSet regs_4800 = {
+ { 0x0c, 0x21 },
+ { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc1 }, { 0x1d, 0x08 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b }, { 0x56, 0x0e },
+ { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x08 }, { 0x71, 0x0a },
+ { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
+ { 0x9e, 0xc0 },
+ { 0xaa, 0x07 },
+ };
+
+ GenesysRegisterSettingSet regs_ta_any = {
+ { 0x0c, 0x00 },
+ { 0x16, 0x33 }, { 0x17, 0x4c }, { 0x18, 0x01 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
+ { 0x52, 0x0e }, { 0x53, 0x11 }, { 0x54, 0x02 }, { 0x55, 0x05 }, { 0x56, 0x08 },
+ { 0x57, 0x0b }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0xc0 },
+ { 0x70, 0x00 }, { 0x71, 0x02 },
+ { 0x74, 0x00 }, { 0x75, 0x1c }, { 0x76, 0x7f },
+ { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
+ { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
+ { 0x9e, 0x00 },
+ { 0xaa, 0x00 },
+ };
+
CustomSensorSettings custom_settings[] = {
- { { 100, 150, 200, 300, 400, 600 }, 8016, ScanMethod::FLATBED, {
- { 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
- { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
- { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
- { 0x0c, 0x00 },
- { 0x70, 0x00 },
- { 0x71, 0x02 },
- { 0x9e, 0x00 },
- { 0xaa, 0x00 },
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x00 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x08 },
- { 0x52, 0x0b },
- { 0x53, 0x0e },
- { 0x54, 0x11 },
- { 0x55, 0x02 },
- { 0x56, 0x05 },
- { 0x57, 0x08 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
- }
- },
- { { 1200 }, 56064, ScanMethod::FLATBED, {
- { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
- { 0x77, 0x00 }, { 0x78, 0x01 }, { 0x79, 0xff },
- { 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff },
- { 0x0c, 0x20 },
- { 0x70, 0x08 },
- { 0x71, 0x0c },
- { 0x9e, 0xc0 },
- { 0xaa, 0x05 },
- { 0x16, 0x3b },
- { 0x17, 0x0c },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x38 },
- { 0x1b, 0x10 },
- { 0x1c, 0x00 },
- { 0x1d, 0x08 },
- { 0x52, 0x02 },
- { 0x53, 0x05 },
- { 0x54, 0x08 },
- { 0x55, 0x0b },
- { 0x56, 0x0e },
- { 0x57, 0x11 },
- { 0x58, 0x1b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
- }
- },
- { { 2400 }, 56064, ScanMethod::FLATBED, {
- { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
- { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
- { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
- { 0x0c, 0x20 },
- { 0x70, 0x08 },
- { 0x71, 0x0a },
- { 0x9e, 0xc0 },
- { 0xaa, 0x05 },
- { 0x16, 0x3b },
- { 0x17, 0x0c },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x38 },
- { 0x1b, 0x10 },
- { 0x1c, 0xc0 },
- { 0x1d, 0x08 },
- { 0x52, 0x02 },
- { 0x53, 0x05 },
- { 0x54, 0x08 },
- { 0x55, 0x0b },
- { 0x56, 0x0e },
- { 0x57, 0x11 },
- { 0x58, 0x1b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
- }
- },
- { { 4800 }, 42752, ScanMethod::FLATBED, {
- { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
- { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
- { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
- { 0x0c, 0x21 },
- { 0x70, 0x08 },
- { 0x71, 0x0a },
- { 0x9e, 0xc0 },
- { 0xaa, 0x07 },
- { 0x16, 0x3b },
- { 0x17, 0x0c },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x38 },
- { 0x1b, 0x10 },
- { 0x1c, 0xc1 },
- { 0x1d, 0x08 },
- { 0x52, 0x02 },
- { 0x53, 0x05 },
- { 0x54, 0x08 },
- { 0x55, 0x0b },
- { 0x56, 0x0e },
- { 0x57, 0x11 },
- { 0x58, 0x1b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
- }
- },
- { ResolutionFilter::ANY, 15624, ScanMethod::TRANSPARENCY, {
- { 0x74, 0x00 }, { 0x75, 0x1c }, { 0x76, 0x7f },
- { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
- { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
- { 0x0c, 0x00 },
- { 0x70, 0x00 },
- { 0x71, 0x02 },
- { 0x9e, 0x00 },
- { 0xaa, 0x00 },
- { 0x16, 0x33 },
- { 0x17, 0x4c },
- { 0x18, 0x01 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x08 },
- { 0x52, 0x0e },
- { 0x53, 0x11 },
- { 0x54, 0x02 },
- { 0x55, 0x05 },
- { 0x56, 0x08 },
- { 0x57, 0x0b },
- { 0x58, 0x6b },
- { 0x59, 0x00 },
- { 0x5a, 0xc0 },
- }
- }
+ { { 100 }, 600, 100, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 1,
+ StaggerConfig{}, regs_100_to_600 },
+ { { 150 }, 600, 150, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 1,
+ StaggerConfig{}, regs_100_to_600 },
+ { { 200 }, 600, 200, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 2,
+ StaggerConfig{}, regs_100_to_600 },
+ { { 300 }, 600, 300, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 3,
+ StaggerConfig{}, regs_100_to_600 },
+ { { 400 }, 600, 400, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 4,
+ StaggerConfig{}, regs_100_to_600 },
+ { { 600 }, 600, 600, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 7,
+ StaggerConfig{}, regs_100_to_600 },
+ { { 1200 }, 1200, 1200, 56064, ScanMethod::FLATBED, Ratio{1, 4}, 14,
+ StaggerConfig{}, regs_1200 },
+ { { 2400 }, 2400, 2400, 56064, ScanMethod::FLATBED, Ratio{1, 2}, 29,
+ StaggerConfig{4, 0}, regs_2400 },
+ { { 4800 }, 4800, 4800, 42752, ScanMethod::FLATBED, Ratio{1, 1}, 58,
+ StaggerConfig{8, 0}, regs_4800 },
+ { { 100, 150, 200, 300, 400, 600, 1200 }, 600, 600, 15624, ScanMethod::TRANSPARENCY,
+ Ratio{1, 1}, 58, StaggerConfig{}, regs_ta_any }, // FIXME: may be incorrect
+ { { 2400 }, 600, 600, 15624, ScanMethod::TRANSPARENCY,
+ Ratio{1, 1}, 58, StaggerConfig{4, 0}, regs_ta_any }, // FIXME: may be incorrect
+ { { 4800 }, 600, 600, 15624, ScanMethod::TRANSPARENCY,
+ Ratio{1, 1}, 58, StaggerConfig{8, 0}, regs_ta_any }, // FIXME: may be incorrect
};
auto base_custom_regs = sensor.custom_regs;
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.register_dpihw;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.method = setting.method;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
sensor.custom_regs = base_custom_regs;
sensor.custom_regs.merge(setting.extra_custom_regs);
s_sensors->push_back(sensor);
@@ -2138,110 +1676,136 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_HP_4850C;
- sensor.optical_res = 4800;
+ sensor.sensor_id = SensorId::CCD_HP_4850C; // gl843
+ sensor.full_resolution = 4800;
sensor.black_pixels = 100;
sensor.dummy_pixel = 58;
- sensor.ccd_start_xoffset = 152;
- sensor.sensor_pixels = 5360*8;
sensor.fau_gain_white_ref = 160;
sensor.gain_white_ref = 160;
sensor.exposure = { 0x2c09, 0x22b8, 0x10f0 };
- sensor.stagger_config = StaggerConfig{ 2400, 4 }; // FIXME: may be incorrect
sensor.custom_regs = {};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
int exposure_lperiod;
ScanMethod method;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ int shading_pixel_offset;
+ StaggerConfig stagger_y; // FIXME: review, may be incorrect
GenesysRegisterSettingSet extra_custom_regs;
};
+ GenesysRegisterSettingSet regs_100_to_600 = {
+ { 0x0c, 0x00 },
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
+ { 0x52, 0x0b }, { 0x53, 0x0e }, { 0x54, 0x11 }, { 0x55, 0x02 },
+ { 0x56, 0x05 }, { 0x57, 0x08 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x02 },
+ { 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
+ { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
+ { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
+ { 0x9e, 0x00 },
+ { 0xaa, 0x00 },
+ };
+ GenesysRegisterSettingSet regs_1200 = {
+ { 0x0c, 0x20 },
+ { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
+ { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x08 }, { 0x71, 0x0c },
+ { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x01 }, { 0x79, 0xff },
+ { 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff }, { 0x7d, 0x90 },
+ { 0x9e, 0xc0 },
+ { 0xaa, 0x05 },
+ };
+ GenesysRegisterSettingSet regs_2400 = {
+ { 0x0c, 0x20 },
+ { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc0 }, { 0x1d, 0x08 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
+ { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x08 }, { 0x71, 0x0a },
+ { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
+ { 0x9e, 0xc0 },
+ { 0xaa, 0x05 },
+ };
+ GenesysRegisterSettingSet regs_4800 = {
+ { 0x0c, 0x21 },
+ { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc1 }, { 0x1d, 0x08 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
+ { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x08 }, { 0x71, 0x0a },
+ { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x90 },
+ { 0x9e, 0xc0 },
+ { 0xaa, 0x07 },
+ };
+ GenesysRegisterSettingSet regs_ta_any = {
+ { 0x0c, 0x00 },
+ { 0x16, 0x33 }, { 0x17, 0x4c }, { 0x18, 0x01 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
+ { 0x52, 0x0e }, { 0x53, 0x11 }, { 0x54, 0x02 }, { 0x55, 0x05 },
+ { 0x56, 0x08 }, { 0x57, 0x0b }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0xc0 },
+ { 0x70, 0x00 }, { 0x71, 0x02 },
+ { 0x74, 0x00 }, { 0x75, 0x1c }, { 0x76, 0x7f },
+ { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
+ { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff }, { 0x7d, 0x90 },
+ { 0x9e, 0x00 },
+ { 0xaa, 0x00 },
+ };
+
CustomSensorSettings custom_settings[] = {
- { { 100, 150, 200, 300, 400, 600 }, 8016, ScanMethod::FLATBED, {
- { 0x0c, 0x00 },
- { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x00 }, { 0x19, 0x2a },
- { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
- { 0x52, 0x0b }, { 0x53, 0x0e }, { 0x54, 0x11 }, { 0x55, 0x02 },
- { 0x56, 0x05 }, { 0x57, 0x08 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0x40 },
- { 0x70, 0x00 }, { 0x71, 0x02 },
- { 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
- { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
- { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
- { 0x9e, 0x00 },
- { 0xaa, 0x00 },
- }
- },
- { { 1200 }, 56064, ScanMethod::FLATBED, {
- { 0x0c, 0x20 },
- { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
- { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
- { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
- { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
- { 0x70, 0x08 }, { 0x71, 0x0c },
- { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
- { 0x77, 0x00 }, { 0x78, 0x01 }, { 0x79, 0xff },
- { 0x7a, 0x00 }, { 0x7b, 0x01 }, { 0x7c, 0xff },
- { 0x9e, 0xc0 },
- { 0xaa, 0x05 },
- }
- },
- { { 2400 }, 56064, ScanMethod::FLATBED, {
- { 0x0c, 0x20 },
- { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
- { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc0 }, { 0x1d, 0x08 },
- { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
- { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
- { 0x70, 0x08 }, { 0x71, 0x0a },
- { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
- { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
- { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
- { 0x9e, 0xc0 },
- { 0xaa, 0x05 },
- }
- },
- { { 4800 }, 42752, ScanMethod::FLATBED, {
- { 0x0c, 0x21 },
- { 0x16, 0x3b }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
- { 0x1a, 0x38 }, { 0x1b, 0x10 }, { 0x1c, 0xc1 }, { 0x1d, 0x08 },
- { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
- { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
- { 0x70, 0x08 }, { 0x71, 0x0a },
- { 0x74, 0x0f }, { 0x75, 0xff }, { 0x76, 0xff },
- { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
- { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
- { 0x9e, 0xc0 },
- { 0xaa, 0x07 },
- }
- },
- { ResolutionFilter::ANY, 15624, ScanMethod::TRANSPARENCY, {
- { 0x0c, 0x00 },
- { 0x16, 0x33 }, { 0x17, 0x4c }, { 0x18, 0x01 }, { 0x19, 0x2a },
- { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x08 },
- { 0x52, 0x0e }, { 0x53, 0x11 }, { 0x54, 0x02 }, { 0x55, 0x05 },
- { 0x56, 0x08 }, { 0x57, 0x0b }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0xc0 },
- { 0x70, 0x00 }, { 0x71, 0x02 },
- { 0x74, 0x00 }, { 0x75, 0x1c }, { 0x76, 0x7f },
- { 0x77, 0x03 }, { 0x78, 0xff }, { 0x79, 0xff },
- { 0x7a, 0x03 }, { 0x7b, 0xff }, { 0x7c, 0xff },
- { 0x9e, 0x00 },
- { 0xaa, 0x00 },
- }
- }
+ { { 100 }, 600, 100, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 1, 50, StaggerConfig{},
+ regs_100_to_600 },
+ { { 150 }, 600, 150, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 1, 50, StaggerConfig{},
+ regs_100_to_600 },
+ { { 200 }, 600, 200, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 2, 50, StaggerConfig{},
+ regs_100_to_600 },
+ { { 300 }, 600, 300, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 3, 50, StaggerConfig{},
+ regs_100_to_600 },
+ { { 400 }, 600, 400, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 4, 50, StaggerConfig{},
+ regs_100_to_600 },
+ { { 600 }, 600, 600, 8016, ScanMethod::FLATBED, Ratio{1, 8}, 7, 50, StaggerConfig{},
+ regs_100_to_600 },
+ { { 1200 }, 1200, 1200, 56064, ScanMethod::FLATBED, Ratio{1, 4}, 14, 0,
+ StaggerConfig{}, regs_1200 },
+ { { 2400 }, 2400, 2400, 56064, ScanMethod::FLATBED, Ratio{1, 2}, 29, 0,
+ StaggerConfig{0, 4}, regs_2400 },
+ { { 4800 }, 4800, 4800, 42752, ScanMethod::FLATBED, Ratio{1, 1}, 58, 0,
+ StaggerConfig{0, 8}, regs_4800 },
+ { { 100, 150, 200, 300, 400, 600, 1200}, 600, 600, 15624, ScanMethod::TRANSPARENCY,
+ Ratio{1, 1}, 58, 0, StaggerConfig{}, regs_ta_any }, // FIXME: review
+ { { 2400 }, 600, 600, 15624, ScanMethod::TRANSPARENCY,
+ Ratio{1, 1}, 58, 0, StaggerConfig{0, 4}, regs_ta_any }, // FIXME: review
+ { { 4800 }, 600, 600, 15624, ScanMethod::TRANSPARENCY,
+ Ratio{1, 1}, 58, 0, StaggerConfig{0, 8}, regs_ta_any }, // FIXME: review
};
auto base_custom_regs = sensor.custom_regs;
for (const CustomSensorSettings& setting : custom_settings)
{
sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.register_dpihw;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.method = setting.method;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.shading_pixel_offset = setting.shading_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
sensor.custom_regs = base_custom_regs;
sensor.custom_regs.merge(setting.extra_custom_regs);
s_sensors->push_back(sensor);
@@ -2249,142 +1813,250 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_CANON_4400F;
- sensor.optical_res = 4800;
- sensor.ccd_size_divisor = 4;
+ sensor.sensor_id = SensorId::CCD_CANON_4400F; // gl843
+ sensor.full_resolution = 4800;
+ sensor.register_dpihw = 4800;
sensor.black_pixels = 50*8;
// 31 at 600 dpi, 58 at 1200 dpi
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 152;
- // 5360 max at 600 dpi
- sensor.sensor_pixels = 5700 * 8;
sensor.fau_gain_white_ref = 160;
sensor.gain_white_ref = 160;
sensor.exposure = { 0x9c40, 0x9c40, 0x9c40 };
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = get_sensor_optical_with_ccd_divisor;
- sensor.get_register_hwdpi_fun = [](const Genesys_Sensor&, unsigned) { return 4800; };
- sensor.get_hwdpi_divisor_fun = [](const Genesys_Sensor&, unsigned) { return 1; };
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
int exposure_lperiod;
+ bool use_host_side_calib;
+ int output_pixel_offset;
std::vector<ScanMethod> methods;
+ StaggerConfig stagger_y;
GenesysRegisterSettingSet extra_custom_regs;
+ GenesysRegisterSettingSet extra_custom_fe_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 300, 600, 1200 }, 11640, { ScanMethod::FLATBED }, {
- { 0x16, 0x13 },
- { 0x17, 0x0a },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x6b },
- { 0x52, 0x0a },
- { 0x53, 0x0d },
- { 0x54, 0x00 },
- { 0x55, 0x03 },
- { 0x56, 0x06 },
- { 0x57, 0x08 },
- { 0x58, 0x5b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 300 }, 1200, 1200, 11640, false, 197, { ScanMethod::FLATBED }, StaggerConfig{}, {
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0a }, { 0x53, 0x0d }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x08 }, { 0x58, 0x5b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x01 }, { 0x73, 0x03 },
{ 0x74, 0x00 }, { 0x75, 0xf8 }, { 0x76, 0x38 },
{ 0x77, 0x00 }, { 0x78, 0xfc }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0xa4 },
{ 0x9e, 0x2d },
- }
+ }, {}
+ },
+ { { 600 }, 1200, 2400, 11640, false, 392, { ScanMethod::FLATBED }, StaggerConfig{}, {
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0a }, { 0x53, 0x0d }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x08 }, { 0x58, 0x5b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x01 }, { 0x73, 0x03 },
+ { 0x74, 0x00 }, { 0x75, 0xf8 }, { 0x76, 0x38 },
+ { 0x77, 0x00 }, { 0x78, 0xfc }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0xa4 },
+ { 0x9e, 0x2d },
+ }, {}
+ },
+ { { 1200 }, 1200, 4800, 11640, false, 794, { ScanMethod::FLATBED }, StaggerConfig{}, {
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0a }, { 0x53, 0x0d }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x08 }, { 0x58, 0x5b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x01 }, { 0x73, 0x03 },
+ { 0x74, 0x00 }, { 0x75, 0xf8 }, { 0x76, 0x38 },
+ { 0x77, 0x00 }, { 0x78, 0xfc }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0xa4 },
+ { 0x9e, 0x2d },
+ }, {}
},
- { { 300, 600, 1200 }, 33300, { ScanMethod::TRANSPARENCY }, {
- { 0x16, 0x13 },
- { 0x17, 0x0a },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x6b },
- { 0x52, 0x0a },
- { 0x53, 0x0d },
- { 0x54, 0x00 },
- { 0x55, 0x03 },
- { 0x56, 0x06 },
- { 0x57, 0x08 },
- { 0x58, 0x5b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 1200 }, 1200, 4800, 33300, true, 5, { ScanMethod::TRANSPARENCY },
+ StaggerConfig{}, {
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0a }, { 0x53, 0x0d }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x08 }, { 0x58, 0x5b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x00 }, { 0x73, 0x02 },
{ 0x74, 0x00 }, { 0x75, 0xf8 }, { 0x76, 0x38 },
{ 0x77, 0x00 }, { 0x78, 0xfc }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0xa4 },
{ 0x9e, 0x2d },
- }
+ }, {}
},
- { { 2400 }, 33300, { ScanMethod::TRANSPARENCY }, {
- { 0x16, 0x13 },
- { 0x17, 0x0a },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x01 },
- { 0x1d, 0x75 },
- { 0x52, 0x0b },
- { 0x53, 0x0d },
- { 0x54, 0x00 },
- { 0x55, 0x03 },
- { 0x56, 0x06 },
- { 0x57, 0x09 },
- { 0x58, 0x53 },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 2400 }, 2400, 4800, 33300, true, 10, { ScanMethod::TRANSPARENCY },
+ StaggerConfig{}, {
+ { 0x16, 0x13 }, { 0x17, 0x15 }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x01 }, { 0x1d, 0x75 },
+ { 0x52, 0x0b }, { 0x53, 0x0d }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x09 }, { 0x58, 0x53 }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x02 }, { 0x73, 0x04 },
{ 0x74, 0x00 }, { 0x75, 0xff }, { 0x76, 0x00 },
{ 0x77, 0x00 }, { 0x78, 0xff }, { 0x79, 0x00 },
{ 0x7a, 0x00 }, { 0x7b, 0x54 }, { 0x7c, 0x92 },
{ 0x9e, 0x2d },
+ }, {
+ { 0x03, 0x1f },
}
},
- { { 4800 }, 33300, { ScanMethod::TRANSPARENCY }, {
- { 0x16, 0x13 },
- { 0x17, 0x0a },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x61 },
- { 0x1d, 0x75 },
- { 0x52, 0x02 },
- { 0x53, 0x05 },
- { 0x54, 0x08 },
- { 0x55, 0x0b },
- { 0x56, 0x0d },
- { 0x57, 0x0f },
- { 0x58, 0x1b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 4800 }, 4800, 4800, 33300, true, -2063, { ScanMethod::TRANSPARENCY },
+ StaggerConfig{0, 8}, {
+ { 0x16, 0x13 }, { 0x17, 0x15 }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x61 }, { 0x1d, 0x75 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
+ { 0x56, 0x0d }, { 0x57, 0x0f }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x08 }, { 0x71, 0x0a }, { 0x72, 0x0a }, { 0x73, 0x0c },
{ 0x74, 0x00 }, { 0x75, 0xff }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0xff }, { 0x79, 0xff },
{ 0x7a, 0x00 }, { 0x7b, 0x54 }, { 0x7c, 0x92 },
{ 0x9e, 0x2d },
- }
+ }, {}
}
};
for (const CustomSensorSettings& setting : custom_settings)
{
for (auto method : setting.methods) {
+ for (auto resolution : setting.resolutions.values()) {
+ sensor.resolutions = { resolution };
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = resolution;
+ sensor.exposure_lperiod = setting.exposure_lperiod;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.use_host_side_calib = setting.use_host_side_calib;
+ sensor.method = method;
+ sensor.stagger_y = setting.stagger_y;
+ sensor.custom_regs = setting.extra_custom_regs;
+ sensor.custom_fe_regs = setting.extra_custom_fe_regs;
+ s_sensors->push_back(sensor);
+ }
+ }
+ }
+ }
+
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CCD_CANON_5600F; // gl847
+ sensor.full_resolution = 4800;
+ sensor.register_dpihw = 4800;
+ sensor.black_pixels = 50*8;
+ sensor.dummy_pixel = 10;
+ sensor.fau_gain_white_ref = 160;
+ sensor.gain_white_ref = 160;
+ sensor.exposure = { 0x9c40, 0x9c40, 0x9c40 };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ sensor.use_host_side_calib = true;
+ {
+ struct CustomSensorSettings {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ int exposure_lperiod;
+ SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ unsigned segment_size;
+ std::vector<unsigned> segment_order;
+ StaggerConfig stagger_x;
+ StaggerConfig stagger_y;
+ GenesysRegisterSettingSet custom_regs;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 150 }, 2400, 600, 300, 4288, { 3983/2, 3983/2, 3983/2 }, Ratio{1, 8}, 10,
+ 5418, std::vector<unsigned>{}, StaggerConfig{}, StaggerConfig{}, {
+ { 0x16, 0x00 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x10 }, { 0x1c, 0x08 }, { 0x1d, 0x02 },
+ { 0x52, 0x0e }, { 0x53, 0x00 }, { 0x54, 0x02 }, { 0x55, 0x04 },
+ { 0x56, 0x06 }, { 0x57, 0x08 }, { 0x58, 0x52 }, { 0x59, 0x3a }, { 0x5a, 0x40 },
+ { 0x74, 0x00 }, { 0x75, 0x33 }, { 0x76, 0x33 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x87, 0x00 },
+ }
+ },
+ { { 300 }, 2400, 600, 600, 5472, { 4558/2, 4558/2, 4558/2 }, Ratio{1, 8}, 110,
+ 5418, std::vector<unsigned>{}, StaggerConfig{}, StaggerConfig{}, {
+ { 0x16, 0x00 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x10 }, { 0x1c, 0x08 }, { 0x1d, 0x02 },
+ { 0x52, 0x0e }, { 0x53, 0x00 }, { 0x54, 0x02 }, { 0x55, 0x04 },
+ { 0x56, 0x06 }, { 0x57, 0x08 }, { 0x58, 0x52 }, { 0x59, 0x3a }, { 0x5a, 0x40 },
+ { 0x74, 0x00 }, { 0x75, 0x33 }, { 0x76, 0x33 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x87, 0x00 },
+ }
+ },
+ { { 600 }, 2400, 600, 600, 10944, { 8701/2, 8701/2, 8701/2 }, Ratio{1, 4}, 155,
+ 5418, std::vector<unsigned>{}, StaggerConfig{}, StaggerConfig{}, {
+ { 0x16, 0x00 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x10 }, { 0x1c, 0x08 }, { 0x1d, 0x02 },
+ { 0x52, 0x02 }, { 0x53, 0x04 }, { 0x54, 0x06 }, { 0x55, 0x08 },
+ { 0x56, 0x0a }, { 0x57, 0x0c }, { 0x58, 0x72 }, { 0x59, 0x5a }, { 0x5a, 0x40 },
+ { 0x74, 0x00 }, { 0x75, 0x33 }, { 0x76, 0x33 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x87, 0x00 },
+ }
+ },
+ { { 1200 }, 2400, 1200, 1200, 29120, { 17120/2, 17120/2, 17120/2 }, Ratio{1, 2}, 295,
+ 5418, { 1, 0 }, StaggerConfig{}, StaggerConfig{}, {
+ { 0x16, 0x00 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x10 }, { 0x1c, 0x08 }, { 0x1d, 0x02 },
+ { 0x52, 0x02 }, { 0x53, 0x04 }, { 0x54, 0x06 }, { 0x55, 0x08 },
+ { 0x56, 0x0a }, { 0x57, 0x0c }, { 0x58, 0x72 }, { 0x59, 0x5a }, { 0x5a, 0x40 },
+ { 0x74, 0x00 }, { 0x75, 0x33 }, { 0x76, 0x33 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x87, 0x00 },
+ }
+ },
+ { { 2400 }, 2400, 2400, 2400, 43776, { 36725/2, 36725/2, 36725/2 }, Ratio{1, 1}, 600,
+ 5418, { 0, 1, 2, 3 },
+ StaggerConfig{10, 15, 4, 9, 14, 19, 8, 13}, StaggerConfig{}, {
+ { 0x16, 0x00 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x10 }, { 0x1c, 0x08 }, { 0x1d, 0x02 },
+ { 0x52, 0x02 }, { 0x53, 0x04 }, { 0x54, 0x06 }, { 0x55, 0x08 },
+ { 0x56, 0x0a }, { 0x57, 0x0c }, { 0x58, 0x72 }, { 0x59, 0x5a }, { 0x5a, 0x40 },
+ { 0x74, 0x00 }, { 0x75, 0x33 }, { 0x76, 0x33 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x87, 0x00 },
+ }
+ },
+ { { 4800 }, 4800, 4800, 4800, 43776, { 36725/2, 36725/2, 36725/2 }, Ratio{1, 1}, 1000,
+ 10784, { 0, 1, 2, 3 },
+ StaggerConfig{5, 9, 6, 10, 3, 7, 16, 20, 13, 17, 14, 18, 11, 15, 24, 28},
+ StaggerConfig{6, 0}, {
+ { 0x16, 0x00 }, { 0x17, 0x06 }, { 0x18, 0x00 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x10 }, { 0x1c, 0x08 }, { 0x1d, 0x02 },
+ { 0x52, 0x0a }, { 0x53, 0x0c }, { 0x54, 0x0e }, { 0x55, 0x00 },
+ { 0x56, 0x02 }, { 0x57, 0x04 }, { 0x58, 0x32 }, { 0x59, 0x1a }, { 0x5a, 0x40 },
+ { 0x74, 0x00 }, { 0x75, 0x33 }, { 0x76, 0x33 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x87, 0x00 },
+ }
+ }
+ };
+
+ for (const auto& setting : custom_settings) {
+ for (auto method : { ScanMethod::FLATBED, ScanMethod::TRANSPARENCY }) {
+ sensor.method = method;
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.resolutions.values().front();
sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.method = method;
- sensor.custom_regs = setting.extra_custom_regs;
+ sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.segment_size = setting.segment_size;
+ sensor.segment_order = setting.segment_order;
+ sensor.stagger_x = setting.stagger_x;
+ sensor.stagger_y = setting.stagger_y;
+ sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
}
}
@@ -2392,57 +2064,39 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_CANON_8400F;
- sensor.optical_res = 3200;
- sensor.register_dpihw_override = 4800;
- sensor.ccd_size_divisor = 1;
+ sensor.sensor_id = SensorId::CCD_CANON_8400F; // gl843
+ sensor.full_resolution = 3200;
+ sensor.register_dpihw = 4800;
sensor.black_pixels = 50*8;
// 31 at 600 dpi, 58 at 1200 dpi
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 152;
- sensor.sensor_pixels = 27200;
sensor.fau_gain_white_ref = 160;
sensor.gain_white_ref = 160;
sensor.exposure = { 0x9c40, 0x9c40, 0x9c40 };
- sensor.stagger_config = StaggerConfig{ 3200, 6 };
sensor.custom_regs = {};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = get_sensor_optical_with_ccd_divisor;
- sensor.get_register_hwdpi_fun = [](const Genesys_Sensor&, unsigned) { return 4800; };
- sensor.get_hwdpi_divisor_fun = [](const Genesys_Sensor&, unsigned) { return 1; };
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
- unsigned dpiset_override;
- unsigned pixel_count_multiplier;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ Ratio pixel_count_ratio;
int exposure_lperiod;
+ int output_pixel_offset;
+ int shading_pixel_offset;
std::vector<ScanMethod> methods;
+ StaggerConfig stagger_y;
GenesysRegisterSettingSet extra_custom_regs;
GenesysRegisterSettingSet custom_fe_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 400 }, 2400, 1, 7200, { ScanMethod::FLATBED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x13 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa0 },
- { 0x52, 0x0d },
- { 0x53, 0x10 },
- { 0x54, 0x01 },
- { 0x55, 0x04 },
- { 0x56, 0x07 },
- { 0x57, 0x0a },
- { 0x58, 0x6b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 400 }, 2400, Ratio{1, 4}, 7200, 2, 0, { ScanMethod::FLATBED },
+ StaggerConfig{}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x13 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x84 }, { 0x1e, 0xa0 },
+ { 0x52, 0x0d }, { 0x53, 0x10 }, { 0x54, 0x01 }, { 0x55, 0x04 },
+ { 0x56, 0x07 }, { 0x57, 0x0a }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x01 }, { 0x71, 0x02 }, { 0x72, 0x03 }, { 0x73, 0x04 },
{ 0x74, 0x00 }, { 0x75, 0x0e }, { 0x76, 0x3f },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
@@ -2450,25 +2104,12 @@ void genesys_init_sensor_tables()
{ 0x80, 0x2a },
}, {}
},
- { { 800 }, 4800, 1, 7200, { ScanMethod::FLATBED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x13 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa0 },
- { 0x52, 0x0d },
- { 0x53, 0x10 },
- { 0x54, 0x01 },
- { 0x55, 0x04 },
- { 0x56, 0x07 },
- { 0x57, 0x0a },
- { 0x58, 0x6b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 800 }, 4800, Ratio{1, 4}, 7200, 5, 13, { ScanMethod::FLATBED },
+ StaggerConfig{}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x13 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x84 }, { 0x1e, 0xa0 },
+ { 0x52, 0x0d }, { 0x53, 0x10 }, { 0x54, 0x01 }, { 0x55, 0x04 },
+ { 0x56, 0x07 }, { 0x57, 0x0a }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x01 }, { 0x71, 0x02 }, { 0x72, 0x03 }, { 0x73, 0x04 },
{ 0x74, 0x00 }, { 0x75, 0x0e }, { 0x76, 0x3f },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
@@ -2476,26 +2117,13 @@ void genesys_init_sensor_tables()
{ 0x80, 0x20 },
}, {}
},
- { { 1600 }, 4800, 1, 14400, { ScanMethod::FLATBED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x11 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa1 },
- { 0x52, 0x0b },
- { 0x53, 0x0e },
- { 0x54, 0x11 },
- { 0x55, 0x02 },
- { 0x56, 0x05 },
- { 0x57, 0x08 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
- { 0x70, 0x01 }, { 0x71, 0x02 }, { 0x72, 0x02 }, { 0x73, 0x03 },
+ { { 1600 }, 4800, Ratio{1, 2}, 14400, 10, 8, { ScanMethod::FLATBED },
+ StaggerConfig{}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x11 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x84 }, { 0x1e, 0xa1 },
+ { 0x52, 0x0b }, { 0x53, 0x0e }, { 0x54, 0x11 }, { 0x55, 0x02 },
+ { 0x56, 0x05 }, { 0x57, 0x08 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x01 }, { 0x72, 0x02 }, { 0x73, 0x03 },
{ 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x02 }, { 0x7b, 0x49 }, { 0x7c, 0x24 },
@@ -2504,25 +2132,12 @@ void genesys_init_sensor_tables()
{ 0x03, 0x1f },
}
},
- { { 3200 }, 4800, 1, 28800, { ScanMethod::FLATBED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa1 },
- { 0x52, 0x02 },
- { 0x53, 0x05 },
- { 0x54, 0x08 },
- { 0x55, 0x0b },
- { 0x56, 0x0e },
- { 0x57, 0x11 },
- { 0x58, 0x1b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 3200 }, 4800, Ratio{1, 1}, 28800, 20, -2, { ScanMethod::FLATBED },
+ StaggerConfig{0, 6}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x84 }, { 0x1e, 0xa1 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
+ { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x09 }, { 0x71, 0x0a }, { 0x72, 0x0b }, { 0x73, 0x0c },
{ 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
@@ -2532,26 +2147,13 @@ void genesys_init_sensor_tables()
{ 0x03, 0x1f },
},
},
- { { 400 }, 2400, 1, 14400, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x13 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa0 },
- { 0x52, 0x0d },
- { 0x53, 0x10 },
- { 0x54, 0x01 },
- { 0x55, 0x04 },
- { 0x56, 0x07 },
- { 0x57, 0x0a },
- { 0x58, 0x6b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 400 }, 2400, Ratio{1, 4}, 14400, 2, 0, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x13 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x84 }, { 0x1e, 0xa0 },
+ { 0x52, 0x0d }, { 0x53, 0x10 }, { 0x54, 0x01 }, { 0x55, 0x04 },
+ { 0x56, 0x07 }, { 0x57, 0x0a }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x01 }, { 0x71, 0x02 }, { 0x72, 0x03 }, { 0x73, 0x04 },
{ 0x74, 0x00 }, { 0x75, 0x0e }, { 0x76, 0x3f },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
@@ -2559,53 +2161,27 @@ void genesys_init_sensor_tables()
{ 0x80, 0x20 },
}, {}
},
- { { 800 }, 4800, 1, 14400, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x13 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa0 },
- { 0x52, 0x0d },
- { 0x53, 0x10 },
- { 0x54, 0x01 },
- { 0x55, 0x04 },
- { 0x56, 0x07 },
- { 0x57, 0x0a },
- { 0x58, 0x6b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
- { 0x70, 0x01 }, { 0x71, 0x02 }, { 0x72, 0x03 }, { 0x73, 0x04 },
+ { { 800 }, 4800, Ratio{1, 4}, 14400, 5, 13, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x13 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x84 }, { 0x1e, 0xa0 },
+ { 0x52, 0x0d }, { 0x53, 0x10 }, { 0x54, 0x01 }, { 0x55, 0x04 },
+ { 0x56, 0x07 }, { 0x57, 0x0a }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x01 }, { 0x72, 0x02 }, { 0x73, 0x03 },
{ 0x74, 0x00 }, { 0x75, 0x0e }, { 0x76, 0x3f },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
{ 0x7a, 0x01 }, { 0x7b, 0xb6 }, { 0x7c, 0xdb },
{ 0x80, 0x20 },
}, {}
},
- { { 1600 }, 4800, 1, 28800, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x11 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa0 },
- { 0x52, 0x0b },
- { 0x53, 0x0e },
- { 0x54, 0x11 },
- { 0x55, 0x02 },
- { 0x56, 0x05 },
- { 0x57, 0x08 },
- { 0x58, 0x63 },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 1600 }, 4800, Ratio{1, 2}, 28800, 10, 8, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x11 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x84 }, { 0x1e, 0xa0 },
+ { 0x52, 0x0b }, { 0x53, 0x0e }, { 0x54, 0x11 }, { 0x55, 0x02 },
+ { 0x56, 0x05 }, { 0x57, 0x08 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x00 }, { 0x71, 0x01 }, { 0x72, 0x02 }, { 0x73, 0x03 },
{ 0x74, 0x00 }, { 0x75, 0x01 }, { 0x76, 0xff },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
@@ -2615,26 +2191,13 @@ void genesys_init_sensor_tables()
{ 0x03, 0x1f },
},
},
- { { 3200 }, 4800, 1, 28800, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
- { 0x16, 0x33 },
- { 0x17, 0x0c },
- { 0x18, 0x10 },
- { 0x19, 0x2a },
- { 0x1a, 0x30 },
- { 0x1b, 0x00 },
- { 0x1c, 0x20 },
- { 0x1d, 0x84 },
- { 0x1e, 0xa0 },
- { 0x52, 0x02 },
- { 0x53, 0x05 },
- { 0x54, 0x08 },
- { 0x55, 0x0b },
- { 0x56, 0x0e },
- { 0x57, 0x11 },
- { 0x58, 0x1b },
- { 0x59, 0x00 },
- { 0x5a, 0x40 },
+ { { 3200 }, 4800, Ratio{1, 1}, 28800, 20, 10, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{0, 6}, {
+ { 0x16, 0x33 }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x84 }, { 0x1e, 0xa0 },
+ { 0x52, 0x02 }, { 0x53, 0x05 }, { 0x54, 0x08 }, { 0x55, 0x0b },
+ { 0x56, 0x0e }, { 0x57, 0x11 }, { 0x58, 0x1b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
{ 0x70, 0x09 }, { 0x71, 0x0a }, { 0x72, 0x0b }, { 0x73, 0x0c },
{ 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
@@ -2648,51 +2211,68 @@ void genesys_init_sensor_tables()
for (const CustomSensorSettings& setting : custom_settings)
{
- for (auto method : setting.methods) {
- sensor.resolutions = setting.resolutions;
- sensor.dpiset_override = setting.dpiset_override;
- sensor.pixel_count_multiplier = setting.pixel_count_multiplier;
- sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.method = method;
- sensor.custom_regs = setting.extra_custom_regs;
- sensor.custom_fe_regs = setting.custom_fe_regs;
- s_sensors->push_back(sensor);
+ for (auto method : setting.methods)
+ {for (auto resolution : setting.resolutions.values()) {
+ sensor.resolutions = { resolution };
+ sensor.shading_resolution = resolution;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.exposure_lperiod = setting.exposure_lperiod;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.shading_pixel_offset = setting.shading_pixel_offset;
+ sensor.method = method;
+ sensor.stagger_y = setting.stagger_y;
+ sensor.custom_regs = setting.extra_custom_regs;
+ sensor.custom_fe_regs = setting.custom_fe_regs;
+ s_sensors->push_back(sensor);
+ }
}
}
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_CANON_8600F;
- sensor.optical_res = 4800;
- sensor.ccd_size_divisor = 4;
+ sensor.sensor_id = SensorId::CCD_CANON_8600F; // gl843
+ sensor.full_resolution = 4800;
+ sensor.register_dpihw = 4800;
sensor.black_pixels = 31;
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 0; // not used at the moment
- // 11372 pixels at 1200 dpi
- sensor.sensor_pixels = 11372*4;
sensor.fau_gain_white_ref = 160;
sensor.gain_white_ref = 160;
sensor.exposure = { 0x9c40, 0x9c40, 0x9c40 };
- sensor.stagger_config = StaggerConfig{4800, 8};
sensor.custom_regs = {};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = get_sensor_optical_with_ccd_divisor;
- sensor.get_register_hwdpi_fun = [](const Genesys_Sensor&, unsigned) { return 4800; };
- sensor.get_hwdpi_divisor_fun = [](const Genesys_Sensor&, unsigned) { return 1; };
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
int exposure_lperiod;
+ int output_pixel_offset;
std::vector<ScanMethod> methods;
+ StaggerConfig stagger_y;
GenesysRegisterSettingSet extra_custom_regs;
GenesysRegisterSettingSet custom_fe_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 300, 600, 1200 }, 24000, { ScanMethod::FLATBED }, {
+ { { 300 }, 1200, 1200, 24000, 1, { ScanMethod::FLATBED }, StaggerConfig{}, {
+ { 0x0c, 0x00 },
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0c }, { 0x53, 0x0f }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x02 }, { 0x73, 0x04 },
+ { 0x56, 0x06 }, { 0x57, 0x09 }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x74, 0x03 }, { 0x75, 0xf0 }, { 0x76, 0xf0 },
+ { 0x77, 0x03 }, { 0x78, 0xfe }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0x49 },
+ { 0x9e, 0x2d },
+ { 0xaa, 0x00 },
+ },
+ {},
+ },
+ { { 600 }, 1200, 2400, 24000, 2, { ScanMethod::FLATBED }, StaggerConfig{}, {
{ 0x0c, 0x00 },
{ 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
@@ -2707,8 +2287,24 @@ void genesys_init_sensor_tables()
},
{},
},
- { { 300, 600, 1200 }, 45000, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
+ { { 1200 }, 1200, 4800, 24000, 5, { ScanMethod::FLATBED }, StaggerConfig{}, {
+ { 0x0c, 0x00 },
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0c }, { 0x53, 0x0f }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x02 }, { 0x73, 0x04 },
+ { 0x56, 0x06 }, { 0x57, 0x09 }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x74, 0x03 }, { 0x75, 0xf0 }, { 0x76, 0xf0 },
+ { 0x77, 0x03 }, { 0x78, 0xfe }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0x49 },
+ { 0x9e, 0x2d },
+ { 0xaa, 0x00 },
+ },
+ {},
+ },
+ { { 300 }, 1200, 1200, 45000, 6, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
{ 0x0c, 0x00 },
{ 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
@@ -2723,8 +2319,43 @@ void genesys_init_sensor_tables()
},
{},
},
- { { 2400 }, 45000, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
+ { { 600 }, 1200, 2400, 45000, 11, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
+ { 0x0c, 0x00 },
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0c }, { 0x53, 0x0f }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x09 }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x02 }, { 0x73, 0x04 },
+ { 0x74, 0x03 }, { 0x75, 0xf0 }, { 0x76, 0xf0 },
+ { 0x77, 0x03 }, { 0x78, 0xfe }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0x49 },
+ { 0x9e, 0x2d },
+ { 0xaa, 0x00 },
+ },
+ {},
+ },
+ { { 1200 }, 1200, 4800, 45000, 23, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
+ { 0x0c, 0x00 },
+ { 0x16, 0x13 }, { 0x17, 0x0a }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x6b },
+ { 0x52, 0x0c }, { 0x53, 0x0f }, { 0x54, 0x00 }, { 0x55, 0x03 },
+ { 0x56, 0x06 }, { 0x57, 0x09 }, { 0x58, 0x6b }, { 0x59, 0x00 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x02 }, { 0x72, 0x02 }, { 0x73, 0x04 },
+ { 0x74, 0x03 }, { 0x75, 0xf0 }, { 0x76, 0xf0 },
+ { 0x77, 0x03 }, { 0x78, 0xfe }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x92 }, { 0x7c, 0x49 },
+ { 0x9e, 0x2d },
+ { 0xaa, 0x00 },
+ },
+ {},
+ },
+ { { 2400 }, 2400, 4800, 45000, 10, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{}, {
{ 0x0c, 0x00 },
{ 0x16, 0x13 }, { 0x17, 0x15 }, { 0x18, 0x10 }, { 0x19, 0x2a },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x01 }, { 0x1d, 0x75 },
@@ -2739,8 +2370,9 @@ void genesys_init_sensor_tables()
},
{},
},
- { { 4800 }, 45000, { ScanMethod::TRANSPARENCY,
- ScanMethod::TRANSPARENCY_INFRARED }, {
+ { { 4800 }, 4800, 4800, 45000, -1982, { ScanMethod::TRANSPARENCY,
+ ScanMethod::TRANSPARENCY_INFRARED },
+ StaggerConfig{8, 0}, {
{ 0x0c, 0x00 },
{ 0x16, 0x13 }, { 0x17, 0x15 }, { 0x18, 0x10 }, { 0x19, 0x2a },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x61 }, { 0x1d, 0x75 },
@@ -2760,25 +2392,30 @@ void genesys_init_sensor_tables()
for (const CustomSensorSettings& setting : custom_settings) {
for (auto method : setting.methods) {
- sensor.resolutions = setting.resolutions;
- sensor.method = method;
- sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.custom_regs = setting.extra_custom_regs;
- sensor.custom_fe_regs = setting.custom_fe_regs;
- s_sensors->push_back(sensor);
+ for (auto resolution : setting.resolutions.values()) {
+ sensor.resolutions = { resolution };
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = resolution;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.method = method;
+ sensor.exposure_lperiod = setting.exposure_lperiod;
+ sensor.stagger_y = setting.stagger_y;
+ sensor.custom_regs = setting.extra_custom_regs;
+ sensor.custom_fe_regs = setting.custom_fe_regs;
+ s_sensors->push_back(sensor);
+ }
}
}
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_HP_N6310;
- sensor.optical_res = 2400;
- // sensor.ccd_size_divisor = 2; Possibly half CCD, needs checking
+ sensor.sensor_id = SensorId::CCD_HP_N6310; // gl847
+ sensor.full_resolution = 2400;
sensor.black_pixels = 96;
sensor.dummy_pixel = 26;
- sensor.ccd_start_xoffset = 128;
- sensor.sensor_pixels = 42720;
+ sensor.pixel_count_ratio = Ratio{1, 4};
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
@@ -2802,41 +2439,102 @@ void genesys_init_sensor_tables()
{ 0x5a, 0x40 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
+ unsigned shading_factor;
+ int output_pixel_offset;
+ };
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, 8, 4 },
+ { { 100 }, 600, 6, 5 },
+ { { 150 }, 600, 4, 8 },
+ { { 200 }, 600, 3, 10 },
+ { { 300 }, 600, 2, 16 },
+ { { 600 }, 600, 1, 32 },
+ { { 1200 }, 1200, 1, 64 },
+ { { 2400 }, 2400, 1, 128 },
+ };
+
+ auto base_custom_regs = sensor.custom_regs;
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.shading_resolution = setting.register_dpihw;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_110;
- sensor.optical_res = 2400;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_110; // gl124
+ sensor.full_resolution = 2400;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
- sensor.ccd_start_xoffset = 303;
- sensor.sensor_pixels = 5168*4;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.gamma = { 2.2f, 2.2f, 2.2f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_gl124;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75, 100, 150 }, 4608, { 462, 609, 453 }, std::vector<unsigned>{}, {
+ { { 75 }, 1200, 600, 150, 300, 4608, { 462, 609, 453 }, Ratio{1, 4}, 4,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ { 0x70, 0x06 }, { 0x71, 0x08 }, { 0x72, 0x08 }, { 0x73, 0x0a },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x1e },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 100 }, 1200, 600, 200, 300, 4608, { 462, 609, 453 }, Ratio{1, 4}, 3,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ { 0x70, 0x06 }, { 0x71, 0x08 }, { 0x72, 0x08 }, { 0x73, 0x0a },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x1e },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 150 }, 1200, 600, 300, 300, 4608, { 462, 609, 453 }, Ratio{1, 4}, 2,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
{ 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
@@ -2853,7 +2551,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
}
},
- { { 300 }, 4608, { 462, 609, 453 }, std::vector<unsigned>{}, {
+ { { 300 }, 1200, 600, 600, 300, 4608, { 462, 609, 453 }, Ratio{1, 4}, 1,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x0c },
{ 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
@@ -2870,7 +2569,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
}
},
- { { 600 }, 5360, { 823, 1117, 805 }, std::vector<unsigned>{}, {
+ { { 600 }, 2400, 600, 600, 600, 5360, { 823, 1117, 805 }, Ratio{1, 4}, 1,
+ std::vector<unsigned>{}, {
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x0a },
{ 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
@@ -2887,7 +2587,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
},
},
- { { 1200 }, 10528, { 6071, 6670, 6042 }, { 0, 1 }, {
+ { { 1200 }, 2400, 1200, 1200, 1200, 10528, { 6071, 6670, 6042 }, Ratio{1, 4}, 1,
+ { 0, 1 }, {
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 },{ 0x20, 0x08 },
{ 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
@@ -2904,7 +2605,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x22 },
}
},
- { { 2400 }, 20864, { 7451, 8661, 7405 }, { 0, 2, 1, 3 }, {
+ { { 2400 }, 2400, 2400, 2400, 2400, 20864, { 7451, 8661, 7405 }, Ratio{1, 4}, 1,
+ { 0, 2, 1, 3 }, {
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x06 },
{ 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
@@ -2925,8 +2627,14 @@ void genesys_init_sensor_tables()
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
@@ -2934,34 +2642,69 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_120;
- sensor.optical_res = 2400;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_120; // gl124
+ sensor.full_resolution = 2400;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
- sensor.ccd_start_xoffset = 303;
- // SEGCNT at 600 DPI by number of segments
- sensor.sensor_pixels = 5104*4;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.gamma = { 2.2f, 2.2f, 2.2f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_gl124;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75, 100, 150, 300 }, 4608, { 1244, 1294, 1144 }, std::vector<unsigned>{}, {
+ { { 75 }, 1200, 600, 150, 300, 4608, { 1244, 1294, 1144 }, Ratio{1, 4}, 4,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x15 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x3a }, { 0x5b, 0x00 }, { 0x5c, 0x00 },
+ { 0x61, 0x20 },
+ { 0x70, 0x00 }, { 0x71, 0x1f }, { 0x72, 0x08 }, { 0x73, 0x0a },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x5e },
+ { 0x93, 0x00 }, { 0x94, 0x09 }, { 0x95, 0xf8 },
+ { 0x96, 0x00 }, { 0x97, 0x70 },
+ { 0x98, 0x21 },
+ },
+ },
+ { { 100 }, 1200, 600, 200, 300, 4608, { 1244, 1294, 1144 }, Ratio{1, 4}, 3,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x15 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x3a }, { 0x5b, 0x00 }, { 0x5c, 0x00 },
+ { 0x61, 0x20 },
+ { 0x70, 0x00 }, { 0x71, 0x1f }, { 0x72, 0x08 }, { 0x73, 0x0a },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x5e },
+ { 0x93, 0x00 }, { 0x94, 0x09 }, { 0x95, 0xf8 },
+ { 0x96, 0x00 }, { 0x97, 0x70 },
+ { 0x98, 0x21 },
+ },
+ },
+ { { 150 }, 1200, 600, 300, 300, 4608, { 1244, 1294, 1144 }, Ratio{1, 4}, 2,
+ std::vector<unsigned>{}, {
{ 0x16, 0x15 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
{ 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
@@ -2978,7 +2721,26 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
},
},
- { { 600 }, 5360, { 2394, 2444, 2144 }, std::vector<unsigned>{}, {
+ { { 300 }, 1200, 600, 600, 300, 4608, { 1244, 1294, 1144 }, Ratio{1, 4}, 1,
+ std::vector<unsigned>{}, {
+ { 0x16, 0x15 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
+ { 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x3a }, { 0x5b, 0x00 }, { 0x5c, 0x00 },
+ { 0x61, 0x20 },
+ { 0x70, 0x00 }, { 0x71, 0x1f }, { 0x72, 0x08 }, { 0x73, 0x0a },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x5e },
+ { 0x93, 0x00 }, { 0x94, 0x09 }, { 0x95, 0xf8 },
+ { 0x96, 0x00 }, { 0x97, 0x70 },
+ { 0x98, 0x21 },
+ },
+ },
+ { { 600 }, 2400, 600, 600, 600, 5360, { 2394, 2444, 2144 }, Ratio{1, 4}, 1,
+ std::vector<unsigned>{}, {
{ 0x16, 0x11 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
{ 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
@@ -2995,7 +2757,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
},
},
- { { 1200 }, 10528, { 4694, 4644, 4094 }, std::vector<unsigned>{}, {
+ { { 1200 }, 2400, 1200, 1200, 1200, 10528, { 4694, 4644, 4094 }, Ratio{1, 2}, 1,
+ std::vector<unsigned>{}, {
{ 0x16, 0x15 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
{ 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
@@ -3012,7 +2775,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
},
},
- { { 2400 }, 20864, { 8944, 8144, 7994 }, std::vector<unsigned>{}, {
+ { { 2400 }, 2400, 2400, 2400, 2400, 20864, { 8944, 8144, 7994 }, Ratio{1, 1}, 1,
+ std::vector<unsigned>{}, {
{ 0x16, 0x11 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x00 }, { 0x20, 0x02 },
{ 0x52, 0x04 }, { 0x53, 0x06 }, { 0x54, 0x00 }, { 0x55, 0x02 },
@@ -3033,8 +2797,14 @@ void genesys_init_sensor_tables()
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
@@ -3042,33 +2812,71 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_210;
- sensor.optical_res = 2400;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_210; // gl124
+ sensor.full_resolution = 4800;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
- sensor.ccd_start_xoffset = 303;
- sensor.sensor_pixels = 5168*4;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.gamma = { 2.2f, 2.2f, 2.2f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_gl124;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75, 100, 150, 300 }, 2768, { 388, 574, 393 }, std::vector<unsigned>{}, {
+ { { 75 }, 2400, 600, 150, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 4,
+ std::vector<unsigned>{}, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x1e },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 100 }, 2400, 600, 200, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 3,
+ std::vector<unsigned>{}, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x1e },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 150 }, 2400, 600, 300, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 2,
+ std::vector<unsigned>{}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
@@ -3086,7 +2894,27 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
}
},
- { { 600 }, 5360, { 388, 574, 393 }, std::vector<unsigned>{}, {
+ { { 300 }, 2400, 600, 600, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 1,
+ std::vector<unsigned>{}, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x1e },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 600 }, 4800, 600, 600, 600, 5360, { 388, 574, 393 }, Ratio{1, 8}, 1,
+ std::vector<unsigned>{}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0a },
@@ -3104,7 +2932,7 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
}
},
- { { 1200 }, 10528, { 388, 574, 393 }, {0, 1}, {
+ { { 1200 }, 4800, 1200, 1200, 1200, 10528, { 388, 574, 393 }, Ratio{1, 8}, 1, {0, 1}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x08 },
@@ -3122,7 +2950,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x22 },
},
},
- { { 2400 }, 20864, { 6839, 8401, 6859 }, {0, 2, 1, 3}, {
+ { { 2400 }, 4800, 2400, 2400, 2400, 20864, { 6839, 8401, 6859 }, Ratio{1, 8}, 1,
+ {0, 2, 1, 3}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x06 },
@@ -3139,13 +2968,38 @@ void genesys_init_sensor_tables()
{ 0x96, 0x00 }, { 0x97, 0xa3 },
{ 0x98, 0x24 },
},
+ },
+ { { 4800 }, 4800, 4800, 4800, 4800, 41536, { 9735, 14661, 11345 }, Ratio{1, 8}, 1,
+ { 0, 2, 4, 6, 1, 3, 5, 7 }, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x04 },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x1e },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x12 }, { 0x89, 0x47 },
+ { 0x93, 0x00 }, { 0x94, 0x14 }, { 0x95, 0x30 },
+ { 0x96, 0x00 }, { 0x97, 0xa5 },
+ { 0x98, 0x28 },
+ },
}
};
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
@@ -3153,33 +3007,33 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_220;
- sensor.optical_res = 2400;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_220; // gl124
+ sensor.full_resolution = 4800;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
- sensor.ccd_start_xoffset = 303;
- sensor.sensor_pixels = 5168*4;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.gamma = { 2.2f, 2.2f, 2.2f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_gl124;
{
struct CustomSensorSettings {
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
int exposure_lperiod;
SensorExposure exposure;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
std::vector<unsigned> segment_order;
GenesysRegisterSettingSet custom_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 75, 100, 150, 300 }, 2768, { 388, 574, 393 }, std::vector<unsigned>{}, {
+ { { 75 }, 2400, 600, 150, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 4,
+ std::vector<unsigned>{}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
@@ -3197,7 +3051,65 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
}
},
- { { 600 }, 5360, { 388, 574, 393 }, std::vector<unsigned>{}, {
+ { { 100 }, 2400, 600, 200, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 3,
+ std::vector<unsigned>{}, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 150 }, 2400, 600, 300, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 2,
+ std::vector<unsigned>{}, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 300 }, 2400, 600, 600, 300, 2768, { 388, 574, 393 }, Ratio{1, 8}, 1,
+ std::vector<unsigned>{}, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0c },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x00 }, { 0x89, 0x65 },
+ { 0x93, 0x00 }, { 0x94, 0x0a }, { 0x95, 0x18 },
+ { 0x96, 0x00 }, { 0x97, 0x9a },
+ { 0x98, 0x21 },
+ }
+ },
+ { { 600 }, 4800, 600, 600, 600, 5360, { 388, 574, 393 }, Ratio{1, 8}, 1,
+ std::vector<unsigned>{}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x0a },
@@ -3215,7 +3127,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x21 },
}
},
- { { 1200 }, 10528, { 388, 574, 393 }, {0, 1}, {
+ { { 1200 }, 4800, 1200, 1200, 1200, 10528, { 388, 574, 393 }, Ratio{1, 8}, 1,
+ {0, 1}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x08 },
@@ -3233,7 +3146,8 @@ void genesys_init_sensor_tables()
{ 0x98, 0x22 },
}
},
- { { 2400 }, 20864, { 6839, 8401, 6859 }, {0, 2, 1, 3}, {
+ { { 2400 }, 4800, 2400, 2400, 2400, 20864, { 6839, 8401, 6859 }, Ratio{1, 8}, 1,
+ {0, 2, 1, 3}, {
// { 0x16, 0x00 }, // FIXME: check if default value is different
{ 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
{ 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x06 },
@@ -3250,13 +3164,38 @@ void genesys_init_sensor_tables()
{ 0x96, 0x00 }, { 0x97, 0xa3 },
{ 0x98, 0x24 },
},
+ },
+ { { 4800 }, 4800, 4800, 4800, 4800, 41536, { 9735, 14661, 11345 }, Ratio{1, 8}, 1,
+ { 0, 2, 4, 6, 1, 3, 5, 7 }, {
+ // { 0x16, 0x00 }, // FIXME: check if default value is different
+ { 0x16, 0x10 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x01 },
+ { 0x1a, 0x30 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x01 }, { 0x20, 0x04 },
+ { 0x52, 0x00 }, { 0x53, 0x02 }, { 0x54, 0x04 }, { 0x55, 0x06 },
+ { 0x56, 0x04 }, { 0x57, 0x04 }, { 0x58, 0x04 }, { 0x59, 0x04 },
+ { 0x5a, 0x1a }, { 0x5b, 0x00 }, { 0x5c, 0xc0 },
+ { 0x61, 0x20 },
+ // { 0x70, 0x00 }, // FIXME: check if default value is different
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x0f },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x88, 0x12 }, { 0x89, 0x47 },
+ { 0x93, 0x00 }, { 0x94, 0x14 }, { 0x95, 0x30 },
+ { 0x96, 0x00 }, { 0x97, 0xa5 },
+ { 0x98, 0x28 },
+ },
}
};
for (const auto& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
sensor.exposure_lperiod = setting.exposure_lperiod;
sensor.exposure = setting.exposure;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
sensor.segment_order = setting.segment_order;
sensor.custom_regs = setting.custom_regs;
s_sensors->push_back(sensor);
@@ -3264,63 +3203,116 @@ void genesys_init_sensor_tables()
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICPRO_3600;
- sensor.optical_res = 1200;
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICPRO_3600; // gl841
+ sensor.full_resolution = 1200;
sensor.black_pixels = 87;
sensor.dummy_pixel = 87;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10100;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x00 },
- { 0x0a, 0x00 },
- { 0x0b, 0x00 },
- { 0x16, 0x33 },
- { 0x17, 0x0b },
- { 0x18, 0x11 },
- { 0x19, 0x2a },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0xc4 },
- { 0x52, 0x07 }, // [GB](HI|LOW) not needed for cis
- { 0x53, 0x0a },
- { 0x54, 0x0c },
- { 0x55, 0x00 },
- { 0x56, 0x02 },
- { 0x57, 0x06 },
- { 0x58, 0x22 },
- { 0x59, 0x69 },
- { 0x5a, 0x40 },
- { 0x5b, 0x00 }, // TODO: 5b-5e
- { 0x5c, 0x00 },
- { 0x5d, 0x00 },
- { 0x5e, 0x02 },
+ { 0x16, 0x33 }, { 0x17, 0x0b }, { 0x18, 0x11 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0xc4 },
+ { 0x52, 0x07 }, { 0x53, 0x0a }, { 0x54, 0x0c }, { 0x55, 0x00 },
+ { 0x56, 0x02 }, { 0x57, 0x06 }, { 0x58, 0x22 }, { 0x59, 0x69 }, { 0x5a, 0x40 },
+ { 0x70, 0x00 }, { 0x71, 0x00 }, { 0x72, 0x00 }, { 0x73, 0x00 },
+ };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpihw;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, 600, 150, 11 },
+ { { 100 }, 600, 600, 200, 14 },
+ { { 150 }, 600, 600, 300, 22 },
+ { { 200 }, 600, 600, 400, 29 },
+ { { 300 }, 600, 600, 600, 44 },
+ { { 600 }, 600, 600, 1200, 88 },
+ { { 1200 }, 1200, 1200, 1200, 88 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.register_dpihw;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
+
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7200; // gl842
+ sensor.full_resolution = 7200;
+ sensor.register_dpihw = 1200;
+ sensor.black_pixels = 88; // TODO
+ sensor.dummy_pixel = 19;
+ sensor.fau_gain_white_ref = 210;
+ sensor.gain_white_ref = 230;
+ sensor.exposure = { 0x2b00, 0x2b00, 0x2b00 };
+ sensor.exposure_lperiod = 0x694e;
+ sensor.use_host_side_calib = true;
+ sensor.custom_regs = {
+ { 0x16, 0x3b }, { 0x17, 0x4b }, { 0x18, 0x10 }, { 0x19, 0x00 },
+ { 0x1a, 0x24 }, { 0x1b, 0x00 }, { 0x1c, 0x40 }, { 0x1d, 0x84 },
+ { 0x52, 0x09 }, { 0x53, 0x0c }, { 0x54, 0x0e }, { 0x55, 0x02 },
+ { 0x56, 0x04 }, { 0x57, 0x07 }, { 0x58, 0x22 }, { 0x59, 0x69 }, { 0x5a, 0xc0 },
+ { 0x70, 0x08 }, { 0x71, 0x09 }, { 0x72, 0x0b }, { 0x73, 0x0c },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
+ { 0x77, 0x00 }, { 0x78, 0x7f }, { 0x79, 0xff },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x00 }, { 0x7f, 0x01 }
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ ScanMethod method;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ unsigned register_dpiset;
+ StaggerConfig stagger_y;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 900 }, ScanMethod::TRANSPARENCY, Ratio{8, 8}, 2, 150, StaggerConfig{} },
+ { { 1800 }, ScanMethod::TRANSPARENCY, Ratio{4, 4}, 10, 300, StaggerConfig{} },
+ { { 3600 }, ScanMethod::TRANSPARENCY, Ratio{2, 2}, 10, 600, StaggerConfig{} },
+ { { 7200 }, ScanMethod::TRANSPARENCY, Ratio{1, 1}, 20, 1200, StaggerConfig{0, 4} },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.method = setting.method;
+ sensor.shading_resolution = setting.resolutions.values().front();
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.stagger_y = setting.stagger_y;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7200I;
- sensor.optical_res = 7200;
- sensor.register_dpihw_override = 1200;
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7200I; // gl843
+ sensor.full_resolution = 7200;
+ sensor.register_dpihw = 1200;
sensor.black_pixels = 88; // TODO
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10200; // TODO
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
- sensor.stagger_config = StaggerConfig{7200, 4};
+ sensor.use_host_side_calib = true;
sensor.custom_regs = {
{ 0x08, 0x00 },
{ 0x09, 0x00 },
@@ -3351,47 +3343,53 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings
{
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
ScanMethod method;
- unsigned ccd_size_divisor;
- unsigned logical_dpihw_override;
- unsigned pixel_count_multiplier;
+ unsigned shading_resolution;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
unsigned exposure_lperiod;
- unsigned dpiset_override;
+ unsigned register_dpiset;
+ StaggerConfig stagger_y;
GenesysRegisterSettingSet custom_fe_regs;
};
CustomSensorSettings custom_settings[] = {
- { { 900 }, ScanMethod::TRANSPARENCY, 1, 900, 8, 0x2538, 150, {} },
- { { 1800 }, ScanMethod::TRANSPARENCY, 1, 1800, 4, 0x2538, 300, {} },
- { { 3600 }, ScanMethod::TRANSPARENCY, 1, 3600, 2, 0x2538, 600, {} },
- { { 7200 }, ScanMethod::TRANSPARENCY, 1, 7200, 1, 0x19c8, 1200, {
+ { { 900 }, ScanMethod::TRANSPARENCY, 900, Ratio{8, 8}, 2, 0x2538, 150,
+ StaggerConfig{}, {} },
+ { { 1800 }, ScanMethod::TRANSPARENCY, 1800, Ratio{4, 4}, 5, 0x2538, 300,
+ StaggerConfig{}, {} },
+ { { 3600 }, ScanMethod::TRANSPARENCY, 3600, Ratio{2, 2}, 10, 0x2538, 600,
+ StaggerConfig{}, {} },
+ { { 7200 }, ScanMethod::TRANSPARENCY, 7200, Ratio{1, 1}, 20, 0x19c8, 1200,
+ StaggerConfig{4, 0}, {
{ 0x02, 0x1b },
{ 0x03, 0x14 },
{ 0x04, 0x20 },
}
},
- { { 900 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 900, 8, 0x1f54, 150, {} },
- { { 1800 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 1800, 4, 0x1f54, 300, {} },
- { { 3600 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 3600, 2, 0x1f54, 600, {} },
- { { 7200 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 7200, 1, 0x1f54, 1200, {} },
+ { { 900 }, ScanMethod::TRANSPARENCY_INFRARED, 900, Ratio{8, 8}, 2, 0x1f54, 150,
+ StaggerConfig{}, {} },
+ { { 1800 }, ScanMethod::TRANSPARENCY_INFRARED, 1800, Ratio{4, 4}, 5, 0x1f54, 300,
+ StaggerConfig{}, {} },
+ { { 3600 }, ScanMethod::TRANSPARENCY_INFRARED, 3600, Ratio{2, 2}, 10, 0x1f54, 600,
+ StaggerConfig{}, {}},
+ { { 7200 }, ScanMethod::TRANSPARENCY_INFRARED, 7200, Ratio{1, 1}, 20, 0x1f54, 1200,
+ StaggerConfig{4, 0}, {} },
};
for (const CustomSensorSettings& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
sensor.method = setting.method;
- sensor.ccd_size_divisor = setting.ccd_size_divisor;
- sensor.logical_dpihw_override = setting.logical_dpihw_override;
- sensor.pixel_count_multiplier = setting.pixel_count_multiplier;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.dpiset_override = setting.dpiset_override;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.stagger_y = setting.stagger_y;
sensor.custom_fe_regs = setting.custom_fe_regs;
s_sensors->push_back(sensor);
}
@@ -3399,19 +3397,17 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7300;
- sensor.optical_res = 7200;
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7300; // gl843
+ sensor.full_resolution = 7200;
sensor.method = ScanMethod::TRANSPARENCY;
- sensor.register_dpihw_override = 1200;
+ sensor.register_dpihw = 1200;
sensor.black_pixels = 88; // TODO
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10200; // TODO
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
sensor.exposure_lperiod = 0x2f44;
- sensor.stagger_config = StaggerConfig{7200, 4};
+ sensor.use_host_side_calib = true;
sensor.custom_regs = {
{ 0x08, 0x00 },
{ 0x09, 0x00 },
@@ -3442,50 +3438,98 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings
{
- ResolutionFilter resolutions;
- unsigned ccd_size_divisor;
- unsigned logical_dpihw_override;
- unsigned pixel_count_multiplier;
- unsigned dpiset_override;
+ ValueFilterAny<unsigned> resolutions;
+ unsigned shading_resolution;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
+ unsigned register_dpiset;
+ StaggerConfig stagger_y;
};
CustomSensorSettings custom_settings[] = {
- { { 900 }, 1, 900, 8, 150 },
- { { 1800 }, 1, 1800, 4, 300 },
- { { 3600 }, 1, 3600, 2, 600 },
- { { 7200 }, 1, 7200, 1, 1200 },
+ { { 900 }, 900, Ratio{8, 8}, 2, 150, StaggerConfig{} },
+ { { 1800 }, 1800, Ratio{4, 4}, 5, 300, StaggerConfig{} },
+ { { 3600 }, 3600, Ratio{2, 2}, 10, 600, StaggerConfig{} },
+ { { 7200 }, 7200, Ratio{1, 1}, 20, 1200, StaggerConfig{4, 0} },
};
for (const CustomSensorSettings& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
- sensor.ccd_size_divisor = setting.ccd_size_divisor;
- sensor.logical_dpihw_override = setting.logical_dpihw_override;
- sensor.pixel_count_multiplier = setting.pixel_count_multiplier;
- sensor.dpiset_override = setting.dpiset_override;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.stagger_y = setting.stagger_y;
s_sensors->push_back(sensor);
}
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7500I;
- sensor.optical_res = 7200;
- sensor.register_dpihw_override = 1200;
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7400; // gl845
+ sensor.full_resolution = 7200;
+ sensor.method = ScanMethod::TRANSPARENCY;
+ sensor.register_dpihw = 1200;
sensor.black_pixels = 88; // TODO
sensor.dummy_pixel = 20;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10200; // TODO
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 230;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
- sensor.stagger_config = StaggerConfig{7200, 4};
+ sensor.exposure_lperiod = 14000;
+ sensor.use_host_side_calib = true;
+ sensor.custom_regs = {
+ { 0x08, 0x00 }, { 0x09, 0x00 }, { 0x0a, 0x00 },
+ { 0x16, 0x27 }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x84 },
+ { 0x52, 0x09 }, { 0x53, 0x0d }, { 0x54, 0x0f }, { 0x55, 0x01 },
+ { 0x56, 0x04 }, { 0x57, 0x07 }, { 0x58, 0x31 }, { 0x59, 0x79 }, { 0x5a, 0xc0 },
+ { 0x70, 0x0a }, { 0x71, 0x0b }, { 0x72, 0x0c }, { 0x73, 0x0d },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x00 },
+ { 0x87, 0x00 },
+ };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ StaggerConfig stagger_y;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 600 }, 100, 10, StaggerConfig{} },
+ { { 1200 }, 200, 20, StaggerConfig{} },
+ { { 2400 }, 400, 40, StaggerConfig{} },
+ { { 3600 }, 600, 60, StaggerConfig{} },
+ { { 7200 }, 1200, 120, StaggerConfig{4, 0} },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.shading_resolution = setting.resolutions.values()[0];
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
+ s_sensors->push_back(sensor);
+ }
+ }
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_7500I; // gl843
+ sensor.full_resolution = 7200;
+ sensor.register_dpihw = 1200;
+ sensor.black_pixels = 88; // TODO
+ sensor.dummy_pixel = 20;
+ sensor.fau_gain_white_ref = 210;
+ sensor.gain_white_ref = 230;
+ sensor.exposure = { 0x0000, 0x0000, 0x0000 };
+ sensor.use_host_side_calib = true;
sensor.custom_regs = {
{ 0x08, 0x00 },
{ 0x09, 0x00 },
@@ -3516,57 +3560,119 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings
{
- ResolutionFilter resolutions;
+ ValueFilterAny<unsigned> resolutions;
ScanMethod method;
- unsigned ccd_size_divisor;
- unsigned logical_dpihw_override;
- unsigned pixel_count_multiplier;
+ unsigned shading_resolution;
+ Ratio pixel_count_ratio;
+ int output_pixel_offset;
unsigned exposure_lperiod;
- unsigned dpiset_override;
+ unsigned register_dpiset;
+ StaggerConfig stagger_y;
};
CustomSensorSettings custom_settings[] = {
- { { 900 }, ScanMethod::TRANSPARENCY, 1, 900, 8, 0x2f44, 150 },
- { { 1800 }, ScanMethod::TRANSPARENCY, 1, 1800, 4, 0x2f44, 300 },
- { { 3600 }, ScanMethod::TRANSPARENCY, 1, 3600, 2, 0x2f44, 600 },
- { { 7200 }, ScanMethod::TRANSPARENCY, 1, 7200, 1, 0x2f44, 1200 },
- { { 900 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 900, 8, 0x2af8, 150 },
- { { 1800 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 1800, 4, 0x2af8, 300 },
- { { 3600 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 3600, 2, 0x2af8, 600 },
- { { 7200 }, ScanMethod::TRANSPARENCY_INFRARED, 1, 7200, 1, 0x2af8, 1200 },
+ { { 900 }, ScanMethod::TRANSPARENCY, 900, Ratio{8, 8}, 2, 0x2f44, 150,
+ StaggerConfig{} },
+ { { 1800 }, ScanMethod::TRANSPARENCY, 1800, Ratio{4, 4}, 5, 0x2f44, 300,
+ StaggerConfig{} },
+ { { 3600 }, ScanMethod::TRANSPARENCY, 3600, Ratio{2, 2}, 10, 0x2f44, 600,
+ StaggerConfig{} },
+ { { 7200 }, ScanMethod::TRANSPARENCY, 7200, Ratio{1, 1}, 20, 0x2f44, 1200,
+ StaggerConfig{4, 0} },
+ { { 900 }, ScanMethod::TRANSPARENCY_INFRARED, 900, Ratio{8, 8}, 2, 0x2af8, 150,
+ StaggerConfig{} },
+ { { 1800 }, ScanMethod::TRANSPARENCY_INFRARED, 1800, Ratio{4, 4}, 5, 0x2af8, 300,
+ StaggerConfig{} },
+ { { 3600 }, ScanMethod::TRANSPARENCY_INFRARED, 3600, Ratio{2, 2}, 10, 0x2af8, 600,
+ StaggerConfig{} },
+ { { 7200 }, ScanMethod::TRANSPARENCY_INFRARED, 7200, Ratio{1, 1}, 20, 0x2af8, 1200,
+ StaggerConfig{4, 0} },
};
for (const CustomSensorSettings& setting : custom_settings) {
sensor.resolutions = setting.resolutions;
sensor.method = setting.method;
- sensor.ccd_size_divisor = setting.ccd_size_divisor;
- sensor.logical_dpihw_override = setting.logical_dpihw_override;
- sensor.pixel_count_multiplier = setting.pixel_count_multiplier;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
sensor.exposure_lperiod = setting.exposure_lperiod;
- sensor.dpiset_override = setting.dpiset_override;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.stagger_y = setting.stagger_y;
s_sensors->push_back(sensor);
}
}
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_IMG101;
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICFILM_8200I; // gl845
+ sensor.full_resolution = 7200;
+ sensor.method = ScanMethod::TRANSPARENCY;
+ sensor.register_dpihw = 1200;
+ sensor.black_pixels = 88; // TODO
+ sensor.dummy_pixel = 20;
+ sensor.fau_gain_white_ref = 210;
+ sensor.gain_white_ref = 230;
+ sensor.exposure = { 0x0000, 0x0000, 0x0000 };
+ sensor.exposure_lperiod = 14000;
+ sensor.use_host_side_calib = true;
+ sensor.custom_regs = {
+ { 0x08, 0x00 }, { 0x09, 0x00 }, { 0x0a, 0x00 },
+ { 0x16, 0x27 }, { 0x17, 0x0c }, { 0x18, 0x10 }, { 0x19, 0x2a },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x84 },
+ { 0x52, 0x09 }, { 0x53, 0x0d }, { 0x54, 0x0f }, { 0x55, 0x01 },
+ { 0x56, 0x04 }, { 0x57, 0x07 }, { 0x58, 0x31 }, { 0x59, 0x79 }, { 0x5a, 0xc0 },
+ { 0x70, 0x0a }, { 0x71, 0x0b }, { 0x72, 0x0c }, { 0x73, 0x0d },
+ { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x00 },
+ { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x00 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x00 }, { 0x7d, 0x00 },
+ { 0x87, 0x00 },
+ };
+ sensor.gamma = { 1.0f, 1.0f, 1.0f };
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ ScanMethod method;
+ unsigned register_dpiset;
+ int output_pixel_offset;
+ StaggerConfig stagger_y;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 900 }, ScanMethod::TRANSPARENCY, 150, 15, StaggerConfig{} },
+ { { 1800 }, ScanMethod::TRANSPARENCY, 300, 30, StaggerConfig{} },
+ { { 3600 }, ScanMethod::TRANSPARENCY, 600, 60, StaggerConfig{} },
+ { { 7200 }, ScanMethod::TRANSPARENCY, 1200, 120, StaggerConfig{4, 0} },
+ { { 900 }, ScanMethod::TRANSPARENCY_INFRARED, 150, 15, StaggerConfig{} },
+ { { 1800 }, ScanMethod::TRANSPARENCY_INFRARED, 300, 30, StaggerConfig{} },
+ { { 3600 }, ScanMethod::TRANSPARENCY_INFRARED, 600, 60, StaggerConfig{} },
+ { { 7200 }, ScanMethod::TRANSPARENCY_INFRARED, 1200, 120, StaggerConfig{4, 0} },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.method = setting.method;
+ sensor.shading_resolution = setting.resolutions.values()[0];
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ sensor.stagger_y = setting.stagger_y;
+ s_sensors->push_back(sensor);
+ }
+ }
+
+
+ sensor = Genesys_Sensor();
+ sensor.sensor_id = SensorId::CCD_IMG101; // gl846
sensor.resolutions = { 75, 100, 150, 300, 600, 1200 };
sensor.exposure_lperiod = 11000;
sensor.segment_size = 5136;
sensor.segment_order = {0, 1};
- sensor.optical_res = 1200;
+ sensor.full_resolution = 1200;
sensor.black_pixels = 31;
sensor.dummy_pixel = 31;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10800;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0x0000, 0x0000, 0x0000 };
@@ -3580,21 +3686,47 @@ void genesys_init_sensor_tables()
{ 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
};
sensor.gamma = { 1.7f, 1.7f, 1.7f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
+ GenesysRegisterSettingSet extra_custom_regs;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, Ratio{1, 4}, 8, { { 0x7e, 0x00 } } },
+ { { 100 }, 600, Ratio{1, 4}, 6, { { 0x7e, 0x00 } } },
+ { { 150 }, 600, Ratio{1, 4}, 4, { { 0x7e, 0x00 } } },
+ { { 300 }, 600, Ratio{1, 4}, 2, { { 0x7e, 0x00 } } },
+ { { 600 }, 600, Ratio{1, 4}, 1, { { 0x7e, 0x01 } } },
+ { { 1200 }, 1200, Ratio{1, 2}, 1, { { 0x7e, 0x01 } } },
+ };
+
+ auto base_custom_regs = sensor.custom_regs;
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.shading_resolution = setting.register_dpihw;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.custom_regs = base_custom_regs;
+ sensor.custom_regs.merge(setting.extra_custom_regs);
+ s_sensors->push_back(sensor);
+ }
+ }
+
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICBOOK_3800;
+ sensor.sensor_id = SensorId::CCD_PLUSTEK_OPTICBOOK_3800; // gl845
sensor.resolutions = { 75, 100, 150, 300, 600, 1200 };
sensor.exposure_lperiod = 11000;
- sensor.optical_res = 1200;
+ sensor.full_resolution = 1200;
sensor.black_pixels = 31;
sensor.dummy_pixel = 31;
- sensor.ccd_start_xoffset = 0;
- sensor.sensor_pixels = 10200;
sensor.fau_gain_white_ref = 210;
sensor.gain_white_ref = 200;
sensor.exposure = { 0, 0, 0 };
@@ -3603,66 +3735,150 @@ void genesys_init_sensor_tables()
{ 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x20 }, { 0x1d, 0x06 },
{ 0x52, 0x02 }, { 0x53, 0x04 }, { 0x54, 0x06 }, { 0x55, 0x08 },
{ 0x56, 0x0a }, { 0x57, 0x00 }, { 0x58, 0x59 }, { 0x59, 0x31 }, { 0x5a, 0x40 },
+ { 0x70, 0x01 }, { 0x71, 0x00 }, { 0x72, 0x02 }, { 0x73, 0x01 },
{ 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c },
{ 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f },
- { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 },
+ { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, { 0x7d, 0x20 },
+ { 0x87, 0x02 },
};
sensor.gamma = { 1.7f, 1.7f, 1.7f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned register_dpihw;
+ Ratio pixel_count_ratio;
+ unsigned shading_factor;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, Ratio{1, 2}, 8 },
+ { { 100 }, 600, Ratio{1, 2}, 6 },
+ { { 150 }, 600, Ratio{1, 2}, 4 },
+ { { 300 }, 600, Ratio{1, 2}, 2 },
+ { { 600 }, 600, Ratio{1, 2}, 1 },
+ { { 1200 }, 1200, Ratio{1, 1}, 1 },
+ };
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.register_dpihw = setting.register_dpihw;
+ sensor.register_dpiset = setting.resolutions.values()[0];
+ sensor.shading_resolution = setting.register_dpihw;
+ sensor.pixel_count_ratio = setting.pixel_count_ratio;
+ sensor.shading_factor = setting.shading_factor;
+ s_sensors->push_back(sensor);
+ }
+ }
sensor = Genesys_Sensor();
- sensor.sensor_id = SensorId::CIS_CANON_LIDE_80;
- sensor.optical_res = 1200; // real hardware limit is 2400
- sensor.ccd_size_divisor = 2;
+ sensor.sensor_id = SensorId::CIS_CANON_LIDE_80; // gl841
+ sensor.full_resolution = 1200; // real hardware limit is 2400
+ sensor.register_dpihw = 1200;
sensor.black_pixels = 20;
sensor.dummy_pixel = 6;
- // tuned to give 3*8 multiple startx coordinate during shading calibration
- sensor.ccd_start_xoffset = 34; // 14=>3, 20=>2
- // 10400, too wide=>10288 in shading data 10240~
- // 10208 too short for shading, max shading data = 10240 pixels, endpix-startpix=10208
- sensor.sensor_pixels = 10240;
sensor.fau_gain_white_ref = 150;
sensor.gain_white_ref = 150;
// maps to 0x70-0x73 for GL841
sensor.exposure = { 0x1000, 0x1000, 0x0500 };
sensor.custom_regs = {
- { 0x08, 0x00 },
- { 0x09, 0x05 },
- { 0x0a, 0x07 },
- { 0x0b, 0x09 },
- { 0x16, 0x00 },
- { 0x17, 0x01 },
- { 0x18, 0x00 },
- { 0x19, 0x06 },
- { 0x1a, 0x00 },
- { 0x1b, 0x00 },
- { 0x1c, 0x00 },
- { 0x1d, 0x04 },
- { 0x52, 0x03 },
- { 0x53, 0x07 },
- { 0x54, 0x00 },
- { 0x55, 0x00 },
- { 0x56, 0x00 },
- { 0x57, 0x00 },
- { 0x58, 0x29 },
- { 0x59, 0x69 },
- { 0x5a, 0x55 },
- { 0x5b, 0x00 },
- { 0x5c, 0x00 },
- { 0x5d, 0x20 },
- { 0x5e, 0x41 },
+ { 0x16, 0x00 }, { 0x17, 0x01 }, { 0x18, 0x00 }, { 0x19, 0x06 },
+ { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x04 },
+ { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 },
+ { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x29 }, { 0x59, 0x69 }, { 0x5a, 0x55 },
+ { 0x70, 0x00 }, { 0x71, 0x05 }, { 0x72, 0x07 }, { 0x73, 0x09 },
};
sensor.gamma = { 1.0f, 1.0f, 1.0f };
- sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
- sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
- sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
- s_sensors->push_back(sensor);
+ {
+ struct CustomSensorSettings
+ {
+ ValueFilterAny<unsigned> resolutions;
+ unsigned optical_resolution;
+ unsigned register_dpiset;
+ unsigned shading_resolution;
+ unsigned shading_factor;
+ int output_pixel_offset;
+ };
+
+ CustomSensorSettings custom_settings[] = {
+ { { 75 }, 600, 150, 600, 8, 2 },
+ { { 100 }, 600, 200, 600, 6, 3 },
+ { { 150 }, 600, 300, 600, 4, 4 },
+ { { 200 }, 600, 400, 600, 3, 6 },
+ { { 300 }, 600, 600, 600, 2, 9 },
+ { { 600 }, 600, 1200, 600, 1, 17 },
+ { { 1200 }, 1200, 1200, 1200, 1, 35 },
+ };
+
+ for (const CustomSensorSettings& setting : custom_settings) {
+ sensor.resolutions = setting.resolutions;
+ sensor.optical_resolution = setting.optical_resolution;
+ sensor.register_dpiset = setting.register_dpiset;
+ sensor.shading_resolution = setting.shading_resolution;
+ sensor.shading_factor = setting.shading_factor;
+ sensor.output_pixel_offset = setting.output_pixel_offset;
+ s_sensors->push_back(sensor);
+ }
+ }
+}
+
+void verify_sensor_tables()
+{
+ std::map<SensorId, AsicType> sensor_to_asic;
+ for (const auto& device : *s_usb_devices) {
+ sensor_to_asic[device.model().sensor_id] = device.model().asic_type;
+ }
+ for (const auto& sensor : *s_sensors) {
+ if (sensor_to_asic.count(sensor.sensor_id) == 0) {
+ throw SaneException("Unknown asic for sensor");
+ }
+ auto asic_type = sensor_to_asic[sensor.sensor_id];
+
+ if (sensor.full_resolution == 0) {
+ throw SaneException("full_resolution is not defined");
+ }
+
+ if (sensor.register_dpiset == 0) {
+ throw SaneException("register_dpiset is not defined");
+ }
+
+ if (asic_type != AsicType::GL646) {
+ if (sensor.register_dpihw == 0) {
+ throw SaneException("register_dpihw is not defined");
+ }
+ if (sensor.shading_resolution == 0) {
+ throw SaneException("shading_resolution is not defined");
+ }
+ }
+
+ if (asic_type == AsicType::GL841) {
+ auto required_registers = {
+ 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
+ 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
+ 0x70, 0x71, 0x72, 0x73,
+ };
+ for (auto address : required_registers) {
+ if (!sensor.custom_regs.has_reg(address)) {
+ throw SaneException("Required register is not present");
+ }
+ }
+ }
+
+ if (asic_type == AsicType::GL842) {
+ auto required_registers = {
+ 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1c, 0x1d,
+ 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d,
+ 0x7f
+ };
+ for (auto address : required_registers) {
+ if (!sensor.custom_regs.has_reg(address)) {
+ throw SaneException("Required register is not present");
+ }
+ }
+ }
+ }
}
+
} // namespace genesys