eco2d/code/common/compress.c

35 lines
954 B
C

#include "compress.h"
uint32_t compress_rle(void* data, uint32_t size, uint8_t *dest) {
if (size < 1) return 0;
uint32_t total_size = 0;
uint8_t *buf = (uint8_t*)data;
uint8_t byte = buf[0];
uint16_t occurences = 1;
for (uint32_t i = 1; i <= size; i += 1){
if (buf[i] != byte || i == size) {
*(uint16_t*)dest = occurences; dest += 2;
*dest++ = byte;
byte = buf[i];
occurences = 1;
total_size += 3;
}
else occurences++;
}
return total_size;
}
uint32_t decompress_rle(void* data, uint32_t size, uint8_t *dest) {
if (size < 1) return 0;
uint32_t total_size = 0;
uint8_t *buf = (uint8_t*)data;
for (uint32_t i = 0; i < size; i += 3){
uint16_t len = *(uint16_t*)&buf[i];
for (uint16_t j = 0; j < len; j += 1){
*dest++ = buf[i+2];
total_size++;
}
}
return total_size;
}