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;
|
uint8_t *work_buffer_dst;
|
||||||
unsigned int dst_lines;
|
unsigned int dst_lines;
|
||||||
unsigned int step_1_mode;
|
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 *src_buffer;
|
||||||
Genesys_Buffer *dst_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;
|
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: frontend requested %lu bytes\n", __func__, (u_long) * len);
|
||||||
|
|
||||||
DBG(DBG_info, "%s: bytes_to_read=%lu, total_bytes_read=%lu\n", __func__,
|
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);
|
src_buffer = &(dev->read_buffer);
|
||||||
|
|
||||||
/* maybe reorder components/bytes */
|
/* maybe reorder components/bytes */
|
||||||
if (needs_reorder)
|
if (dev->session.pipeline_needs_reorder) {
|
||||||
{
|
|
||||||
if (depth == 1) {
|
if (depth == 1) {
|
||||||
throw SaneException("Can't reorder single bit data\n");
|
throw SaneException("Can't reorder single bit data\n");
|
||||||
}
|
}
|
||||||
|
@ -3828,8 +3793,8 @@ Problems with the first approach:
|
||||||
src_buffer = dst_buffer;
|
src_buffer = dst_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* maybe reverse effects of ccd layout */
|
// maybe reverse effects of ccd layout
|
||||||
if (needs_ccd)
|
if (dev->session.pipeline_needs_ccd)
|
||||||
{
|
{
|
||||||
// should not happen with depth == 1.
|
// should not happen with depth == 1.
|
||||||
if (depth == 1) {
|
if (depth == 1) {
|
||||||
|
@ -3878,9 +3843,8 @@ Problems with the first approach:
|
||||||
src_buffer = dst_buffer;
|
src_buffer = dst_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* maybe shrink(or enlarge) lines */
|
// maybe shrink(or enlarge) lines
|
||||||
if (needs_shrink)
|
if (dev->session.pipeline_needs_shrink) {
|
||||||
{
|
|
||||||
|
|
||||||
dst_buffer = &(dev->out_buffer);
|
dst_buffer = &(dev->out_buffer);
|
||||||
|
|
||||||
|
@ -3933,8 +3897,7 @@ Problems with the first approach:
|
||||||
bytes = *len;
|
bytes = *len;
|
||||||
work_buffer_src = src_buffer->get_read_pos();
|
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);
|
genesys_reverse_bits(work_buffer_src, destination, bytes);
|
||||||
*len = 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)
|
void compute_session(Genesys_Device* dev, ScanSession& s, const Genesys_Sensor& sensor)
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
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_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)
|
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_read : %zu\n", session.buffer_size_lines);
|
||||||
DBG(level, " buffer_size_shrink : %zu\n", session.buffer_size_shrink);
|
DBG(level, " buffer_size_shrink : %zu\n", session.buffer_size_shrink);
|
||||||
DBG(level, " buffer_size_out : %zu\n", session.buffer_size_out);
|
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);
|
debug_dump(level, session.params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -294,6 +294,12 @@ struct ScanSession {
|
||||||
// whether to enable ledadd functionality
|
// whether to enable ledadd functionality
|
||||||
bool enable_ledadd = false;
|
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
|
void assert_computed() const
|
||||||
{
|
{
|
||||||
if (!computed) {
|
if (!computed) {
|
||||||
|
|
Ładowanie…
Reference in New Issue