diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar index e82d12e5b4..4c2fef9f87 100644 Binary files a/tools/dmitool/dmitool.jar and b/tools/dmitool/dmitool.jar differ diff --git a/tools/dmitool/src/main/java/dmitool/DMIException.java b/tools/dmitool/src/main/java/dmitool/DMIException.java index ecc9d2f062..e929316289 100644 --- a/tools/dmitool/src/main/java/dmitool/DMIException.java +++ b/tools/dmitool/src/main/java/dmitool/DMIException.java @@ -8,6 +8,9 @@ public class DMIException extends Exception { desc = descriptor; this.line = line; } + public DMIException(String what) { + super(what); + } public DMIException(String what, Exception cause) { super(what, cause); } diff --git a/tools/dmitool/src/main/java/dmitool/IconState.java b/tools/dmitool/src/main/java/dmitool/IconState.java index 568f7c5cea..82fdc86369 100644 --- a/tools/dmitool/src/main/java/dmitool/IconState.java +++ b/tools/dmitool/src/main/java/dmitool/IconState.java @@ -4,6 +4,9 @@ import java.util.Arrays; import ar.com.hjg.pngj.ImageInfo; import ar.com.hjg.pngj.ImageLineInt; import ar.com.hjg.pngj.PngWriter; +import ar.com.hjg.pngj.PngReader; +import ar.com.hjg.pngj.PngjInputException; +import java.io.InputStream; import java.io.OutputStream; public class IconState { @@ -144,4 +147,95 @@ public class IconState { } out.end(); } -} \ No newline at end of file + + public static IconState importFromPNG(DMI dmi, InputStream inS, String name) throws DMIException { + int w = dmi.w; + int h = dmi.h; + + PngReader in; + try { + in = new PngReader(inS); + } catch(PngjInputException pie) { + throw new DMIException("Bad file format!", pie); + } + int pxW = in.imgInfo.cols; + int pxH = in.imgInfo.rows; + int frames = pxW / w; + int dirs = pxH / h; + + // make sure the size is an integer multiple + if(frames * w != pxW || frames==0) throw new DMIException("Illegal image size!"); + if(dirs * h != pxH || dirs==0) throw new DMIException("Illegal image size!"); + + int[][] px = new int[pxH][]; + for(int i=0; i= 0) System.out.println("Loading " + f); - dmi = doDMILoad(f); + DMI dmi = doDMILoad(f); if(VERBOSITY >= 0) dmi.printInfo(); if(VERBOSITY >= 0) System.out.println("Saving " + f); dmi.writeDMI(new FileOutputStream(f), true); break; - case "merge": + } + case "merge": { if(argq.size() < 4) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -145,7 +150,8 @@ public class Main { System.exit(0); } break; - case "extract": + } + case "extract": { if(argq.size() < 3) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -155,7 +161,7 @@ public class Main { state = argq.pollFirst(), outFile = argq.pollFirst(); - dmi = doDMILoad(file); + DMI dmi = doDMILoad(file); if(VERBOSITY >= 0) dmi.printInfo(); IconState is = dmi.getIconState(state); @@ -231,7 +237,44 @@ public class Main { } is.dumpToPNG(new FileOutputStream(outFile), mDir, Mdir, mFrame, Mframe); break; - case "verify": + } + case "import": { + if(argq.size() < 3) { + System.out.println("Insufficient arguments for command!"); + System.out.println(helpStr); + return; + } + String dmiFile = argq.pollFirst(), + stateName = argq.pollFirst(), + pngFile = argq.pollFirst(); + + boolean noDup = false; + if(!argq.isEmpty()) { + switch(argq.pollFirst().toLowerCase()) { + case "nodup": + noDup = true; + break; + } + } + + if(VERBOSITY >= 0) System.out.println("Loading " + dmiFile); + DMI toImportTo = doDMILoad(dmiFile); + if(VERBOSITY >= 0) toImportTo.printInfo(); + //public static IconState importFromPNG(DMI dmi, InputStream inS, String name) throws DMIException { + IconState is = IconState.importFromPNG(toImportTo, new FileInputStream(pngFile), stateName); + + + if(!(noDup && toImportTo.setIconState(is))) { + toImportTo.addIconState(null, is); + } + + if(VERBOSITY >= 0) toImportTo.printInfo(); + + if(VERBOSITY >= 0) System.out.println("Saving " + dmiFile); + toImportTo.writeDMI(new FileOutputStream(dmiFile)); + break; + } + case "verify": { if(argq.size() < 1) { System.out.println("Insufficient arguments for command!"); System.out.println(helpStr); @@ -242,6 +285,7 @@ public class Main { DMI v = doDMILoad(vF); if(VERBOSITY >= 0) v.printInfo(); break; + } default: System.out.println("Command '" + op + "' not found!"); case "help":