203 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			203 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.internal;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import haxe.ds.Vector;
							 | 
						||
| 
								 | 
							
								import haxe.io.Bytes;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class BytesBlob implements Resource {
							 | 
						||
| 
								 | 
							
									static inline var bufferSize: Int = 2000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var bytes: Bytes;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:allow(kha.LoaderImpl)
							 | 
						||
| 
								 | 
							
									function new(bytes: Bytes) {
							 | 
						||
| 
								 | 
							
										this.bytes = bytes;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function fromBytes(bytes: Bytes): Blob {
							 | 
						||
| 
								 | 
							
										return new Blob(bytes);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function alloc(size: Int): Blob {
							 | 
						||
| 
								 | 
							
										return new Blob(Bytes.alloc(size));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function sub(start: Int, length: Int): Blob {
							 | 
						||
| 
								 | 
							
										return new Blob(bytes.sub(start, length));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var length(get, null): Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep
							 | 
						||
| 
								 | 
							
									function get_length(): Int {
							 | 
						||
| 
								 | 
							
										return bytes.length;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function writeU8(position: Int, value: Int): Void {
							 | 
						||
| 
								 | 
							
										bytes.set(position, value);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readU8(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var byte = bytes.get(position);
							 | 
						||
| 
								 | 
							
										++position;
							 | 
						||
| 
								 | 
							
										return byte;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readS8(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var byte = bytes.get(position);
							 | 
						||
| 
								 | 
							
										++position;
							 | 
						||
| 
								 | 
							
										var sign = (byte & 0x80) == 0 ? 1 : -1;
							 | 
						||
| 
								 | 
							
										byte = byte & 0x7F;
							 | 
						||
| 
								 | 
							
										return sign * byte;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readU16BE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										position += 2;
							 | 
						||
| 
								 | 
							
										return first * 256 + second;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readU16LE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										position += 2;
							 | 
						||
| 
								 | 
							
										return second * 256 + first;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readU32LE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var fourth = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var third = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 2);
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 3);
							 | 
						||
| 
								 | 
							
										position += 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return fourth + third * 256 + second * 256 * 256 + first * 256 * 256 * 256;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readU32BE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var fourth = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var third = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 2);
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 3);
							 | 
						||
| 
								 | 
							
										position += 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return first + second * 256 + third * 256 * 256 + fourth * 256 * 256 * 256;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readS16BE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										position += 2;
							 | 
						||
| 
								 | 
							
										var sign = (first & 0x80) == 0 ? 1 : -1;
							 | 
						||
| 
								 | 
							
										first = first & 0x7F;
							 | 
						||
| 
								 | 
							
										if (sign == -1)
							 | 
						||
| 
								 | 
							
											return -0x7fff + first * 256 + second;
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											return first * 256 + second;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readS16LE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										var sign = (second & 0x80) == 0 ? 1 : -1;
							 | 
						||
| 
								 | 
							
										second = second & 0x7F;
							 | 
						||
| 
								 | 
							
										position += 2;
							 | 
						||
| 
								 | 
							
										if (sign == -1)
							 | 
						||
| 
								 | 
							
											return -0x7fff + second * 256 + first;
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											return second * 256 + first;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readS32LE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var fourth = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var third = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 2);
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 3);
							 | 
						||
| 
								 | 
							
										var sign = (first & 0x80) == 0 ? 1 : -1;
							 | 
						||
| 
								 | 
							
										first = first & 0x7F;
							 | 
						||
| 
								 | 
							
										position += 4;
							 | 
						||
| 
								 | 
							
										if (sign == -1)
							 | 
						||
| 
								 | 
							
											return -0x7fffffff + fourth + third * 256 + second * 256 * 256 + first * 256 * 256 * 256;
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											return fourth + third * 256 + second * 256 * 256 + first * 256 * 256 * 256;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readS32BE(position: Int): Int {
							 | 
						||
| 
								 | 
							
										var fourth = bytes.get(position + 0);
							 | 
						||
| 
								 | 
							
										var third = bytes.get(position + 1);
							 | 
						||
| 
								 | 
							
										var second = bytes.get(position + 2);
							 | 
						||
| 
								 | 
							
										var first = bytes.get(position + 3);
							 | 
						||
| 
								 | 
							
										var sign = (fourth & 0x80) == 0 ? 1 : -1;
							 | 
						||
| 
								 | 
							
										fourth = fourth & 0x7F;
							 | 
						||
| 
								 | 
							
										position += 4;
							 | 
						||
| 
								 | 
							
										if (sign == -1)
							 | 
						||
| 
								 | 
							
											return -0x7fffffff + first + second * 256 + third * 256 * 256 + fourth * 256 * 256 * 256;
							 | 
						||
| 
								 | 
							
										return first + second * 256 + third * 256 * 256 + fourth * 256 * 256 * 256;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readF32LE(position: Int): Float {
							 | 
						||
| 
								 | 
							
										return readF32(readS32LE(position));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readF32BE(position: Int): Float {
							 | 
						||
| 
								 | 
							
										return readF32(readS32BE(position));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function readF32(i: Int): Float {
							 | 
						||
| 
								 | 
							
										var sign: Float = ((i & 0x80000000) == 0) ? 1 : -1;
							 | 
						||
| 
								 | 
							
										var exp: Int = ((i >> 23) & 0xFF);
							 | 
						||
| 
								 | 
							
										var man: Int = (i & 0x7FFFFF);
							 | 
						||
| 
								 | 
							
										switch (exp) {
							 | 
						||
| 
								 | 
							
											case 0:
							 | 
						||
| 
								 | 
							
												// zero, do nothing, ignore negative zero and subnormals
							 | 
						||
| 
								 | 
							
												return 0.0;
							 | 
						||
| 
								 | 
							
											case 0xFF:
							 | 
						||
| 
								 | 
							
												if (man != 0)
							 | 
						||
| 
								 | 
							
													return Math.NaN;
							 | 
						||
| 
								 | 
							
												else if (sign > 0)
							 | 
						||
| 
								 | 
							
													return Math.POSITIVE_INFINITY;
							 | 
						||
| 
								 | 
							
												else
							 | 
						||
| 
								 | 
							
													return Math.NEGATIVE_INFINITY;
							 | 
						||
| 
								 | 
							
											default:
							 | 
						||
| 
								 | 
							
												return sign * ((man + 0x800000) / 8388608.0) * Math.pow(2, exp - 127);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function toString(): String {
							 | 
						||
| 
								 | 
							
										return bytes.toString();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function bit(value: Int, position: Int): Bool {
							 | 
						||
| 
								 | 
							
										var b = (value >>> position) & 1 == 1;
							 | 
						||
| 
								 | 
							
										if (b) {
							 | 
						||
| 
								 | 
							
											var a = 3;
							 | 
						||
| 
								 | 
							
											++a;
							 | 
						||
| 
								 | 
							
											return true;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else {
							 | 
						||
| 
								 | 
							
											var c = 4;
							 | 
						||
| 
								 | 
							
											--c;
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function toText(chars: Vector<Int>, length: Int): String {
							 | 
						||
| 
								 | 
							
										var value = "";
							 | 
						||
| 
								 | 
							
										for (i in 0...length)
							 | 
						||
| 
								 | 
							
											value += String.fromCharCode(chars[i]);
							 | 
						||
| 
								 | 
							
										return value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function readUtf8String(): String {
							 | 
						||
| 
								 | 
							
										return bytes.toString();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function toBytes(): Bytes {
							 | 
						||
| 
								 | 
							
										return bytes;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function unload(): Void {
							 | 
						||
| 
								 | 
							
										bytes = null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |