diff --git a/forms/tileseteditor.ui b/forms/tileseteditor.ui
index ebd05962..a0687826 100644
--- a/forms/tileseteditor.ui
+++ b/forms/tileseteditor.ui
@@ -479,6 +479,9 @@
+
+
+
diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h
index 276dce47..f57ea79c 100644
--- a/include/ui/tileseteditor.h
+++ b/include/ui/tileseteditor.h
@@ -76,6 +76,10 @@ private slots:
void on_comboBox_layerType_activated(int arg1);
+ void on_actionExport_Primary_Tiles_Image_triggered();
+
+ void on_actionExport_Secondary_Tiles_Image_triggered();
+
private:
void closeEvent(QCloseEvent*);
void initMetatileSelector();
diff --git a/include/ui/tileseteditortileselector.h b/include/ui/tileseteditortileselector.h
index f20bbe5d..38347b39 100644
--- a/include/ui/tileseteditortileselector.h
+++ b/include/ui/tileseteditortileselector.h
@@ -25,6 +25,8 @@ public:
QList getSelectedTiles();
void setExternalSelection(int, int, QList);
QPoint getTileCoordsOnWidget(uint16_t);
+ QImage buildPrimaryTilesIndexedImage();
+ QImage buildSecondaryTilesIndexedImage();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent*);
diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp
index c8157c0a..829d19f1 100644
--- a/src/ui/tileseteditor.cpp
+++ b/src/ui/tileseteditor.cpp
@@ -369,8 +369,8 @@ void TilesetEditor::importTilesetTiles(Tileset *tileset, bool primary) {
}
// Validate total number of tiles in image.
- int numTilesWide = image.width() / 16;
- int numTilesHigh = image.height() / 16;
+ int numTilesWide = image.width() / 8;
+ int numTilesHigh = image.height() / 8;
int totalTiles = numTilesHigh * numTilesWide;
int maxAllowedTiles = primary ? Project::getNumTilesPrimary() : Project::getNumTilesTotal() - Project::getNumTilesPrimary();
if (totalTiles > maxAllowedTiles) {
@@ -553,3 +553,25 @@ void TilesetEditor::on_actionRedo_triggered()
this->metatileLayersItem->clearLastModifiedCoords();
}
}
+
+void TilesetEditor::on_actionExport_Primary_Tiles_Image_triggered()
+{
+ QString defaultName = QString("%1_Tiles_Pal%2").arg(this->primaryTileset->name).arg(this->paletteId);
+ QString defaultFilepath = QString("%1/%2.png").arg(this->project->root).arg(defaultName);
+ QString filepath = QFileDialog::getSaveFileName(this, "Export Primary Tiles Image", defaultFilepath, "Image Files (*.png)");
+ if (!filepath.isEmpty()) {
+ QImage image = this->tileSelector->buildPrimaryTilesIndexedImage();
+ image.save(filepath);
+ }
+}
+
+void TilesetEditor::on_actionExport_Secondary_Tiles_Image_triggered()
+{
+ QString defaultName = QString("%1_Tiles_Pal%2").arg(this->secondaryTileset->name).arg(this->paletteId);
+ QString defaultFilepath = QString("%1/%2.png").arg(this->project->root).arg(defaultName);
+ QString filepath = QFileDialog::getSaveFileName(this, "Export Secondary Tiles Image", defaultFilepath, "Image Files (*.png)");
+ if (!filepath.isEmpty()) {
+ QImage image = this->tileSelector->buildSecondaryTilesIndexedImage();
+ image.save(filepath);
+ }
+}
diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp
index 8a5e9576..59fcec96 100644
--- a/src/ui/tileseteditortileselector.cpp
+++ b/src/ui/tileseteditortileselector.cpp
@@ -2,6 +2,7 @@
#include "imageproviders.h"
#include "project.h"
#include
+#include
QPoint TilesetEditorTileSelector::getSelectionDimensions() {
if (this->externalSelection) {
@@ -169,3 +170,70 @@ QPoint TilesetEditorTileSelector::getTileCoordsOnWidget(uint16_t tile) {
pos.ry() = (pos.y() * this->cellHeight) + (this->cellHeight / 2);
return pos;
}
+
+QImage TilesetEditorTileSelector::buildPrimaryTilesIndexedImage() {
+ if (!this->primaryTileset || !this->primaryTileset->tiles
+ || !this->secondaryTileset || !this->secondaryTileset->tiles) {
+ return QImage();
+ }
+
+ int primaryLength = this->primaryTileset->tiles->length();
+ int height = primaryLength / this->numTilesWide;
+ QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset);
+ QImage image(this->numTilesWide * 8, height * 8, QImage::Format_RGBA8888);
+
+ QPainter painter(&image);
+ for (uint16_t tile = 0; tile < primaryLength; tile++) {
+ QImage tileImage;
+ if (tile < primaryLength) {
+ tileImage = getColoredTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId);
+ } else {
+ tileImage = QImage(8, 8, QImage::Format_RGBA8888);
+ tileImage.fill(palette.at(0));
+ }
+
+ int y = tile / this->numTilesWide;
+ int x = tile % this->numTilesWide;
+ QPoint origin = QPoint(x * 8, y * 8);
+ painter.drawImage(origin, tileImage.mirrored(this->xFlip, this->yFlip));
+ }
+
+ painter.end();
+
+ QVector colorTable = palette.toVector();
+ return image.convertToFormat(QImage::Format::Format_Indexed8, colorTable);
+}
+
+QImage TilesetEditorTileSelector::buildSecondaryTilesIndexedImage() {
+ if (!this->primaryTileset || !this->primaryTileset->tiles
+ || !this->secondaryTileset || !this->secondaryTileset->tiles) {
+ return QImage();
+ }
+
+ int secondaryLength = this->secondaryTileset->tiles->length();
+ int height = secondaryLength / this->numTilesWide;
+ QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset);
+ QImage image(this->numTilesWide * 8, height * 8, QImage::Format_RGBA8888);
+
+ QPainter painter(&image);
+ uint16_t primaryLength = static_cast(Project::getNumTilesPrimary());
+ for (uint16_t tile = 0; tile < secondaryLength; tile++) {
+ QImage tileImage;
+ if (tile < secondaryLength) {
+ tileImage = getColoredTileImage(tile + primaryLength, this->primaryTileset, this->secondaryTileset, this->paletteId);
+ } else {
+ tileImage = QImage(8, 8, QImage::Format_RGBA8888);
+ tileImage.fill(palette.at(0));
+ }
+
+ int y = tile / this->numTilesWide;
+ int x = tile % this->numTilesWide;
+ QPoint origin = QPoint(x * 8, y * 8);
+ painter.drawImage(origin, tileImage.mirrored(this->xFlip, this->yFlip));
+ }
+
+ painter.end();
+
+ QVector colorTable = palette.toVector();
+ return image.convertToFormat(QImage::Format::Format_Indexed8, colorTable);
+}