您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
202 行
6.1 KiB
202 行
6.1 KiB
using System;
|
|
|
|
namespace Unity.UIWidgets.foundation {
|
|
public class WriteBuffer {
|
|
public WriteBuffer() {
|
|
_buffer = new byte[0];
|
|
_position = 0;
|
|
}
|
|
|
|
byte[] _buffer;
|
|
int _position;
|
|
|
|
void _ensureCapacity(int value) {
|
|
if (value <= _buffer.Length)
|
|
return;
|
|
int capacity = value;
|
|
if (capacity < 256)
|
|
capacity = 256;
|
|
if (capacity < _buffer.Length * 2)
|
|
capacity = _buffer.Length * 2;
|
|
if ((uint) (_buffer.Length * 2) > 2147483591U)
|
|
capacity = value > 2147483591 ? value : 2147483591;
|
|
|
|
byte[] buffer = new byte[capacity];
|
|
if (_buffer.Length > 0)
|
|
Buffer.BlockCopy(_buffer, 0, buffer, 0, _buffer.Length);
|
|
_buffer = buffer;
|
|
}
|
|
|
|
public void putUint8(byte value) {
|
|
_ensureCapacity(_position + 1);
|
|
_buffer[_position] = value;
|
|
_position++;
|
|
}
|
|
|
|
public unsafe void putUint16(ushort value) {
|
|
_ensureCapacity(_position + 2);
|
|
fixed (byte* ptr = &_buffer[_position])
|
|
*(ushort*) ptr = value;
|
|
_position += 2;
|
|
}
|
|
|
|
public unsafe void putUint32(uint value) {
|
|
_ensureCapacity(_position + 4);
|
|
fixed (byte* ptr = &_buffer[_position])
|
|
*(uint*) ptr = value;
|
|
_position += 4;
|
|
}
|
|
|
|
public unsafe void putInt32(int value) {
|
|
_ensureCapacity(_position + 4);
|
|
fixed (byte* ptr = &_buffer[_position])
|
|
*(int*) ptr = value;
|
|
_position += 4;
|
|
}
|
|
|
|
public unsafe void putInt64(long value) {
|
|
_ensureCapacity(_position + 8);
|
|
fixed (byte* ptr = &_buffer[_position])
|
|
*(long*) ptr = value;
|
|
_position += 8;
|
|
}
|
|
|
|
public unsafe void putFloat32(float value) {
|
|
_alignTo(4);
|
|
_ensureCapacity(_position + 4);
|
|
fixed (byte* ptr = &_buffer[_position])
|
|
*(float*) ptr = value;
|
|
_position += 4;
|
|
}
|
|
|
|
public void putUint8List(byte[] list) {
|
|
int lengthInBytes = list.Length;
|
|
_ensureCapacity(_position + lengthInBytes);
|
|
Buffer.BlockCopy(list, 0, _buffer, _position, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
}
|
|
|
|
public void putInt32List(int[] list) {
|
|
_alignTo(4);
|
|
int lengthInBytes = list.Length * 4;
|
|
_ensureCapacity(_position + lengthInBytes);
|
|
Buffer.BlockCopy(list, 0, _buffer, _position, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
}
|
|
|
|
public void putInt64List(long[] list) {
|
|
_alignTo(8);
|
|
int lengthInBytes = list.Length * 8;
|
|
_ensureCapacity(_position + lengthInBytes);
|
|
Buffer.BlockCopy(list, 0, _buffer, _position, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
}
|
|
|
|
public void putFloat32List(float[] list) {
|
|
_alignTo(4);
|
|
int lengthInBytes = list.Length * 4;
|
|
_ensureCapacity(_position + lengthInBytes);
|
|
Buffer.BlockCopy(list, 0, _buffer, _position, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
}
|
|
|
|
void _alignTo(int alignment) {
|
|
var mod = _position % alignment;
|
|
if (mod != 0) {
|
|
for (int i = 0; i < alignment - mod; i++)
|
|
putUint8(0);
|
|
}
|
|
}
|
|
|
|
public byte[] done() {
|
|
var bytes = new byte[_position];
|
|
Buffer.BlockCopy(_buffer, 0, bytes, 0, _position);
|
|
_buffer = null;
|
|
return bytes;
|
|
}
|
|
}
|
|
|
|
public class ReadBuffer {
|
|
public ReadBuffer(byte[] data) {
|
|
D.assert(data != null);
|
|
this.data = data;
|
|
}
|
|
|
|
public readonly byte[] data;
|
|
|
|
int _position = 0;
|
|
|
|
public bool hasRemaining => _position < data.Length;
|
|
|
|
public byte getUint8() {
|
|
return data[_position++];
|
|
}
|
|
|
|
public unsafe ushort getUint16() {
|
|
fixed (byte* ptr = &data[_position += 2])
|
|
return *(ushort*) ptr;
|
|
}
|
|
|
|
public unsafe uint getUint32() {
|
|
fixed (byte* ptr = &data[_position += 4])
|
|
return *(uint*) ptr;
|
|
}
|
|
|
|
public unsafe int getInt32() {
|
|
fixed (byte* ptr = &data[_position += 4])
|
|
return *(int*) ptr;
|
|
}
|
|
|
|
public unsafe long getInt64() {
|
|
fixed (byte* ptr = &data[_position += 8])
|
|
return *(long*) ptr;
|
|
}
|
|
|
|
public unsafe float getFloat32() {
|
|
_alignTo(4);
|
|
fixed (byte* ptr = &data[_position += 4])
|
|
return *(float*) ptr;
|
|
}
|
|
|
|
public byte[] getUint8List(int length) {
|
|
byte[] list = new byte[length];
|
|
int lengthInBytes = length;
|
|
Buffer.BlockCopy(data, _position, list, 0, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
return list;
|
|
}
|
|
|
|
public int[] getInt32List(int length) {
|
|
_alignTo(4);
|
|
int[] list = new int[length];
|
|
int lengthInBytes = length * 4;
|
|
Buffer.BlockCopy(data, _position, list, 0, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
return list;
|
|
}
|
|
|
|
public long[] getInt64List(int length) {
|
|
_alignTo(8);
|
|
long[] list = new long[length];
|
|
int lengthInBytes = length * 8;
|
|
Buffer.BlockCopy(data, _position, list, 0, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
return list;
|
|
}
|
|
|
|
public float[] getFloat32List(int length) {
|
|
_alignTo(4);
|
|
float[] list = new float[length];
|
|
int lengthInBytes = length * 4;
|
|
Buffer.BlockCopy(data, _position, list, 0, lengthInBytes);
|
|
_position += lengthInBytes;
|
|
return list;
|
|
}
|
|
|
|
void _alignTo(int alignment) {
|
|
int mod = _position % alignment;
|
|
if (mod != 0)
|
|
_position += alignment - mod;
|
|
}
|
|
}
|
|
}
|