--- /dev/null
+/*
+ * 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;
+ }
+
+}
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モデルファイルのパーサ基本部。
}
/**
- * シェーディング用ファイル情報から
- * テクスチャファイル名とスフィアマップファイル名を分離する。
- * @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 ハンドラ
*/
String shadingFile =
parsePmdText(PmdLimits.MAXBYTES_TEXTUREFILENAME);
- String[] splitted = splitShadingFileInfo(shadingFile);
+ String[] splitted = ShadingUtil.splitShadingFileInfo(shadingFile);
String textureFile = splitted[0];
String sphereFile = splitted[1];
--- /dev/null
+/*
+ */
+
+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;
+ }
+
+}
--- /dev/null
+/*
+ */
+
+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;
+ }
+
+}