diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 897fc26a8..202431f37 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -42,6 +42,7 @@ set(SOURCE_FILES ConfigController.cpp Display.cpp DisplayGL.cpp + DisplayQt.cpp GBAApp.cpp GBAKeyEditor.cpp GIFView.cpp diff --git a/src/platform/qt/DisplayQt.cpp b/src/platform/qt/DisplayQt.cpp new file mode 100644 index 000000000..34c43bda6 --- /dev/null +++ b/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 + +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(buffer), 256, 256, QImage::Format_RGB16); +#else + m_backing = QImage(reinterpret_cast(buffer), 256, 256, QImage::Format_RGB555); +#endif +#else + m_backing = QImage(reinterpret_cast(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 +} diff --git a/src/platform/qt/DisplayQt.h b/src/platform/qt/DisplayQt.h new file mode 100644 index 000000000..8476861f1 --- /dev/null +++ b/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 +#include + +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 diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 979ad8f6f..cb7c87a0c 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "CheatsView.h"