OSDN Git Service

ヘッダ情報の通知修正
authorOlyutorskii <olyutorskii@users.osdn.me>
Wed, 1 Jun 2011 22:38:20 +0000 (07:38 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Wed, 1 Jun 2011 22:38:20 +0000 (07:38 +0900)
src/main/java/jp/sourceforge/mikutoga/parser/pmd/PmdBasicHandler.java
src/main/java/jp/sourceforge/mikutoga/parser/pmd/PmdParserBase.java
src/main/java/jp/sourceforge/mikutoga/pmd/PmdModel.java
src/main/java/jp/sourceforge/mikutoga/pmd/pmdexporter/PmdExporterBase.java
src/main/java/jp/sourceforge/mikutoga/pmd/pmdloader/TextBuilder.java
src/test/java/sample/pmd/DummyHandler.java

index 96bece8..4e43921 100644 (file)
@@ -34,11 +34,11 @@ public interface PmdBasicHandler {
 
     /**
      * PMDファイルのヘッダ情報の通知を受け取る。
-     * @param ver ヘッダ情報の版数
+     * @param header ヘッダ情報バイト列
      * @throws MmdFormatException 不正フォーマットによる
      * パース処理の中断をパーサに指示
      */
-    void pmdHeaderInfo(float ver)
+    void pmdHeaderInfo(byte[] header)
             throws MmdFormatException;
 
     /**
index b82a118..fab5682 100644 (file)
@@ -17,6 +17,8 @@ import jp.sourceforge.mikutoga.parser.MmdSource;
  */
 public class PmdParserBase extends CommonParser {
 
+    public static final int HEADER_LENGTH = 7;
+
     /** 改行文字列 CR。 */
     protected static final String CR = "\r";       // 0x0d
     /** 改行文字列 LF。 */
@@ -24,8 +26,10 @@ public class PmdParserBase extends CommonParser {
     /** 改行文字列 CRLF。 */
     protected static final String CRLF = CR + LF;  // 0x0d, 0x0a
 
-    private static final String MAGIC = "Pmd";
-    private static final int MAGIC_SZ = MAGIC.getBytes(CS_WIN31J).length;
+    private static final byte[] MAGIC_BYTES = {
+        (byte)0x50, (byte)0x6d, (byte)0x64,               // "Pmd"
+        (byte)0x00, (byte)0x00, (byte)0x80, (byte)0x3f,   // 1.0f
+    };
 
     private static final int VERTEX_DATA_SZ      = 38;
     private static final int SURFACE_DATA_SZ     =  6;
@@ -37,6 +41,11 @@ public class PmdParserBase extends CommonParser {
     private static final int GROUPEDBONE_DATA_SZ =  3;
 
 
+    static{
+        assert MAGIC_BYTES.length == HEADER_LENGTH;
+    }
+
+
     private PmdBasicHandler basicHandler = null;
     private PmdShapeHandler shapeHandler = null;
     private PmdMaterialHandler materialHandler = null;
@@ -222,12 +231,15 @@ public class PmdParserBase extends CommonParser {
      * @throws MmdFormatException フォーマットエラー
      */
     private void parsePmdHeader() throws IOException, MmdFormatException{
-        String magic = parseZeroTermWin31J(MAGIC_SZ);
-        if( ! magic.equals(MAGIC) ){
-            throw new MmdFormatException("unrecognized magic data");
+        byte[] header = new byte[HEADER_LENGTH];
+        parseByteArray(header);
+
+        for(int idx = 0; idx < MAGIC_BYTES.length; idx++){
+            if(header[idx] != MAGIC_BYTES[idx]){
+                throw new MmdFormatException("unknown PMD-header type");
+            }
         }
 
-        float ver = parseFloat();
         String modelName   =
                 parseZeroTermWin31J(PmdLimits.MAXBYTES_MODELNAME);
         String description =
@@ -235,7 +247,7 @@ public class PmdParserBase extends CommonParser {
         description = description.replace(CRLF, LF);
 
         if(this.basicHandler != null){
-            this.basicHandler.pmdHeaderInfo(ver);
+            this.basicHandler.pmdHeaderInfo(header);
             this.basicHandler.pmdModelInfo(modelName, description);
         }
 
index 25aebb5..1dfc9a1 100644 (file)
@@ -25,11 +25,6 @@ import jp.sourceforge.mikutoga.corelib.I18nText;
  */
 public class PmdModel {
 
-    /** デフォルトのヘッダバージョン。 */
-    public static final float DEF_HEADERVER = 1.0f;
-
-    private float headerVersion = DEF_HEADERVER;
-
     private final I18nText modelName = new I18nText();
     private final I18nText description = new I18nText();
 
@@ -71,23 +66,6 @@ public class PmdModel {
     }
 
     /**
-     * PMDファイルのヘッダバージョンを返す。
-     * @return PMDファイルのヘッダバージョン
-     */
-    public float getHeaderVersion(){
-        return this.headerVersion;
-    }
-
-    /**
-     * PMDファイルのヘッダバージョンを設定する。
-     * @param ver PMDファイルのヘッダバージョン
-     */
-    public void setHeaderVersion(float ver){
-        this.headerVersion = ver;
-        return;
-    }
-
-    /**
      * モデル名を返す。
      * @return モデル名
      */
index 3b1c342..e606a74 100644 (file)
@@ -48,7 +48,10 @@ public class PmdExporterBase extends AbstractExporter{
     /** 影響元IKボーンが無い場合の便宜的なボーンID。 */
     public static final int NOIKBONE_ID = 0x0000;
 
-    private static final String MAGIC = "Pmd";
+    private static final byte[] MAGIC_BYTES = {
+        (byte)0x50, (byte)0x6d, (byte)0x64,               // "Pmd"
+        (byte)0x00, (byte)0x00, (byte)0x80, (byte)0x3f,   // 1.0f
+    };
 
     private static final byte[] NULLFILLER =
         { (byte)0x00 };
@@ -174,9 +177,9 @@ public class PmdExporterBase extends AbstractExporter{
      */
     private void dumpBasic(PmdModel model)
             throws IOException, IllegalPmdTextException{
-        dumpCharSequence(MAGIC);
-        float ver = model.getHeaderVersion();
-        dumpFloat(ver);
+        for(int idx=0; idx < MAGIC_BYTES.length; idx++){
+            dumpByte(MAGIC_BYTES[idx]);
+        }
 
         String modelName   = model.getModelName()  .getPrimaryText();
         String description = model.getDescription().getPrimaryText();
index e37082f..f81a535 100644 (file)
@@ -170,11 +170,10 @@ class TextBuilder implements PmdBasicHandler, PmdEngHandler {
 
     /**
      * {@inheritDoc}
-     * @param ver {@inheritDoc}
+     * @param header {@inheritDoc}
      */
     @Override
-    public void pmdHeaderInfo(float ver){
-        this.model.setHeaderVersion(ver);
+    public void pmdHeaderInfo(byte[] header){
         return;
     }
 
index f9fc4fd..dc1d774 100644 (file)
@@ -72,8 +72,8 @@ public class DummyHandler
     }
 
     @Override
-    public void pmdHeaderInfo(float ver){
-        System.out.println("ver=" + ver);
+    public void pmdHeaderInfo(byte[] header){
+        System.out.println("header length=" + header.length);
         return;
     }