kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Wefax b/w fix
* The generated image is now really back and white. * Display speedup.pull/1/head
rodzic
ae363526ed
commit
6b7067ed77
|
@ -35,7 +35,7 @@ private:
|
||||||
int bufsize;
|
int bufsize;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
int depth;
|
static const int depth = 3;
|
||||||
int numcol;
|
int numcol;
|
||||||
int slantdir;
|
int slantdir;
|
||||||
void slant_corr(int x, int y);
|
void slant_corr(int x, int y);
|
||||||
|
@ -48,7 +48,16 @@ public:
|
||||||
picture(int, int, int, int, int bg_col = 0);
|
picture(int, int, int, int, int bg_col = 0);
|
||||||
~picture();
|
~picture();
|
||||||
void video(unsigned char *, int);
|
void video(unsigned char *, int);
|
||||||
void pixel(unsigned char, int);
|
void pixel(unsigned char data, int pos) {
|
||||||
|
if (pos < 0 || pos >= bufsize) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
FL_LOCK_D();
|
||||||
|
vidbuf[pos] = data;
|
||||||
|
if (pos % (width * depth) == 0)
|
||||||
|
redraw();
|
||||||
|
FL_UNLOCK_D();
|
||||||
|
}
|
||||||
unsigned char pixel(int);
|
unsigned char pixel(int);
|
||||||
int handle(int);
|
int handle(int);
|
||||||
void draw();
|
void draw();
|
||||||
|
|
|
@ -321,9 +321,6 @@ int wefax_pic::update_rx_pic_col(unsigned char data, int pix_pos )
|
||||||
/// Each time the received image becomes too high, we increase its height.
|
/// Each time the received image becomes too high, we increase its height.
|
||||||
static const int curr_pix_incr_height = 100 ;
|
static const int curr_pix_incr_height = 100 ;
|
||||||
|
|
||||||
/// Maybe there is a slant.
|
|
||||||
pix_pos = ( double )pix_pos * slant_factor_default() + 0.5 ;
|
|
||||||
|
|
||||||
/// Three ints per pixel. It is safer to recalculate the
|
/// Three ints per pixel. It is safer to recalculate the
|
||||||
/// row index to avoid any buffer overflow, because the given
|
/// row index to avoid any buffer overflow, because the given
|
||||||
/// row is invalid if the image was horizontally moved.
|
/// row is invalid if the image was horizontally moved.
|
||||||
|
@ -449,11 +446,17 @@ void wefax_pic::update_rx_pic_bw(unsigned char data, int pix_pos )
|
||||||
return ;
|
return ;
|
||||||
};
|
};
|
||||||
/// The image must be horizontally shifted.
|
/// The image must be horizontally shifted.
|
||||||
pix_pos += center_val_prev ;
|
pix_pos += center_val_prev * bytes_per_pix ;
|
||||||
if( pix_pos < 0 ) {
|
if( pix_pos < 0 ) {
|
||||||
pix_pos = 0 ;
|
pix_pos = 0 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Maybe there is a slant.
|
||||||
|
pix_pos = ( double )pix_pos * slant_factor_default() + 0.5 ;
|
||||||
|
|
||||||
|
/// Must be a multiple of the number of bytes per pixel.
|
||||||
|
pix_pos = ( pix_pos / bytes_per_pix ) * bytes_per_pix ;
|
||||||
|
|
||||||
static int last_row_number = 0 ;
|
static int last_row_number = 0 ;
|
||||||
|
|
||||||
update_rx_pic_col(data, pix_pos);
|
update_rx_pic_col(data, pix_pos);
|
||||||
|
@ -1082,9 +1085,7 @@ void wefax_pic::create_rx_viewer(int pos_x, int pos_y,int win_wid, int hei_win)
|
||||||
wefax_slider_rx_center = new Fl_Slider(wid_off_low, hei_off_low, wid_btn_curr, height_btn, _(title_center));
|
wefax_slider_rx_center = new Fl_Slider(wid_off_low, hei_off_low, wid_btn_curr, height_btn, _(title_center));
|
||||||
wefax_slider_rx_center->type(FL_HORIZONTAL);
|
wefax_slider_rx_center->type(FL_HORIZONTAL);
|
||||||
wefax_slider_rx_center->align(FL_ALIGN_LEFT);
|
wefax_slider_rx_center->align(FL_ALIGN_LEFT);
|
||||||
/// Multiplied by three because of color image.
|
/// The range is set when the image size in pixels is known.
|
||||||
double range_rx_center = bytes_per_pix * (double)wid_img ;
|
|
||||||
wefax_slider_rx_center->range(-range_rx_center, range_rx_center);
|
|
||||||
wefax_slider_rx_center->step(1.0);
|
wefax_slider_rx_center->step(1.0);
|
||||||
wefax_slider_rx_center->callback(wefax_cb_pic_rx_center, 0);
|
wefax_slider_rx_center->callback(wefax_cb_pic_rx_center, 0);
|
||||||
wefax_slider_rx_center->tooltip(_("Align image horizontally."));
|
wefax_slider_rx_center->tooltip(_("Align image horizontally."));
|
||||||
|
@ -1146,6 +1147,10 @@ void wefax_pic::resize_rx_viewer(int wid_img)
|
||||||
snprintf( buffer_width, sizeof(buffer_width), "%d", wid_img );
|
snprintf( buffer_width, sizeof(buffer_width), "%d", wid_img );
|
||||||
wefax_out_rx_width->value(buffer_width);
|
wefax_out_rx_width->value(buffer_width);
|
||||||
|
|
||||||
|
/// This is a number of pixels.
|
||||||
|
double range_rx_center = wid_img / 2.0 ;
|
||||||
|
wefax_slider_rx_center->range(-range_rx_center, range_rx_center);
|
||||||
|
|
||||||
wefax_pic_rx_win->redraw();
|
wefax_pic_rx_win->redraw();
|
||||||
FL_UNLOCK_D();
|
FL_UNLOCK_D();
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,6 @@ picture::picture (int X, int Y, int W, int H, int bg_col) :
|
||||||
{
|
{
|
||||||
width = W;
|
width = W;
|
||||||
height = H;
|
height = H;
|
||||||
depth = 3;
|
|
||||||
bufsize = W * H * depth;
|
bufsize = W * H * depth;
|
||||||
numcol = 0;
|
numcol = 0;
|
||||||
slantdir = 0;
|
slantdir = 0;
|
||||||
|
@ -84,19 +83,6 @@ void picture::video(unsigned char *data, int len )
|
||||||
FL_UNLOCK_D();
|
FL_UNLOCK_D();
|
||||||
}
|
}
|
||||||
|
|
||||||
void picture::pixel(unsigned char data, int pos)
|
|
||||||
{
|
|
||||||
if (pos < 0 || pos >= bufsize) {
|
|
||||||
LOG_ERROR("Image overflow pos=%d bufsize=%d", pos, bufsize );
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
FL_LOCK_D();
|
|
||||||
vidbuf[pos] = data;
|
|
||||||
if (pos % (width * 3) == 0)
|
|
||||||
redraw();
|
|
||||||
FL_UNLOCK_D();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char picture::pixel(int pos)
|
unsigned char picture::pixel(int pos)
|
||||||
{
|
{
|
||||||
if (pos < 0 || pos >= bufsize) return 0;
|
if (pos < 0 || pos >= bufsize) return 0;
|
||||||
|
@ -183,17 +169,19 @@ void picture::stretch(double the_ratio)
|
||||||
unsigned char * new_vidbuf = new unsigned char[new_bufsize];
|
unsigned char * new_vidbuf = new unsigned char[new_bufsize];
|
||||||
|
|
||||||
/// No interpolation, it takes the nearest pixel.
|
/// No interpolation, it takes the nearest pixel.
|
||||||
for( int ix_out = 0 ; ix_out < new_bufsize ; ++ix_out ) {
|
for( int ix_out = 0 ; ix_out < new_bufsize ; ix_out += depth ) {
|
||||||
|
|
||||||
/// TODO: ix_out could be double to qvoid this conversion.
|
|
||||||
int ix_in = ( double )ix_out * the_ratio + 0.5 ;
|
int ix_in = ( double )ix_out * the_ratio + 0.5 ;
|
||||||
|
ix_in = ( ix_in / depth ) * depth ;
|
||||||
if( ix_in >= bufsize ) {
|
if( ix_in >= bufsize ) {
|
||||||
/// Grey value as a filler to indicate the end. For debugging.
|
/// Grey value as a filler to indicate the end. For debugging.
|
||||||
memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out );
|
memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out );
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
/// TODO: It might not properly work with color images !!!!
|
for( int i = 0; i < depth ; ++i )
|
||||||
new_vidbuf[ ix_out ] = vidbuf[ ix_in ];
|
{
|
||||||
|
new_vidbuf[ ix_out + i ] = vidbuf[ ix_in + i ];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
delete [] vidbuf ;
|
delete [] vidbuf ;
|
||||||
|
@ -208,6 +196,8 @@ void picture::stretch(double the_ratio)
|
||||||
/// Beware that it is not protected by FL_LOCK_D/FL_UNLOCK_D
|
/// Beware that it is not protected by FL_LOCK_D/FL_UNLOCK_D
|
||||||
void picture::shift_horizontal_center(int horizontal_shift)
|
void picture::shift_horizontal_center(int horizontal_shift)
|
||||||
{
|
{
|
||||||
|
/// This is a number of pixels.
|
||||||
|
horizontal_shift *= depth ;
|
||||||
if( horizontal_shift < -bufsize ) {
|
if( horizontal_shift < -bufsize ) {
|
||||||
horizontal_shift = -bufsize ;
|
horizontal_shift = -bufsize ;
|
||||||
}
|
}
|
||||||
|
@ -240,14 +230,13 @@ void picture::set_zoom( int the_zoom )
|
||||||
void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar *buf)
|
void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar *buf)
|
||||||
{
|
{
|
||||||
const picture * ptr_pic = ( const picture * ) data ;
|
const picture * ptr_pic = ( const picture * ) data ;
|
||||||
static const int dpth=3 ;
|
|
||||||
int img_width = ptr_pic->width ;
|
int img_width = ptr_pic->width ;
|
||||||
const unsigned char * in_ptr = ptr_pic->vidbuf ;
|
const unsigned char * in_ptr = ptr_pic->vidbuf ;
|
||||||
const int max_buf_offset = ptr_pic->bufsize - dpth ;
|
const int max_buf_offset = ptr_pic->bufsize - depth ;
|
||||||
/// Should not happen because tested before. This ensures that memcpy is OK.
|
/// Should not happen because tested before. This ensures that memcpy is OK.
|
||||||
if( ptr_pic->zoom == 0 ) {
|
if( ptr_pic->zoom == 0 ) {
|
||||||
int in_offset = img_width * y_screen + x_screen ;
|
int in_offset = img_width * y_screen + x_screen ;
|
||||||
memcpy( buf, in_ptr + in_offset * dpth, dpth * wid_screen );
|
memcpy( buf, in_ptr + in_offset * depth, depth * wid_screen );
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,10 +254,10 @@ void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, u
|
||||||
stride );
|
stride );
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
int dpth_in_offset = dpth * in_offset ;
|
int dpth_in_offset = depth * in_offset ;
|
||||||
|
|
||||||
/// Check the latest offset.
|
/// Check the latest offset.
|
||||||
if( dpth_in_offset + dpth * stride * wid_screen >= max_buf_offset ) {
|
if( dpth_in_offset + depth * stride * wid_screen >= max_buf_offset ) {
|
||||||
LOG_WARN(
|
LOG_WARN(
|
||||||
"Boom1 y_sc=%d h=%d w=%d wd_sc=%d wdt=%d strd=%d off=%d prd=%d mbo=%d\n",
|
"Boom1 y_sc=%d h=%d w=%d wd_sc=%d wdt=%d strd=%d off=%d prd=%d mbo=%d\n",
|
||||||
y_screen,
|
y_screen,
|
||||||
|
@ -278,15 +267,15 @@ void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, u
|
||||||
img_width,
|
img_width,
|
||||||
stride,
|
stride,
|
||||||
in_offset,
|
in_offset,
|
||||||
( dpth_in_offset + dpth ),
|
( dpth_in_offset + depth ),
|
||||||
max_buf_offset );
|
max_buf_offset );
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
for( int ix_w = 0, max_w = wid_screen * dpth; ix_w < max_w ; ix_w += dpth ) {
|
for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) {
|
||||||
buf[ ix_w ] = in_ptr[ dpth_in_offset ];
|
buf[ ix_w ] = in_ptr[ dpth_in_offset ];
|
||||||
buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ];
|
buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ];
|
||||||
buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ];
|
buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ];
|
||||||
dpth_in_offset += dpth * stride ;
|
dpth_in_offset += depth * stride ;
|
||||||
}
|
}
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
@ -306,9 +295,8 @@ void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, u
|
||||||
stride );
|
stride );
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
/// TODO: Will not properly work for color images.
|
int dpth_in_offset = depth * in_offset ;
|
||||||
int dpth_in_offset = dpth * in_offset ;
|
for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) {
|
||||||
for( int ix_w = 0, max_w = wid_screen * dpth; ix_w < max_w ; ix_w += dpth ) {
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if( dpth_in_offset >= max_buf_offset ) {
|
if( dpth_in_offset >= max_buf_offset ) {
|
||||||
LOG_WARN(
|
LOG_WARN(
|
||||||
|
@ -328,8 +316,8 @@ void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, u
|
||||||
buf[ ix_w ] = in_ptr[ dpth_in_offset ];
|
buf[ ix_w ] = in_ptr[ dpth_in_offset ];
|
||||||
buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ];
|
buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ];
|
||||||
buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ];
|
buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ];
|
||||||
if( ( ix_w % ( dpth * stride ) ) == 0 ) {
|
if( ( ix_w % ( depth * stride ) ) == 0 ) {
|
||||||
dpth_in_offset += dpth ;
|
dpth_in_offset += depth ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ;
|
return ;
|
||||||
|
|
Ładowanie…
Reference in New Issue