Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Decompress(u16 *in, u16 *out, u32 size)
- {
- u32 flag = 0x8000, jmp, len = 3; // 3 assignment shouldn't be needed
- u16 *end = &in[size];
- while (in != end)
- {
- // cache next 16 flags
- if (flag & 0x8000) flag = (*in++ << 16) | 1;
- // not literal
- if (flag & 0x80000000)
- {
- jmp=*in++;
- // length encoded with 5 bits?
- if (jmp & 0xF800)
- {
- len = jmp >> 11;
- jmp &= 0x7FF;
- }
- // then it's using 16 bits
- else len = *in++;
- // premature end signal
- if (!(jmp | len)) return;
- // zero filled RLE case when there's nowhere to jump back
- if (!jmp)
- while (len > 0) *out++ = 0, len--;
- // jump back & copy from output
- else
- {
- u16 *bp = &out[-jmp];
- while (len > 0) *out++ = *bp++, len--;
- }
- }
- // literal, read and write as is
- else *out++ = *in++;
- // next flag
- flag <<= 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement