mirror of
https://github.com/libretro/mgba.git
synced 2024-11-24 00:20:05 +00:00
Qt: Optimize logo drawing
This commit is contained in:
parent
d3ebcda24b
commit
1273ab4ca5
1
CHANGES
1
CHANGES
@ -55,6 +55,7 @@ Misc:
|
||||
- Util: Use proper locale for reading and writing float values
|
||||
- Debugger: Make I/O register names be addresses instead of values
|
||||
- Debugger: Rename read/write commands
|
||||
- Qt: Optimize logo drawing
|
||||
|
||||
0.1.1: (2015-01-24)
|
||||
Bugfixes:
|
||||
|
@ -66,9 +66,14 @@ Window::Window(ConfigController* config, QWidget* parent)
|
||||
format.setSwapInterval(1);
|
||||
m_display = new Display(format);
|
||||
|
||||
m_logo.setDevicePixelRatio(m_screenWidget->devicePixelRatio());
|
||||
m_logo = m_logo; // Free memory left over in old pixmap
|
||||
|
||||
m_screenWidget->setMinimumSize(m_display->minimumSize());
|
||||
m_screenWidget->setSizePolicy(m_display->sizePolicy());
|
||||
m_screenWidget->setSizeHint(m_display->minimumSize() * 2);
|
||||
m_screenWidget->setPixmap(m_logo);
|
||||
m_screenWidget->setLockAspectRatio(m_logo.width(), m_logo.height());
|
||||
setCentralWidget(m_screenWidget);
|
||||
|
||||
connect(m_controller, SIGNAL(gameStarted(GBAThread*)), this, SLOT(gameStarted(GBAThread*)));
|
||||
@ -325,7 +330,6 @@ void Window::keyReleaseEvent(QKeyEvent* event) {
|
||||
}
|
||||
|
||||
void Window::resizeEvent(QResizeEvent*) {
|
||||
redoLogo();
|
||||
m_config->setOption("height", m_screenWidget->height());
|
||||
m_config->setOption("width", m_screenWidget->width());
|
||||
}
|
||||
@ -393,7 +397,6 @@ void Window::gameStarted(GBAThread* context) {
|
||||
appendMRU(context->fname);
|
||||
setWindowTitle(tr(PROJECT_NAME " - %1").arg(title));
|
||||
attachWidget(m_display);
|
||||
m_screenWidget->setScaledContents(true);
|
||||
|
||||
#ifndef Q_OS_MAC
|
||||
if(isFullScreen()) {
|
||||
@ -410,8 +413,8 @@ void Window::gameStopped() {
|
||||
}
|
||||
setWindowTitle(tr(PROJECT_NAME));
|
||||
detachWidget(m_display);
|
||||
m_screenWidget->setScaledContents(false);
|
||||
redoLogo();
|
||||
m_screenWidget->setLockAspectRatio(m_logo.width(), m_logo.height());
|
||||
m_screenWidget->setPixmap(m_logo);
|
||||
|
||||
m_fpsTimer.stop();
|
||||
}
|
||||
@ -432,15 +435,6 @@ void Window::gameFailed() {
|
||||
fail->show();
|
||||
}
|
||||
|
||||
void Window::redoLogo() {
|
||||
if (m_controller->isLoaded()) {
|
||||
return;
|
||||
}
|
||||
QPixmap logo(m_logo.scaled(m_screenWidget->size() * m_screenWidget->devicePixelRatio(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
logo.setDevicePixelRatio(m_screenWidget->devicePixelRatio());
|
||||
m_screenWidget->setPixmap(logo);
|
||||
}
|
||||
|
||||
void Window::recordFrame() {
|
||||
m_frameList.append(QDateTime::currentDateTime());
|
||||
while (m_frameList.count() > FRAME_LIST_SIZE) {
|
||||
@ -558,6 +552,7 @@ void Window::setupMenu(QMenuBar* menubar) {
|
||||
QPixmap pixmap;
|
||||
pixmap.convertFromImage(currentImage.rgbSwapped());
|
||||
m_screenWidget->setPixmap(pixmap);
|
||||
m_screenWidget->setLockAspectRatio(3, 2);
|
||||
});
|
||||
connect(m_controller, &GameController::gameUnpaused, [pause]() { pause->setChecked(false); });
|
||||
m_gameActions.append(pause);
|
||||
@ -810,10 +805,6 @@ WindowBackground::WindowBackground(QWidget* parent)
|
||||
setLayout(new QStackedLayout());
|
||||
layout()->setContentsMargins(0, 0, 0, 0);
|
||||
setAlignment(Qt::AlignCenter);
|
||||
QPalette p = palette();
|
||||
p.setColor(backgroundRole(), Qt::black);
|
||||
setPalette(p);
|
||||
setAutoFillBackground(true);
|
||||
}
|
||||
|
||||
void WindowBackground::setSizeHint(const QSize& hint) {
|
||||
@ -823,3 +814,28 @@ void WindowBackground::setSizeHint(const QSize& hint) {
|
||||
QSize WindowBackground::sizeHint() const {
|
||||
return m_sizeHint;
|
||||
}
|
||||
|
||||
void WindowBackground::setLockAspectRatio(int width, int height) {
|
||||
m_aspectWidth = width;
|
||||
m_aspectHeight = height;
|
||||
}
|
||||
|
||||
void WindowBackground::paintEvent(QPaintEvent*) {
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::SmoothPixmapTransform);
|
||||
const QPixmap* logo = pixmap();
|
||||
painter.fillRect(QRect(QPoint(), size()), Qt::black);
|
||||
if (!logo) {
|
||||
return;
|
||||
}
|
||||
QSize s = size();
|
||||
QSize ds = s;
|
||||
if (s.width() * m_aspectHeight > s.height() * m_aspectWidth) {
|
||||
ds.setWidth(s.height() * m_aspectWidth / m_aspectHeight);
|
||||
} else if (s.width() * m_aspectHeight < s.height() * m_aspectWidth) {
|
||||
ds.setHeight(s.width() * m_aspectHeight / m_aspectWidth);
|
||||
}
|
||||
QPoint origin = QPoint((s.width() - ds.width()) / 2, (s.height() - ds.height()) / 2);
|
||||
QRect full(origin, ds);
|
||||
painter.drawPixmap(full, *logo);
|
||||
}
|
||||
|
@ -101,7 +101,6 @@ private slots:
|
||||
void gameStopped();
|
||||
void gameCrashed(const QString&);
|
||||
void gameFailed();
|
||||
void redoLogo();
|
||||
|
||||
void recordFrame();
|
||||
void showFPS();
|
||||
@ -157,9 +156,15 @@ public:
|
||||
|
||||
void setSizeHint(const QSize& size);
|
||||
virtual QSize sizeHint() const override;
|
||||
void setLockAspectRatio(int width, int height);
|
||||
|
||||
protected:
|
||||
virtual void paintEvent(QPaintEvent*) override;
|
||||
|
||||
private:
|
||||
QSize m_sizeHint;
|
||||
int m_aspectWidth;
|
||||
int m_aspectHeight;
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user