package com.intellij.flex.uiDesigner.abc;
import com.intellij.flex.uiDesigner.io.AbstractByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel;
class WritableDataBuffer extends DataBuffer {
WritableDataBuffer(int preferredSize) {
preferredSize = preferredSize <= 0 ? 1000 : preferredSize;
data = new byte[preferredSize];
size = 0;
position = 0;
}
public void writeTo(WritableByteChannel channel) throws IOException {
channel.write(ByteBuffer.wrap(data, offset, size));
}
public void writeTo(AbstractByteArrayOutputStream channel) throws IOException {
channel.write(ByteBuffer.wrap(data, offset, size));
}
public void clear() {
position = 0;
size = 0;
}
public void delete(int count) {
size -= count;
}
private void resize(int increment) {
if (size + increment > data.length) {
byte[] temp = new byte[data.length * 3 / 2 + 1];
System.arraycopy(data, 0, temp, 0, data.length);
data = temp;
}
}
public void writeTo(DataBuffer b) {
writeTo(b.data, b.size);
}
public void writeTo(byte[] bytes) {
writeTo(bytes, bytes.length);
}
public void writeTo(byte[] bytes, int length) {
resize(length);
System.arraycopy(bytes, 0, data, size, length);
size += length;
}
public void writeU8(int v) {
resize(1);
data[size++] = (byte)v;
}
public int copyU8(DataBuffer dataBuffer) {
resize(1);
return data[size++] = (byte)dataBuffer.readU8();
}
public void writeU8(int pos, int v) {
data[pos] = (byte)v;
}
public void writeS24(int v) {
writeU24(v);
}
public void writeS24(int pos, int v) {
data[pos] = (byte)v;
data[pos + 1] = (byte)(v >> 8);
data[pos + 2] = (byte)(v >> 16);
}
public void writeU24(int v) {
resize(3);
data[size++] = (byte)v;
data[size++] = (byte)(v >> 8);
data[size++] = (byte)(v >> 16);
}
public void writeU32(int v) {
if (v < 128 && v > -1) {
resize(1);
data[size++] = (byte)v;
}
else if (v < 16384 && v > -1) {
resize(2);
data[size++] = (byte)((v & 0x7F) | 0x80);
data[size++] = (byte)((v >> 7) & 0x7F);
}
else if (v < 2097152 && v > -1) {
resize(3);
data[size++] = (byte)((v & 0x7F) | 0x80);
data[size++] = (byte)((v >> 7) | 0x80);
data[size++] = (byte)((v >> 14) & 0x7F);
}
else if (v < 268435456 && v > -1) {
resize(4);
data[size++] = (byte)((v & 0x7F) | 0x80);
data[size++] = (byte)(v >> 7 | 0x80);
data[size++] = (byte)(v >> 14 | 0x80);
data[size++] = (byte)((v >> 21) & 0x7F);
}
else {
resize(5);
data[size++] = (byte)((v & 0x7F) | 0x80);
data[size++] = (byte)(v >> 7 | 0x80);
data[size++] = (byte)(v >> 14 | 0x80);
data[size++] = (byte)(v >> 21 | 0x80);
data[size++] = (byte)((v >> 28) & 0x0F);
}
}
public void close() {
position = 0;
}
}