aboutsummaryrefslogtreecommitdiff
path: root/src/frontend
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2020-05-24 23:16:56 +0200
committerArisotura <thetotalworm@gmail.com>2020-05-24 23:16:56 +0200
commit16252a85e70feaa1bd10312a357ac74bd677ade3 (patch)
treec2a889e5c3861db39138ced1adea3b2520bc4e82 /src/frontend
parentf69f3fcb7a6f5eabe07de3db58409aee036348ea (diff)
separate screen handling shit to a specialized class
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/FrontendUtil.h5
-rw-r--r--src/frontend/Util_Video.cpp6
-rw-r--r--src/frontend/qt_sdl/main.cpp168
-rw-r--r--src/frontend/qt_sdl/main.h22
4 files changed, 122 insertions, 79 deletions
diff --git a/src/frontend/FrontendUtil.h b/src/frontend/FrontendUtil.h
index 1fd7329..359018f 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 0f5ff66..87cb9b5 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 922206f..0e0a21b 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -543,24 +543,22 @@ 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();
+ int sizing = Config::ScreenSizing;
+ if (sizing == 3) sizing = autoScreenSizing;
- touching = false;
-}
+ Frontend::SetupScreenLayout(w, h,
+ Config::ScreenLayout,
+ Config::ScreenRotation,
+ sizing,
+ Config::ScreenGap,
+ Config::IntegerScaling != 0);
-MainWindowPanel::~MainWindowPanel()
-{
- delete screen[0];
- delete screen[1];
+ Frontend::GetScreenTransforms(screenMatrix[0], screenMatrix[1]);
}
-void MainWindowPanel::ensureProperMinSize()
+QSize ScreenHandler::screenGetMinSize()
{
bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3);
int gap = Config::ScreenGap;
@@ -571,48 +569,110 @@ void MainWindowPanel::ensureProperMinSize()
if (Config::ScreenLayout == 0) // natural
{
if (isHori)
- setMinimumSize(h+gap+h, w);
+ return QSize(h+gap+h, w);
else
- setMinimumSize(w, h+gap+h);
+ return QSize(w, h+gap+h);
}
else if (Config::ScreenLayout == 1) // vertical
{
if (isHori)
- setMinimumSize(h, w+gap+w);
+ return QSize(h, w+gap+w);
else
- setMinimumSize(w, h+gap+h);
+ return QSize(w, h+gap+h);
}
else // horizontal
{
if (isHori)
- setMinimumSize(h+gap+h, w);
+ return QSize(h+gap+h, w);
else
- setMinimumSize(w+gap+w, h);
+ return QSize(w+gap+w, h);
+ }
+}
+
+void ScreenHandler::screenOnMousePress(QMouseEvent* event)
+{
+ event->accept();
+ if (event->button() != Qt::LeftButton) return;
+
+ int x = event->pos().x();
+ int y = event->pos().y();
+
+ Frontend::GetTouchCoords(x, y);
+
+ if (x >= 0 && x < 256 && y >= 0 && y < 192)
+ {
+ touching = true;
+ NDS::TouchScreen(x, y);
+ }
+}
+
+void ScreenHandler::screenOnMouseRelease(QMouseEvent* event)
+{
+ event->accept();
+ if (event->button() != Qt::LeftButton) return;
+
+ if (touching)
+ {
+ touching = false;
+ NDS::ReleaseScreen();
}
}
+void ScreenHandler::screenOnMouseMove(QMouseEvent* event)
+{
+ event->accept();
+ if (!(event->buttons() & Qt::LeftButton)) return;
+ if (!touching) return;
+
+ int x = event->pos().x();
+ int y = event->pos().y();
+
+ Frontend::GetTouchCoords(x, y);
+
+ // clamp to screen range
+ if (x < 0) x = 0;
+ else if (x > 255) x = 255;
+ if (y < 0) y = 0;
+ else if (y > 191) y = 191;
+
+ 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;
- int sizing = Config::ScreenSizing;
- if (sizing == 3) sizing = autoScreenSizing;
-
- Frontend::SetupScreenLayout(w, h,
- Config::ScreenLayout,
- Config::ScreenRotation,
- sizing,
- Config::ScreenGap,
- Config::IntegerScaling != 0);
+ screenSetupLayout(w, h);
- mtx = Frontend::GetScreenTransform(0);
+ 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 = Frontend::GetScreenTransform(1);
+ mtx = screenMatrix[1];
screenTrans[1].setMatrix(mtx[0], mtx[1], 0.f,
mtx[2], mtx[3], 0.f,
mtx[4], mtx[5], 1.f);
@@ -628,18 +688,18 @@ void MainWindowPanel::paintEvent(QPaintEvent* event)
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);
+ 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.drawImage(screenrc, screen[0]);
painter.setTransform(screenTrans[1]);
- painter.drawImage(screenrc, *screen[1]);
+ painter.drawImage(screenrc, screen[1]);
}
void MainWindowPanel::resizeEvent(QResizeEvent* event)
@@ -649,51 +709,17 @@ void MainWindowPanel::resizeEvent(QResizeEvent* event)
void MainWindowPanel::mousePressEvent(QMouseEvent* event)
{
- event->accept();
- if (event->button() != Qt::LeftButton) return;
-
- int x = event->pos().x();
- int y = event->pos().y();
-
- Frontend::GetTouchCoords(x, y);
-
- if (x >= 0 && x < 256 && y >= 0 && y < 192)
- {
- touching = true;
- NDS::TouchScreen(x, y);
- }
+ screenOnMousePress(event);
}
void MainWindowPanel::mouseReleaseEvent(QMouseEvent* event)
{
- event->accept();
- if (event->button() != Qt::LeftButton) return;
-
- if (touching)
- {
- touching = false;
- NDS::ReleaseScreen();
- }
+ screenOnMouseRelease(event);
}
void MainWindowPanel::mouseMoveEvent(QMouseEvent* event)
{
- event->accept();
- if (!(event->buttons() & Qt::LeftButton)) return;
- if (!touching) return;
-
- int x = event->pos().x();
- int y = event->pos().y();
-
- Frontend::GetTouchCoords(x, y);
-
- // clamp to screen range
- if (x < 0) x = 0;
- else if (x > 255) x = 255;
- if (y < 0) y = 0;
- else if (y > 191) y = 191;
-
- NDS::TouchScreen(x, y);
+ screenOnMouseMove(event);
}
void MainWindowPanel::onScreenLayoutChanged()
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index c0dc465..1121da1 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;
};