all repos — mgba @ cb0f95b07053e63e817bd05df0a36bf917667d09

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
 11#ifdef M_CORE_GB
 12#include <mgba/internal/gb/video.h>
 13#elif defined(M_CORE_GBA)
 14#include <mgba/internal/gba/video.h>
 15#endif
 16
 17using namespace QGBA;
 18
 19#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 20Display::Driver Display::s_driver = Display::Driver::OPENGL;
 21#else
 22Display::Driver Display::s_driver = Display::Driver::QT;
 23#endif
 24
 25Display* Display::create(QWidget* parent) {
 26#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 27	QGLFormat format(QGLFormat(QGL::Rgba | QGL::DoubleBuffer));
 28	format.setSwapInterval(1);
 29#endif
 30
 31	switch (s_driver) {
 32#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 33	case Driver::OPENGL:
 34		return new DisplayGL(format, parent);
 35#endif
 36#ifdef BUILD_GL
 37	case Driver::OPENGL1:
 38		format.setVersion(1, 4);
 39		return new DisplayGL(format, parent);
 40#endif
 41
 42	case Driver::QT:
 43		return new DisplayQt(parent);
 44
 45	default:
 46#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY)
 47		return new DisplayGL(format, parent);
 48#else
 49		return new DisplayQt(parent);
 50#endif
 51	}
 52}
 53
 54Display::Display(QWidget* parent)
 55	: QWidget(parent)
 56	, m_lockAspectRatio(false)
 57	, m_filter(false)
 58{
 59	setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 60#ifdef M_CORE_GB
 61	setMinimumSize(GB_VIDEO_HORIZONTAL_PIXELS, GB_VIDEO_VERTICAL_PIXELS);
 62#elif defined(M_CORE_GBA)
 63	setMinimumSize(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS);
 64#endif
 65	connect(&m_mouseTimer, SIGNAL(timeout()), this, SIGNAL(hideCursor()));
 66	m_mouseTimer.setSingleShot(true);
 67	m_mouseTimer.setInterval(MOUSE_DISAPPEAR_TIMER);
 68	setMouseTracking(true);
 69}
 70
 71QSize Display::viewportSize() {
 72	QSize s = size();
 73	QSize ds = s;
 74	if (isAspectRatioLocked()) {
 75		if (s.width() * m_coreHeight > s.height() * m_coreWidth) {
 76			ds.setWidth(s.height() * m_coreWidth / m_coreHeight);
 77		} else if (s.width() * m_coreHeight < s.height() * m_coreWidth) {
 78			ds.setHeight(s.width() * m_coreHeight / m_coreWidth);
 79		}
 80	}
 81	return ds;
 82}
 83
 84void Display::resizeEvent(QResizeEvent*) {
 85	m_messagePainter.resize(size(), m_lockAspectRatio, devicePixelRatio());
 86}
 87
 88void Display::lockAspectRatio(bool lock) {
 89	m_lockAspectRatio = lock;
 90	m_messagePainter.resize(size(), m_lockAspectRatio, devicePixelRatio());
 91}
 92
 93void Display::filter(bool filter) {
 94	m_filter = filter;
 95}
 96
 97void Display::showMessage(const QString& message) {
 98	m_messagePainter.showMessage(message);
 99	if (!isDrawing()) {
100		forceDraw();
101	}
102}
103
104void Display::mouseMoveEvent(QMouseEvent* event) {
105	emit showCursor();
106	m_mouseTimer.stop();
107	m_mouseTimer.start();
108	event->ignore();
109}
110
111void Display::setSystemDimensions(int width, int height) {
112	m_coreWidth = width;
113	m_coreHeight = height;
114}