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;
 | 
						|
	}
 | 
						|
}
 |