genesys: Compute what image processing will be needed in session

merge-requests/177/head
Povilas Kanapickas 2019-09-13 11:36:56 +03:00
rodzic a5efb96978
commit 9a844e1ede
3 zmienionych plików z 47 dodań i 43 usunięć

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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) {