all repos — mgba @ a46901b90980c82d4ccc63c8daf2746ec64dd670

mGBA Game Boy Advance Emulator

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

 1/* Copyright (c) 2013-2016 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 "TilePainter.h"
 7
 8#include <QImage>
 9#include <QMouseEvent>
10#include <QPainter>
11
12using namespace QGBA;
13
14TilePainter::TilePainter(QWidget* parent)
15	: QWidget(parent)
16{
17	m_backing.fill(Qt::transparent);
18	resize(256, 768);
19	setTileCount(3072);
20}
21
22void TilePainter::paintEvent(QPaintEvent*) {
23	QPainter painter(this);
24	painter.drawPixmap(QPoint(), m_backing);
25}
26
27void TilePainter::resizeEvent(QResizeEvent*) {
28	int w = width() / m_size;
29	if (!w) {
30		w = 1;
31	}
32	int calculatedHeight = (m_tileCount + w - 1) * m_size / w;
33	calculatedHeight -= calculatedHeight % m_size;
34	if (width() / m_size != m_backing.width() / m_size || m_backing.height() != calculatedHeight) {
35		m_backing = QPixmap(width(), calculatedHeight);
36		m_backing.fill(Qt::transparent);
37		emit needsRedraw();
38	}
39}
40
41void TilePainter::mousePressEvent(QMouseEvent* event) {
42	int x = event->x() / m_size;
43	int y = event->y() / m_size;
44	emit indexPressed(y * (width() / m_size) + x);
45}
46
47void TilePainter::setTile(int index, const color_t* data) {
48	QPainter painter(&m_backing);
49	int w = width() / m_size;
50	int x = index % w;
51	int y = index / w;
52	QRect r(x * m_size, y * m_size, m_size, m_size);
53	QImage tile(reinterpret_cast<const uchar*>(data), 8, 8, QImage::Format_ARGB32);
54	tile = tile.convertToFormat(QImage::Format_RGB32).rgbSwapped();
55	painter.drawImage(r, tile);
56	update(r);
57}
58
59void TilePainter::setTileCount(int tiles) {
60	m_tileCount = tiles;
61	if (sizePolicy().horizontalPolicy() != QSizePolicy::Fixed) {
62		// Only manage the size ourselves if we don't appear to have something else managing it
63		int w = width() / m_size;
64		int h = (tiles + w - 1) * m_size / w;
65		setMinimumSize(m_size, h - (h % m_size));
66	} else {		
67		int w = minimumSize().width() / m_size;
68		if (!w) {
69			w = 1;
70		}
71		int h = (tiles + w - 1) * m_size / w;
72		setMinimumSize(w * m_size, h - (h % m_size));
73	}
74	resizeEvent(nullptr);
75}
76
77void TilePainter::setTileMagnification(int mag) {
78	m_size = mag * 8;
79	setTileCount(m_tileCount);
80}