mirror of
https://github.com/markdavidlong/AppleSAWS.git
synced 2024-10-19 08:24:39 +00:00
Added menu option to select between NTSC/Monochrome on HiresViewWidget
This commit is contained in:
parent
0d40a0f264
commit
8e25c21c19
@ -14,6 +14,7 @@ HiresViewWidget::HiresViewWidget(QWidget *parent) :
|
|||||||
{
|
{
|
||||||
resize(561,384);
|
resize(561,384);
|
||||||
m_viewMode = Color2;
|
m_viewMode = Color2;
|
||||||
|
m_showScanLines = true;
|
||||||
|
|
||||||
if (m_rowTable == 0) { makeOffsetTable(); }
|
if (m_rowTable == 0) { makeOffsetTable(); }
|
||||||
|
|
||||||
@ -23,6 +24,46 @@ HiresViewWidget::HiresViewWidget(QWidget *parent) :
|
|||||||
QPainter painter(&m_pixmap);
|
QPainter painter(&m_pixmap);
|
||||||
painter.setBrush(Qt::black);
|
painter.setBrush(Qt::black);
|
||||||
painter.drawRect(0,0,this->width(),this->height());
|
painter.drawRect(0,0,this->width(),this->height());
|
||||||
|
|
||||||
|
formatGroup = new QActionGroup(this);
|
||||||
|
|
||||||
|
monochromeAction = new QAction("Monochrome Display",this);
|
||||||
|
monochromeAction->setCheckable(true);
|
||||||
|
monochromeAction->setChecked(false);
|
||||||
|
formatGroup->addAction(monochromeAction);
|
||||||
|
|
||||||
|
ntscAction = new QAction("NTSC Display",this);
|
||||||
|
ntscAction->setCheckable(true);
|
||||||
|
ntscAction->setChecked(true);
|
||||||
|
formatGroup->addAction(ntscAction);
|
||||||
|
|
||||||
|
showScanLinesAction = new QAction("Show Scan Lines",this);
|
||||||
|
showScanLinesAction->setCheckable(true);
|
||||||
|
showScanLinesAction->setChecked(true);
|
||||||
|
|
||||||
|
connect(ntscAction, SIGNAL(toggled(bool)), this, SLOT(handleNtscAction(bool)));
|
||||||
|
connect(monochromeAction, SIGNAL(toggled(bool)), this, SLOT(handleMonochromeAction(bool)));
|
||||||
|
connect(showScanLinesAction, SIGNAL(toggled(bool)), this, SLOT(handleShowScanLinesAction(bool)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void HiresViewWidget::handleNtscAction(bool toggled) {
|
||||||
|
if (toggled) {
|
||||||
|
m_viewMode = Color2;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HiresViewWidget::handleMonochromeAction(bool toggled) {
|
||||||
|
if (toggled) {
|
||||||
|
m_viewMode = Monochrome;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HiresViewWidget::handleShowScanLinesAction(bool toggled) {
|
||||||
|
m_showScanLines = toggled;
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HiresViewWidget::paintEvent(QPaintEvent *event)
|
void HiresViewWidget::paintEvent(QPaintEvent *event)
|
||||||
@ -33,6 +74,9 @@ void HiresViewWidget::paintEvent(QPaintEvent *event)
|
|||||||
// if (m_pixmap.size() != this->size()) {
|
// if (m_pixmap.size() != this->size()) {
|
||||||
// m_pixmap = m_pixmap.scaled(this->size(),Qt::KeepAspectRatio);
|
// m_pixmap = m_pixmap.scaled(this->size(),Qt::KeepAspectRatio);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
drawPixmap();
|
||||||
|
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
|
|
||||||
QPixmap tmppixmap = m_pixmap;
|
QPixmap tmppixmap = m_pixmap;
|
||||||
@ -47,40 +91,64 @@ void HiresViewWidget::resizeEvent(QResizeEvent *)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HiresViewWidget::setData(QByteArray data) {
|
void HiresViewWidget::drawPixmap() {
|
||||||
qDebug() << "setData";
|
|
||||||
m_data = data;
|
|
||||||
QPainter pmpainter(&m_pixmap);
|
QPainter pmpainter(&m_pixmap);
|
||||||
|
|
||||||
|
pmpainter.setBrush(Qt::black);
|
||||||
|
pmpainter.setPen(Qt::black);
|
||||||
|
pmpainter.drawRect(0,0,m_pixmap.width(),m_pixmap.height());
|
||||||
|
|
||||||
if (m_viewMode == Monochrome)
|
if (m_viewMode == Monochrome)
|
||||||
{
|
{
|
||||||
pmpainter.setPen(Qt::white);
|
pmpainter.setPen(Qt::white);
|
||||||
pmpainter.setBrush(Qt::white);
|
pmpainter.setBrush(Qt::white);
|
||||||
|
|
||||||
for (int idx = 0; idx < m_data.size() ; idx++) {
|
quint8 chunkCount = 0;
|
||||||
|
// for (int idx = 0; idx < m_data.size() ; idx+=40) {
|
||||||
|
int idx = 0;
|
||||||
|
while (idx < m_data.size()) {
|
||||||
int rowcol = findRowCol(idx);
|
int rowcol = findRowCol(idx);
|
||||||
|
// int xoff = (rowcol / 10000) * 7;
|
||||||
|
int yoff = (rowcol % 10000);
|
||||||
|
|
||||||
quint8 byte = m_data[idx];
|
QBitArray bits(561,false);
|
||||||
|
int bitoffset = 0;
|
||||||
|
bool lastbit = false;
|
||||||
|
|
||||||
// qDebug() << "idx: " << idx << (rowcol / 1000) << (rowcol % 1000);
|
for (int jdx = 0; jdx < 40; jdx++)
|
||||||
int xoff = (rowcol / 10000) * 7 * 2;
|
{
|
||||||
int yoff = (rowcol % 10000) * 2;
|
quint8 byte = m_data[idx++];
|
||||||
|
QBitArray dataBits = byteToBits(byte);
|
||||||
|
|
||||||
if (byte & 0x01) { pmpainter.drawRect(xoff+0,yoff,1,1); }
|
bool highBit = dataBits.at(0);
|
||||||
|
|
||||||
if (byte & 0x02) { pmpainter.drawRect(xoff+2,yoff,1,1); }
|
if (highBit) {
|
||||||
|
bits[bitoffset++] = lastbit;
|
||||||
|
}
|
||||||
|
|
||||||
if (byte & 0x04) { pmpainter.drawRect(xoff+4,yoff,1,1); }
|
for (int xdx = 1; xdx < 7; xdx++) {
|
||||||
|
bits[bitoffset++] = dataBits.at(xdx);
|
||||||
|
bits[bitoffset++] = dataBits.at(xdx);
|
||||||
|
}
|
||||||
|
lastbit = dataBits.at(7);
|
||||||
|
bits[bitoffset++] = dataBits.at(7);
|
||||||
|
if (!highBit) {
|
||||||
|
bits[bitoffset++] = dataBits.at(7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (byte & 0x08) { pmpainter.drawRect(xoff+6,yoff,1,1); }
|
|
||||||
|
|
||||||
if (byte & 0x10) { pmpainter.drawRect(xoff+8,yoff,1,1); }
|
drawMonoLine(pmpainter, yoff*2, bits);
|
||||||
|
if (!m_showScanLines) drawMonoLine(pmpainter, yoff*2+1, bits);
|
||||||
|
|
||||||
if (byte & 0x20) { pmpainter.drawRect(xoff+10,yoff,1,1); }
|
|
||||||
|
|
||||||
if (byte & 0x40) { pmpainter.drawRect(xoff+12,yoff,1,1); }
|
chunkCount++;
|
||||||
|
if (chunkCount == 3) {
|
||||||
|
chunkCount = 0;
|
||||||
|
idx+=8;
|
||||||
|
}
|
||||||
|
|
||||||
if (idx >= (280*192)) break;
|
|
||||||
}
|
}
|
||||||
} else if (m_viewMode == Color1) {
|
} else if (m_viewMode == Color1) {
|
||||||
|
|
||||||
@ -185,10 +253,9 @@ void HiresViewWidget::setData(QByteArray data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drawNtscLine(pmpainter, yoff*2, bits);
|
drawNtscLine(pmpainter, yoff*2, bits);
|
||||||
// drawMonoLine(pmpainter, yoff*2, bits);
|
if (!m_showScanLines) {
|
||||||
// for (int ddx = 0; ddx < bits.count(); ddx++) {
|
drawNtscLine(pmpainter, yoff*2+1, bits);
|
||||||
// if (bits.at(ddx)) { pmpainter.drawRect(ddx,yoff*2,0,1); }
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
chunkCount++;
|
chunkCount++;
|
||||||
if (chunkCount == 3) {
|
if (chunkCount == 3) {
|
||||||
@ -199,9 +266,25 @@ void HiresViewWidget::setData(QByteArray data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HiresViewWidget::setData(QByteArray data) {
|
||||||
|
qDebug() << "setData";
|
||||||
|
m_data = data;
|
||||||
|
|
||||||
|
drawPixmap();
|
||||||
|
}
|
||||||
|
|
||||||
void HiresViewWidget::drawMonoLine(QPainter &painter, int lineNum, QBitArray data) {
|
void HiresViewWidget::drawMonoLine(QPainter &painter, int lineNum, QBitArray data) {
|
||||||
for (int idx = 0; idx < data.count(); idx++) {
|
for (int idx = 0; idx < data.count(); idx++) {
|
||||||
if (data.at(idx)) { painter.drawPoint(idx,lineNum); }
|
|
||||||
|
if (data.at(idx))
|
||||||
|
{
|
||||||
|
painter.setPen(Qt::white);
|
||||||
|
} else {
|
||||||
|
painter.setPen(Qt::black);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
painter.drawPoint(idx,lineNum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -397,5 +480,14 @@ void HiresViewWidget::makeOffsetTable() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HiresViewWidget::contextMenuEvent(QContextMenuEvent *event) {
|
||||||
|
QMenu menu(this);
|
||||||
|
menu.addAction(monochromeAction);
|
||||||
|
menu.addAction(ntscAction);
|
||||||
|
menu.addSeparator();
|
||||||
|
menu.addAction(showScanLinesAction);
|
||||||
|
menu.exec(event->globalPos());
|
||||||
|
}
|
||||||
|
|
||||||
QMap<int,int> *HiresViewWidget::m_rowTable = 0;
|
QMap<int,int> *HiresViewWidget::m_rowTable = 0;
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QBitArray>
|
#include <QBitArray>
|
||||||
|
#include <QAction>
|
||||||
|
#include <QMenu>
|
||||||
|
|
||||||
static const QColor blackColor = QColor(0,0,0);
|
static const QColor blackColor = QColor(0,0,0);
|
||||||
static const QColor brownColor = QColor();
|
static const QColor brownColor = QColor();
|
||||||
@ -44,12 +46,17 @@ public:
|
|||||||
void resizeEvent(QResizeEvent *event);
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
|
||||||
static QBitArray byteToBits(quint8 byte);
|
static QBitArray byteToBits(quint8 byte);
|
||||||
|
void contextMenuEvent(QContextMenuEvent *);
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setData(QByteArray data);
|
void setData(QByteArray data);
|
||||||
void setMode(ViewMode);
|
void setMode(ViewMode);
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void handleNtscAction(bool toggled);
|
||||||
|
void handleMonochromeAction(bool toggled);
|
||||||
|
void handleShowScanLinesAction(bool toggled);
|
||||||
private:
|
private:
|
||||||
QPixmap m_pixmap;
|
QPixmap m_pixmap;
|
||||||
QByteArray m_data;
|
QByteArray m_data;
|
||||||
@ -65,6 +72,15 @@ private:
|
|||||||
void drawMonoLine(QPainter &painter, int lineNum, QBitArray data);
|
void drawMonoLine(QPainter &painter, int lineNum, QBitArray data);
|
||||||
|
|
||||||
QColor getColorFromBits(QBitArray bits, quint8 phase);
|
QColor getColorFromBits(QBitArray bits, quint8 phase);
|
||||||
|
|
||||||
|
QAction *monochromeAction;
|
||||||
|
QAction *ntscAction;
|
||||||
|
QAction *showScanLinesAction;
|
||||||
|
QActionGroup *formatGroup;
|
||||||
|
|
||||||
|
bool m_showScanLines;
|
||||||
|
|
||||||
|
void drawPixmap();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user