Compare commits

..

No commits in common. "4bf87914ced9a396a40845adb5fe3585fbd218a4" and "1fb42d55d5dbc211ee1fab3dad06992dc63f12f4" have entirely different histories.

5 changed files with 9 additions and 62 deletions

View file

@ -1,14 +1,3 @@
# SpritePacker # SpritePacker
An advanced sprite packing tool. Currently a work in progress. An advanced sprite packing tool. Currently work in progress.
## Getting Started
* Clone or download this repo, and build the included solution.
* Windows GUI: Open the solution in Visual Studio and hit build (CTRL + SHIFT + B).
* Windows Command Line: Run `msbuild` from the root of this repo (I assume).
* Linux GUI: Open the solution in MonoDevelop and hit build (F8)
* Linux Command Line: Run `xbuild` from the root of this repo.
* Run `./SpritePacker.exe --help` to learn how to use it.
## License
This tool is licensed under the Mozilla Public License version 2.0. You can view the full license text in the `LICENSE` file in this repo. Alternatively, [tl;dr legal](https://tldrlegal.com/) has a [summary](https://tldrlegal.com/license/mozilla-public-license-2.0-(mpl-2)) of this license.

View file

@ -11,13 +11,7 @@ namespace SpritePacker
Normal, Normal,
DisplayHelpText, DisplayHelpText,
DisplayVersionText DisplayVersionText
} };
enum OutputFormat
{
Text,
CSV
}
class Program class Program
{ {
@ -31,7 +25,6 @@ namespace SpritePacker
private static SpritePacker spritePacker; private static SpritePacker spritePacker;
private static OutputFormat outputFormat = OutputFormat.Text;
private static string outputFilename = "spritesheet.png"; private static string outputFilename = "spritesheet.png";
private static List<string> values = new List<string>(); private static List<string> values = new List<string>();
@ -55,9 +48,6 @@ namespace SpritePacker
case "--verbose": case "--verbose":
Verbose = true; Verbose = true;
break; break;
case "--csv":
outputFormat = OutputFormat.CSV;
break;
default: default:
if(args[i].StartsWith("-")) if(args[i].StartsWith("-"))
{ {
@ -108,19 +98,8 @@ namespace SpritePacker
spritePacker = new SpritePacker(Verbose); spritePacker = new SpritePacker(Verbose);
addSprites(values); addSprites(values);
spritePacker.Arrange(); spritePacker.Arrange();
Console.WriteLine(spritePacker.ToString());
spritePacker.Output(outputFilename); spritePacker.Output(outputFilename);
switch(outputFormat)
{
case OutputFormat.CSV:
Console.WriteLine(spritePacker.GetSpritePositionsCSV().Trim());
break;
case OutputFormat.Text:
Console.WriteLine(spritePacker.ToString());
break;
default:
Console.Error.WriteLine("Error: Invalid output format!");
break;
}
} }
private static void addSprites(List<string> filenames) private static void addSprites(List<string> filenames)

View file

@ -1,15 +1,10 @@
SpritePacker {version}, by Starbeamrainbowlabs SpritePacker {version}, by Starbeamrainbowlabs
Built at {build-date} Built at {build-date}
An advanced sprite packing tool
Usage: Usage:
[mono ]./SpritePacker.exe [flags] /path/to/output/file.png [filenames] mono ./SpritePacker.exe [flags] /path/to/output/file.png [filenames]
Option Meaning
-------------------------------------------------------------------------------
--help Shows this help message. --help Shows this help message.
--version Shows the version information. --version Shows the version information.
--csv Outputs the final sprite positions in CSV.
More information can be found at https://git.starbeamrainbowlabs.com/sbrl/SpritePacker More information can be found at https://git.starbeamrainbowlabs.com/sbrl/SpritePacker

View file

@ -50,7 +50,6 @@ namespace SpritePacker
public int Right { get { return area.Right; } } public int Right { get { return area.Right; } }
public int AreaSize { get { return area.Width * area.Height; } } public int AreaSize { get { return area.Width * area.Height; } }
public int MaxSideLength { get { return Math.Max(area.Width, area.Height); } }
public Sprite(string inFilename) public Sprite(string inFilename)
{ {

View file

@ -6,7 +6,6 @@ using System.IO;
using System.Configuration; using System.Configuration;
using System.Drawing.Text; using System.Drawing.Text;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Text;
namespace SpritePacker namespace SpritePacker
{ {
@ -30,7 +29,7 @@ namespace SpritePacker
/// <param name="sprite">Sprite.</param> /// <param name="sprite">Sprite.</param>
public void Add(Sprite sprite) public void Add(Sprite sprite)
{ {
if(Verbose) Console.WriteLine("Adding {0}.", sprite); Console.WriteLine("Adding {0}.", sprite);
sprites.Add(sprite); sprites.Add(sprite);
} }
/// <summary> /// <summary>
@ -98,12 +97,12 @@ namespace SpritePacker
// move the next scan line up a bit. // move the next scan line up a bit.
// Also make sure that the next scan line and the current scan line don't touch or cross. // Also make sure that the next scan line and the current scan line don't touch or cross.
if (probSpr.Bottom < nextScanLines.Y && probSpr.Bottom > scanLines.Y) if (probSpr.Bottom < nextScanLines.Y && probSpr.Bottom > scanLines.Y)
nextScanLines.Y = probSpr.Bottom; // NOTE: Add one here? nextScanLines.Y = probSpr.Bottom + 1;
} }
if(Verbose) Console.WriteLine("Found rightmost problem: {0}", rightProblem); if(Verbose) Console.WriteLine("Found rightmost problem: {0}", rightProblem);
// Move up to the position furthest to the right // Move up to the position furthest to the right
cspr.X = rightProblem.Right; // NOTE: Add one here? cspr.X = rightProblem.Right + 1;
} }
if (!foundPosition) if (!foundPosition)
@ -133,12 +132,12 @@ namespace SpritePacker
// move the enxt scan line up to meet it. // move the enxt scan line up to meet it.
// Also make sure that the next scan line and the current scan line don't touch or cross. // Also make sure that the next scan line and the current scan line don't touch or cross.
if (probSpr.Right < nextScanLines.X && probSpr.Right > scanLines.X) if (probSpr.Right < nextScanLines.X && probSpr.Right > scanLines.X)
nextScanLines.X = probSpr.Right; // NOTE: Add one here? nextScanLines.X = probSpr.Right + 1;
} }
if(Verbose) Console.WriteLine("Found downProblem {0}", downProblem); if(Verbose) Console.WriteLine("Found downProblem {0}", downProblem);
// Move up to the position furthest downwards // Move up to the position furthest downwards
cspr.Y = downProblem.Bottom; // NOTE: Add one here? cspr.Y = downProblem.Bottom + 1;
} }
} }
@ -201,20 +200,6 @@ namespace SpritePacker
finalImage.Dispose(); finalImage.Dispose();
} }
public string GetSpritePositionsCSV(bool header = true)
{
StringWriter result = new StringWriter();
if (header)
result.WriteLine("index,filename,x,y,width,height");
int i = 0;
foreach(Sprite spr in sprites)
{
result.WriteLine("{0},{1},{2},{3},{4},{5}", new object[] { i, spr.Filename, spr.X, spr.Y, spr.Width, spr.Height });
i++;
}
return result.ToString();
}
/// <summary> /// <summary>
/// Sorts the sprites by size. /// Sorts the sprites by size.
/// </summary> /// </summary>