OSDN Git Service

シェーディング情報分離
authorOlyutorskii <olyutorskii@users.osdn.me>
Wed, 17 Apr 2013 21:08:18 +0000 (06:08 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Wed, 17 Apr 2013 21:08:18 +0000 (06:08 +0900)
src/main/java/jp/sfjp/mikutoga/pmd/ShadingUtil.java [new file with mode: 0644]
src/main/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBase.java
src/test/java/jp/sfjp/mikutoga/pmd/ShadingUtilTest.java [new file with mode: 0644]
src/test/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBaseTest.java [new file with mode: 0644]

diff --git a/src/main/java/jp/sfjp/mikutoga/pmd/ShadingUtil.java b/src/main/java/jp/sfjp/mikutoga/pmd/ShadingUtil.java
new file mode 100644 (file)
index 0000000..9fe2e35
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * shading file utility
+ *
+ * License : The MIT License
+ * Copyright(c) 2013 MikuToga Partners
+ */
+
+package jp.sfjp.mikutoga.pmd;
+
+import java.util.regex.Pattern;
+
+/**
+ * シェーディング情報の各種ユーティリティ。
+ * <p>※ スフィアマップファイルの中身はBMP(DIB)形式。
+ * <p><a href="http://en.wikipedia.org/wiki/BMP_file_format">
+ * BMP file format </a>
+ */
+public final class ShadingUtil {
+
+    /** スフィアマップファイル名(乗算)拡張子。 */
+    public static final String EXT_SPH = ".sph";
+    /** スフィアマップファイル名(加算)拡張子。 */
+    public static final String EXT_SPA = ".spa";
+
+    private static final String SEPARATOR = Pattern.quote("*");
+    private static final Pattern SPLITTER = Pattern.compile(SEPARATOR);
+
+
+    /**
+     * 隠しコンストラクタ。
+     */
+    private ShadingUtil(){
+        assert false;
+        throw new AssertionError();
+    }
+
+
+    /**
+     * スフィアマップファイル名か否か判定する。
+     * <p>拡張子が「.sph」(乗算)もしくは「.spa」(加算)なら
+     * スフィアマップファイル名と判定する。
+     * @param fname ファイル名
+     * @return スフィアマップファイルならtrue
+     */
+    public static boolean isSpheremapFile(String fname) {
+        if(fname.endsWith(EXT_SPH)) return true;
+        if(fname.endsWith(EXT_SPA)) return true;
+        return false;
+    }
+
+    /**
+     * シェーディング用ファイル情報文字列から
+     * テクスチャファイル名とスフィアマップファイル名を分離する。
+     * <p>2つのファイル名は単一の「*」で区切られ、
+     * 前部がテクスチャファイル名、後部がスフィアマップファイル名となる。
+     * 「*」がなく末尾が「.sph」か「.spa」なら
+     * スフィアマップファイル名のみ、
+     * 末尾がどちらでもなければテクスチャファイル名のみとなる。
+     * @param shadingFile シェーディング用ファイル情報
+     * @return [0]:テクスチャファイル名 [1]:スフィアマップファイル名。
+     * 該当ファイル名が無い場合は空文字列。
+     */
+    public static String[] splitShadingFileInfo(String shadingFile) {
+        String[] result;
+
+        result = SPLITTER.split(shadingFile, 2);
+        assert result.length == 1 || result.length == 2;
+
+        if(result.length == 1){
+            String onlyFile = result[0];
+            if (isSpheremapFile(onlyFile)){
+                result = new String[]{ "", onlyFile };
+            }else{
+                result = new String[]{ onlyFile, "" };
+            }
+        }
+
+        assert result.length == 2;
+
+        return result;
+    }
+
+}
index 720114c..b005258 100644 (file)
@@ -15,6 +15,7 @@ import jp.sfjp.mikutoga.bin.parser.CommonParser;
 import jp.sfjp.mikutoga.bin.parser.MmdEofException;
 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
 import jp.sfjp.mikutoga.bin.parser.TextDecoder;
+import jp.sfjp.mikutoga.pmd.ShadingUtil;
 
 /**
  * PMDモデルファイルのパーサ基本部。
@@ -93,36 +94,6 @@ public class PmdParserBase extends CommonParser {
     }
 
     /**
-     * シェーディング用ファイル情報から
-     * テクスチャファイル名とスフィアマップファイル名を分離する。
-     * @param shadingFile シェーディング用ファイル情報
-     * @return [0]:テクスチャファイル名 [1]:スフィアマップファイル名。
-     * 該当ファイル名が無い場合は空文字列。
-     */
-    public static String[] splitShadingFileInfo(String shadingFile){
-        String[] result;
-
-        result = shadingFile.split('\\'+"*", 2);
-        assert result.length == 1 || result.length == 2;
-
-        if(result.length == 1){
-            String onlyFile = result[0];
-            result = new String[2];
-            result[0] = "";
-            result[1] = "";
-            if(onlyFile.endsWith(".sph") || onlyFile.endsWith(".spa")){
-                result[1] = onlyFile;
-            }else{
-                result[0] = onlyFile;
-            }
-        }
-
-        assert result.length == 2;
-
-        return result;
-    }
-
-    /**
      * 基本情報通知ハンドラを登録する。
      * @param handler ハンドラ
      */
@@ -384,7 +355,7 @@ public class PmdParserBase extends CommonParser {
 
             String shadingFile =
                     parsePmdText(PmdLimits.MAXBYTES_TEXTUREFILENAME);
-            String[] splitted = splitShadingFileInfo(shadingFile);
+            String[] splitted = ShadingUtil.splitShadingFileInfo(shadingFile);
             String textureFile = splitted[0];
             String sphereFile  = splitted[1];
 
diff --git a/src/test/java/jp/sfjp/mikutoga/pmd/ShadingUtilTest.java b/src/test/java/jp/sfjp/mikutoga/pmd/ShadingUtilTest.java
new file mode 100644 (file)
index 0000000..a7b07a2
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ */
+
+package jp.sfjp.mikutoga.pmd;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class ShadingUtilTest {
+
+    public ShadingUtilTest() {
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+    }
+
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Test of isSpheremapFile method, of class ShadingUtil.
+     */
+    @Test
+    public void testIsSpheremapFile() {
+        System.out.println("isSpheremapFile");
+
+        assertFalse(ShadingUtil.isSpheremapFile(""));
+        assertFalse(ShadingUtil.isSpheremapFile("a"));
+        assertFalse(ShadingUtil.isSpheremapFile("a.png"));
+        assertTrue(ShadingUtil.isSpheremapFile("a.sph"));
+        assertTrue(ShadingUtil.isSpheremapFile("a.spa"));
+        assertTrue(ShadingUtil.isSpheremapFile(".sph"));
+        assertTrue(ShadingUtil.isSpheremapFile(".spa"));
+        assertFalse(ShadingUtil.isSpheremapFile("sph"));
+        assertFalse(ShadingUtil.isSpheremapFile("spa"));
+        assertFalse(ShadingUtil.isSpheremapFile("a.SPH"));
+        assertFalse(ShadingUtil.isSpheremapFile("a.SPA"));
+
+        return;
+    }
+
+    /**
+     * Test of splitShadingFileInfo method, of class PmdParserBase.
+     */
+    @Test
+    public void testSplitShadingFileInfo() {
+        System.out.println("splitShadingFileInfo");
+
+        String[] result;
+
+        result = ShadingUtil.splitShadingFileInfo("");
+        assertEquals(2, result.length);
+        assertEquals("", result[0]);
+        assertEquals("", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a");
+        assertEquals(2, result.length);
+        assertEquals("a", result[0]);
+        assertEquals("", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a.sph");
+        assertEquals(2, result.length);
+        assertEquals("", result[0]);
+        assertEquals("a.sph", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a.spa");
+        assertEquals(2, result.length);
+        assertEquals("", result[0]);
+        assertEquals("a.spa", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a.spz");
+        assertEquals(2, result.length);
+        assertEquals("a.spz", result[0]);
+        assertEquals("", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a*b");
+        assertEquals(2, result.length);
+        assertEquals("a", result[0]);
+        assertEquals("b", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a*b*c");
+        assertEquals(2, result.length);
+        assertEquals("a", result[0]);
+        assertEquals("b*c", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("*");
+        assertEquals(2, result.length);
+        assertEquals("", result[0]);
+        assertEquals("", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a*");
+        assertEquals(2, result.length);
+        assertEquals("a", result[0]);
+        assertEquals("", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("*b");
+        assertEquals(2, result.length);
+        assertEquals("", result[0]);
+        assertEquals("b", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a.sph*");
+        assertEquals(2, result.length);
+        assertEquals("a.sph", result[0]);
+        assertEquals("", result[1]);
+
+        result = ShadingUtil.splitShadingFileInfo("a.spa*");
+        assertEquals(2, result.length);
+        assertEquals("a.spa", result[0]);
+        assertEquals("", result[1]);
+
+        return;
+    }
+
+}
diff --git a/src/test/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBaseTest.java b/src/test/java/jp/sfjp/mikutoga/pmd/parser/PmdParserBaseTest.java
new file mode 100644 (file)
index 0000000..bac02c9
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ */
+
+package jp.sfjp.mikutoga.pmd.parser;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class PmdParserBaseTest {
+
+    public PmdParserBaseTest() {
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+    }
+
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Test of chopLastLF method, of class PmdParserBase.
+     */
+    @Test
+    public void testChopLastLF() {
+        System.out.println("chopLastLF");
+
+        assertEquals("", PmdParserBase.chopLastLF(""));
+        assertEquals("abc", PmdParserBase.chopLastLF("abc"));
+        assertEquals("abc\r", PmdParserBase.chopLastLF("abc\r"));
+        assertEquals("abc", PmdParserBase.chopLastLF("abc\n"));
+        assertEquals("abc\r", PmdParserBase.chopLastLF("abc\r\n"));
+        assertEquals("abc\nxyz", PmdParserBase.chopLastLF("abc\nxyz"));
+        assertEquals("abc\r\nxyz", PmdParserBase.chopLastLF("abc\r\nxyz"));
+        assertEquals("\r", PmdParserBase.chopLastLF("\r"));
+        assertEquals("", PmdParserBase.chopLastLF("\n"));
+        assertEquals("\r", PmdParserBase.chopLastLF("\r\n"));
+
+        return;
+    }
+
+}