kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Compute what image processing will be needed in session
rodzic
a5efb96978
commit
9a844e1ede
|
@ -3597,10 +3597,6 @@ static void genesys_read_ordered_data(Genesys_Device* dev, SANE_Byte* destinatio
|
|||
uint8_t *work_buffer_dst;
|
||||
unsigned int dst_lines;
|
||||
unsigned int step_1_mode;
|
||||
unsigned int needs_reorder;
|
||||
unsigned int needs_ccd;
|
||||
unsigned int needs_shrink;
|
||||
unsigned int needs_reverse;
|
||||
Genesys_Buffer *src_buffer;
|
||||
Genesys_Buffer *dst_buffer;
|
||||
|
||||
|
@ -3619,36 +3615,6 @@ static void genesys_read_ordered_data(Genesys_Device* dev, SANE_Byte* destinatio
|
|||
|
||||
src_pixels = dev->current_setup.pixels;
|
||||
|
||||
needs_reorder = 1;
|
||||
if (channels != 3 && depth != 16) {
|
||||
needs_reorder = 0;
|
||||
}
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
if (channels != 3 && depth == 16) {
|
||||
needs_reorder = 0;
|
||||
}
|
||||
if (channels == 3 && depth == 16 && !dev->model->is_cis &&
|
||||
dev->model->line_mode_color_order == ColorOrder::RGB)
|
||||
{
|
||||
needs_reorder = 0;
|
||||
}
|
||||
#endif
|
||||
if (channels == 3 && depth == 8 && !dev->model->is_cis &&
|
||||
dev->model->line_mode_color_order == ColorOrder::RGB)
|
||||
{
|
||||
needs_reorder = 0;
|
||||
}
|
||||
|
||||
needs_ccd = dev->current_setup.max_shift > 0;
|
||||
needs_shrink = dev->settings.requested_pixels != src_pixels;
|
||||
needs_reverse = depth == 1;
|
||||
|
||||
DBG(DBG_info, "%s: using filters:%s%s%s%s\n", __func__,
|
||||
needs_reorder ? " reorder" : "",
|
||||
needs_ccd ? " ccd" : "",
|
||||
needs_shrink ? " shrink" : "",
|
||||
needs_reverse ? " reverse" : "");
|
||||
|
||||
DBG(DBG_info, "%s: frontend requested %lu bytes\n", __func__, (u_long) * len);
|
||||
|
||||
DBG(DBG_info, "%s: bytes_to_read=%lu, total_bytes_read=%lu\n", __func__,
|
||||
|
@ -3733,8 +3699,7 @@ Problems with the first approach:
|
|||
src_buffer = &(dev->read_buffer);
|
||||
|
||||
/* maybe reorder components/bytes */
|
||||
if (needs_reorder)
|
||||
{
|
||||
if (dev->session.pipeline_needs_reorder) {
|
||||
if (depth == 1) {
|
||||
throw SaneException("Can't reorder single bit data\n");
|
||||
}
|
||||
|
@ -3828,8 +3793,8 @@ Problems with the first approach:
|
|||
src_buffer = dst_buffer;
|
||||
}
|
||||
|
||||
/* maybe reverse effects of ccd layout */
|
||||
if (needs_ccd)
|
||||
// maybe reverse effects of ccd layout
|
||||
if (dev->session.pipeline_needs_ccd)
|
||||
{
|
||||
// should not happen with depth == 1.
|
||||
if (depth == 1) {
|
||||
|
@ -3878,9 +3843,8 @@ Problems with the first approach:
|
|||
src_buffer = dst_buffer;
|
||||
}
|
||||
|
||||
/* maybe shrink(or enlarge) lines */
|
||||
if (needs_shrink)
|
||||
{
|
||||
// maybe shrink(or enlarge) lines
|
||||
if (dev->session.pipeline_needs_shrink) {
|
||||
|
||||
dst_buffer = &(dev->out_buffer);
|
||||
|
||||
|
@ -3933,8 +3897,7 @@ Problems with the first approach:
|
|||
bytes = *len;
|
||||
work_buffer_src = src_buffer->get_read_pos();
|
||||
|
||||
if (needs_reverse)
|
||||
{
|
||||
if (dev->session.pipeline_needs_reverse) {
|
||||
genesys_reverse_bits(work_buffer_src, destination, bytes);
|
||||
*len = bytes;
|
||||
}
|
||||
|
|
|
@ -1204,6 +1204,35 @@ void compute_session_buffer_sizes(AsicType asic, ScanSession& s)
|
|||
}
|
||||
}
|
||||
|
||||
void compute_session_pipeline(const Genesys_Device* dev, ScanSession& s)
|
||||
{
|
||||
auto channels = s.params.channels;
|
||||
auto depth = s.params.depth;
|
||||
|
||||
s.pipeline_needs_reorder = true;
|
||||
if (channels != 3 && depth != 16) {
|
||||
s.pipeline_needs_reorder = false;
|
||||
}
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
if (channels != 3 && depth == 16) {
|
||||
s.pipeline_needs_reorder = false;
|
||||
}
|
||||
if (channels == 3 && depth == 16 && !dev->model->is_cis &&
|
||||
dev->model->line_mode_color_order == ColorOrder::RGB)
|
||||
{
|
||||
s.pipeline_needs_reorder = false;
|
||||
}
|
||||
#endif
|
||||
if (channels == 3 && depth == 8 && !dev->model->is_cis &&
|
||||
dev->model->line_mode_color_order == ColorOrder::RGB)
|
||||
{
|
||||
s.pipeline_needs_reorder = false;
|
||||
}
|
||||
s.pipeline_needs_ccd = s.max_color_shift_lines + s.num_staggered_lines > 0;
|
||||
s.pipeline_needs_shrink = dev->settings.requested_pixels != s.output_pixels;
|
||||
s.pipeline_needs_reverse = depth == 1;
|
||||
}
|
||||
|
||||
void compute_session(Genesys_Device* dev, ScanSession& s, const Genesys_Sensor& sensor)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
|
@ -1385,6 +1414,7 @@ void compute_session(Genesys_Device* dev, ScanSession& s, const Genesys_Sensor&
|
|||
}
|
||||
|
||||
compute_session_buffer_sizes(dev->model->asic_type, s);
|
||||
compute_session_pipeline(dev, s);
|
||||
}
|
||||
|
||||
static std::size_t get_usb_buffer_read_size(AsicType asic, const ScanSession& session)
|
||||
|
@ -2106,6 +2136,11 @@ void debug_dump(unsigned level, const ScanSession& session)
|
|||
DBG(level, " buffer_size_read : %zu\n", session.buffer_size_lines);
|
||||
DBG(level, " buffer_size_shrink : %zu\n", session.buffer_size_shrink);
|
||||
DBG(level, " buffer_size_out : %zu\n", session.buffer_size_out);
|
||||
DBG(level, " filters:%s%s%s%s\n",
|
||||
session.pipeline_needs_reorder ? " reorder" : "",
|
||||
session.pipeline_needs_ccd ? " ccd" : "",
|
||||
session.pipeline_needs_shrink ? " shrink" : "",
|
||||
session.pipeline_needs_reverse ? " reverse" : "");
|
||||
debug_dump(level, session.params);
|
||||
}
|
||||
|
||||
|
|
|
@ -294,6 +294,12 @@ struct ScanSession {
|
|||
// whether to enable ledadd functionality
|
||||
bool enable_ledadd = false;
|
||||
|
||||
// what pipeline modifications are needed
|
||||
bool pipeline_needs_reorder = false;
|
||||
bool pipeline_needs_ccd = false;
|
||||
bool pipeline_needs_shrink = false;
|
||||
bool pipeline_needs_reverse = false;
|
||||
|
||||
void assert_computed() const
|
||||
{
|
||||
if (!computed) {
|
||||
|
|
Ładowanie…
Reference in New Issue