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}