scan alignment troubles

merge-requests/1/head
Stphane Voltz 2010-05-24 06:41:27 +02:00
rodzic a78b0edee7
commit 7cd2ed8ac9
2 zmienionych plików z 39 dodań i 56 usunięć

Wyświetl plik

@ -430,8 +430,8 @@ static Genesys_Sensor Sensor[] = {
{CIS_CANONLIDE100,
1200, /* optical resolution */
87, /* black pixels */
16, /* dummy pixels */
0,
16, /* dummy pixels 16 */
303,
10272, /* 10272 */
210,
200,
@ -788,7 +788,8 @@ static Genesys_Motor Motor[] = {
{ /* power mode 0 */
{ 2343, 1017, 128, 0.80}, /* full step */
{ 4678, 2034, 64, 0.80}, /* half step */
{ 4*2034, 4*2034, 32, 0.80}, /* quarter step */
{ 4*2034, 4*2034, 32, 0.80}, /* quarter step 0.75*2712 */
/*{ 4*2034, 4*2034, 32, 0.80}, quarter step */
/* extra values kept for documentation
{ 2343, 864, 32, 0.80}, full step
{ 2*1171, 2*648, 32, 0.80}, half step */
@ -935,7 +936,7 @@ static Genesys_Model canon_lide_100_model = {
{16, 8, 0}, /* possible depths in gray mode */
{16, 8, 0}, /* possible depths in color mode */
SANE_FIX (6.0), /* Start of scan area in mm (x) 6.95 */
SANE_FIX (0.0), /* Start of scan area in mm (x) 6.95 */
SANE_FIX (30.0), /* Start of scan area in mm (y) */
SANE_FIX (216.07), /* Size of scan area in mm (x) */
SANE_FIX (299.0), /* Size of scan area in mm (y) */
@ -972,7 +973,7 @@ static Genesys_Model canon_lide_100_model = {
| GENESYS_FLAG_DARK_CALIBRATION
| GENESYS_FLAG_CUSTOM_GAMMA,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW,
150,
50,
400
};

Wyświetl plik

@ -461,9 +461,9 @@ gl847_init_registers (Genesys_Device * dev)
SETREG (0x14, 0x00);
SETREG (0x15, 0x00);
SETREG (0x16, 0x10);
SETREG (0x17, 0x0c);
SETREG (0x17, 0x08);
SETREG (0x18, 0x00);
SETREG (0x19, 0xff);
SETREG (0x19, 0x50);
SETREG (0x1a, 0x34);
SETREG (0x1b, 0x00);
SETREG (0x1c, 0x02);
@ -1416,7 +1416,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
SANE_Bool half_ccd, int color_filter, int flags)
{
unsigned int words_per_line;
unsigned int end, used_pixels;
unsigned int startx,endx, used_pixels;
unsigned int dpiset;
unsigned int i;
Genesys_Register_Set *r;
@ -1428,6 +1428,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
exposure_time,
used_res, start, pixels, channels, depth, half_ccd, flags);
startx = dev->sensor.dummy_pixel + 1 + dev->sensor.CCD_start_xoffset - 32;
if(pixels<dev->sensor.sensor_pixels)
{
used_pixels = dev->sensor.sensor_pixels;
@ -1436,7 +1437,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
{
used_pixels = pixels;
}
end = start + used_pixels;
endx = startx + used_pixels;
status = gl847_set_fe (dev, AFE_SET);
if (status != SANE_STATUS_GOOD)
@ -1456,11 +1457,14 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
r->value &= ~(REG01_SCAN | REG01_SHDAREA);
if ((flags & OPTICAL_FLAG_DISABLE_SHADING) ||
(dev->model->flags & GENESYS_FLAG_NO_CALIBRATION))
r->value &= ~REG01_DVDSET;
{
r->value &= ~REG01_DVDSET;
}
else
{
r->value |= REG01_DVDSET | REG01_SHDAREA;
r->value |= REG01_DVDSET;
}
r->value &= ~REG01_DVDSET; /* XXX STEF XXX */
/* average looks better than deletion, and we are already set up to
use one of the average enabled resolutions */
@ -1556,13 +1560,13 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
DBG (DBG_io2, "%s: dpiset used=%d\n", __FUNCTION__, dpiset);
r = sanei_genesys_get_address (reg, 0x30);
r->value = HIBYTE (start);
r->value = HIBYTE (startx);
r = sanei_genesys_get_address (reg, 0x31);
r->value = LOBYTE (start);
r->value = LOBYTE (startx);
r = sanei_genesys_get_address (reg, 0x32);
r->value = HIBYTE (end);
r->value = HIBYTE (endx);
r = sanei_genesys_get_address (reg, 0x33);
r->value = LOBYTE (end);
r->value = LOBYTE (endx);
/* words(16bit) before gamma, conversion to 8 bit or lineart*/
words_per_line = (used_pixels * dpiset) / gl847_get_dpihw (dev);
@ -1604,13 +1608,13 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
r = sanei_genesys_get_address (reg, 0x34);
r->value = dev->sensor.dummy_pixel;
/* XXX STEF XXX */
/* XXX STEF XXX
r = sanei_genesys_get_address (reg, 0x1d);
i = 2*r->value;
r = sanei_genesys_get_address (reg, 0x17);
i += r->value;
r = sanei_genesys_get_address (reg, 0x34);
r->value = i;
r->value = i; */
DBG (DBG_proc, "gl847_init_optical_regs_scan : completed. \n");
return SANE_STATUS_GOOD;
@ -1768,18 +1772,11 @@ independent of our calculated values:
used_res = optical_res / 15;
/* compute scan parameters values */
/* pixels are allways given at half or full CCD optical resolution */
/* use detected left margin and fixed value */
/* pixels are allways given at full optical resolution */
/* use detected left margin and fixed value */
/* start */
/* add x coordinates */
start =
((dev->sensor.CCD_start_xoffset + startx) * used_res) /
dev->sensor.optical_res;
/* needs to be aligned for used_res */
start = (start * optical_res) / used_res;
start += dev->sensor.dummy_pixel + 1;
start = startx;
if (stagger > 0)
start |= 1;
@ -2063,22 +2060,20 @@ gl847_calculate_current_setup (Genesys_Device * dev)
dev->settings.yres, dev->settings.lines, dev->settings.pixels,
dev->settings.tl_x, dev->settings.tl_y, dev->settings.scan_mode);
/* channels */
/* channels */
if (dev->settings.scan_mode == 4) /* single pass color */
channels = 3;
else
channels = 1;
/* depth */
/* depth */
depth = dev->settings.depth;
if (dev->settings.scan_mode == 0)
depth = 1;
/* start */
/* start */
start = SANE_UNFIX (dev->model->x_offset);
start += dev->settings.tl_x;
start = (start * dev->sensor.optical_res) / MM_PER_INCH;
@ -2155,19 +2150,6 @@ gl847_calculate_current_setup (Genesys_Device * dev)
/* compute scan parameters values */
/* pixels are allways given at half or full CCD optical resolution */
/* use detected left margin and fixed value */
/* start */
/* add x coordinates */
start =
((dev->sensor.CCD_start_xoffset + startx) * used_res) /
dev->sensor.optical_res;
/* needs to be aligned for used_res */
start = (start * optical_res) / used_res;
start += dev->sensor.dummy_pixel + 1;
if (stagger > 0)
start |= 1;
/* compute correct pixels number */
/* pixels */
@ -2924,7 +2906,7 @@ gl847_feed (Genesys_Device * dev, int steps)
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_feed: Failed to stop action: %s\n",
"gl847_feed: failed to stop action: %s\n",
sane_strstatus (status));
return status;
}
@ -2942,7 +2924,7 @@ gl847_feed (Genesys_Device * dev, int steps)
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_feed: Failed to bulk write registers: %s\n",
"gl847_feed: failed to bulk write registers: %s\n",
sane_strstatus (status));
return status;
}
@ -2951,7 +2933,7 @@ gl847_feed (Genesys_Device * dev, int steps)
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_feed: Failed to start motor: %s\n",
"gl847_feed: failed to start motor: %s\n",
sane_strstatus (status));
gl847_stop_action (dev);
/* send original registers */
@ -2966,7 +2948,7 @@ gl847_feed (Genesys_Device * dev, int steps)
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"gl847_feed: Failed to read home sensor: %s\n",
"gl847_feed: failed to read home sensor: %s\n",
sane_strstatus (status));
return status;
}
@ -2985,7 +2967,7 @@ gl847_feed (Genesys_Device * dev, int steps)
gl847_stop_action (dev);
DBG (DBG_error,
"gl847_feed: timeout while waiting for scanhead to go home\n");
"gl847_feed: timeout while feeding\n");
return SANE_STATUS_IO_ERROR;
}
@ -3341,8 +3323,7 @@ gl847_init_regs_for_shading (Genesys_Device * dev)
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
/* we don't handle differing shading areas very well */
/* SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |*/
SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |
SCAN_FLAG_IGNORE_LINE_DISTANCE |
SCAN_FLAG_USE_OPTICAL_RES);
@ -3655,7 +3636,7 @@ gl847_led_calibration (Genesys_Device * dev)
int i, j;
SANE_Status status = SANE_STATUS_GOOD;
int val;
int channels;
int channels, depth;
int avg[3], avga, avge;
int turn;
char fn[20];
@ -3668,6 +3649,7 @@ gl847_led_calibration (Genesys_Device * dev)
/* offset calibration is always done in color mode */
channels = 3;
depth=16;
/* initial calibration reg values */
memcpy (dev->calib_reg, dev->reg,
@ -3683,7 +3665,7 @@ gl847_led_calibration (Genesys_Device * dev)
dev->settings.xres) /
dev->sensor.optical_res,
1,
16,
depth,
channels,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
@ -3706,7 +3688,7 @@ gl847_led_calibration (Genesys_Device * dev)
used_res = dev->current_setup.xres;
num_pixels = dev->current_setup.pixels;
total_size = num_pixels * channels * 2 * 1; /* colors * bytes_per_color * scan lines */
total_size = num_pixels * channels * (depth/8) * 1; /* colors * bytes_per_color * scan lines */
line = malloc (total_size);
if (!line)
@ -3755,7 +3737,7 @@ gl847_led_calibration (Genesys_Device * dev)
{
snprintf (fn, 20, "led_%d.pnm", turn);
sanei_genesys_write_pnm_file (fn,
line, 16, channels, num_pixels, 1);
line, depth, channels, num_pixels, 1);
}
acceptable = SANE_TRUE;