@@ -345,9 +345,10 @@ impl PngImage {
345
345
for line in self . scan_lines ( false ) {
346
346
if prev_pass != line. pass || line. data . len ( ) != prev_line. len ( ) {
347
347
prev_line = vec ! [ 0 ; line. data. len( ) ] ;
348
- // Calculate the best possible entropy for this pass
348
+ // Calculate the best possible result for this pass
349
349
best_possible = match filter {
350
350
RowFilter :: Entropy => ilog2i ( line. data . len ( ) as u32 + 1 ) as i32 ,
351
+ RowFilter :: Bigrams => 1 ,
351
352
RowFilter :: BigEnt => ilog2i ( line. data . len ( ) as u32 ) as i32 ,
352
353
_ => 0 ,
353
354
}
@@ -379,18 +380,18 @@ impl PngImage {
379
380
RowFilter :: MinSum => {
380
381
// MSAD algorithm mentioned in libpng reference docs
381
382
// http://www.libpng.org/pub/png/book/chapter09.html
382
- let mut best_size = usize :: MAX ;
383
+ let mut best_size = i32 :: MAX ;
383
384
for f in try_filters {
384
385
f. filter_line ( bpp, & mut line_data, & prev_line, & mut f_buf, alpha_bytes) ;
385
386
let size = f_buf. iter ( ) . fold ( 0 , |acc, & x| {
386
387
let signed = x as i8 ;
387
- acc + signed. unsigned_abs ( ) as usize
388
+ acc + signed. unsigned_abs ( ) as i32
388
389
} ) ;
389
390
if size < best_size {
390
391
best_size = size;
391
392
std:: mem:: swap ( & mut best_line, & mut f_buf) ;
392
393
best_line_raw. clone_from ( & line_data) ;
393
- if size == 0 {
394
+ if size == best_possible {
394
395
// Best possible result
395
396
break ;
396
397
}
@@ -427,20 +428,20 @@ impl PngImage {
427
428
RowFilter :: Bigrams => {
428
429
// Count distinct bigrams, from pngwolf
429
430
// https://bjoern.hoehrmann.de/pngwolf/
430
- let mut best_size = usize :: MAX ;
431
+ let mut best_size = i32 :: MAX ;
431
432
for f in try_filters {
432
433
f. filter_line ( bpp, & mut line_data, & prev_line, & mut f_buf, alpha_bytes) ;
433
434
let mut set = bitarr ! [ 0 ; 0x10000 ] ;
434
435
for pair in f_buf. windows ( 2 ) {
435
436
let bigram = ( pair[ 0 ] as usize ) << 8 | pair[ 1 ] as usize ;
436
437
set. set ( bigram, true ) ;
437
438
}
438
- let size = set. count_ones ( ) ;
439
+ let size = set. count_ones ( ) as i32 ;
439
440
if size < best_size {
440
441
best_size = size;
441
442
std:: mem:: swap ( & mut best_line, & mut f_buf) ;
442
443
best_line_raw. clone_from ( & line_data) ;
443
- if size == 1 {
444
+ if size == best_possible {
444
445
// Best possible result
445
446
break ;
446
447
}
0 commit comments