From b05ca3c3f3a62d74d4409392bab7ebc76a7ae8e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Fri, 23 Sep 2011 20:02:54 +0200 Subject: [PATCH] move specific gl843 shading function to genesys_gl843.c --- backend/genesys.c | 89 +++++------------------------------------ backend/genesys_gl843.c | 66 +++++++++++++++++++++++++++++- backend/genesys_low.h | 5 +++ 3 files changed, 79 insertions(+), 81 deletions(-) diff --git a/backend/genesys.c b/backend/genesys.c index 7d12d5798..8d95e5321 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -2543,80 +2543,6 @@ compute_averaged_planar (Genesys_Device * dev, } } } -#ifndef UNIT_TESTING -static -#endif -int -compute_gl843_coefficients (Genesys_Device * dev, - uint8_t ** shading_data, - unsigned int pixels, - unsigned int coeff, - unsigned int target) -{ - uint16_t *buffer = (uint16_t *) * shading_data, *darkptr, *whiteptr; - int size; - unsigned int i, count; - uint16_t val; - - darkptr = (uint16_t *) dev->dark_average_data; - whiteptr = (uint16_t *) dev->white_average_data; - - size = (pixels * 2 * 3 * 256) / 252 * 2 + 512; - DBG (DBG_io, "%s: final shading size=%04x\n", __FUNCTION__, size); - *shading_data = (uint8_t *) malloc (size); - if (*shading_data == NULL) - return 0; - - memset(*shading_data,0,size); - - /* offset */ - buffer = (uint16_t *)*shading_data; - count = 0; - - /* loop over calibration data to build shading coefficients */ - for (i = 0; i < pixels; i++) - { - /* red */ - *buffer = darkptr[3 * i]; - buffer++; - count++; - val = - compute_coefficient (coeff, target, whiteptr[3 * i] - darkptr[3 * i]); - *buffer = val; - buffer++; - count++; - - /* green */ - *buffer = darkptr[3 * i + 1]; - buffer++; - count++; - val = - compute_coefficient (coeff, target, - whiteptr[3 * i + 1] - darkptr[3 * i + 1]); - *buffer = val; - buffer++; - count++; - - /* blue */ - *buffer = darkptr[3 * i + 2]; - buffer++; - count++; - val = - compute_coefficient (coeff, target, - whiteptr[3 * i + 2] - darkptr[3 * i + 2]); - *buffer = val; - buffer++; - count++; - - if ((count % 256) == 252) - { - buffer += 4; - count += 4; - } - } - - return size; -} /** * Computes shading coefficient using formula in data sheet. 16bit data values @@ -3060,12 +2986,15 @@ genesys_send_shading_coefficient (Genesys_Device * dev) case CCD_KVSS080: case CCD_G4050: target_code = 0xf000; - free(shading_data); - length=compute_gl843_coefficients (dev, - &shading_data, - pixels_per_line, - coeff, - target_code); + o = 0; + compute_coefficients (dev, + shading_data, + pixels_per_line, + 3, + cmat, + o, + coeff, + target_code); break; case CIS_CANONLIDE100: case CIS_CANONLIDE200: diff --git a/backend/genesys_gl843.c b/backend/genesys_gl843.c index 80873384a..eb6f9c838 100644 --- a/backend/genesys_gl843.c +++ b/backend/genesys_gl843.c @@ -4049,6 +4049,70 @@ gl843_search_strip (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black) return status; } +/** + * Send shading calibration data. The buffer is considered to always hold values + * for all the channels. + */ +#ifndef UNIT_TESTING +static +#endif +SANE_Status +gl843_send_shading_data (Genesys_Device * dev, uint8_t * data, int size) +{ + SANE_Status status; + int final_size; + uint8_t *final_data; + uint8_t *buffer; + int i,count; + + DBGSTART; + + /* compute and allocate size for final data */ + final_size = (size / 252) * 256 + 512; + DBG (DBG_io, "%s: final shading size=%04x\n", __FUNCTION__, final_size); + final_data = (uint8_t *) malloc (final_size); + if(final_data==NULL) + { + DBG (DBG_error, "%s: failed to allocate memory for shding data\n", __FUNCTION__); + return SANE_STATUS_NO_MEM; + } + + /* copy regular shading data to the expected layout */ + buffer = final_data; + count = 0; + + /* loop over calibration data */ + for (i = 0; i < size; i++) + { + buffer[count] = data[i]; + count++; + if ((count % (256*2)) == (252*2)) + { + count += 4*2; + } + } + + /* send data */ + status = sanei_genesys_set_buffer_address (dev, 0); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, "%s: failed to set buffer address: %s\n", __FUNCTION__, sane_strstatus (status)); + free(final_data); + return status; + } + + status = dev->model->cmd_set->bulk_write_data (dev, 0x3c, final_data, final_size); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, "%s: failed to send shading table: %s\n", __FUNCTION__, sane_strstatus (status)); + } + + free(final_data); + DBGCOMPLETED; + return status; +} + + /** the gl843 command set */ static Genesys_Command_Set gl843_cmd_set = { "gl843-generic", /* the name of this set */ @@ -4102,7 +4166,7 @@ static Genesys_Command_Set gl843_cmd_set = { sanei_genesys_is_compatible_calibration, NULL, - NULL, /* gl843_send_shading_data */ + gl843_send_shading_data, gl843_calculate_current_setup }; diff --git a/backend/genesys_low.h b/backend/genesys_low.h index e957b00fe..a7e6e0db8 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -612,6 +612,11 @@ struct Genesys_Calibration_Cache struct Genesys_Calibration_Cache *next; }; +/** + * Describes the current device status for the backend + * session. This should be more accurately called + * Genesys_Session . + */ struct Genesys_Device { SANE_Int dn;