@@ -230,17 +230,18 @@ static int read_header_from_map(mmap_t map, int force, int ifactor_override) {
230
230
return parse_header (out , force , ifactor_override );
231
231
}
232
232
#endif
233
- typedef struct { u32 bytes , crc ; } block_hdr ;
233
+ typedef struct { u32 bytes , crc ; bool zrle ; } block_hdr ;
234
234
static void write_block_header (FILE * des , block_hdr h ) {
235
- u8 b [8 ]; b [0 ] = 'X' ;
235
+ u8 b [8 ]; b [0 ] = 'X' + zrle ; // X/Y.
236
236
if (h .bytes > 0xFFFFFF )
237
237
FATAL ("Could not write the header: block too big." );
238
238
b [1 ] = h .bytes >> 16 ; b [2 ] = h .bytes >> 8 ; b [3 ] = h .bytes ;
239
239
b [4 ] = h .crc >> 24 ; b [5 ] = h .crc >> 16 ; b [6 ] = h .crc >> 8 ; b [7 ] = h .crc ;
240
240
xfwrite (b , 8 , des );
241
241
}
242
242
static block_hdr parse_block_header (u8 b [8 ], bool force ) {
243
- block_hdr h ; bool valid = b [0 ] == 'X' ;
243
+ block_hdr h ; bool valid = b [0 ] == 'X' || b [0 ] == 'Y' ;
244
+ h .zrle = b [0 ] == 'Y' ;
244
245
if (!valid ) {
245
246
FATAL_UNLESS ("Invalid block header." , !force );
246
247
h .bytes = 0xFFFFFF ; h .crc = 0 ; return h ;
@@ -264,7 +265,7 @@ static void encode4(FILE * in, FILE * out, int ifactor) {
264
265
Fi (ibs , rse32 (in_buffer + i * K , o1 + i * N ));
265
266
do_interlacing (o1 , o2 , ifactor );
266
267
xfwrite (o2 , ibs * N , out );
267
- bhdr .bytes = n ; bhdr .crc = crc32c (in_buffer , n );
268
+ bhdr .bytes = n ; bhdr .crc = crc32c (in_buffer , n ); bhdr . zrle = false;
268
269
write_block_header (out , bhdr );
269
270
}
270
271
free (in_buffer ), free (o1 ), free (o2 ); xfclose (out );
@@ -286,7 +287,7 @@ static void encode3(mmap_t in, FILE * out, int ifactor) {
286
287
Fi (ibs , rse32 (in_buffer + i * K , o1 + i * N ));
287
288
do_interlacing (o1 , o2 , ifactor );
288
289
xfwrite (o2 , ibs * N , out );
289
- bhdr .bytes = n ; bhdr .crc = crc32c (in_buffer , n );
290
+ bhdr .bytes = n ; bhdr .crc = crc32c (in_buffer , n ); bhdr . zrle = false;
290
291
write_block_header (out , bhdr );
291
292
}
292
293
free (in_buffer ), free (o1 ), free (o2 ); xfclose (out );
0 commit comments