Hell Raster Display

* changed raster display to multi-line marquee
  * added right-click on display to clear
pull/4/head
David Freese 2016-06-08 08:41:33 -05:00
rodzic 4841f1098d
commit 3c7392ec80
5 zmienionych plików z 70 dodań i 72 usunięć

Wyświetl plik

@ -300,7 +300,7 @@ Fl_Group *mf_group1 = 0;
Fl_Group *mf_group2 = 0; Fl_Group *mf_group2 = 0;
FTextRX *ReceiveText = 0; FTextRX *ReceiveText = 0;
FTextTX *TransmitText = 0; FTextTX *TransmitText = 0;
static Raster *FHdisp; Raster *FHdisp;
Fl_Box *minbox; Fl_Box *minbox;
int oix; int oix;

Wyświetl plik

@ -64,6 +64,7 @@ extern bool bMOREINFO;
extern FTextRX *ReceiveText; extern FTextRX *ReceiveText;
extern FTextTX *TransmitText; extern FTextTX *TransmitText;
extern Raster *FHdisp;
extern pskBrowser *mainViewer; extern pskBrowser *mainViewer;
extern Fl_Input2 *txtInpSeek; extern Fl_Input2 *txtInpSeek;
extern Fl_Box *hideViewer; extern Fl_Box *hideViewer;

Wyświetl plik

@ -44,6 +44,7 @@ public:
Raster(int, int, int, int); Raster(int, int, int, int);
~Raster(); ~Raster();
void draw(); void draw();
int handle(int);
void resize(int x, int y, int w, int h); void resize(int x, int y, int w, int h);
unsigned char *buffer() { return vidbuf;} unsigned char *buffer() { return vidbuf;}
int size() { return width * height;} int size() { return width * height;}

Wyświetl plik

@ -1195,8 +1195,12 @@ static void pCLRRX(std::string &s, size_t &i, size_t endbracket)
return; return;
} }
s.replace( i, 7, "" ); s.replace( i, 7, "" );
if (active_modem->get_mode() == MODE_IFKP) trx_mode md = active_modem->get_mode();
if (md == MODE_IFKP)
ifkp_rx_text->clear(); ifkp_rx_text->clear();
else if ((md >= MODE_FELDHELL) && (md <= MODE_HELL80))
FHdisp->clear();
else else
ReceiveText->clear(); ReceiveText->clear();
} }

Wyświetl plik

@ -22,6 +22,9 @@
#include <config.h> #include <config.h>
#include <iostream>
#include <FL/Fl.H>
#include <FL/fl_draw.H> #include <FL/fl_draw.H>
#include "raster.h" #include "raster.h"
@ -33,21 +36,24 @@
#include "raster.h" #include "raster.h"
#include "qrunner.h" #include "qrunner.h"
using namespace std;
bool rowschanged = false; bool rowschanged = false;
Raster::Raster (int X, int Y, int W, int H) : Raster::Raster (int X, int Y, int W, int H) :
Fl_Widget (X, Y, W, H) { Fl_Widget (X, Y, W, H) {
width = W - 4; width = W - 4;
height = H - 4; height = H - 4;
space = 2; space = 1;
rowheight = 2 * FELD_RX_COLUMN_LEN;//40;//60; rowheight = 2 * FELD_RX_COLUMN_LEN + space;
Nrows = (int)(height / (rowheight + space) - 0.5);
Nrows = 0;
while ((Nrows * rowheight) < height) Nrows++;
Nrows--;
vidbuf = new unsigned char[width * height]; vidbuf = new unsigned char[width * height];
memset(vidbuf, 255, width * height); memset(vidbuf, 255, width * height);
col = 0; col = 0;
vidpos = 0;
numcols = 0;
yp = Nrows * (space + rowheight);
box(FL_DOWN_BOX); box(FL_DOWN_BOX);
} }
@ -59,39 +65,29 @@ Raster::~Raster()
void Raster::data(int data[], int len) void Raster::data(int data[], int len)
{ {
if (data == NULL || len == 0) if (data == NULL || len == 0 || (len > rowheight))
return; return;
int h = len;
int pos;
int zeropos;
FL_LOCK_D(); FL_LOCK_D();
if (h > height) for (int row = 0; row < Nrows; row++) {
h = height; int rowstart = width * rowheight * row;
col++; int nextrow = width * rowheight * (row + 1);
if (col >= width) { for (int i = 0; i < len; i++) {
unsigned char *from = vidbuf + (space + rowheight) * width; memmove( vidbuf + rowstart + i*width,
int numtocopy = Nrows * (space + rowheight) * width; vidbuf + rowstart + i*width + 1,
memmove(vidbuf, from, numtocopy); width - 1);
memset( vidbuf + yp * width, if (row < (Nrows - 1)) {
255, (space + rowheight) * width); vidbuf[rowstart + i*width + width - 1] =
col = 0; vidbuf[nextrow + i* width];
damage(FL_DAMAGE_USER2); }
}
} }
else int toppixel = width * (Nrows - 1) * rowheight + width - 1;
if (damage() != FL_DAMAGE_ALL) for (int i = 0; i < len; i++) {
damage(FL_DAMAGE_USER1); vidbuf[toppixel + width * (len - i)] = (unsigned char) data[i];
zeropos = Nrows * (space + rowheight) * width;
for (int i = 0; i < h; i++) {
pos = zeropos + width * (h - i - 1) + col;
vidbuf[pos] = (unsigned char)data[i];
} }
numcols++;
vidpos = col - numcols;
if (vidpos < 0) vidpos = 0;
// redraw();
REQ_DROP(&Raster::redraw, this); REQ_DROP(&Raster::redraw, this);
FL_UNLOCK_D(); FL_UNLOCK_D();
@ -100,25 +96,26 @@ void Raster::data(int data[], int len)
void Raster::clear() void Raster::clear()
{ {
FL_LOCK_D(); memset(vidbuf, 255, width * height);
for (int i = 0; i < width * height; i++)
vidbuf[i] = 255;
col = width;
REQ_DROP(&Raster::redraw, this);
// redraw(); // redraw();
FL_UNLOCK_D(); REQ_DROP(&Raster::redraw, this);
FL_AWAKE_D(); FL_AWAKE_D();
} }
void Raster::resize(int x, int y, int w, int h) void Raster::resize(int x, int y, int w, int h)
{ {
int Wdest = w - 4, Hdest = h - 4; int Wdest = w - 4;
int Ndest = (int)(Hdest / (rowheight + space) - 0.5); int Hdest = h - 4;
int Ndest;
unsigned char *tempbuf = new unsigned char [Wdest * Hdest]; unsigned char *tempbuf = new unsigned char [Wdest * Hdest];
unsigned char *oldbuf; unsigned char *oldbuf;
int xfrcols, xfrrows; int xfrcols, xfrrows;
int from, to; int from, to;
Ndest = 0;
while ((Ndest * rowheight) < Hdest) Ndest++;
Ndest--;
memset(tempbuf, 255, Wdest * Hdest); memset(tempbuf, 255, Wdest * Hdest);
if (Wdest >= width) if (Wdest >= width)
@ -127,27 +124,27 @@ void Raster::resize(int x, int y, int w, int h)
xfrcols = Wdest; xfrcols = Wdest;
if (Ndest <= Nrows) { if (Ndest <= Nrows) {
xfrrows = (Ndest + 1)*(rowheight + space); xfrrows = Ndest * rowheight;
from = (Nrows - Ndest) * (rowheight + space); from = (Nrows - Ndest) * rowheight;
to = 0; to = 0;
for (int r = 0; r < xfrrows; r++) for (int r = 0; r < xfrrows; r++)
for (int c = 0; c < xfrcols; c++) for (int c = 0; c < xfrcols; c++)
tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c];
} else { } else {
xfrrows = (Nrows + 1)*(rowheight + space); xfrrows = Nrows * rowheight;
from = 0; from = 0;
to = (Ndest - Nrows) * (rowheight + space); to = (Ndest - Nrows) * rowheight;
for (int r = 0; r < xfrrows; r++) for (int r = 0; r < xfrrows; r++)
for (int c = 0; c < xfrcols; c++) for (int c = 0; c < xfrcols; c++)
tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c];
} }
oldbuf = vidbuf; oldbuf = vidbuf;
vidbuf = tempbuf; vidbuf = tempbuf;
width = Wdest; height = Hdest; width = Wdest;
height = Hdest;
Nrows = Ndest; Nrows = Ndest;
yp = Ndest * (space + rowheight);
delete [] oldbuf; delete [] oldbuf;
@ -158,27 +155,22 @@ void Raster::resize(int x, int y, int w, int h)
void Raster::draw() void Raster::draw()
{ {
if ((damage() & FL_DAMAGE_USER2)) { draw_box();
draw_box(); fl_draw_image_mono(
fl_draw_image_mono( vidbuf,
vidbuf, x() + 2, y() + 2,
x() + 2, y() + 2, width, height, 1);
width, height,
1, width );
} else if ((damage() & FL_DAMAGE_USER1)) {
fl_draw_image_mono(
vidbuf + vidpos + Nrows * (space + rowheight) * width,
x() + vidpos + 2, y() + yp + 2,
numcols, rowheight,
1, width);
numcols = 0;
} else {
draw_box();
fl_draw_image_mono(
vidbuf,
x() + 2, y() + 2,
width, height,
1, width );
}
} }
int Raster::handle(int event)
{
if (Fl::event_inside( this )) {
if (event == FL_PUSH) {
if (Fl::event_button() == FL_RIGHT_MOUSE) {
clear();
return 1;
}
}
}
return Fl_Widget::handle(event);
}