[aseprite] 81/134: Add --ignore-empty command line option (close #549)
Tobias Hansen
thansen at moszumanska.debian.org
Sat Mar 14 17:10:09 UTC 2015
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository aseprite.
commit b7d86e596a060a4354bb9c606428e828e7721411
Author: David Capello <davidcapello at gmail.com>
Date: Sun Nov 30 10:23:11 2014 -0300
Add --ignore-empty command line option (close #549)
This option can be used to avoid exporting empty frames/cels.
---
src/app/app.cpp | 9 ++++++++
src/app/app_options.cpp | 1 +
src/app/app_options.h | 2 ++
src/app/document_exporter.cpp | 50 +++++++++++++++++++++++++++++++++++++------
src/app/document_exporter.h | 6 ++++++
5 files changed, 61 insertions(+), 7 deletions(-)
diff --git a/src/app/app.cpp b/src/app/app.cpp
index 5d447ee..aacf33e 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -210,6 +210,8 @@ void App::initialize(int argc, const char* argv[])
// Procress options
PRINTF("Processing options...\n");
+ bool ignoreEmpty = false;
+
// Open file specified in the command line
if (!options.values().empty()) {
Console console;
@@ -258,6 +260,10 @@ void App::initialize(int argc, const char* argv[])
importLayer = value.value();
importLayerSaveAs = value.value();
}
+ // --ignore-empty
+ else if (opt == &options.ignoreEmpty()) {
+ ignoreEmpty = true;
+ }
// --save-as <filename>
else if (opt == &options.saveAs()) {
Document* doc = NULL;
@@ -380,6 +386,9 @@ void App::initialize(int argc, const char* argv[])
if (m_exporter != NULL) {
PRINTF("Exporting sheet...\n");
+ if (ignoreEmpty)
+ m_exporter->setIgnoreEmptyCels(true);
+
m_exporter->exportSheet();
m_exporter.reset(NULL);
}
diff --git a/src/app/app_options.cpp b/src/app/app_options.cpp
index 8a5cbbf..7f78773 100644
--- a/src/app/app_options.cpp
+++ b/src/app/app_options.cpp
@@ -48,6 +48,7 @@ AppOptions::AppOptions(int argc, const char* argv[])
, m_sheetPack(m_po.add("sheet-pack").description("Use a packing algorithm to avoid waste of space\nin the texture"))
, m_splitLayers(m_po.add("split-layers").description("Import each layer of the next given sprite as\na separated image in the sheet"))
, m_importLayer(m_po.add("import-layer").requiresValue("<name>").description("Import just one layer of the next given sprite"))
+ , m_ignoreEmpty(m_po.add("ignore-empty").description("Do not export empty frames/cels"))
, m_verbose(m_po.add("verbose").description("Explain what is being done"))
, m_help(m_po.add("help").mnemonic('?').description("Display this help and exits"))
, m_version(m_po.add("version").description("Output version information and exit"))
diff --git a/src/app/app_options.h b/src/app/app_options.h
index e1d56dc..19901d8 100644
--- a/src/app/app_options.h
+++ b/src/app/app_options.h
@@ -56,6 +56,7 @@ public:
const Option& sheetPack() const { return m_sheetPack; }
const Option& splitLayers() const { return m_splitLayers; }
const Option& importLayer() const { return m_importLayer; }
+ const Option& ignoreEmpty() const { return m_ignoreEmpty; }
bool hasExporterParams() const;
@@ -82,6 +83,7 @@ private:
Option& m_sheetPack;
Option& m_splitLayers;
Option& m_importLayer;
+ Option& m_ignoreEmpty;
Option& m_verbose;
Option& m_help;
diff --git a/src/app/document_exporter.cpp b/src/app/document_exporter.cpp
index 86c16d1..e15d792 100644
--- a/src/app/document_exporter.cpp
+++ b/src/app/document_exporter.cpp
@@ -32,6 +32,7 @@
#include "base/unique_ptr.h"
#include "gfx/packing_rects.h"
#include "gfx/size.h"
+#include "raster/algorithm/shrink_bounds.h"
#include "raster/cel.h"
#include "raster/dithering_method.h"
#include "raster/image.h"
@@ -205,6 +206,7 @@ DocumentExporter::DocumentExporter()
, m_texturePack(false)
, m_scale(1.0)
, m_scaleMode(DefaultScaleMode)
+ , m_ignoreEmptyCels(false)
{
}
@@ -264,6 +266,7 @@ void DocumentExporter::exportSheet()
void DocumentExporter::captureSamples(Samples& samples)
{
+ ImageBufferPtr checkEmptyImageBuf;
std::vector<char> buf(32);
for (auto& item : m_documents) {
@@ -289,7 +292,35 @@ void DocumentExporter::captureSamples(Samples& samples)
+ "." + base::get_file_extension(filename));
}
- samples.addSample(Sample(doc, sprite, layer, frame, filename));
+ Sample sample(doc, sprite, layer, frame, filename);
+
+ if (m_ignoreEmptyCels) {
+ if (layer && layer->isImage() &&
+ !static_cast<LayerImage*>(layer)->getCel(frame)) {
+ // Empty cel this sample completely
+ continue;
+ }
+
+ base::UniquePtr<Image> checkEmptyImage(
+ Image::create(sprite->pixelFormat(),
+ sprite->width(),
+ sprite->height(),
+ checkEmptyImageBuf));
+
+ checkEmptyImage->setMaskColor(sprite->transparentColor());
+ clear_image(checkEmptyImage, sprite->transparentColor());
+ renderSample(sample, checkEmptyImage, 0, 0);
+
+ gfx::Rect frameBounds;
+ if (!algorithm::shrink_bounds(checkEmptyImage, frameBounds,
+ sprite->transparentColor())) {
+ // If shrink_bounds returns false, it's because the whole
+ // image is transparent (equal to the mask color).
+ continue;
+ }
+ }
+
+ samples.addSample(sample);
}
}
}
@@ -355,12 +386,7 @@ void DocumentExporter::renderTexture(const Samples& samples, Image* textureImage
int x = sample.inTextureBounds().x - sample.trimmedBounds().x;
int y = sample.inTextureBounds().y - sample.trimmedBounds().y;
- if (sample.layer()) {
- layer_render(sample.layer(), textureImage, x, y, sample.frame());
- }
- else {
- sample.sprite()->render(textureImage, x, y, sample.frame());
- }
+ renderSample(sample, textureImage, x, y);
}
}
@@ -415,4 +441,14 @@ void DocumentExporter::createDataFile(const Samples& samples, std::ostream& os,
<< "}\n";
}
+void DocumentExporter::renderSample(const Sample& sample, raster::Image* dst, int x, int y)
+{
+ if (sample.layer()) {
+ layer_render(sample.layer(), dst, x, y, sample.frame());
+ }
+ else {
+ sample.sprite()->render(dst, x, y, sample.frame());
+ }
+}
+
} // namespace app
diff --git a/src/app/document_exporter.h b/src/app/document_exporter.h
index a618e9b..1224821 100644
--- a/src/app/document_exporter.h
+++ b/src/app/document_exporter.h
@@ -89,6 +89,10 @@ namespace app {
m_scaleMode = mode;
}
+ void setIgnoreEmptyCels(bool ignore) {
+ m_ignoreEmptyCels = ignore;
+ }
+
void addDocument(Document* document, raster::Layer* layer = NULL) {
m_documents.push_back(Item(document, layer));
}
@@ -106,6 +110,7 @@ namespace app {
Document* createEmptyTexture(const Samples& samples);
void renderTexture(const Samples& samples, raster::Image* textureImage);
void createDataFile(const Samples& samples, std::ostream& os, raster::Image* textureImage);
+ void renderSample(const Sample& sample, raster::Image* dst, int x, int y);
class Item {
public:
@@ -126,6 +131,7 @@ namespace app {
bool m_texturePack;
double m_scale;
ScaleMode m_scaleMode;
+ bool m_ignoreEmptyCels;
Items m_documents;
DISABLE_COPYING(DocumentExporter);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git
More information about the Pkg-games-commits
mailing list