SforzandoCF

saffron reader

Mar 4th, 2026
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.00 KB | None | 0 0
  1. public class SAFFIO {
  2.     public static SaffronAnimation read (DataInput in) {
  3.         int[] k = new int[2];
  4.         byte[] data = new byte[4];
  5.         in.readFully(data);
  6.         if (!"SAFF".equals(data)) throw new IllegalArgumentException("not a saff file");
  7.         OasisCanvas[] frames = new OasisCanvas[in.readUnsignedShort()];
  8.         for (int i = 0; i < frames.length; i++)
  9.             frames[i] = OasisCanvas.readShortForm(data);
  10.         SaffronChannel[] channels = new SaffronChannel[in.readUnsignedByte() + 1];
  11.         int length = in.readUnsignedShort();
  12.         channels[0] = new SaffronChannel(SaffronChannel.Type.FRAME_SELECT);
  13.         for (int i = 1; i < channels.length; i++)
  14.             channels[i] = new SaffronChannel(SaffronChannel.Type.byID(readInt(2, in, k)));
  15.         for (int i = 0; i < length; i++) {
  16.             for (int j = 0; j < channels.length; j++) {
  17.                 if (channels[j].hasActiveEvent(i) || readInt(1, in, k) == 0) continue;
  18.                 int len = readPackedInt(in, k);
  19.                 switch (channels[j].getType()) {
  20.                     case SaffronChannel.Type.FRAME_SELECT:
  21.                         channels[j].addEvent(new SaffronEvent(i, len, frames[readPackedUInt(in, k)]));
  22.                         break;
  23.                     case SaffronChannel.Type.ROTATE:
  24.                         InterpolationType typer = InterpolationType.valueOf(readInt(2, in, k));
  25.                         double target = readPackedFloat(in, k) / 32768 * Math.PI;
  26.                         channels[j].addEvent(new SaffronEvent(i, len, typer, Double.valueOf(target)));
  27.                         break;
  28.                     case SaffronChannel.Type.TRANSLATE:
  29.                         InterpolationType typet = InterpolationType.valueOf(readInt(2, in, k));
  30.                         int x = readPackedInt(in, k);
  31.                         int y = readPackedInt(in, k);
  32.                         channels[j].addEvent(new SaffronEvent(i, len, typet, Integer.valueOf(x), Integer.valueOf(y)));
  33.                         break;
  34.                     case SaffronChannel.Type.DILATE:
  35.                         InterpolationType typet = InterpolationType.valueOf(readInt(2, in, k));
  36.                         double scalar = readPackedFloat(in, k);
  37.                         channels[j].addEvent(new SaffronEvent(i, len, typet, Double.valueOf(scalar)));
  38.                         break;
  39.                 }
  40.             }
  41.         }
  42.         return new SaffronAnimation(frames, channels);
  43.     }
  44.    
  45.     public static int readPackedInt (DataInput in, int[] k) {
  46.         int c = readInt(2, in, k);
  47.         switch (c) {
  48.             case 0:
  49.                 return Integer.expand(readInt(3, in, k), 0x80000003);
  50.             case 1:
  51.                 return Integer.expand(readInt(6, in, k), 0x8000001F);
  52.             case 2:
  53.                 return Integer.expand(readInt(9, in, k), 0x800000FF);
  54.             case 3:
  55.                 return Integer.expand(readInt(12, in, k), 0x800007FF);
  56.         }
  57.     }
  58.    
  59.     public static int readPackedUInt (DataInput in, int[] k) {
  60.         int c = readInt(2, in, k);
  61.         switch (c) {
  62.             case 0:
  63.                 return readInt(2, in, k);
  64.             case 1:
  65.                 return readInt(5, in, k);
  66.             case 2:
  67.                 return readInt(8, in, k);
  68.             case 3:
  69.                 return readInt(11, in, k);
  70.         }
  71.     }
  72.    
  73.     public static double readPackedFloat (DataInput in, int[] k) {
  74.         int c = readInt(3, in, k);
  75.         switch (c) {
  76.             case 0:
  77.                 return Float.intBitsToFloat(Integer.expand(readInt(4, in, k), 0x83800000) + (readInt(1, in, k) << 23));
  78.             case 1:
  79.                 return Float.intBitsToFloat(Integer.expand(readInt(6, in, k), 0x83980000));
  80.             case 2:
  81.                 return Float.intBitsToFloat(Integer.expand(readInt(8, in, k), 0x839E0000));
  82.             case 3:
  83.                 return Float.intBitsToFloat(Integer.expand(readInt(10, in, k), 0x839F8000));
  84.             case 4:
  85.                 return Float.intBitsToFloat(Integer.expand(readInt(5, in, k), 0x87800000) + (readInt(1, in, k) << 23));
  86.             case 5:
  87.                 return Float.intBitsToFloat(Integer.expand(readInt(7, in, k), 0x87980000));
  88.             case 6:
  89.                 return Float.intBitsToFloat(Integer.expand(readInt(9, in, k), 0x879E0000));
  90.             case 7:
  91.                 return Float.intBitsToFloat(Integer.expand(readInt(11, in, k), 0x879F8000));
  92.         }
  93.     }
  94.    
  95.     public static double readPackedUFloat (DataInput in, int[] k) {
  96.         int c = readInt(3, in, k);
  97.         switch (c) {
  98.             case 0:
  99.                 return Float.intBitsToFloat(Integer.expand(readInt(3, in, k), 0x03800000) + (readInt(1, in, k) << 23));
  100.             case 1:
  101.                 return Float.intBitsToFloat(Integer.expand(readInt(5, in, k), 0x03980000));
  102.             case 2:
  103.                 return Float.intBitsToFloat(Integer.expand(readInt(7, in, k), 0x039E0000));
  104.             case 3:
  105.                 return Float.intBitsToFloat(Integer.expand(readInt(9, in, k), 0x039F8000));
  106.             case 4:
  107.                 return Float.intBitsToFloat(Integer.expand(readInt(4, in, k), 0x07800000) + (readInt(1, in, k) << 23));
  108.             case 5:
  109.                 return Float.intBitsToFloat(Integer.expand(readInt(6, in, k), 0x07980000));
  110.             case 6:
  111.                 return Float.intBitsToFloat(Integer.expand(readInt(8, in, k), 0x079E0000));
  112.             case 7:
  113.                 return Float.intBitsToFloat(Integer.expand(readInt(10, in, k), 0x079F8000));
  114.         }
  115.     }
  116.    
  117.     public static int readInt (int len, DataInput in, int[] k) {
  118.         int r = 0;
  119.         for (int i = 0; i < len; i++)
  120.             r = (r << 1) | readBit(in, k);
  121.         return r;
  122.     }
  123.    
  124.     public static int readBit (DataInput in, int[] k) {
  125.         if (k[0] == 0) {
  126.             k[1] = in.readUnsignedByte();
  127.             k[0] = 0x80;
  128.         }
  129.         int r = (k[1] & k[0]) / k[0];
  130.         k[0] >>= 1;
  131.         return r;
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment