kopia lustrzana https://gitlab.com/sane-project/backends
make lineart work when number of segments is higher than 1
rodzic
dd2a64e9a4
commit
de2af06d35
|
@ -4790,6 +4790,13 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
|
||||||
{
|
{
|
||||||
size_t count;
|
size_t count;
|
||||||
SANE_Status status;
|
SANE_Status status;
|
||||||
|
uint8_t odd,even,mask;
|
||||||
|
uint16_t merged;
|
||||||
|
int depth,i;
|
||||||
|
|
||||||
|
depth = dev->settings.depth;
|
||||||
|
if (dev->settings.scan_mode == SCAN_MODE_LINEART)
|
||||||
|
depth = 1;
|
||||||
|
|
||||||
/* fill buffer if needed */
|
/* fill buffer if needed */
|
||||||
if (dev->oe_buffer.avail == 0)
|
if (dev->oe_buffer.avail == 0)
|
||||||
|
@ -4817,32 +4824,86 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
|
||||||
count++;
|
count++;
|
||||||
dev->cur++;
|
dev->cur++;
|
||||||
}
|
}
|
||||||
else if(dev->settings.depth==8 && dev->settings.double_xres==SANE_FALSE)
|
else
|
||||||
{
|
{
|
||||||
while (dev->cur < dev->len && count < size)
|
/* here we must handle the segments to copy data */
|
||||||
{
|
if(dev->segnb==2)
|
||||||
/* copy even pixel */
|
{
|
||||||
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
|
if(depth==8)
|
||||||
/* copy odd pixel */
|
{
|
||||||
work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
|
while (dev->cur < dev->len && count < size)
|
||||||
/* update counter and pointer */
|
{
|
||||||
count += 2;
|
/* copy even pixel */
|
||||||
dev->cur++;
|
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
|
||||||
|
/* copy odd pixel */
|
||||||
|
work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
|
||||||
|
/* update counter and pointer */
|
||||||
|
count += 2;
|
||||||
|
dev->cur++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(depth==16)
|
||||||
|
{
|
||||||
|
while (dev->cur < dev->len && count < size)
|
||||||
|
{
|
||||||
|
/* copy even pixel */
|
||||||
|
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
|
||||||
|
work_buffer_dst[count+1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos+1];
|
||||||
|
/* copy odd pixel */
|
||||||
|
work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
|
||||||
|
work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos+1];
|
||||||
|
/* update counter and pointer */
|
||||||
|
count += 4;
|
||||||
|
dev->cur+=2;
|
||||||
|
}
|
||||||
|
} else { /* lineart case */
|
||||||
|
while (dev->cur < dev->len && count < size)
|
||||||
|
{
|
||||||
|
/* get values to merge */
|
||||||
|
odd = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
|
||||||
|
even = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
|
||||||
|
|
||||||
|
/* interleave bits .... */
|
||||||
|
merged=0;
|
||||||
|
for(i=7;i>=0;i--)
|
||||||
|
{
|
||||||
|
mask=1<<i;
|
||||||
|
if(odd & mask)
|
||||||
|
{
|
||||||
|
merged |= 1;
|
||||||
|
}
|
||||||
|
merged<<=1;
|
||||||
|
if(even & mask)
|
||||||
|
{
|
||||||
|
merged |= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* don't shift on last bit */
|
||||||
|
if(i>0)
|
||||||
|
{
|
||||||
|
merged<<=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store result */
|
||||||
|
work_buffer_dst[count] = merged >> 8;
|
||||||
|
work_buffer_dst[count+1] = merged & 255;
|
||||||
|
|
||||||
|
/* update counter and pointer */
|
||||||
|
count += 2;
|
||||||
|
dev->cur++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else if(dev->segnb==4)
|
||||||
else if(dev->settings.depth==16 && dev->settings.double_xres==SANE_FALSE)
|
{
|
||||||
{
|
DBG (DBG_error, "%s: %d is an unimplemented segment number ....\n",__FUNCTION__,dev->segnb);
|
||||||
while (dev->cur < dev->len && count < size)
|
return SANE_STATUS_INVAL;
|
||||||
{
|
}
|
||||||
/* copy even pixel */
|
else
|
||||||
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
|
{
|
||||||
work_buffer_dst[count+1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos+1];
|
DBG (DBG_error, "%s: %d is an unimplemented segment number ....\n",__FUNCTION__,dev->segnb);
|
||||||
/* copy odd pixel */
|
return SANE_STATUS_INVAL;
|
||||||
work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
|
|
||||||
work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos+1];
|
|
||||||
/* update counter and pointer */
|
|
||||||
count += 4;
|
|
||||||
dev->cur+=2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue