all repos — mgba @ 425baa17737ed51ee8c02715b1403f1ea8ab9391

mGBA Game Boy Advance Emulator

src/platform/qt/Display.cpp (view raw)

  1/* Copyright (c) 2013-2015 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "Display.h"
  7
  8#include "DisplayGL.h"
  9#include "DisplayQt.h"
 10#include "LogController.h"
 11
 12using namespace QGBA;
 13
 14#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 15Display::Driver Display::s_driver = Display::Driver::OPENGL;
 16#else
 17Display::Driver Display::s_driver = Display::Driver::QT;
 18#endif
 19
 20Display* Display::create(QWidget* parent) {
 21#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 22	QSurfaceFormat format;
 23	format.setSwapInterval(1);
 24	format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
 25#endif
 26
 27	switch (s_driver) {
 28#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 29	case Driver::OPENGL:
 30#if defined(BUILD_GLES2) || defined(USE_EPOXY)
 31		if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
 32			format.setVersion(2, 0);
 33		} else {
 34			format.setVersion(3, 2);
 35		}
 36		format.setProfile(QSurfaceFormat::CoreProfile);
 37		if (!DisplayGL::supportsFormat(format)) {
 38#ifdef BUILD_GL
 39			LOG(QT, WARN) << ("Failed to create an OpenGL Core context, trying old-style...");
 40			format.setVersion(1, 4);
 41			format.setOption(QSurfaceFormat::DeprecatedFunctions);
 42			if (!DisplayGL::supportsFormat(format)) {
 43				return nullptr;
 44			}
 45#else
 46			return nullptr;
 47#endif
 48		}
 49		return new DisplayGL(format, parent);
 50#endif
 51#endif
 52#ifdef BUILD_GL
 53	case Driver::OPENGL1:
 54		format.setVersion(1, 4);
 55		if (!DisplayGL::supportsFormat(format)) {
 56			return nullptr;
 57		}
 58		return new DisplayGL(format, parent);
 59#endif
 60
 61	case Driver::QT:
 62		return new DisplayQt(parent);
 63
 64	default:
 65#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 66		return new DisplayGL(format, parent);
 67#else
 68		return new DisplayQt(parent);
 69#endif
 70	}
 71}
 72
 73Display::Display(QWidget* parent)
 74	: QWidget(parent)
 75{
 76	setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 77	connect(&m_mouseTimer, &QTimer::timeout, this, &Display::hideCursor);
 78	m_mouseTimer.setSingleShot(true);
 79	m_mouseTimer.setInterval(MOUSE_DISAPPEAR_TIMER);
 80	setMouseTracking(true);
 81}
 82
 83void Display::resizeEvent(QResizeEvent*) {
 84	m_messagePainter.resize(size(), m_lockAspectRatio, devicePixelRatio());
 85}
 86
 87void Display::lockAspectRatio(bool lock) {
 88	m_lockAspectRatio = lock;
 89	m_messagePainter.resize(size(), m_lockAspectRatio, devicePixelRatio());
 90}
 91
 92void Display::lockIntegerScaling(bool lock) {
 93	m_lockIntegerScaling = lock;
 94}
 95
 96void Display::interframeBlending(bool lock) {
 97	m_interframeBlending = lock;
 98}
 99
100void Display::showOSDMessages(bool enable) {
101	m_showOSD = enable;
102}
103
104void Display::filter(bool filter) {
105	m_filter = filter;
106}
107
108void Display::showMessage(const QString& message) {
109	m_messagePainter.showMessage(message);
110	if (!isDrawing()) {
111		forceDraw();
112	}
113}
114
115void Display::mouseMoveEvent(QMouseEvent*) {
116	emit showCursor();
117	m_mouseTimer.stop();
118	m_mouseTimer.start();
119}