diff --git a/data/pref.xml b/data/pref.xml
index ae3582f94..47f9cdcef 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -459,6 +459,8 @@
+
+
diff --git a/data/strings/en.ini b/data/strings/en.ini
index 33d118cc9..e8165d8c0 100644
--- a/data/strings/en.ini
+++ b/data/strings/en.ini
@@ -577,6 +577,10 @@ trim_by_grid = By Grid
trim_by_grid_tooltip = Trims by grid boundaries instead of pixel by pixel
extrude = Extrude
extrude_tooltip = Adds a border to each frame duplicating the pixels of its edges
+merge_dups = Merge Dups
+merge_dups_tooltip = Merge Duplicate Frames
+ignore_empty = Ignore Empty
+ignore_empty_tooltip = Ignore Empty Frames
layers = Layers:
split_layers = Split Layers
split_layers_tooltip = Generates one sprite for each layer
diff --git a/data/widgets/export_sprite_sheet.xml b/data/widgets/export_sprite_sheet.xml
index 76d1541e2..39c97eefd 100644
--- a/data/widgets/export_sprite_sheet.xml
+++ b/data/widgets/export_sprite_sheet.xml
@@ -55,6 +55,11 @@
+
+
+
+
+
diff --git a/src/app/commands/cmd_export_sprite_sheet.cpp b/src/app/commands/cmd_export_sprite_sheet.cpp
index 948340b13..195138ba4 100644
--- a/src/app/commands/cmd_export_sprite_sheet.cpp
+++ b/src/app/commands/cmd_export_sprite_sheet.cpp
@@ -71,6 +71,8 @@ struct ExportSpriteSheetParams : public NewParams {
Param trim { this, false, "trim" };
Param trimByGrid { this, false, "trimByGrid" };
Param extrude { this, false, "extrude" };
+ Param ignoreEmpty { this, false, "ignoreEmpty" };
+ Param mergeDuplicates { this, false, "mergeDuplicates" };
Param openGenerated { this, false, "openGenerated" };
Param layer { this, std::string(), "layer" };
Param tag { this, std::string(), "tag" };
@@ -177,6 +179,8 @@ void update_doc_exporter_from_params(DocExporter& exporter,
const bool trimCels = params.trim();
const bool trimByGrid = params.trimByGrid();
const bool extrude = params.extrude();
+ const bool ignoreEmpty = params.ignoreEmpty();
+ const bool mergeDuplicates = params.mergeDuplicates();
const bool splitLayers = params.splitLayers();
const bool splitTags = params.splitTags();
const bool listLayers = params.listLayers();
@@ -234,6 +238,8 @@ void update_doc_exporter_from_params(DocExporter& exporter,
exporter.setTrimCels(trimCels);
exporter.setTrimByGrid(trimByGrid);
exporter.setExtrude(extrude);
+ exporter.setIgnoreEmptyCels(ignoreEmpty);
+ exporter.setMergeDuplicates(mergeDuplicates);
if (listLayers) exporter.setListLayers(true);
if (listTags) exporter.setListTags(true);
if (listSlices) exporter.setListSlices(true);
@@ -326,6 +332,8 @@ public:
trimEnabled()->isSelected()) &&
params.trimByGrid());
extrudeEnabled()->setSelected(params.extrude());
+ mergeDups()->setSelected(params.mergeDuplicates());
+ ignoreEmpty()->setSelected(params.ignoreEmpty());
borderPadding()->setTextf("%d", params.borderPadding());
shapePadding()->setTextf("%d", params.shapePadding());
@@ -379,6 +387,8 @@ public:
shapePadding()->Change.connect(base::Bind(&ExportSpriteSheetWindow::generatePreview, this));
innerPadding()->Change.connect(base::Bind(&ExportSpriteSheetWindow::generatePreview, this));
extrudeEnabled()->Click.connect(base::Bind(&ExportSpriteSheetWindow::generatePreview, this));
+ mergeDups()->Click.connect(base::Bind(&ExportSpriteSheetWindow::generatePreview, this));
+ ignoreEmpty()->Click.connect(base::Bind(&ExportSpriteSheetWindow::generatePreview, this));
imageEnabled()->Click.connect(base::Bind(&ExportSpriteSheetWindow::onImageEnabledChange, this));
imageFilename()->Click.connect(base::Bind(&ExportSpriteSheetWindow::onImageFilename, this));
dataEnabled()->Click.connect(base::Bind(&ExportSpriteSheetWindow::onDataEnabledChange, this));
@@ -433,6 +443,8 @@ public:
params.trim (trimValue());
params.trimByGrid (trimByGridValue());
params.extrude (extrudeValue());
+ params.mergeDuplicates (mergeDupsValue());
+ params.ignoreEmpty (ignoreEmptyValue());
params.openGenerated (openGeneratedValue());
params.layer (layerValue());
params.tag (tagValue());
@@ -577,6 +589,14 @@ private:
return (extrudeValue() ? 1: 0);
}
+ bool mergeDupsValue() const {
+ return mergeDups()->isSelected();
+ }
+
+ bool ignoreEmptyValue() const {
+ return ignoreEmpty()->isSelected();
+ }
+
bool openGeneratedValue() const {
return openGenerated()->isSelected();
}
@@ -1103,6 +1123,8 @@ void ExportSpriteSheetCommand::onExecute(Context* context)
if (!params.trim.isSet()) params.trim( docPref.spriteSheet.trim());
if (!params.trimByGrid.isSet()) params.trimByGrid( docPref.spriteSheet.trimByGrid());
if (!params.extrude.isSet()) params.extrude( docPref.spriteSheet.extrude());
+ if (!params.mergeDuplicates.isSet()) params.mergeDuplicates( docPref.spriteSheet.mergeDuplicates());
+ if (!params.ignoreEmpty.isSet()) params.ignoreEmpty( docPref.spriteSheet.ignoreEmpty());
if (!params.openGenerated.isSet()) params.openGenerated( docPref.spriteSheet.openGenerated());
if (!params.layer.isSet()) params.layer( docPref.spriteSheet.layer());
if (!params.tag.isSet()) params.tag( docPref.spriteSheet.frameTag());
@@ -1141,6 +1163,8 @@ void ExportSpriteSheetCommand::onExecute(Context* context)
docPref.spriteSheet.trim (params.trim());
docPref.spriteSheet.trimByGrid (params.trimByGrid());
docPref.spriteSheet.extrude (params.extrude());
+ docPref.spriteSheet.mergeDuplicates (params.mergeDuplicates());
+ docPref.spriteSheet.ignoreEmpty (params.ignoreEmpty());
docPref.spriteSheet.openGenerated (params.openGenerated());
docPref.spriteSheet.layer (params.layer());
docPref.spriteSheet.frameTag (params.tag());