123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "rle.h"
- #include "fileops.h"
- uint8_t rle_file_getc()
- {
- static uint16_t rle_filled = 0;
- static uint8_t data;
- if ( !rle_filled )
- {
- data = file_getc();
- switch ( data )
- {
- case RLE_RUN:
- data = file_getc();
- rle_filled = file_getc() - 1;
- break;
- case RLE_RUNLONG:
- data = file_getc();
- rle_filled = file_getc();
- rle_filled |= file_getc() << 8;
- rle_filled--;
- break;
- case RLE_ESC:
- data = file_getc();
- break;
- }
- }
- else
- {
- rle_filled--;
- }
- if ( file_status || file_res )
- {
- rle_filled = 0;
- }
- return data;
- }
- void rle_mem_init( const uint8_t *address, uint32_t len )
- {
- rle_mem_ptr = address;
- rle_mem_endptr = address + len;
- rle_state = 0;
- }
- uint8_t rle_mem_getc()
- {
- static uint16_t rle_mem_filled = 0;
- static uint8_t rle_mem_data;
- if ( !rle_mem_filled )
- {
- rle_mem_data = *( rle_mem_ptr++ );
- switch ( rle_mem_data )
- {
- case RLE_RUN:
- rle_mem_data = *( rle_mem_ptr )++;
- rle_mem_filled = *( rle_mem_ptr )++ - 1;
- break;
- case RLE_RUNLONG:
- rle_mem_data = *( rle_mem_ptr )++;
- rle_mem_filled = *( rle_mem_ptr )++;
- rle_mem_filled |= *( rle_mem_ptr )++ << 8;
- rle_mem_filled--;
- break;
- case RLE_ESC:
- rle_mem_data = *( rle_mem_ptr )++;
- break;
- }
- }
- else
- {
- rle_mem_filled--;
- }
- if ( rle_mem_ptr >= rle_mem_endptr )
- {
- rle_mem_filled = 0;
- rle_state = 1;
- }
- return rle_mem_data;
- }
|