OSDN Git Service

TexturePacker2, better discovery of parent pack.json files.
authorNathanSweet <nathan.sweet@gmail.com>
Wed, 30 Jan 2013 20:56:53 +0000 (21:56 +0100)
committerNathanSweet <nathan.sweet@gmail.com>
Wed, 30 Jan 2013 20:56:53 +0000 (21:56 +0100)
extensions/gdx-tools/src/com/badlogic/gdx/tools/imagepacker/TexturePackerFileProcessor.java

index d0442dc..1b72926 100644 (file)
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
  * See the License for the specific language governing permissions and\r
  * limitations under the License.\r
- ******************************************************************************/
-package com.badlogic.gdx.tools.imagepacker;\r
+ ******************************************************************************/\r
 \r
-import java.io.File;\r
-import java.io.FileReader;\r
-import java.util.ArrayList;\r
-import java.util.regex.Pattern;\r
+package com.badlogic.gdx.tools.imagepacker;\r
 \r
 import com.badlogic.gdx.tools.FileProcessor;\r
 import com.badlogic.gdx.tools.imagepacker.TexturePacker2.Settings;\r
@@ -26,6 +22,13 @@ import com.badlogic.gdx.utils.Json;
 import com.badlogic.gdx.utils.JsonReader;\r
 import com.badlogic.gdx.utils.ObjectMap;\r
 \r
+import java.io.File;\r
+import java.io.FileReader;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.regex.Pattern;\r
+\r
 /** @author Nathan Sweet */\r
 public class TexturePackerFileProcessor extends FileProcessor {\r
        private final Settings defaultSettings;\r
@@ -50,6 +53,41 @@ public class TexturePackerFileProcessor extends FileProcessor {
 \r
        public ArrayList<Entry> process (File inputFile, File outputRoot) throws Exception {\r
                root = inputFile;\r
+\r
+               // Collect pack.json setting files.\r
+               final ArrayList<File> settingsFiles = new ArrayList();\r
+               FileProcessor settingsProcessor = new FileProcessor() {\r
+                       protected void processFile (Entry inputFile) throws Exception {\r
+                               settingsFiles.add(inputFile.inputFile);\r
+                       }\r
+               };\r
+               settingsProcessor.addInputRegex("pack\\.json");\r
+               settingsProcessor.process(inputFile, null);\r
+               // Sort parent first.\r
+               Collections.sort(settingsFiles, new Comparator<File>() {\r
+                       public int compare (File file1, File file2) {\r
+                               return file1.toString().length() - file2.toString().length();\r
+                       }\r
+               });\r
+               for (File settingsFile : settingsFiles) {\r
+                       // Find first parent with settings, or use defaults.\r
+                       Settings settings = null;\r
+                       File parent = settingsFile.getParentFile();\r
+                       while (true) {\r
+                               if (parent.equals(root)) break;\r
+                               parent = parent.getParentFile();\r
+                               settings = dirToSettings.get(parent);\r
+                               if (settings != null) {\r
+                                       settings = new Settings(settings);\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if (settings == null) settings = new Settings(defaultSettings);\r
+                       // Merge settings from current directory.\r
+                       json.readFields(settings, new JsonReader().parse(new FileReader(settingsFile)));\r
+                       dirToSettings.put(settingsFile.getParentFile(), settings);\r
+               }\r
+\r
                return super.process(inputFile, outputRoot);\r
        }\r
 \r
@@ -77,24 +115,16 @@ public class TexturePackerFileProcessor extends FileProcessor {
        protected void processDir (Entry inputDir, ArrayList<Entry> files) throws Exception {\r
                System.out.println(inputDir.inputFile.getName());\r
 \r
-               // Start with a copy of a parent dir's settings or the default settings.\r
+               // Find first parent with settings, or use defaults.\r
                Settings settings = null;\r
                File parent = inputDir.inputFile;\r
                while (true) {\r
                        if (parent.equals(root)) break;\r
                        parent = parent.getParentFile();\r
                        settings = dirToSettings.get(parent);\r
-                       if (settings != null) {\r
-                               settings = new Settings(settings);\r
-                               break;\r
-                       }\r
+                       if (settings != null) break;\r
                }\r
-               if (settings == null) settings = new Settings(defaultSettings);\r
-               dirToSettings.put(inputDir.inputFile, settings);\r
-\r
-               // Merge settings from pack.json file.\r
-               File settingsFile = new File(inputDir.inputFile, "pack.json");\r
-               if (settingsFile.exists()) json.readFields(settings, new JsonReader().parse(new FileReader(settingsFile)));\r
+               if (settings == null) settings = defaultSettings;\r
 \r
                // Pack.\r
                TexturePacker2 packer = new TexturePacker2(root, settings);\r
@@ -102,4 +132,4 @@ public class TexturePackerFileProcessor extends FileProcessor {
                        packer.addImage(file.inputFile);\r
                packer.pack(inputDir.outputDir, packFileName);\r
        }\r
-}
\ No newline at end of file
+}\r