Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class SAFFIO {
- public static SaffronAnimation read (DataInput in) {
- int[] k = new int[2];
- byte[] data = new byte[4];
- in.readFully(data);
- if (!"SAFF".equals(data)) throw new IllegalArgumentException("not a saff file");
- OasisCanvas[] frames = new OasisCanvas[in.readUnsignedShort()];
- for (int i = 0; i < frames.length; i++)
- frames[i] = OasisCanvas.readShortForm(data);
- SaffronChannel[] channels = new SaffronChannel[in.readUnsignedByte() + 1];
- int length = in.readUnsignedShort();
- channels[0] = new SaffronChannel(SaffronChannel.Type.FRAME_SELECT);
- for (int i = 1; i < channels.length; i++)
- channels[i] = new SaffronChannel(SaffronChannel.Type.byID(readInt(2, in, k)));
- for (int i = 0; i < length; i++) {
- for (int j = 0; j < channels.length; j++) {
- if (channels[j].hasActiveEvent(i) || readInt(1, in, k) == 0) continue;
- int len = readPackedInt(in, k);
- switch (channels[j].getType()) {
- case SaffronChannel.Type.FRAME_SELECT:
- channels[j].addEvent(new SaffronEvent(i, len, frames[readPackedUInt(in, k)]));
- break;
- case SaffronChannel.Type.ROTATE:
- InterpolationType typer = InterpolationType.valueOf(readInt(2, in, k));
- double target = readPackedFloat(in, k) / 32768 * Math.PI;
- channels[j].addEvent(new SaffronEvent(i, len, typer, Double.valueOf(target)));
- break;
- case SaffronChannel.Type.TRANSLATE:
- InterpolationType typet = InterpolationType.valueOf(readInt(2, in, k));
- int x = readPackedInt(in, k);
- int y = readPackedInt(in, k);
- channels[j].addEvent(new SaffronEvent(i, len, typet, Integer.valueOf(x), Integer.valueOf(y)));
- break;
- case SaffronChannel.Type.DILATE:
- InterpolationType typet = InterpolationType.valueOf(readInt(2, in, k));
- double scalar = readPackedFloat(in, k);
- channels[j].addEvent(new SaffronEvent(i, len, typet, Double.valueOf(scalar)));
- break;
- }
- }
- }
- return new SaffronAnimation(frames, channels);
- }
- public static int readPackedInt (DataInput in, int[] k) {
- int c = readInt(2, in, k);
- switch (c) {
- case 0:
- return Integer.expand(readInt(3, in, k), 0x80000003);
- case 1:
- return Integer.expand(readInt(6, in, k), 0x8000001F);
- case 2:
- return Integer.expand(readInt(9, in, k), 0x800000FF);
- case 3:
- return Integer.expand(readInt(12, in, k), 0x800007FF);
- }
- }
- public static int readPackedUInt (DataInput in, int[] k) {
- int c = readInt(2, in, k);
- switch (c) {
- case 0:
- return readInt(2, in, k);
- case 1:
- return readInt(5, in, k);
- case 2:
- return readInt(8, in, k);
- case 3:
- return readInt(11, in, k);
- }
- }
- public static double readPackedFloat (DataInput in, int[] k) {
- int c = readInt(3, in, k);
- switch (c) {
- case 0:
- return Float.intBitsToFloat(Integer.expand(readInt(4, in, k), 0x83800000) + (readInt(1, in, k) << 23));
- case 1:
- return Float.intBitsToFloat(Integer.expand(readInt(6, in, k), 0x83980000));
- case 2:
- return Float.intBitsToFloat(Integer.expand(readInt(8, in, k), 0x839E0000));
- case 3:
- return Float.intBitsToFloat(Integer.expand(readInt(10, in, k), 0x839F8000));
- case 4:
- return Float.intBitsToFloat(Integer.expand(readInt(5, in, k), 0x87800000) + (readInt(1, in, k) << 23));
- case 5:
- return Float.intBitsToFloat(Integer.expand(readInt(7, in, k), 0x87980000));
- case 6:
- return Float.intBitsToFloat(Integer.expand(readInt(9, in, k), 0x879E0000));
- case 7:
- return Float.intBitsToFloat(Integer.expand(readInt(11, in, k), 0x879F8000));
- }
- }
- public static double readPackedUFloat (DataInput in, int[] k) {
- int c = readInt(3, in, k);
- switch (c) {
- case 0:
- return Float.intBitsToFloat(Integer.expand(readInt(3, in, k), 0x03800000) + (readInt(1, in, k) << 23));
- case 1:
- return Float.intBitsToFloat(Integer.expand(readInt(5, in, k), 0x03980000));
- case 2:
- return Float.intBitsToFloat(Integer.expand(readInt(7, in, k), 0x039E0000));
- case 3:
- return Float.intBitsToFloat(Integer.expand(readInt(9, in, k), 0x039F8000));
- case 4:
- return Float.intBitsToFloat(Integer.expand(readInt(4, in, k), 0x07800000) + (readInt(1, in, k) << 23));
- case 5:
- return Float.intBitsToFloat(Integer.expand(readInt(6, in, k), 0x07980000));
- case 6:
- return Float.intBitsToFloat(Integer.expand(readInt(8, in, k), 0x079E0000));
- case 7:
- return Float.intBitsToFloat(Integer.expand(readInt(10, in, k), 0x079F8000));
- }
- }
- public static int readInt (int len, DataInput in, int[] k) {
- int r = 0;
- for (int i = 0; i < len; i++)
- r = (r << 1) | readBit(in, k);
- return r;
- }
- public static int readBit (DataInput in, int[] k) {
- if (k[0] == 0) {
- k[1] = in.readUnsignedByte();
- k[0] = 0x80;
- }
- int r = (k[1] & k[0]) / k[0];
- k[0] >>= 1;
- return r;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment