rle.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "rle.h"
  2. #include "fileops.h"
  3. uint8_t rle_file_getc() {
  4. static uint16_t rle_filled = 0;
  5. static uint8_t data;
  6. if(!rle_filled) {
  7. data = file_getc();
  8. switch(data) {
  9. case RLE_RUN:
  10. data = file_getc();
  11. rle_filled = file_getc()-1;
  12. break;
  13. case RLE_RUNLONG:
  14. data = file_getc();
  15. rle_filled = file_getc();
  16. rle_filled |= file_getc() << 8;
  17. rle_filled--;
  18. break;
  19. case RLE_ESC:
  20. data = file_getc();
  21. break;
  22. }
  23. } else {
  24. rle_filled--;
  25. }
  26. if(file_status || file_res) rle_filled = 0;
  27. return data;
  28. }
  29. void rle_mem_init(const uint8_t* address, uint32_t len) {
  30. rle_mem_ptr = address;
  31. rle_mem_endptr = address+len;
  32. rle_state = 0;
  33. }
  34. uint8_t rle_mem_getc() {
  35. static uint16_t rle_mem_filled = 0;
  36. static uint8_t rle_mem_data;
  37. if(!rle_mem_filled) {
  38. rle_mem_data = *(rle_mem_ptr++);
  39. switch(rle_mem_data) {
  40. case RLE_RUN:
  41. rle_mem_data = *(rle_mem_ptr)++;
  42. rle_mem_filled = *(rle_mem_ptr)++ - 1;
  43. break;
  44. case RLE_RUNLONG:
  45. rle_mem_data = *(rle_mem_ptr)++;
  46. rle_mem_filled = *(rle_mem_ptr)++;
  47. rle_mem_filled |= *(rle_mem_ptr)++ << 8;
  48. rle_mem_filled--;
  49. break;
  50. case RLE_ESC:
  51. rle_mem_data = *(rle_mem_ptr)++;
  52. break;
  53. }
  54. } else {
  55. rle_mem_filled--;
  56. }
  57. if(rle_mem_ptr>=rle_mem_endptr){
  58. rle_mem_filled = 0;
  59. rle_state = 1;
  60. }
  61. return rle_mem_data;
  62. }