package com.kreative.paint.material.sprite; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; public class UnmakeSpriteSheet { public static void main(String[] args) { if (args.length == 0) { printHelp(); } else { File outDir = null; SpriteSheetReader.Options o = new SpriteSheetReader.Options(); boolean makeSPNX = false; boolean makeIIOW = false; boolean makeStrip = false; boolean processingFlags = true; int i = 0; while (i < args.length) { String arg = args[i++]; if (processingFlags && arg.startsWith("-")) { if (arg.equals("--")) { processingFlags = false; } else if (arg.equals("-D") && i < args.length) { outDir = new File(args[i++]); } else if (arg.equals("-s") && i < args.length) { arg = args[i++].trim(); if (arg.equalsIgnoreCase("whole")) { o.setDefaultSlicingNone(); } else if (arg.equalsIgnoreCase("strip")) { o.setDefaultSlicingStrip(); } else { Pattern p = Pattern.compile("([0-9]+)\\s*[Xx,]\\s*([0-9]+)"); Matcher m = p.matcher(arg); if (m.matches()) { int w = Integer.parseInt(m.group(1)); int h = Integer.parseInt(m.group(2)); o.setDefaultSlicingFixed(w, h); } else { System.err.println("Ignoring invalid option parameter: -s " + arg); } } } else if (arg.equals("-h") && i < args.length) { arg = args[i++].trim(); Pattern p = Pattern.compile( "([Cc][Ee][Nn][Tt][Ee][Rr]|[+-]?[0-9]+)\\s*,\\s*" + "([Cc][Ee][Nn][Tt][Ee][Rr]|[+-]?[0-9]+)" ); Matcher m = p.matcher(arg); if (m.matches()) { int x = m.group(1).equalsIgnoreCase("center") ? SpriteSheetReader.Options.HOTSPOT_CENTER : Integer.parseInt(m.group(1)); int y = m.group(2).equalsIgnoreCase("center") ? SpriteSheetReader.Options.HOTSPOT_CENTER : Integer.parseInt(m.group(2)); o.setDefaultHotspot(x, y); } else { System.err.println("Ignoring invalid option parameter: -h " + arg); } } else if (arg.equals("-o")) { o.setDefaultSlicingOrder(ArrayOrdering.fromString(args[i++])); } else if (arg.equals("-t")) { o.setDefaultColorTransform(ColorTransform.fromString(args[i++])); } else if (arg.equals("-p")) { arg = args[i++].trim(); if (arg.equalsIgnoreCase("auto")) { o.setDefaultPresentationAuto(); } else { Pattern p = Pattern.compile( "([+-]?[0-9]+)\\s*[Xx,]\\s*" + "([+-]?[0-9]+)\\s*,\\s*(.+)" ); Matcher m = p.matcher(arg); if (m.matches()) { int w = Integer.parseInt(m.group(1)); int h = Integer.parseInt(m.group(2)); ArrayOrdering order = ArrayOrdering.fromString(m.group(3)); o.setDefaultPresentation(w, h, order); } else { System.err.println("Ignoring invalid option parameter: -p " + arg); } } } else if (arg.equals("-i")) { o.setDefaultIntent(SpriteIntent.fromString(args[i++])); } else if (arg.equals("-d")) { arg = args[i++].trim(); if (arg.equalsIgnoreCase("flat")) { o.setDefaultStructureFlat(); } else if (arg.equalsIgnoreCase("single")) { o.setDefaultStructureSingleParent(false); } else if (arg.equalsIgnoreCase("xsingle")) { o.setDefaultStructureSingleParent(true); } else if (arg.equalsIgnoreCase("multi")) { o.setDefaultStructureMultipleParents(false); } else if (arg.equalsIgnoreCase("xmulti")) { o.setDefaultStructureMultipleParents(true); } else { System.err.println("Ignoring invalid option parameter: -d " + arg); } } else if (arg.equals("-S")) { makeSPNX = true; } else if (arg.equals("-I")) { makeIIOW = true; } else if (arg.equals("-P")) { makeStrip = true; } else if (arg.equals("--help")) { printHelp(); } else { System.err.println("Ignoring unknown option: " + arg); } } else { try { processFile(new File(arg), outDir, o, makeSPNX, makeIIOW, makeStrip); } catch (IOException e) { System.err.println("Error processing " + arg + ": " + e.getMessage()); e.printStackTrace(); } } } } } private static void printHelp() { System.out.println(); System.out.println("UnmakeSpriteSheet - Extract sprite info from PNG."); System.out.println(); System.out.println("Options:"); System.out.println(" -D <path> Set output directory."); System.out.println(" -S Output SPNX file."); System.out.println(" -I Output PNG file rewritten by ImageIO."); System.out.println(" -P Output PNG file without spNF chunk."); System.out.println(" -- Treat remaining arguments as file names."); System.out.println(); System.out.println("If none of -S, -I, -P are specified, all are implied."); System.out.println(); } private static void processFile( File inFile, File outDir, SpriteSheetReader.Options o, boolean makeSPNX, boolean makeIIOW, boolean makeStrip ) throws IOException { if (!(makeSPNX || makeIIOW || makeStrip)) { makeSPNX = makeIIOW = makeStrip = true; } File frnfFile, iiowFile, stripFile; if (outDir == null) { File parent = inFile.getParentFile(); String basename = inFile.getName().replaceFirst("\\.[a-zA-Z0-9]+$", ""); frnfFile = new File(parent, basename + "-spriteinfo.spnx"); iiowFile = new File(parent, basename + "-iiowrite.png"); stripFile = new File(parent, basename + "-stripped.png"); } else if (makeIIOW && makeStrip) { String basename = inFile.getName().replaceFirst("\\.[a-zA-Z0-9]+$", ""); frnfFile = new File(outDir, basename + "-spriteinfo.spnx"); iiowFile = new File(outDir, basename + "-iiowrite.png"); stripFile = new File(outDir, basename + "-stripped.png"); } else { String basename = inFile.getName().replaceFirst("\\.[a-zA-Z0-9]+$", ""); frnfFile = new File(outDir, basename + ".spnx"); iiowFile = new File(outDir, basename + ".png"); stripFile = new File(outDir, basename + ".png"); } SpriteSheet sheet = SpriteSheetReader.readSpriteSheet(inFile, o); if (makeSPNX) { PrintWriter finfOut = new PrintWriter(new OutputStreamWriter(new FileOutputStream(frnfFile), "UTF-8"), true); SpriteSheetWriter.printSPNX(finfOut, sheet); finfOut.flush(); finfOut.close(); } if (makeIIOW) { ImageIO.write(sheet.image, "png", iiowFile); } if (makeStrip) { DataInputStream stripIn = new DataInputStream(new FileInputStream(inFile)); DataOutputStream stripOut = new DataOutputStream(new FileOutputStream(stripFile)); SpriteSheetWriter.stripSPNF(stripIn, stripOut); stripOut.flush(); stripOut.close(); stripIn.close(); } } }