Skip to content

Commit 3965708

Browse files
DreamNik10110111
andcommitted
Make sure splash screen preserves OpenGL context
This is important on Android. Co-authored-by: Ruslan Kabatsayev <b7.10110111@gmail.com>
1 parent 52c773f commit 3965708

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

src/StelSplashScreen.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
#include "StelFileMgr.hpp"
2121
#include "StelUtils.hpp"
2222

23+
#include <QOpenGLContext>
2324
#include <QPainter>
25+
#include <QSurface>
2426
#include <cmath>
2527

2628
SplashScreen::SplashScreenWidget* SplashScreen::instance;
@@ -142,24 +144,56 @@ void setBestFontStretch(SplashTextHolder& h, QFont& font, const QString& text,
142144
font.setStretch(max);
143145
}
144146

147+
// This is necessary for Android
148+
class OpenGLContextPresever
149+
{
150+
public:
151+
QOpenGLContext* prevContext;
152+
QSurface* prevSurface;
153+
154+
OpenGLContextPresever()
155+
{
156+
prevContext = QOpenGLContext::currentContext();
157+
if (prevContext)
158+
{
159+
prevSurface = prevContext->surface();
160+
}
161+
}
162+
163+
~OpenGLContextPresever()
164+
{
165+
if (QOpenGLContext::currentContext() != prevContext)
166+
{
167+
prevContext->makeCurrent(prevSurface);
168+
}
169+
}
170+
};
171+
145172
}
146173

147174
void SplashScreen::present(const double sizeRatio)
148175
{
176+
OpenGLContextPresever preserver;
177+
149178
Q_ASSERT(!instance);
150179
instance=new SplashScreenWidget(sizeRatio);
151180
instance->show();
181+
182+
#if !defined(Q_OS_ANDROID)
152183
instance->ensureFirstPaint();
184+
#endif
153185
}
154186

155187
void SplashScreen::showMessage(QString const& message)
156188
{
189+
OpenGLContextPresever contextPreserver;
157190
Q_ASSERT(instance);
158191
instance->showMessage(message, Qt::AlignLeft|Qt::AlignBottom, Qt::white);
159192
}
160193

161194
void SplashScreen::finish(QWidget* mainWindow)
162195
{
196+
OpenGLContextPresever contextPreserver;
163197
Q_ASSERT(instance);
164198
instance->hide();
165199
instance->finish(mainWindow);
@@ -169,6 +203,7 @@ void SplashScreen::finish(QWidget* mainWindow)
169203

170204
void SplashScreen::clearMessage()
171205
{
206+
OpenGLContextPresever contextPreserver;
172207
Q_ASSERT(instance);
173208
instance->clearMessage();
174209
}
@@ -215,6 +250,7 @@ SplashScreen::SplashScreenWidget::SplashScreenWidget(const double sizeRatio)
215250

216251
void SplashScreen::SplashScreenWidget::paintEvent(QPaintEvent* event)
217252
{
253+
OpenGLContextPresever contextPreserver;
218254
QSplashScreen::paintEvent(event);
219255

220256
QPainter p(this);

0 commit comments

Comments
 (0)