all repos — mgba @ b02b9930473ebdde980e73403dae58a2c4516349

mGBA Game Boy Advance Emulator

src/platform/qt/TileView.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 "TileView.h"
  7
  8#include "CoreController.h"
  9#include "GBAApp.h"
 10
 11#include <QFontDatabase>
 12#include <QTimer>
 13
 14#ifdef M_CORE_GB
 15#include <mgba/internal/gb/gb.h>
 16#endif
 17
 18using namespace QGBA;
 19
 20TileView::TileView(std::shared_ptr<CoreController> controller, QWidget* parent)
 21	: AssetView(controller, parent)
 22	, m_controller(controller)
 23{
 24	m_ui.setupUi(this);
 25	m_ui.tile->setController(controller);
 26
 27	connect(m_ui.tiles, &TilePainter::indexPressed, m_ui.tile, &AssetTile::selectIndex);
 28	connect(m_ui.paletteId, &QAbstractSlider::valueChanged, this, &TileView::updatePalette);
 29
 30	switch (m_controller->platform()) {
 31#ifdef M_CORE_GBA
 32	case PLATFORM_GBA:
 33		m_ui.tile->setBoundary(2048, 0, 2);
 34		break;
 35#endif
 36#ifdef M_CORE_GB
 37	case PLATFORM_GB:
 38		m_ui.palette256->setEnabled(false);
 39		m_ui.tile->setBoundary(1024, 0, 0);
 40		break;
 41#endif
 42	default:
 43		return;
 44	}
 45
 46	connect(m_ui.palette256, &QAbstractButton::toggled, [this](bool selected) {
 47		if (selected) {
 48			m_ui.paletteId->setValue(0);
 49		}
 50		switch (m_controller->platform()) {
 51#ifdef M_CORE_GBA
 52		case PLATFORM_GBA:
 53			m_ui.tile->setBoundary(2048 >> selected, selected, selected + 2);
 54			break;
 55#endif
 56#ifdef M_CORE_GB
 57		case PLATFORM_GB:
 58			return;
 59#endif
 60		default:
 61			break;
 62		}
 63		updateTiles(true);
 64	});
 65	connect(m_ui.magnification, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [this]() {
 66		updateTiles(true);
 67	});
 68}
 69
 70#ifdef M_CORE_GBA
 71void TileView::updateTilesGBA(bool force) {
 72	if (m_ui.palette256->isChecked()) {
 73		m_ui.tiles->setTileCount(1536);
 74		mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 1);
 75		for (int i = 0; i < 1024; ++i) {
 76			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, 0);
 77			if (data) {
 78				m_ui.tiles->setTile(i, data);
 79			} else if (force) {
 80				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, 0));
 81			}
 82		}
 83		cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 3);
 84		for (int i = 1024; i < 1536; ++i) {
 85			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 1024, 0);
 86			if (data) {
 87				m_ui.tiles->setTile(i, data);
 88			} else if (force) {
 89				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 1024, 0));
 90			}
 91		}
 92	} else {
 93		mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0);
 94		m_ui.tiles->setTileCount(3072);
 95		for (int i = 0; i < 2048; ++i) {
 96			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, m_paletteId);
 97			if (data) {
 98				m_ui.tiles->setTile(i, data);
 99			} else if (force) {
100				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId));
101			}
102		}
103		cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 2);
104		for (int i = 2048; i < 3072; ++i) {
105			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 2048, m_paletteId);
106			if (data) {
107				m_ui.tiles->setTile(i, data);
108			} else if (force) {
109				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 2048, m_paletteId));
110			}
111		}
112	}
113}
114#endif
115
116#ifdef M_CORE_GB
117void TileView::updateTilesGB(bool force) {
118	const GB* gb = static_cast<const GB*>(m_controller->thread()->core->board);
119	int count = gb->model >= GB_MODEL_CGB ? 1024 : 512;
120	m_ui.tiles->setTileCount(count);
121	mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0);
122	for (int i = 0; i < count; ++i) {
123		const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[8 * i], i, m_paletteId);
124		if (data) {
125			m_ui.tiles->setTile(i, data);
126		} else if (force) {
127			m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId));
128		}
129	}
130}
131#endif
132
133void TileView::updatePalette(int palette) {
134	m_paletteId = palette;
135	m_ui.tile->setPalette(palette);
136	updateTiles(true);
137}