summaryrefslogtreecommitdiff
path: root/backend/genesys/low.cpp
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff.email>2023-02-12 17:35:53 +0100
committerJörg Frings-Fürst <debian@jff.email>2023-02-12 17:35:53 +0100
commit84357741a6a6e6430f199b2c3f7498e0e97da9ad (patch)
tree23e8d66ede9506b94c76fb36910ca3c7dd15c74e /backend/genesys/low.cpp
parent302276dc1b90cfc972fb726ca94a23b18f4b0088 (diff)
New upstream version 1.2.1upstream/1.2.1
Diffstat (limited to 'backend/genesys/low.cpp')
-rw-r--r--backend/genesys/low.cpp110
1 files changed, 52 insertions, 58 deletions
diff --git a/backend/genesys/low.cpp b/backend/genesys/low.cpp
index a6da2c1..3ffc24a 100644
--- a/backend/genesys/low.cpp
+++ b/backend/genesys/low.cpp
@@ -106,7 +106,7 @@ unsigned sanei_genesys_get_bulk_max_size(AsicType asic_type)
}
// Set address for writing data
-void sanei_genesys_set_buffer_address(Genesys_Device* dev, uint32_t addr)
+void sanei_genesys_set_buffer_address(Genesys_Device* dev, std::uint32_t addr)
{
DBG_HELPER(dbg);
@@ -356,12 +356,12 @@ void wait_until_has_valid_words(Genesys_Device* dev)
}
// Read data (e.g scanned image) from scan buffer
-void sanei_genesys_read_data_from_scanner(Genesys_Device* dev, uint8_t* data, size_t size)
+void sanei_genesys_read_data_from_scanner(Genesys_Device* dev, std::uint8_t* data, size_t size)
{
DBG_HELPER_ARGS(dbg, "size = %zu bytes", size);
- if (size & 1)
- DBG(DBG_info, "WARNING %s: odd number of bytes\n", __func__);
+ if (size & 1)
+ DBG(DBG_info, "WARNING %s: odd number of bytes\n", __func__);
wait_until_has_valid_words(dev);
@@ -565,7 +565,7 @@ void sanei_genesys_read_feed_steps(Genesys_Device* dev, unsigned int* steps)
void sanei_genesys_set_lamp_power(Genesys_Device* dev, const Genesys_Sensor& sensor,
Genesys_Register_Set& regs, bool set)
{
- static const uint8_t REG_0x03_LAMPPWR = 0x10;
+ static const std::uint8_t REG_0x03_LAMPPWR = 0x10;
if (set) {
regs.find_reg(0x03).value |= REG_0x03_LAMPPWR;
@@ -606,7 +606,7 @@ void sanei_genesys_set_lamp_power(Genesys_Device* dev, const Genesys_Sensor& sen
void sanei_genesys_set_motor_power(Genesys_Register_Set& regs, bool set)
{
- static const uint8_t REG_0x02_MTRPWR = 0x10;
+ static const std::uint8_t REG_0x02_MTRPWR = 0x10;
if (set) {
regs.find_reg(0x02).value |= REG_0x02_MTRPWR;
@@ -635,13 +635,13 @@ bool should_enable_gamma(const ScanSession& session, const Genesys_Sensor& senso
return true;
}
-std::vector<uint16_t> get_gamma_table(Genesys_Device* dev, const Genesys_Sensor& sensor,
- int color)
+std::vector<std::uint16_t> get_gamma_table(Genesys_Device* dev, const Genesys_Sensor& sensor,
+ int color)
{
if (!dev->gamma_override_tables[color].empty()) {
return dev->gamma_override_tables[color];
} else {
- std::vector<uint16_t> ret;
+ std::vector<std::uint16_t> ret;
sanei_genesys_create_default_gamma_table(dev, ret, sensor.gamma[color]);
return ret;
}
@@ -654,23 +654,38 @@ std::vector<uint16_t> get_gamma_table(Genesys_Device* dev, const Genesys_Sensor&
* @param bits number of bits used by gamma
* @param max value for gamma
* @param size of the gamma table
- * @param gamma allocated gamma buffer to fill
*/
-void sanei_genesys_generate_gamma_buffer(Genesys_Device* dev,
+std::vector<std::uint8_t> generate_gamma_buffer(Genesys_Device* dev,
const Genesys_Sensor& sensor,
- int bits,
- int max,
- int size,
- uint8_t* gamma)
+ int bits, int max, int size)
{
DBG_HELPER(dbg);
- std::vector<uint16_t> rgamma = get_gamma_table(dev, sensor, GENESYS_RED);
- std::vector<uint16_t> ggamma = get_gamma_table(dev, sensor, GENESYS_GREEN);
- std::vector<uint16_t> bgamma = get_gamma_table(dev, sensor, GENESYS_BLUE);
+
+ // the gamma tables are 16 bits words and contain 3 channels
+ std::vector<std::uint8_t> gamma_buf(size * 2 * 3);
+
+ std::vector<std::uint16_t> rgamma = get_gamma_table(dev, sensor, GENESYS_RED);
+ std::vector<std::uint16_t> ggamma = get_gamma_table(dev, sensor, GENESYS_GREEN);
+ std::vector<std::uint16_t> bgamma = get_gamma_table(dev, sensor, GENESYS_BLUE);
+
+ auto get_gamma_value = [](const std::vector<std::uint16_t>& array,
+ std::size_t index) -> std::uint16_t
+ {
+ if (index < array.size())
+ return array[index];
+ return 0xffff;
+ };
+
+ auto set_gamma_buf_value = [](std::vector<std::uint8_t>& array, std::size_t pos,
+ std::uint16_t value)
+ {
+ array[pos * 2 + 0] = value & 0xff;
+ array[pos * 2 + 1] = (value >> 8) & 0xff;
+ };
if(dev->settings.contrast!=0 || dev->settings.brightness!=0)
{
- std::vector<uint16_t> lut(65536);
+ std::vector<std::uint16_t> lut(65536);
sanei_genesys_load_lut(reinterpret_cast<unsigned char *>(lut.data()),
bits,
bits,
@@ -680,39 +695,21 @@ void sanei_genesys_generate_gamma_buffer(Genesys_Device* dev,
dev->settings.brightness);
for (int i = 0; i < size; i++)
{
- uint16_t value=rgamma[i];
- value=lut[value];
- gamma[i * 2 + size * 0 + 0] = value & 0xff;
- gamma[i * 2 + size * 0 + 1] = (value >> 8) & 0xff;
-
- value=ggamma[i];
- value=lut[value];
- gamma[i * 2 + size * 2 + 0] = value & 0xff;
- gamma[i * 2 + size * 2 + 1] = (value >> 8) & 0xff;
-
- value=bgamma[i];
- value=lut[value];
- gamma[i * 2 + size * 4 + 0] = value & 0xff;
- gamma[i * 2 + size * 4 + 1] = (value >> 8) & 0xff;
+ set_gamma_buf_value(gamma_buf, i + size * 0, lut[get_gamma_value(rgamma, i)]);
+ set_gamma_buf_value(gamma_buf, i + size * 1, lut[get_gamma_value(ggamma, i)]);
+ set_gamma_buf_value(gamma_buf, i + size * 2, lut[get_gamma_value(bgamma, i)]);
}
}
else
{
for (int i = 0; i < size; i++)
{
- uint16_t value=rgamma[i];
- gamma[i * 2 + size * 0 + 0] = value & 0xff;
- gamma[i * 2 + size * 0 + 1] = (value >> 8) & 0xff;
-
- value=ggamma[i];
- gamma[i * 2 + size * 2 + 0] = value & 0xff;
- gamma[i * 2 + size * 2 + 1] = (value >> 8) & 0xff;
-
- value=bgamma[i];
- gamma[i * 2 + size * 4 + 0] = value & 0xff;
- gamma[i * 2 + size * 4 + 1] = (value >> 8) & 0xff;
+ set_gamma_buf_value(gamma_buf, i + size * 0, get_gamma_value(rgamma, i));
+ set_gamma_buf_value(gamma_buf, i + size * 1, get_gamma_value(ggamma, i));
+ set_gamma_buf_value(gamma_buf, i + size * 2, get_gamma_value(bgamma, i));
}
}
+ return gamma_buf;
}
@@ -730,15 +727,12 @@ void sanei_genesys_send_gamma_table(Genesys_Device* dev, const Genesys_Sensor& s
size = 256 + 1;
- /* allocate temporary gamma tables: 16 bits words, 3 channels */
- std::vector<uint8_t> gamma(size * 2 * 3, 255);
-
- sanei_genesys_generate_gamma_buffer(dev, sensor, 16, 65535, size, gamma.data());
+ auto gamma = generate_gamma_buffer(dev, sensor, 16, 65535, size);
// loop sending gamma tables NOTE: 0x01000000 not 0x10000000
for (i = 0; i < 3; i++) {
// clear corresponding GMM_N bit
- uint8_t val = dev->interface->read_register(0xbd);
+ std::uint8_t val = dev->interface->read_register(0xbd);
val &= ~(0x01 << i);
dev->interface->write_register(0xbd, val);
@@ -1410,7 +1404,7 @@ void sanei_genesys_asic_init(Genesys_Device* dev)
{
DBG_HELPER(dbg);
- uint8_t val;
+ std::uint8_t val;
bool cold = true;
// URB 16 control 0xc0 0x0c 0x8e 0x0b len 1 read 0x00 */
@@ -1507,13 +1501,13 @@ void scanner_start_action(Genesys_Device& dev, bool start_motor)
void sanei_genesys_set_dpihw(Genesys_Register_Set& regs, unsigned dpihw)
{
// same across GL646, GL841, GL843, GL846, GL847, GL124
- const uint8_t REG_0x05_DPIHW_MASK = 0xc0;
- const uint8_t REG_0x05_DPIHW_600 = 0x00;
- const uint8_t REG_0x05_DPIHW_1200 = 0x40;
- const uint8_t REG_0x05_DPIHW_2400 = 0x80;
- const uint8_t REG_0x05_DPIHW_4800 = 0xc0;
+ const std::uint8_t REG_0x05_DPIHW_MASK = 0xc0;
+ const std::uint8_t REG_0x05_DPIHW_600 = 0x00;
+ const std::uint8_t REG_0x05_DPIHW_1200 = 0x40;
+ const std::uint8_t REG_0x05_DPIHW_2400 = 0x80;
+ const std::uint8_t REG_0x05_DPIHW_4800 = 0xc0;
- uint8_t dpihw_setting;
+ std::uint8_t dpihw_setting;
switch (dpihw) {
case 600:
dpihw_setting = REG_0x05_DPIHW_600;
@@ -1925,8 +1919,8 @@ void sanei_genesys_load_lut(unsigned char* lut,
double shift, rise;
int max_in_val = (1 << in_bits) - 1;
int max_out_val = (1 << out_bits) - 1;
- uint8_t *lut_p8 = lut;
- uint16_t* lut_p16 = reinterpret_cast<std::uint16_t*>(lut);
+ std::uint8_t* lut_p8 = lut;
+ std::uint16_t* lut_p16 = reinterpret_cast<std::uint16_t*>(lut);
/* slope is converted to rise per unit run:
* first [-127,127] to [-.999,.999]