all repos — mgba @ f2559ad169ac3136e694e5482f1129d7d8341641

mGBA Game Boy Advance Emulator

Qt: Add pure-Qt display backend
Jeffrey Pfau jeffrey@endrift.com
Wed, 01 Apr 2015 00:35:55 -0700
commit

f2559ad169ac3136e694e5482f1129d7d8341641

parent

11eab66247ed0ac13508921a9fd6b3a3ae14ed0e

M src/platform/qt/CMakeLists.txtsrc/platform/qt/CMakeLists.txt

@@ -42,6 +42,7 @@ CheatsView.cpp

ConfigController.cpp Display.cpp DisplayGL.cpp + DisplayQt.cpp GBAApp.cpp GBAKeyEditor.cpp GIFView.cpp
A src/platform/qt/DisplayQt.cpp

@@ -0,0 +1,82 @@

+/* Copyright (c) 2013-2015 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "DisplayQt.h" + +#include <QPainter> + +using namespace QGBA; + +DisplayQt::DisplayQt(QWidget* parent) + : Display(parent) + , m_lockAspectRatio(false) + , m_filter(false) +{ + connect(&m_drawTimer, SIGNAL(timeout()), this, SLOT(update())); + m_drawTimer.setInterval(12); // Give update time roughly 4.6ms of clearance +} + +void DisplayQt::startDrawing(const uint32_t* buffer, GBAThread* context) { + m_context = context; +#ifdef COLOR_16_BIT +#ifdef COLOR_5_6_5 + m_backing = QImage(reinterpret_cast<const uchar*>(buffer), 256, 256, QImage::Format_RGB16); +#else + m_backing = QImage(reinterpret_cast<const uchar*>(buffer), 256, 256, QImage::Format_RGB555); +#endif +#else + m_backing = QImage(reinterpret_cast<const uchar*>(buffer), 256, 256, QImage::Format_RGB32); +#endif + m_drawTimer.start(); +} + +void DisplayQt::stopDrawing() { + m_drawTimer.stop(); +} + +void DisplayQt::pauseDrawing() { + m_drawTimer.stop(); +} + +void DisplayQt::unpauseDrawing() { + m_drawTimer.start(); +} + +void DisplayQt::forceDraw() { + update(); +} + +void DisplayQt::lockAspectRatio(bool lock) { + m_lockAspectRatio = lock; + update(); +} + +void DisplayQt::filter(bool filter) { + m_filter = filter; + update(); +} + +void DisplayQt::paintEvent(QPaintEvent*) { + QPainter painter(this); + painter.fillRect(QRect(QPoint(), size()), Qt::black); + if (m_filter) { + painter.setRenderHint(QPainter::SmoothPixmapTransform); + } + QSize s = size(); + QSize ds = s; + if (s.width() * 2 > s.height() * 3) { + ds.setWidth(s.height() * 3 / 2); + } else if (s.width() * 2 < s.height() * 3) { + ds.setHeight(s.width() * 2 / 3); + } + QPoint origin = QPoint((s.width() - ds.width()) / 2, (s.height() - ds.height()) / 2); + QRect full(origin, ds); + +#ifdef COLOR_5_6_5 + painter.drawImage(full, m_backing, QRect(0, 0, 240, 160)); +#else + painter.drawImage(full, m_backing.rgbSwapped(), QRect(0, 0, 240, 160)); +#endif +}
A src/platform/qt/DisplayQt.h

@@ -0,0 +1,46 @@

+/* Copyright (c) 2013-2015 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef QGBA_DISPLAY_QT +#define QGBA_DISPLAY_QT + +#include "Display.h" + +#include <QImage> +#include <QTimer> + +struct GBAThread; + +namespace QGBA { + +class DisplayQt : public Display { +Q_OBJECT + +public: + DisplayQt(QWidget* parent = nullptr); + +public slots: + void startDrawing(const uint32_t* buffer, GBAThread* context); + void stopDrawing(); + void pauseDrawing(); + void unpauseDrawing(); + void forceDraw(); + void lockAspectRatio(bool lock); + void filter(bool filter); + +protected: + virtual void paintEvent(QPaintEvent*) override; + +private: + QTimer m_drawTimer; + GBAThread* m_context; + QImage m_backing; + bool m_lockAspectRatio; + bool m_filter; +}; + +} + +#endif
M src/platform/qt/Window.cppsrc/platform/qt/Window.cpp

@@ -12,6 +12,7 @@ #include <QKeySequence>

#include <QMenuBar> #include <QMessageBox> #include <QMimeData> +#include <QPainter> #include <QStackedLayout> #include "CheatsView.h"