From 0f58159c61b2649fac0f00326a8e632ede40203a Mon Sep 17 00:00:00 2001 From: Frank Zago Date: Fri, 23 Aug 2002 01:14:06 +0000 Subject: [PATCH] Enlarged the gamma table for the VM4542 (1024 entries as opposed to 256 for the previous scanners). --- backend/teco1.c | 222 ++++++++++++++++++++++++------------------------ backend/teco1.h | 15 ++-- 2 files changed, 120 insertions(+), 117 deletions(-) diff --git a/backend/teco1.c b/backend/teco1.c index f35798054..080e1a810 100644 --- a/backend/teco1.c +++ b/backend/teco1.c @@ -48,7 +48,7 @@ /*--------------------------------------------------------------------------*/ -#define BUILD 5 /* 2002/04/21 */ +#define BUILD 6 /* 2002/08/22 */ #define BACKEND_NAME teco1 #define TECO_CONFIG_FILE "teco1.conf" @@ -78,6 +78,14 @@ #include "teco1.h" +#undef sim +#ifdef sim +#define sanei_scsi_cmd2(a, b, c, d, e, f, g) SANE_STATUS_GOOD +#define sanei_scsi_open(a, b, c, d) 0 +#define sanei_scsi_cmd(a, b, c, d, e) SANE_STATUS_GOOD +#define sanei_scsi_close(a) SANE_STATUS_GOOD +#endif + /*--------------------------------------------------------------------------*/ /* Lists of possible scan modes. */ @@ -138,21 +146,24 @@ static const struct scanners_supported scanners[] = { "Relisys", "RELI 2412", {1, 1200, 1}, /* resolution */ 300, 1200, /* max x and Y resolution */ - 1 /* color 1 pass */ + 1, /* color 1 pass */ + 256 /* number of bytes per gamma color */ }, {6, "TECO VM3520", "Relisys", "AVEC Colour Office 2400", {1, 600, 1}, /* resolution */ 300, 600, /* max x and Y resolution */ - 3 /* color 3 pass */ + 3, /* color 3 pass */ + 256 /* number of bytes per gamma color */ }, {6, "TECO VM4542", "Relisys", "RELI 4830", {1, 400, 1}, /* resolution */ 400, 400, /* max x and Y resolution */ - 1 /* color 1 pass */ + 1, /* color 1 pass */ + 1024 /* number of bytes per gamma color */ } }; @@ -377,12 +388,14 @@ teco_identify_scanner (Teco_Scanner * dev) size = dev->buffer[4] + 5; /* total length of the inquiry data */ +#ifndef sim if (size < 53) { DBG (DBG_error, "teco_identify_scanner: not enough data to identify device\n"); return (SANE_FALSE); } +#endif MKSCSI_INQUIRY (cdb, size); status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, @@ -396,6 +409,16 @@ teco_identify_scanner (Teco_Scanner * dev) return (SANE_FALSE); } +#ifdef sim + { + /* vm4542 */ + unsigned char table[] = { + 0x06, 0x00, 0x02, 0x02, 0x30, 0x00, 0x00, 0x10, 0x52, 0x45, 0x4c, 0x49, 0x53, 0x59, 0x53, 0x20, 0x52, 0x45, 0x4c, 0x49, 0x20, 0x34, 0x38, 0x33, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x2e, 0x30, 0x33, 0x31, 0x2e, 0x30, 0x33, 0x02, 0x00, 0x54, 0x45, 0x43, 0x4f, 0x20, 0x56, 0x4d, 0x34, 0x35, 0x34, 0x32 + }; + memcpy (dev->buffer, table, sizeof (table)); + } +#endif + hexdump (DBG_info2, "inquiry", dev->buffer, size); dev->scsi_type = dev->buffer[0] & 0x1f; @@ -722,6 +745,7 @@ teco_scan (Teco_Scanner * dev) return status; } +#if 0 /* Do some vendor specific stuff. */ static SANE_Status teco_vendor_spec (Teco_Scanner * dev) @@ -759,44 +783,14 @@ teco_vendor_spec (Teco_Scanner * dev) return status; } +#endif -/* A default gamma table. */ -static const SANE_Word gamma_init[GAMMA_LENGTH] = { - 0x00, 0x06, 0x0A, 0x0D, 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F, - 0x21, 0x23, 0x25, 0x27, - 0x28, 0x2A, 0x2C, 0x2D, 0x2F, 0x30, 0x32, 0x33, 0x35, 0x36, 0x38, 0x39, - 0x3A, 0x3C, 0x3D, 0x3F, - 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4A, 0x4B, 0x4D, 0x4E, - 0x4F, 0x50, 0x51, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, - 0x61, 0x62, 0x63, 0x64, - 0x65, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, - 0x72, 0x73, 0x74, 0x75, - 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, - 0x81, 0x82, 0x83, 0x84, - 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, - 0x90, 0x91, 0x92, 0x92, - 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, - 0x9E, 0x9F, 0x9F, 0xA0, - 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xA9, 0xAA, - 0xAB, 0xAC, 0xAD, 0xAD, - 0xAE, 0xAF, 0xB0, 0xB1, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB5, 0xB6, 0xB7, - 0xB8, 0xB9, 0xB9, 0xBA, - 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC0, 0xC1, 0xC2, 0xC3, 0xC3, - 0xC4, 0xC5, 0xC6, 0xC6, - 0xC7, 0xC8, 0xC9, 0xC9, 0xCA, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCF, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD2, - 0xD3, 0xD4, 0xD5, 0xD5, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xDA, 0xDA, 0xDB, - 0xDC, 0xDC, 0xDD, 0xDE, - 0xDF, 0xDF, 0xE0, 0xE1, 0xE1, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE6, 0xE6, - 0xE7, 0xE8, 0xE8, 0xE9, - 0xEA, 0xEB, 0xEB, 0xEC, 0xED, 0xED, 0xEE, 0xEF, 0xEF, 0xF0, 0xF1, 0xF1, - 0xF2, 0xF3, 0xF4, 0xF4, - 0xF5, 0xF6, 0xF6, 0xF7, 0xF8, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFC, - 0xFD, 0xFE, 0xFE, 0xFF -}; - -/* Send the gamma */ +/* Send the gamma + * The order is RGB. The last color is unused. + * G is also the gray gamma (if gray scan). + * + * Some scanner have 4 tables of 256 bytes, and some 4 tables of 1024 bytes. + */ static SANE_Status teco_send_gamma (Teco_Scanner * dev) { @@ -804,10 +798,7 @@ teco_send_gamma (Teco_Scanner * dev) SANE_Status status; struct { - unsigned char gamma_R[GAMMA_LENGTH]; - unsigned char gamma_G[GAMMA_LENGTH]; /* also gray */ - unsigned char gamma_B[GAMMA_LENGTH]; - unsigned char gamma_unused[GAMMA_LENGTH]; + unsigned char gamma[4* MAX_GAMMA_LENGTH]; } param; size_t i; @@ -815,17 +806,9 @@ teco_send_gamma (Teco_Scanner * dev) DBG (DBG_proc, "teco_send_gamma: enter\n"); - size = sizeof (param); - assert (size == 4 * GAMMA_LENGTH); + size = 4 * GAMMA_LENGTH; MKSCSI_SEND_10 (cdb, 0x03, 0x02, size); -#if 0 - for (i = 0; i < size; i++) - { - gamma[i] = i & 0xff; - } -#endif - if (dev->val[OPT_CUSTOM_GAMMA].w) { /* Use the custom gamma. */ @@ -834,10 +817,10 @@ teco_send_gamma (Teco_Scanner * dev) /* Gray */ for (i = 0; i < GAMMA_LENGTH; i++) { - param.gamma_R[i] = 0; - param.gamma_G[i] = dev->gamma_GRAY[i]; - param.gamma_B[i] = 0; - param.gamma_unused[i] = 0; + param.gamma[0 * GAMMA_LENGTH + i] = 0; + param.gamma[1 * GAMMA_LENGTH + i] = dev->gamma_GRAY[i]; + param.gamma[2 * GAMMA_LENGTH + i] = 0; + param.gamma[3 * GAMMA_LENGTH + i] = 0; } } else @@ -845,21 +828,27 @@ teco_send_gamma (Teco_Scanner * dev) /* Color */ for (i = 0; i < GAMMA_LENGTH; i++) { - param.gamma_R[i] = dev->gamma_R[i]; - param.gamma_G[i] = dev->gamma_G[i]; - param.gamma_B[i] = dev->gamma_B[i]; - param.gamma_unused[i] = 0; + param.gamma[0 * GAMMA_LENGTH + i] = dev->gamma_R[i]; + param.gamma[1 * GAMMA_LENGTH + i] = dev->gamma_G[i]; + param.gamma[2 * GAMMA_LENGTH + i] = dev->gamma_B[i]; + param.gamma[3 * GAMMA_LENGTH + i] = 0; } } } else { + /* + * Shift is 1 for GAMMA_LENGTH == 256 + * and 4 for GAMMA_LENGTH == 1024 + */ + int shift = GAMMA_LENGTH >> 8; + for (i = 0; i < GAMMA_LENGTH; i++) { - param.gamma_R[i] = gamma_init[i]; - param.gamma_G[i] = gamma_init[i]; - param.gamma_B[i] = gamma_init[i]; - param.gamma_unused[i] = 0; + param.gamma[0 * GAMMA_LENGTH + i] = i / shift; + param.gamma[1 * GAMMA_LENGTH + i] = i / shift; + param.gamma[2 * GAMMA_LENGTH + i] = i / shift; + param.gamma[3 * GAMMA_LENGTH + i] = 0; } } @@ -1460,59 +1449,70 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) SANE_Status sane_open (SANE_String_Const devicename, SANE_Handle * handle) { - Teco_Scanner *dev; - SANE_Status status; + Teco_Scanner *dev; + SANE_Status status; - DBG (DBG_proc, "sane_open: enter\n"); + DBG (DBG_proc, "sane_open: enter\n"); - /* search for devicename */ - if (devicename[0]) - { - DBG (DBG_info, "sane_open: devicename=%s\n", devicename); + /* search for devicename */ + if (devicename[0]) + { + DBG (DBG_info, "sane_open: devicename=%s\n", devicename); - for (dev = first_dev; dev; dev = dev->next) + for (dev = first_dev; dev; dev = dev->next) + { + if (strcmp (dev->sane.name, devicename) == 0) + { + break; + } + } + + if (!dev) + { + status = attach_scanner (devicename, &dev); + if (status != SANE_STATUS_GOOD) + { + return status; + } + } + } + else + { + DBG (DBG_sane_info, "sane_open: no devicename, opening first device\n"); + dev = first_dev; /* empty devicename -> use first device */ + } + + if (!dev) + { + DBG (DBG_error, "No scanner found\n"); + + return SANE_STATUS_INVAL; + } + + teco_init_options (dev); + + /* Initialize the gamma table. */ { - if (strcmp (dev->sane.name, devicename) == 0) - { - break; - } + /* + * Shift is 1 for GAMMA_LENGTH == 256 + * and 4 for GAMMA_LENGTH == 1024 + */ + int shift = GAMMA_LENGTH >> 8; + size_t i; + + for (i = 0; i < GAMMA_LENGTH; i++) { + dev->gamma_R[i] = i / shift; + dev->gamma_G[i] = i / shift; + dev->gamma_B[i] = i / shift; + dev->gamma_GRAY[i] = i / shift; + } } - if (!dev) - { - status = attach_scanner (devicename, &dev); - if (status != SANE_STATUS_GOOD) - { - return status; - } - } - } - else - { - DBG (DBG_sane_info, "sane_open: no devicename, opening first device\n"); - dev = first_dev; /* empty devicename -> use first device */ - } + *handle = dev; - if (!dev) - { - DBG (DBG_error, "No scanner found\n"); + DBG (DBG_proc, "sane_open: exit\n"); - return SANE_STATUS_INVAL; - } - - teco_init_options (dev); - - /* Initialize the gamma table. */ - memcpy (dev->gamma_R, gamma_init, dev->opt[OPT_GAMMA_VECTOR_R].size); - memcpy (dev->gamma_G, gamma_init, dev->opt[OPT_GAMMA_VECTOR_G].size); - memcpy (dev->gamma_B, gamma_init, dev->opt[OPT_GAMMA_VECTOR_B].size); - memcpy (dev->gamma_GRAY, gamma_init, dev->opt[OPT_GAMMA_VECTOR_GRAY].size); - - *handle = dev; - - DBG (DBG_proc, "sane_open: exit\n"); - - return SANE_STATUS_GOOD; + return SANE_STATUS_GOOD; } const SANE_Option_Descriptor * diff --git a/backend/teco1.h b/backend/teco1.h index aa71da021..cb3cc0d3d 100644 --- a/backend/teco1.h +++ b/backend/teco1.h @@ -220,8 +220,8 @@ getbitfield (unsigned char *pageaddr, int mask, int shift) /*--------------------------------------------------------------------------*/ -#define GAMMA_LENGTH 0x100 /* number of value per color */ - +#define MAX_GAMMA_LENGTH 0x400 /* maximum number of value per color */ +#define GAMMA_LENGTH (dev->def->num_gamma_color) /* number of value per color */ /*--------------------------------------------------------------------------*/ enum Teco_Option @@ -277,6 +277,9 @@ struct scanners_supported int y_resolution_max; /* maximum Y dpi */ int pass; /* number of passes in color mode */ + + size_t num_gamma_color; /* number of value per color */ + }; /*--------------------------------------------------------------------------*/ @@ -348,10 +351,10 @@ typedef struct Teco_Scanner Option_Value val[OPT_NUM_OPTIONS]; /* Gamma table. 1 array per colour. */ - SANE_Word gamma_GRAY[GAMMA_LENGTH]; - SANE_Word gamma_R[GAMMA_LENGTH]; - SANE_Word gamma_G[GAMMA_LENGTH]; - SANE_Word gamma_B[GAMMA_LENGTH]; + SANE_Word gamma_GRAY[MAX_GAMMA_LENGTH]; + SANE_Word gamma_R[MAX_GAMMA_LENGTH]; + SANE_Word gamma_G[MAX_GAMMA_LENGTH]; + SANE_Word gamma_B[MAX_GAMMA_LENGTH]; } Teco_Scanner;