@@ -74,6 +74,7 @@ def bitwise_rle_encode(data):
74
74
75
75
def get_bit (data , n ): return 1 if (data [n // 8 ] & (0x80 >> (n & 7 ))) else 0
76
76
77
+ isext = False
77
78
bitslen = len (data ) * 8
78
79
bitstate = get_bit (data , 0 )
79
80
rledata = [ bitstate ]
@@ -84,18 +85,19 @@ def get_bit(data, n): return 1 if (data[n // 8] & (0x80 >> (n & 7))) else 0
84
85
if i < bitslen : b = get_bit (data , i )
85
86
runlen += 1
86
87
if bitstate != b or i == bitslen :
87
- if i > 11 * 56 * 8 : print (f'Bit change at index { i } with runlen={ runlen } ' )
88
- if runlen >= 16 :
88
+ if runlen >= 272 :
89
+ isext = True
90
+ rem = runlen & 0xFF
91
+ rledata += [ 15 , 15 , rem // 16 , rem % 16 ]
92
+ elif runlen >= 16 :
89
93
rledata += [ 15 , runlen // 16 - 1 , runlen % 16 ]
90
- if i > 11 * 56 * 8 : print (f'Storing { [ 15 , runlen // 16 - 1 , runlen % 16 ]} ' )
91
94
else :
92
95
rledata += [ runlen - 1 ]
93
- if i > 11 * 56 * 8 : print (f'Storing { [ runlen ]} ' )
94
96
bitstate ^= 1
95
97
runlen = 0
96
98
i += 1
97
99
98
- print ("\n rledata" , rledata )
100
+ # print("\nrledata", rledata)
99
101
100
102
encoded = []
101
103
ri = 0
@@ -107,9 +109,9 @@ def get_bit(data, n): return 1 if (data[n // 8] & (0x80 >> (n & 7))) else 0
107
109
ri += 2
108
110
109
111
print ("\n encoded" , encoded )
110
- return encoded
112
+ return encoded , isext
111
113
112
- def bitwise_rle_decode (rledata , invert = 0 ):
114
+ def bitwise_rle_decode (isext , rledata , invert = 0 ):
113
115
expanded = []
114
116
for n in rledata : expanded += [ n >> 4 , n & 0xF ]
115
117
@@ -123,7 +125,12 @@ def bitwise_rle_decode(rledata, invert=0):
123
125
if i == 1 : bitstate = c ; continue
124
126
125
127
if c == 15 :
126
- c = 16 * expanded [i ] + expanded [i + 1 ] + 15
128
+ d = expanded [i ] ; e = expanded [i + 1 ]
129
+ if isext and d == 15 :
130
+ c = 256 + 16 * e + expanded [i + 2 ] - 1
131
+ i += 1
132
+ else :
133
+ c = 16 * d + e + 15
127
134
i += 2
128
135
129
136
for _ in range (c , - 1 , - 1 ):
@@ -143,7 +150,7 @@ def bitwise_rle_decode(rledata, invert=0):
143
150
144
151
return decoded
145
152
146
- def rle_emit (ofile , arrname , rledata , rawsize ):
153
+ def rle_emit (ofile , arrname , rledata , rawsize , isext ):
147
154
148
155
outstr = ''
149
156
rows = [ rledata [i :i + 16 ] for i in range (0 , len (rledata ), 16 ) ]
@@ -153,21 +160,20 @@ def rle_emit(ofile, arrname, rledata, rawsize):
153
160
154
161
outstr = outstr [:- 2 ]
155
162
size = len (rledata )
156
- ofile .write ("\n // Saves %i bytes\n %s %s_rle[%d] PROGMEM = {\n %s\n };\n " % (rawsize - size , datatype , arrname , size , outstr ))
163
+ defname = 'COMPACT_CUSTOM_BOOTSCREEN_EXT' if isext else 'COMPACT_CUSTOM_BOOTSCREEN'
164
+ ofile .write (f"\n // Saves { rawsize - size } bytes\n #define { defname } \n { datatype } { arrname } _rle[{ size } ] PROGMEM = {{\n { outstr } \n }};\n " )
157
165
158
166
# Encode the data, write it out, close the file
159
- rledata = bitwise_rle_encode (raw_data )
160
- rle_emit (ofile , arrname , rledata , len (raw_data ))
167
+ rledata , isext = bitwise_rle_encode (raw_data )
168
+ rle_emit (ofile , arrname , rledata , len (raw_data ), isext )
161
169
ofile .close ()
162
170
163
171
# Validate that code properly compressed (and decompressed) the data
164
- checkdata = bitwise_rle_decode (rledata )
165
- badindex = - 1
172
+ checkdata = bitwise_rle_decode (isext , rledata )
166
173
for i in range (0 , len (checkdata )):
167
174
if raw_data [i ] != checkdata [i ]:
168
- badindex = i
175
+ print ( f'Data mismatch at byte offset { i } (should be { raw_data [ i ] } but got { checkdata [ i ] } )' )
169
176
break
170
- if badindex >= 0 : print (f'Data mismatch at byte { badindex } ' )
171
177
172
178
if len (sys .argv ) <= 2 :
173
179
print ('Usage: rle_compress_bitmap.py INPUT_FILE OUTPUT_FILE' )
0 commit comments