From 16252a85e70feaa1bd10312a357ac74bd677ade3 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 24 May 2020 23:16:56 +0200 Subject: [PATCH] separate screen handling shit to a specialized class --- src/frontend/FrontendUtil.h | 5 +- src/frontend/Util_Video.cpp | 6 +- src/frontend/qt_sdl/main.cpp | 204 ++++++++++++++++++++--------------- src/frontend/qt_sdl/main.h | 22 +++- 4 files changed, 140 insertions(+), 97 deletions(-) diff --git a/src/frontend/FrontendUtil.h b/src/frontend/FrontendUtil.h index 1fd73296..359018f6 100644 --- a/src/frontend/FrontendUtil.h +++ b/src/frontend/FrontendUtil.h @@ -104,11 +104,12 @@ void UndoStateLoad(); // * integerScale: force screens to be scaled up at integer scaling factors void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int rotation, int sizing, int screenGap, bool integerScale); -// get a 2x3 transform matrix for the given screen (0=top, 1=bottom) +// get a 2x3 transform matrix for each screen // note: the transform assumes an origin point at the top left of the display, // X going left and Y going down // for each screen the source coordinates should be (0,0) and (256,192) -float* GetScreenTransform(int screen); +// 'top' and 'bot' should point each to an array of 6 floats +void GetScreenTransforms(float* top, float* bot); // de-transform the provided host display coordinates to get coordinates // on the bottom screen diff --git a/src/frontend/Util_Video.cpp b/src/frontend/Util_Video.cpp index 0f5ff667..87cb9b50 100644 --- a/src/frontend/Util_Video.cpp +++ b/src/frontend/Util_Video.cpp @@ -313,10 +313,10 @@ void SetupScreenLayout(int screenWidth, int screenHeight, int screenLayout, int } } -float* GetScreenTransform(int screen) +void GetScreenTransforms(float* top, float* bot) { - if (screen == 0) return TopScreenMtx; - else return BotScreenMtx; + memcpy(top, TopScreenMtx, 6*sizeof(float)); + memcpy(bot, BotScreenMtx, 6*sizeof(float)); } void GetTouchCoords(int& x, int& y) diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 922206fc..0e0a21be 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -543,60 +543,8 @@ bool EmuThread::emuIsRunning() } -MainWindowPanel::MainWindowPanel(QWidget* parent) : QWidget(parent) +void ScreenHandler::screenSetupLayout(int w, int h) { - screen[0] = new QImage(256, 192, QImage::Format_RGB32); - screen[1] = new QImage(256, 192, QImage::Format_RGB32); - - screenTrans[0].reset(); - screenTrans[1].reset(); - - touching = false; -} - -MainWindowPanel::~MainWindowPanel() -{ - delete screen[0]; - delete screen[1]; -} - -void MainWindowPanel::ensureProperMinSize() -{ - bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3); - int gap = Config::ScreenGap; - - int w = 256; - int h = 192; - - if (Config::ScreenLayout == 0) // natural - { - if (isHori) - setMinimumSize(h+gap+h, w); - else - setMinimumSize(w, h+gap+h); - } - else if (Config::ScreenLayout == 1) // vertical - { - if (isHori) - setMinimumSize(h, w+gap+w); - else - setMinimumSize(w, h+gap+h); - } - else // horizontal - { - if (isHori) - setMinimumSize(h+gap+h, w); - else - setMinimumSize(w+gap+w, h); - } -} - -void MainWindowPanel::setupScreenLayout() -{ - int w = width(); - int h = height(); - float* mtx; - int sizing = Config::ScreenSizing; if (sizing == 3) sizing = autoScreenSizing; @@ -607,47 +555,41 @@ void MainWindowPanel::setupScreenLayout() Config::ScreenGap, Config::IntegerScaling != 0); - mtx = Frontend::GetScreenTransform(0); - screenTrans[0].setMatrix(mtx[0], mtx[1], 0.f, - mtx[2], mtx[3], 0.f, - mtx[4], mtx[5], 1.f); - - mtx = Frontend::GetScreenTransform(1); - screenTrans[1].setMatrix(mtx[0], mtx[1], 0.f, - mtx[2], mtx[3], 0.f, - mtx[4], mtx[5], 1.f); + Frontend::GetScreenTransforms(screenMatrix[0], screenMatrix[1]); } -void MainWindowPanel::paintEvent(QPaintEvent* event) +QSize ScreenHandler::screenGetMinSize() { - QPainter painter(this); + bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3); + int gap = Config::ScreenGap; - // fill background - painter.fillRect(event->rect(), QColor::fromRgb(0, 0, 0)); + int w = 256; + int h = 192; - int frontbuf = GPU::FrontBuffer; - if (!GPU::Framebuffer[frontbuf][0] || !GPU::Framebuffer[frontbuf][1]) return; - - memcpy(screen[0]->scanLine(0), GPU::Framebuffer[frontbuf][0], 256*192*4); - memcpy(screen[1]->scanLine(0), GPU::Framebuffer[frontbuf][1], 256*192*4); - - painter.setRenderHint(QPainter::SmoothPixmapTransform, Config::ScreenFilter!=0); - - QRect screenrc(0, 0, 256, 192); - - painter.setTransform(screenTrans[0]); - painter.drawImage(screenrc, *screen[0]); - - painter.setTransform(screenTrans[1]); - painter.drawImage(screenrc, *screen[1]); + if (Config::ScreenLayout == 0) // natural + { + if (isHori) + return QSize(h+gap+h, w); + else + return QSize(w, h+gap+h); + } + else if (Config::ScreenLayout == 1) // vertical + { + if (isHori) + return QSize(h, w+gap+w); + else + return QSize(w, h+gap+h); + } + else // horizontal + { + if (isHori) + return QSize(h+gap+h, w); + else + return QSize(w+gap+w, h); + } } -void MainWindowPanel::resizeEvent(QResizeEvent* event) -{ - setupScreenLayout(); -} - -void MainWindowPanel::mousePressEvent(QMouseEvent* event) +void ScreenHandler::screenOnMousePress(QMouseEvent* event) { event->accept(); if (event->button() != Qt::LeftButton) return; @@ -664,7 +606,7 @@ void MainWindowPanel::mousePressEvent(QMouseEvent* event) } } -void MainWindowPanel::mouseReleaseEvent(QMouseEvent* event) +void ScreenHandler::screenOnMouseRelease(QMouseEvent* event) { event->accept(); if (event->button() != Qt::LeftButton) return; @@ -676,7 +618,7 @@ void MainWindowPanel::mouseReleaseEvent(QMouseEvent* event) } } -void MainWindowPanel::mouseMoveEvent(QMouseEvent* event) +void ScreenHandler::screenOnMouseMove(QMouseEvent* event) { event->accept(); if (!(event->buttons() & Qt::LeftButton)) return; @@ -696,6 +638,90 @@ void MainWindowPanel::mouseMoveEvent(QMouseEvent* event) NDS::TouchScreen(x, y); } + +MainWindowPanel::MainWindowPanel(QWidget* parent) : QWidget(parent) +{ + screen[0] = QImage(256, 192, QImage::Format_RGB32); + screen[1] = QImage(256, 192, QImage::Format_RGB32); + + screenTrans[0].reset(); + screenTrans[1].reset(); + + touching = false; +} + +MainWindowPanel::~MainWindowPanel() +{ +} + +void MainWindowPanel::ensureProperMinSize() +{ + setMinimumSize(screenGetMinSize()); +} + +void MainWindowPanel::setupScreenLayout() +{ + int w = width(); + int h = height(); + float* mtx; + + screenSetupLayout(w, h); + + mtx = screenMatrix[0]; + screenTrans[0].setMatrix(mtx[0], mtx[1], 0.f, + mtx[2], mtx[3], 0.f, + mtx[4], mtx[5], 1.f); + + mtx = screenMatrix[1]; + screenTrans[1].setMatrix(mtx[0], mtx[1], 0.f, + mtx[2], mtx[3], 0.f, + mtx[4], mtx[5], 1.f); +} + +void MainWindowPanel::paintEvent(QPaintEvent* event) +{ + QPainter painter(this); + + // fill background + painter.fillRect(event->rect(), QColor::fromRgb(0, 0, 0)); + + int frontbuf = GPU::FrontBuffer; + if (!GPU::Framebuffer[frontbuf][0] || !GPU::Framebuffer[frontbuf][1]) return; + + memcpy(screen[0].scanLine(0), GPU::Framebuffer[frontbuf][0], 256*192*4); + memcpy(screen[1].scanLine(0), GPU::Framebuffer[frontbuf][1], 256*192*4); + + painter.setRenderHint(QPainter::SmoothPixmapTransform, Config::ScreenFilter!=0); + + QRect screenrc(0, 0, 256, 192); + + painter.setTransform(screenTrans[0]); + painter.drawImage(screenrc, screen[0]); + + painter.setTransform(screenTrans[1]); + painter.drawImage(screenrc, screen[1]); +} + +void MainWindowPanel::resizeEvent(QResizeEvent* event) +{ + setupScreenLayout(); +} + +void MainWindowPanel::mousePressEvent(QMouseEvent* event) +{ + screenOnMousePress(event); +} + +void MainWindowPanel::mouseReleaseEvent(QMouseEvent* event) +{ + screenOnMouseRelease(event); +} + +void MainWindowPanel::mouseMoveEvent(QMouseEvent* event) +{ + screenOnMouseMove(event); +} + void MainWindowPanel::onScreenLayoutChanged() { setupScreenLayout(); diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index c0dc465c..1121da1d 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -64,7 +64,24 @@ private: }; -class MainWindowPanel : public QWidget +class ScreenHandler +{ +protected: + void screenSetupLayout(int w, int h); + + QSize screenGetMinSize(); + + void screenOnMousePress(QMouseEvent* event); + void screenOnMouseRelease(QMouseEvent* event); + void screenOnMouseMove(QMouseEvent* event); + + float screenMatrix[2][6]; + + bool touching; +}; + + +class MainWindowPanel : public QWidget, public ScreenHandler { Q_OBJECT @@ -88,9 +105,8 @@ private slots: void onScreenLayoutChanged(); private: - QImage* screen[2]; + QImage screen[2]; QTransform screenTrans[2]; - bool touching; };