From 2f25acd017b6adaaf53a9e5008901eaa4fd6b4bd Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 11 Nov 2025 18:33:23 -0500 Subject: [PATCH] move asset dir functions to another file and get them out of the engine --- CMakeLists.txt | 2 + src/engine/assetDir.cpp | 152 +++++++++++++++++++++++++++++++++++++ src/engine/assetDir.h | 52 +++++++++++++ src/engine/engine.cpp | 78 ------------------- src/engine/engine.h | 13 ---- src/engine/fileOps/fur.cpp | 52 ------------- src/engine/song.h | 11 +-- src/gui/dataList.cpp | 6 +- 8 files changed, 210 insertions(+), 156 deletions(-) create mode 100644 src/engine/assetDir.cpp create mode 100644 src/engine/assetDir.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 85259de3c..57b342527 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -782,6 +782,8 @@ src/engine/brrUtils.c src/engine/safeReader.cpp src/engine/safeWriter.cpp src/engine/workPool.cpp + +src/engine/assetDir.cpp src/engine/cmdStream.cpp src/engine/cmdStreamOps.cpp src/engine/config.cpp diff --git a/src/engine/assetDir.cpp b/src/engine/assetDir.cpp new file mode 100644 index 000000000..06e9e52c2 --- /dev/null +++ b/src/engine/assetDir.cpp @@ -0,0 +1,152 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2025 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "assetDir.h" +#include "../ta-log.h" + +void moveAsset(std::vector& dir, int before, int after) { + if (before<0 || after<0) return; + for (DivAssetDir& i: dir) { + for (size_t j=0; j& dir, int entry) { + if (entry<0) return; + for (DivAssetDir& i: dir) { + for (size_t j=0; jentry) { + i.entries[j]--; + } + } + } +} + +void checkAssetDir(std::vector& dir, size_t entries) { + bool* inAssetDir=new bool[entries]; + memset(inAssetDir,0,entries*sizeof(bool)); + + for (DivAssetDir& i: dir) { + for (size_t j=0; j=(int)entries) { + i.entries.erase(i.entries.begin()+j); + j--; + continue; + } + + // erase duplicate entry + if (inAssetDir[i.entries[j]]) { + i.entries.erase(i.entries.begin()+j); + j--; + continue; + } + + // mark entry as present + inAssetDir[i.entries[j]]=true; + } + } + + // get unsorted directory + DivAssetDir* unsortedDir=NULL; + for (DivAssetDir& i: dir) { + if (i.name.empty()) { + unsortedDir=&i; + break; + } + } + + // add missing items to unsorted directory + for (size_t i=0; ientries.push_back(i); + } + } + + delete[] inAssetDir; +} + +void putAssetDirData(SafeWriter* w, std::vector& dir) { + size_t blockStartSeek, blockEndSeek; + + w->write("ADIR",4); + blockStartSeek=w->tell(); + w->writeI(0); + + w->writeI(dir.size()); + + for (DivAssetDir& i: dir) { + w->writeString(i.name,false); + w->writeS(i.entries.size()); + for (int j: i.entries) { + w->writeC(j); + } + } + + blockEndSeek=w->tell(); + w->seek(blockStartSeek,SEEK_SET); + w->writeI(blockEndSeek-blockStartSeek-4); + w->seek(0,SEEK_END); +} + +DivDataErrors readAssetDirData(SafeReader& reader, std::vector& dir) { + char magic[4]; + reader.read(magic,4); + if (memcmp(magic,"ADIR",4)!=0) { + logV("header is invalid: %c%c%c%c",magic[0],magic[1],magic[2],magic[3]); + return DIV_DATA_INVALID_HEADER; + } + reader.readI(); // reserved + + unsigned int numDirs=reader.readI(); + + dir.reserve(numDirs); + for (unsigned int i=0; i +#include "dataErrors.h" +#include "safeReader.h" +#include "safeWriter.h" + +struct DivAssetDir { + String name; + std::vector entries; + + DivAssetDir(): + name("New Directory") {} + DivAssetDir(String n): + name(n) {} +}; + +// check whether an asset directory is complete (UNSAFE) +void checkAssetDir(std::vector& dir, size_t entries); + +// move an asset +void moveAsset(std::vector& dir, int before, int after); + +// remove an asset +void removeAsset(std::vector& dir, int entry); + +// read/write asset dir +void putAssetDirData(SafeWriter* w, std::vector& dir); +DivDataErrors readAssetDirData(SafeReader& reader, std::vector& dir); + +#endif diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 46c43c5b2..81bf1aee7 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -709,84 +709,6 @@ void DivEngine::changeSong(size_t songIndex) { prevRow=0; } -void DivEngine::moveAsset(std::vector& dir, int before, int after) { - if (before<0 || after<0) return; - for (DivAssetDir& i: dir) { - for (size_t j=0; j& dir, int entry) { - if (entry<0) return; - for (DivAssetDir& i: dir) { - for (size_t j=0; jentry) { - i.entries[j]--; - } - } - } -} - -void DivEngine::checkAssetDir(std::vector& dir, size_t entries) { - bool* inAssetDir=new bool[entries]; - memset(inAssetDir,0,entries*sizeof(bool)); - - for (DivAssetDir& i: dir) { - for (size_t j=0; j=(int)entries) { - i.entries.erase(i.entries.begin()+j); - j--; - continue; - } - - // erase duplicate entry - if (inAssetDir[i.entries[j]]) { - i.entries.erase(i.entries.begin()+j); - j--; - continue; - } - - // mark entry as present - inAssetDir[i.entries[j]]=true; - } - } - - // get unsorted directory - DivAssetDir* unsortedDir=NULL; - for (DivAssetDir& i: dir) { - if (i.name.empty()) { - unsortedDir=&i; - break; - } - } - - // add missing items to unsorted directory - for (size_t i=0; ientries.push_back(i); - } - } - - delete[] inAssetDir; -} - void DivEngine::copyChannelP(int src, int dest) { if (src<0 || src>=chans) return; if (dest<0 || dest>=chans) return; diff --git a/src/engine/engine.h b/src/engine/engine.h index 66196f894..1c7d989eb 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -701,16 +701,6 @@ class DivEngine { void swapSystemUnsafe(int src, int dest, bool preserveOrder=true); - // move an asset - void moveAsset(std::vector& dir, int before, int after); - - // remove an asset - void removeAsset(std::vector& dir, int entry); - - // read/write asset dir - void putAssetDirData(SafeWriter* w, std::vector& dir); - DivDataErrors readAssetDirData(SafeReader& reader, std::vector& dir); - // add every export method here friend class DivROMExport; friend class DivExportAmigaValidation; @@ -819,9 +809,6 @@ class DivEngine { // convert old flags static void convertOldFlags(unsigned int oldFlags, DivConfig& newFlags, DivSystem sys); - // check whether an asset directory is complete (UNSAFE) - void checkAssetDir(std::vector& dir, size_t entries); - // benchmark (returns time in seconds) double benchmarkPlayback(); double benchmarkSeek(); diff --git a/src/engine/fileOps/fur.cpp b/src/engine/fileOps/fur.cpp index 285e1aa1b..a27bf30d7 100644 --- a/src/engine/fileOps/fur.cpp +++ b/src/engine/fileOps/fur.cpp @@ -63,58 +63,6 @@ struct PatToWrite { pat(p) {} }; -void DivEngine::putAssetDirData(SafeWriter* w, std::vector& dir) { - size_t blockStartSeek, blockEndSeek; - - w->write("ADIR",4); - blockStartSeek=w->tell(); - w->writeI(0); - - w->writeI(dir.size()); - - for (DivAssetDir& i: dir) { - w->writeString(i.name,false); - w->writeS(i.entries.size()); - for (int j: i.entries) { - w->writeC(j); - } - } - - blockEndSeek=w->tell(); - w->seek(blockStartSeek,SEEK_SET); - w->writeI(blockEndSeek-blockStartSeek-4); - w->seek(0,SEEK_END); -} - -DivDataErrors DivEngine::readAssetDirData(SafeReader& reader, std::vector& dir) { - char magic[4]; - reader.read(magic,4); - if (memcmp(magic,"ADIR",4)!=0) { - logV("header is invalid: %c%c%c%c",magic[0],magic[1],magic[2],magic[3]); - return DIV_DATA_INVALID_HEADER; - } - reader.readI(); // reserved - - unsigned int numDirs=reader.readI(); - - dir.reserve(numDirs); - for (unsigned int i=0; i entries; - - DivAssetDir(): - name("New Directory") {} - DivAssetDir(String n): - name(n) {} -}; - struct DivEffectStorage { DivEffectType id; unsigned short slot, storageVer; diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 0c99b9f61..5c8711e44 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -745,7 +745,7 @@ void FurnaceGUI::drawInsList(bool asChild) { if (dirToDelete!=-1) { e->lockEngine([this,dirToDelete]() { e->song.insDir.erase(e->song.insDir.begin()+dirToDelete); - e->checkAssetDir(e->song.insDir,e->song.ins.size()); + checkAssetDir(e->song.insDir,e->song.ins.size()); }); } } else { @@ -1402,7 +1402,7 @@ void FurnaceGUI::actualWaveList() { if (dirToDelete!=-1) { e->lockEngine([this,dirToDelete]() { e->song.waveDir.erase(e->song.waveDir.begin()+dirToDelete); - e->checkAssetDir(e->song.waveDir,e->song.wave.size()); + checkAssetDir(e->song.waveDir,e->song.wave.size()); }); } } else { @@ -1457,7 +1457,7 @@ void FurnaceGUI::actualSampleList() { if (dirToDelete!=-1) { e->lockEngine([this,dirToDelete]() { e->song.sampleDir.erase(e->song.sampleDir.begin()+dirToDelete); - e->checkAssetDir(e->song.sampleDir,e->song.sample.size()); + checkAssetDir(e->song.sampleDir,e->song.sample.size()); }); } } else {