Import the current wip animation datatype and subclasses. further development will...
[AROS.git] / workbench / classes / datatypes / wav / bitpack.c
blob7ab34750584c6b3d95be2335ac78c2af3880c9b0
1 /*
2 * wave.datatype
3 * (c) Fredrik Wikstrom
4 */
6 #include <exec/types.h>
7 #include <dos/dos.h>
9 #include "endian.h"
10 #include "bitpack.h"
12 // Generic BitPack stuff:
14 void bitpack_init (BitPack_buffer *b, void *ptr, LONG size) {
15 b->buffer=b->ptr=ptr;
16 b->size=size;
17 b->endbyte=0;
18 b->endbit=0;
21 const ULONG bp_mask[33]={
22 0x00000000, 0x00000001, 0x00000003, 0x00000007,
23 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
24 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
25 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
26 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
27 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
28 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
29 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
30 0xffffffff
33 LONG bitpack_seek (BitPack_buffer *b, LONG offs, LONG type) {
34 LONG oldoffset;
35 oldoffset=(b->endbyte<<3)+b->endbit;
37 switch (type) {
39 case OFFSET_CURRENT:
40 offs+=oldoffset;
41 break;
43 case OFFSET_END:
44 offs+=(b->size<<3);
45 break;
49 b->endbyte=offs>>3;
50 b->endbit=offs&7;
52 b->ptr=b->buffer+b->endbyte;
54 return (oldoffset);
57 void * bitpack_align (BitPack_buffer *b) {
58 if (b->endbit) {
59 b->endbit=0;
60 b->endbyte++;
61 b->ptr++;
63 return (b->ptr);
66 void * bitpack_align_even (BitPack_buffer *b) {
67 bitpack_align_lsb(b);
68 if (b->endbyte&1) {
69 b->endbyte++;
70 b->ptr++;
72 return (b->ptr);