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 @@ + + + @@ -502,22 +505,22 @@ - Import Primary Tiles + Import Primary Tiles... - Import Secondary Tiles + Import Secondary Tiles... - Change Number of Metatiles + Change Number of Metatiles... - Change Palettes + Palette Editor @@ -536,6 +539,16 @@ Ctrl+Y + + + Export Primary Tiles Image... + + + + + Export Secondary Tiles Image... + + 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); +}