فهرست منبع

hxd.fmt.pak.Build: add option align, ease binary comparison in some situation (#1153)

Yuxiao Mao 2 سال پیش
والد
کامیت
94d39432d7
2فایلهای تغییر یافته به همراه27 افزوده شده و 4 حذف شده
  1. 6 1
      hxd/fmt/pak/Build.hx
  2. 21 3
      hxd/fmt/pak/Writer.hx

+ 6 - 1
hxd/fmt/pak/Build.hx

@@ -14,6 +14,7 @@ class Build {
 	public var includePath : Array<String> = [];
 	public var includePath : Array<String> = [];
 	public var resPath : String = "res";
 	public var resPath : String = "res";
 	public var outPrefix : String;
 	public var outPrefix : String;
+	public var align : Int = 0;
 	public var pakDiff = false;
 	public var pakDiff = false;
 	public var checkJPG = false;
 	public var checkJPG = false;
 	public var checkOGG = false;
 	public var checkOGG = false;
@@ -92,6 +93,8 @@ class Build {
 			f.checksum = haxe.crypto.Adler32.make(data);
 			f.checksum = haxe.crypto.Adler32.make(data);
 			out.bytes.push(data);
 			out.bytes.push(data);
 			out.size += data.length;
 			out.size += data.length;
+			if (align > 1)
+				out.size += align - data.length % align;
 		}
 		}
 		return f;
 		return f;
 	}
 	}
@@ -181,7 +184,7 @@ class Build {
 		var outFile = outPrefix + ".pak";
 		var outFile = outPrefix + ".pak";
 		Sys.println("Writing "+outFile);
 		Sys.println("Writing "+outFile);
 		var f = sys.io.File.write(outFile);
 		var f = sys.io.File.write(outFile);
-		new Writer(f).write(pak, null, out.bytes);
+		new Writer(f, align).write(pak, null, out.bytes);
 		f.close();
 		f.close();
 	}
 	}
 
 
@@ -227,6 +230,8 @@ class Build {
 				}
 				}
 				extractRec(pak.root, baseDir);
 				extractRec(pak.root, baseDir);
 				Sys.exit(0);
 				Sys.exit(0);
+			case "-align" if( args.length > 0 ):
+				b.align = Std.parseInt(args.shift());
 			case "-diff":
 			case "-diff":
 				b.pakDiff = true;
 				b.pakDiff = true;
 			case "-res" if( args.length > 0 ):
 			case "-res" if( args.length > 0 ):

+ 21 - 3
hxd/fmt/pak/Writer.hx

@@ -4,9 +4,11 @@ import hxd.fmt.pak.Data;
 class Writer {
 class Writer {
 
 
 	var o : haxe.io.Output;
 	var o : haxe.io.Output;
+	var align : Int = 0;
 
 
-	public function new(o) {
+	public function new(o, ?align) {
 		this.o = o;
 		this.o = o;
+		this.align = align;
 	}
 	}
 
 
 	public function writeFile( f : File ) {
 	public function writeFile( f : File ) {
@@ -31,12 +33,23 @@ class Writer {
 		}
 		}
 	}
 	}
 
 
+	function addPadding( pos : Int ) {
+		var padLen = align - pos % align;
+		for (i in 0...padLen) {
+			o.writeByte(0);
+		}
+
+	}
+
 	public function write( pak : Data, content : haxe.io.Bytes, ?arrayContent : Array<haxe.io.Bytes> ) {
 	public function write( pak : Data, content : haxe.io.Bytes, ?arrayContent : Array<haxe.io.Bytes> ) {
 
 
 		if( arrayContent != null ) {
 		if( arrayContent != null ) {
 			pak.dataSize = 0;
 			pak.dataSize = 0;
-			for( b in arrayContent )
+			for( b in arrayContent ) {
 				pak.dataSize += b.length;
 				pak.dataSize += b.length;
+				if (align > 1)
+					pak.dataSize += align - b.length % align;
+			}
 		} else
 		} else
 			pak.dataSize = content.length;
 			pak.dataSize = content.length;
 
 
@@ -44,16 +57,21 @@ class Writer {
 		new Writer(header).writeFile(pak.root);
 		new Writer(header).writeFile(pak.root);
 		var header = header.getBytes();
 		var header = header.getBytes();
 		pak.headerSize = header.length + 16;
 		pak.headerSize = header.length + 16;
+		if (align > 1)
+			pak.headerSize += align - pak.headerSize % align;
 
 
 		o.writeString("PAK");
 		o.writeString("PAK");
 		o.writeByte(pak.version);
 		o.writeByte(pak.version);
 		o.writeInt32(pak.headerSize);
 		o.writeInt32(pak.headerSize);
 		o.writeInt32(pak.dataSize);
 		o.writeInt32(pak.dataSize);
 		o.write(header);
 		o.write(header);
+		if (align > 1) addPadding(header.length + 16); // Align for end of DATA
 		o.writeString("DATA");
 		o.writeString("DATA");
 		if( arrayContent != null ) {
 		if( arrayContent != null ) {
-			for( b in arrayContent )
+			for( b in arrayContent ) {
 				o.write(b);
 				o.write(b);
+				if (align > 1) addPadding(b.length);
+			}
 		} else
 		} else
 			o.write(content);
 			o.write(content);
 	}
 	}