all repos — mgba @ 9c5d434d9084fcff22c8128fdbe5e3f6281c3784

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	, m_size(8)
17{
18	m_backing = QPixmap(256, 768);
19	m_backing.fill(Qt::transparent);
20	resize(256, 768);
21	setTileCount(3072);
22}
23
24void TilePainter::paintEvent(QPaintEvent* event) {
25	QPainter painter(this);
26	painter.drawPixmap(QPoint(), m_backing);
27}
28
29void TilePainter::resizeEvent(QResizeEvent* event) {
30	int calculatedHeight = (m_tileCount * m_size) / (width() / m_size) + m_size / 2;
31	if (width() / m_size != m_backing.width() / m_size || m_backing.height() != calculatedHeight) {
32		m_backing = QPixmap(width(), calculatedHeight);
33		m_backing.fill(Qt::transparent);
34	}
35}
36
37void TilePainter::mousePressEvent(QMouseEvent* event) {
38	int x = event->x() / m_size;
39	int y = event->y() / m_size;
40	emit indexPressed(y * (width() / m_size) + x);
41}
42
43void TilePainter::setTile(int index, const uint16_t* data) {
44	QPainter painter(&m_backing);
45	int w = width() / m_size;
46	int x = index % w;
47	int y = index / w;
48	QRect r(x * m_size, y * m_size, m_size, m_size);
49	QImage tile(reinterpret_cast<const uchar*>(data), 8, 8, QImage::Format_RGB555);
50	painter.drawImage(r, tile.rgbSwapped());
51	update(r);
52}
53
54void TilePainter::setTileCount(int tiles) {
55	m_tileCount = tiles;
56	setMinimumSize(16, (tiles * m_size) / (width() / m_size));
57	resizeEvent(nullptr);
58}
59
60void TilePainter::setTileMagnification(int mag) {
61	m_size = mag * 8;
62	setTileCount(m_tileCount);
63}