GUI: add option to toggle save compression

This commit is contained in:
tildearrow 2023-05-18 15:52:48 -05:00
parent dae87a4980
commit 347d35be19
3 changed files with 59 additions and 47 deletions

View file

@ -1968,8 +1968,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
//ImGui::GetIO().ConfigFlags|=ImGuiConfigFlags_NavEnableKeyboard; //ImGui::GetIO().ConfigFlags|=ImGuiConfigFlags_NavEnableKeyboard;
} }
#define FURNACE_ZLIB_COMPRESS
int FurnaceGUI::save(String path, int dmfVersion) { int FurnaceGUI::save(String path, int dmfVersion) {
SafeWriter* w; SafeWriter* w;
logD("saving file..."); logD("saving file...");
@ -1992,35 +1990,56 @@ int FurnaceGUI::save(String path, int dmfVersion) {
w->finish(); w->finish();
return 1; return 1;
} }
#ifdef FURNACE_ZLIB_COMPRESS if (settings.compress) {
unsigned char zbuf[131072]; unsigned char zbuf[131072];
int ret; int ret;
z_stream zl; z_stream zl;
memset(&zl,0,sizeof(z_stream)); memset(&zl,0,sizeof(z_stream));
ret=deflateInit(&zl,Z_DEFAULT_COMPRESSION); ret=deflateInit(&zl,Z_DEFAULT_COMPRESSION);
if (ret!=Z_OK) { if (ret!=Z_OK) {
logE("zlib error!"); logE("zlib error!");
lastError="compression error"; lastError="compression error";
fclose(outFile); fclose(outFile);
w->finish(); w->finish();
return 2; return 2;
} }
zl.avail_in=w->size(); zl.avail_in=w->size();
zl.next_in=w->getFinalBuf(); zl.next_in=w->getFinalBuf();
while (zl.avail_in>0) { while (zl.avail_in>0) {
zl.avail_out=131072;
zl.next_out=zbuf;
if ((ret=deflate(&zl,Z_NO_FLUSH))==Z_STREAM_ERROR) {
logE("zlib stream error!");
lastError="zlib stream error";
deflateEnd(&zl);
fclose(outFile);
w->finish();
return 2;
}
size_t amount=131072-zl.avail_out;
if (amount>0) {
if (fwrite(zbuf,1,amount,outFile)!=amount) {
logE("did not write entirely: %s!",strerror(errno));
lastError=strerror(errno);
deflateEnd(&zl);
fclose(outFile);
w->finish();
return 1;
}
}
}
zl.avail_out=131072; zl.avail_out=131072;
zl.next_out=zbuf; zl.next_out=zbuf;
if ((ret=deflate(&zl,Z_NO_FLUSH))==Z_STREAM_ERROR) { if ((ret=deflate(&zl,Z_FINISH))==Z_STREAM_ERROR) {
logE("zlib stream error!"); logE("zlib finish stream error!");
lastError="zlib stream error"; lastError="zlib finish stream error";
deflateEnd(&zl); deflateEnd(&zl);
fclose(outFile); fclose(outFile);
w->finish(); w->finish();
return 2; return 2;
} }
size_t amount=131072-zl.avail_out; if (131072-zl.avail_out>0) {
if (amount>0) { if (fwrite(zbuf,1,131072-zl.avail_out,outFile)!=(131072-zl.avail_out)) {
if (fwrite(zbuf,1,amount,outFile)!=amount) {
logE("did not write entirely: %s!",strerror(errno)); logE("did not write entirely: %s!",strerror(errno));
lastError=strerror(errno); lastError=strerror(errno);
deflateEnd(&zl); deflateEnd(&zl);
@ -2029,37 +2048,16 @@ int FurnaceGUI::save(String path, int dmfVersion) {
return 1; return 1;
} }
} }
}
zl.avail_out=131072;
zl.next_out=zbuf;
if ((ret=deflate(&zl,Z_FINISH))==Z_STREAM_ERROR) {
logE("zlib finish stream error!");
lastError="zlib finish stream error";
deflateEnd(&zl); deflateEnd(&zl);
fclose(outFile); } else {
w->finish(); if (fwrite(w->getFinalBuf(),1,w->size(),outFile)!=w->size()) {
return 2;
}
if (131072-zl.avail_out>0) {
if (fwrite(zbuf,1,131072-zl.avail_out,outFile)!=(131072-zl.avail_out)) {
logE("did not write entirely: %s!",strerror(errno)); logE("did not write entirely: %s!",strerror(errno));
lastError=strerror(errno); lastError=strerror(errno);
deflateEnd(&zl);
fclose(outFile); fclose(outFile);
w->finish(); w->finish();
return 1; return 1;
} }
} }
deflateEnd(&zl);
#else
if (fwrite(w->getFinalBuf(),1,w->size(),outFile)!=w->size()) {
logE("did not write entirely: %s!",strerror(errno));
lastError=strerror(errno);
fclose(outFile);
w->finish();
return 1;
}
#endif
fclose(outFile); fclose(outFile);
w->finish(); w->finish();
backupLock.lock(); backupLock.lock();

View file

@ -1424,6 +1424,7 @@ class FurnaceGUI {
int alwaysPlayIntro; int alwaysPlayIntro;
int iCannotWait; int iCannotWait;
int orderButtonPos; int orderButtonPos;
int compress;
unsigned int maxUndoSteps; unsigned int maxUndoSteps;
String mainFontPath; String mainFontPath;
String patFontPath; String patFontPath;
@ -1569,6 +1570,7 @@ class FurnaceGUI {
alwaysPlayIntro(0), alwaysPlayIntro(0),
iCannotWait(0), iCannotWait(0),
orderButtonPos(2), orderButtonPos(2),
compress(1),
maxUndoSteps(100), maxUndoSteps(100),
mainFontPath(""), mainFontPath(""),
patFontPath(""), patFontPath(""),

View file

@ -654,6 +654,15 @@ void FurnaceGUI::drawSettings() {
settings.saveUnusedPatterns=saveUnusedPatternsB; settings.saveUnusedPatterns=saveUnusedPatternsB;
} }
bool compressB=settings.compress;
if (ImGui::Checkbox("Compress when saving",&compressB)) {
settings.compress=compressB;
}
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("use zlib to compress saved songs.");
}
bool cursorFollowsOrderB=settings.cursorFollowsOrder; bool cursorFollowsOrderB=settings.cursorFollowsOrder;
if (ImGui::Checkbox("Cursor follows current order when moving it",&cursorFollowsOrderB)) { if (ImGui::Checkbox("Cursor follows current order when moving it",&cursorFollowsOrderB)) {
settings.cursorFollowsOrder=cursorFollowsOrderB; settings.cursorFollowsOrder=cursorFollowsOrderB;
@ -2673,6 +2682,7 @@ void FurnaceGUI::syncSettings() {
settings.cursorFollowsOrder=e->getConfInt("cursorFollowsOrder",1); settings.cursorFollowsOrder=e->getConfInt("cursorFollowsOrder",1);
settings.iCannotWait=e->getConfInt("iCannotWait",0); settings.iCannotWait=e->getConfInt("iCannotWait",0);
settings.orderButtonPos=e->getConfInt("orderButtonPos",2); settings.orderButtonPos=e->getConfInt("orderButtonPos",2);
settings.compress=e->getConfInt("compress",1);
clampSetting(settings.mainFontSize,2,96); clampSetting(settings.mainFontSize,2,96);
clampSetting(settings.patFontSize,2,96); clampSetting(settings.patFontSize,2,96);
@ -2793,6 +2803,7 @@ void FurnaceGUI::syncSettings() {
clampSetting(settings.cursorFollowsOrder,0,1); clampSetting(settings.cursorFollowsOrder,0,1);
clampSetting(settings.iCannotWait,0,1); clampSetting(settings.iCannotWait,0,1);
clampSetting(settings.orderButtonPos,0,2); clampSetting(settings.orderButtonPos,0,2);
clampSetting(settings.compress,0,1);
if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportLoops<0.0) settings.exportLoops=0.0;
if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0;
@ -3008,6 +3019,7 @@ void FurnaceGUI::commitSettings() {
e->setConf("cursorFollowsOrder",settings.cursorFollowsOrder); e->setConf("cursorFollowsOrder",settings.cursorFollowsOrder);
e->setConf("iCannotWait",settings.iCannotWait); e->setConf("iCannotWait",settings.iCannotWait);
e->setConf("orderButtonPos",settings.orderButtonPos); e->setConf("orderButtonPos",settings.orderButtonPos);
e->setConf("compress",settings.compress);
// colors // colors
for (int i=0; i<GUI_COLOR_MAX; i++) { for (int i=0; i<GUI_COLOR_MAX; i++) {