浏览代码

fix for >256MB pack

ncannasse 10 年之前
父节点
当前提交
423109f5aa
共有 2 个文件被更改,包括 22 次插入18 次删除
  1. 9 15
      hxd/fmt/pak/Build.hx
  2. 13 3
      hxd/fmt/pak/Writer.hx

+ 9 - 15
hxd/fmt/pak/Build.hx

@@ -26,7 +26,7 @@ class Build {
 			default:
 			}
 			var data = sys.io.File.getBytes(dir);
-			f.dataPosition = out.size;
+			f.dataPosition = #if pakDiff out.bytes.length #else out.size #end;
 			f.dataSize = data.length;
 			f.checksum = haxe.crypto.Adler32.make(data);
 			out.bytes.push(data);
@@ -72,7 +72,7 @@ class Build {
 		return root.checksum == old.checksum;
 	}
 
-	public static function rebuild( pak : Data, bytes : haxe.io.Bytes ) {
+	public static function rebuild( pak : Data, bytes : Array<haxe.io.Bytes> ) {
 		var size = 0;
 		function calcRec(f:File) {
 			if( f.isDirectory ) {
@@ -82,14 +82,14 @@ class Build {
 				size += f.dataSize;
 		}
 		calcRec(pak.root);
-		var out = haxe.io.Bytes.alloc(size);
+		var out = [];
 		var pos = 0;
 		function writeRec(f:File) {
 			if( f.isDirectory ) {
 				for( c in f.content )
 					writeRec(c);
 			} else {
-				out.blit(pos, bytes, f.dataPosition, f.dataSize);
+				out.push(bytes[f.dataPosition]);
 				f.dataPosition = pos;
 				pos += f.dataSize;
 			}
@@ -100,15 +100,9 @@ class Build {
 
 	public static function make( dir = "res" ) {
 		var pak = new Data();
-		var out = { bytes : [], size : 0 };
+		var outBytes = { bytes : [], size : 0 };
 		pak.version = 0;
-		pak.root = buildRec(dir,"",out);
-		var bytes = haxe.io.Bytes.alloc(out.size);
-		var pos = 0;
-		for( b in out.bytes ) {
-			bytes.blit(pos, b, 0, b.length);
-			pos += b.length;
-		}
+		pak.root = buildRec(dir,"",outBytes);
 		var out = "res";
 
 		#if pakDiff
@@ -126,12 +120,12 @@ class Build {
 				Sys.println("No changes in resources");
 				return;
 			}
-			bytes = rebuild(pak, bytes);
+			outBytes.bytes = rebuild(pak, outBytes.bytes);
 		}
 		#end
 
-		var f = sys.io.File.write(out+".pak");
-		new Writer(f).write(pak,bytes);
+		var f = sys.io.File.write(out + ".pak");
+		new Writer(f).write(pak, null, outBytes.bytes);
 		f.close();
 	}
 

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

@@ -26,8 +26,14 @@ class Writer {
 		}
 	}
 
-	public function write( pak : Data, content : haxe.io.Bytes ) {
-		pak.dataSize = content.length;
+	public function write( pak : Data, content : haxe.io.Bytes, ?arrayContent : Array<haxe.io.Bytes> ) {
+
+		if( arrayContent != null ) {
+			pak.dataSize = 0;
+			for( b in arrayContent )
+				pak.dataSize += b.length;
+		} else
+			pak.dataSize = content.length;
 
 		var header = new haxe.io.BytesOutput();
 		new Writer(header).writeFile(pak.root);
@@ -40,7 +46,11 @@ class Writer {
 		o.writeInt32(pak.dataSize);
 		o.write(header);
 		o.writeString("DATA");
-		o.write(content);
+		if( arrayContent != null ) {
+			for( b in arrayContent )
+				o.write(b);
+		} else
+			o.write(content);
 	}
 
 }