@@ -671,10 +671,8 @@ fn UpdateNodes<AllocF: Allocator<floatX>>(
671671 let max_distance: usize = min ( cur_ix, max_backward_limit) ;
672672 let max_len: usize = num_bytes. wrapping_sub ( pos) ;
673673 let max_zopfli_len: usize = MaxZopfliLen ( params) ;
674- let max_iters: usize = MaxZopfliCandidates ( params) ;
675674 let min_len: usize ;
676675 let mut result: usize = 0usize ;
677- let mut k: usize ;
678676 let gap: usize = 0usize ;
679677 EvaluateNode (
680678 block_start,
@@ -692,144 +690,122 @@ fn UpdateNodes<AllocF: Allocator<floatX>>(
692690 posdata. cost + model. get_min_cost_cmd ( ) + model. get_literal_costs ( posdata. pos , pos) ;
693691 min_len = ComputeMinimumCopyLength ( min_cost, nodes, num_bytes, pos) ;
694692 }
695- k = 0usize ;
696- while k < max_iters && k < queue. size ( ) {
697- ' continue28: loop {
698- {
699- let posdata = queue. at ( k) ;
700- let start: usize = posdata. pos ;
701- let inscode: u16 = GetInsertLengthCode ( pos. wrapping_sub ( start) ) ;
702- let start_costdiff: floatX = posdata. costdiff ;
703- let base_cost: floatX = start_costdiff
704- + GetInsertExtra ( inscode) as ( floatX )
705- + model. get_literal_costs ( 0 , pos) ;
706- let mut best_len: usize = min_len. wrapping_sub ( 1 ) ;
707- for j in 0 ..16 {
708- if best_len >= max_len {
709- break ;
710- }
711693
712- let idx: usize = kDistanceCacheIndex[ j] as usize ;
713- let distance_cache_len_minus_1 = 3 ;
714- debug_assert_eq ! ( distance_cache_len_minus_1 + 1 , posdata. distance_cache. len( ) ) ;
715- let backward: usize =
716- ( posdata. distance_cache [ ( idx & distance_cache_len_minus_1) ]
717- + i32:: from ( kDistanceCacheOffset[ j] ) ) as usize ;
718- let mut prev_ix: usize = cur_ix. wrapping_sub ( backward) ;
719- let len: usize ;
720- let continuation: u8 = ringbuffer[ cur_ix_masked. wrapping_add ( best_len) ] ;
721- if cur_ix_masked. wrapping_add ( best_len) > ringbuffer_mask {
722- break ;
723- }
724- if backward > max_distance. wrapping_add ( gap) {
725- continue ;
726- }
727- if backward > max_distance {
728- continue ;
729- }
730- if prev_ix >= cur_ix {
731- continue ;
732- }
733- prev_ix &= ringbuffer_mask;
734- if prev_ix. wrapping_add ( best_len) > ringbuffer_mask
735- || continuation != ringbuffer[ prev_ix. wrapping_add ( best_len) ]
736- {
737- continue ;
738- }
739- len = FindMatchLengthWithLimit (
740- & ringbuffer[ prev_ix..] ,
741- & ringbuffer[ cur_ix_masked..] ,
742- max_len,
743- ) ;
694+ for k in 0 ..min ( MaxZopfliCandidates ( params) , queue. size ( ) ) {
695+ let posdata = queue. at ( k) ;
696+ let start: usize = posdata. pos ;
697+ let inscode: u16 = GetInsertLengthCode ( pos. wrapping_sub ( start) ) ;
698+ let start_costdiff: floatX = posdata. costdiff ;
699+ let base_cost: floatX =
700+ start_costdiff + GetInsertExtra ( inscode) as ( floatX ) + model. get_literal_costs ( 0 , pos) ;
701+ let mut best_len: usize = min_len. wrapping_sub ( 1 ) ;
702+ for j in 0 ..16 {
703+ if best_len >= max_len {
704+ break ;
705+ }
744706
745- let dist_cost = base_cost + model. get_distance_cost ( j) ;
746- for l in best_len. wrapping_add ( 1 ) ..=len {
747- let copycode: u16 = GetCopyLengthCode ( l) ;
748- let cmdcode: u16 =
749- CombineLengthCodes ( inscode, copycode, ( j == 0usize ) as i32 ) ;
750- let cost: floatX = ( if cmdcode < 128 { base_cost } else { dist_cost } )
751- + ( GetCopyExtra ( copycode) as floatX )
752- + model. get_command_cost ( cmdcode) ;
753- if cost
754- < match nodes[ pos. wrapping_add ( l) ] . u {
755- Union1 :: cost( cost) => cost,
756- _ => 0.0 ,
757- }
758- {
759- UpdateZopfliNode (
760- nodes,
761- pos,
762- start,
763- l,
764- l,
765- backward,
766- j. wrapping_add ( 1 ) ,
767- cost,
768- ) ;
769- result = max ( result, l) ;
770- }
771- best_len = l;
707+ let idx: usize = kDistanceCacheIndex[ j] as usize ;
708+ let distance_cache_len_minus_1 = 3 ;
709+ debug_assert_eq ! ( distance_cache_len_minus_1 + 1 , posdata. distance_cache. len( ) ) ;
710+ let backward: usize = ( posdata. distance_cache [ ( idx & distance_cache_len_minus_1) ]
711+ + i32:: from ( kDistanceCacheOffset[ j] ) ) as usize ;
712+ let mut prev_ix: usize = cur_ix. wrapping_sub ( backward) ;
713+ let len: usize ;
714+ let continuation: u8 = ringbuffer[ cur_ix_masked. wrapping_add ( best_len) ] ;
715+ if cur_ix_masked. wrapping_add ( best_len) > ringbuffer_mask {
716+ break ;
717+ }
718+ if backward > max_distance. wrapping_add ( gap) {
719+ continue ;
720+ }
721+ if backward > max_distance {
722+ continue ;
723+ }
724+ if prev_ix >= cur_ix {
725+ continue ;
726+ }
727+ prev_ix &= ringbuffer_mask;
728+ if prev_ix. wrapping_add ( best_len) > ringbuffer_mask
729+ || continuation != ringbuffer[ prev_ix. wrapping_add ( best_len) ]
730+ {
731+ continue ;
732+ }
733+ len = FindMatchLengthWithLimit (
734+ & ringbuffer[ prev_ix..] ,
735+ & ringbuffer[ cur_ix_masked..] ,
736+ max_len,
737+ ) ;
738+
739+ let dist_cost = base_cost + model. get_distance_cost ( j) ;
740+ for l in best_len. wrapping_add ( 1 ) ..=len {
741+ let copycode: u16 = GetCopyLengthCode ( l) ;
742+ let cmdcode: u16 = CombineLengthCodes ( inscode, copycode, ( j == 0usize ) as i32 ) ;
743+ let cost: floatX = ( if cmdcode < 128 { base_cost } else { dist_cost } )
744+ + ( GetCopyExtra ( copycode) as floatX )
745+ + model. get_command_cost ( cmdcode) ;
746+ if cost
747+ < match nodes[ pos. wrapping_add ( l) ] . u {
748+ Union1 :: cost( cost) => cost,
749+ _ => 0.0 ,
772750 }
751+ {
752+ UpdateZopfliNode ( nodes, pos, start, l, l, backward, j. wrapping_add ( 1 ) , cost) ;
753+ result = max ( result, l) ;
773754 }
774- if k >= 2usize {
775- break ' continue28;
776- }
755+ best_len = l;
756+ }
757+ }
758+
759+ if k >= 2 {
760+ continue ;
761+ }
762+
763+ let mut len: usize = min_len;
764+ for j in 0usize ..num_matches {
765+ let match_ = BackwardMatch ( matches[ j] ) ;
766+ let dist: usize = match_. distance ( ) as usize ;
767+ let is_dictionary_match = dist > max_distance. wrapping_add ( gap) ;
768+ let dist_code: usize = dist. wrapping_add ( 16 ) . wrapping_sub ( 1 ) ;
769+ let mut dist_symbol: u16 = 0 ;
770+ let mut distextra: u32 = 0 ;
771+
772+ PrefixEncodeCopyDistance (
773+ dist_code,
774+ params. dist . num_direct_distance_codes as usize ,
775+ u64:: from ( params. dist . distance_postfix_bits ) ,
776+ & mut dist_symbol,
777+ & mut distextra,
778+ ) ;
779+ let distnumextra: u32 = u32:: from ( dist_symbol) >> 10 ;
780+ let dist_cost = base_cost
781+ + ( distnumextra as floatX )
782+ + model. get_distance_cost ( ( dist_symbol as i32 & 0x03ff ) as usize ) ;
783+ let max_match_len = match_. length ( ) ;
784+ if len < max_match_len && ( is_dictionary_match || max_match_len > max_zopfli_len) {
785+ len = max_match_len;
786+ }
787+ while len <= max_match_len {
777788 {
778- let mut len: usize = min_len;
779- for j in 0usize ..num_matches {
780- let match_ = BackwardMatch ( matches[ j] ) ;
781- let dist: usize = match_. distance ( ) as usize ;
782- let is_dictionary_match = dist > max_distance. wrapping_add ( gap) ;
783- let dist_code: usize = dist. wrapping_add ( 16 ) . wrapping_sub ( 1 ) ;
784- let mut dist_symbol: u16 = 0 ;
785- let mut distextra: u32 = 0 ;
786-
787- PrefixEncodeCopyDistance (
788- dist_code,
789- params. dist . num_direct_distance_codes as usize ,
790- u64:: from ( params. dist . distance_postfix_bits ) ,
791- & mut dist_symbol,
792- & mut distextra,
793- ) ;
794- let distnumextra: u32 = u32:: from ( dist_symbol) >> 10 ;
795- let dist_cost = base_cost
796- + ( distnumextra as floatX )
797- + model. get_distance_cost ( ( dist_symbol as i32 & 0x03ff ) as usize ) ;
798- let max_match_len = match_. length ( ) ;
799- if len < max_match_len
800- && ( is_dictionary_match || max_match_len > max_zopfli_len)
801- {
802- len = max_match_len;
803- }
804- while len <= max_match_len {
805- {
806- let len_code: usize = if is_dictionary_match {
807- match_. length_code ( )
808- } else {
809- len
810- } ;
811- let copycode: u16 = GetCopyLengthCode ( len_code) ;
812- let cmdcode: u16 = CombineLengthCodes ( inscode, copycode, 0i32 ) ;
813- let cost: floatX = dist_cost
814- + GetCopyExtra ( copycode) as ( floatX )
815- + model. get_command_cost ( cmdcode) ;
816- if let Union1 :: cost( nodeCost) = ( nodes[ pos. wrapping_add ( len) ] ) . u {
817- if cost < nodeCost {
818- UpdateZopfliNode (
819- nodes, pos, start, len, len_code, dist, 0usize , cost,
820- ) ;
821- result = max ( result, len) ;
822- }
823- }
824- }
825- len = len. wrapping_add ( 1 ) ;
789+ let len_code: usize = if is_dictionary_match {
790+ match_. length_code ( )
791+ } else {
792+ len
793+ } ;
794+ let copycode: u16 = GetCopyLengthCode ( len_code) ;
795+ let cmdcode: u16 = CombineLengthCodes ( inscode, copycode, 0i32 ) ;
796+ let cost: floatX = dist_cost
797+ + GetCopyExtra ( copycode) as ( floatX )
798+ + model. get_command_cost ( cmdcode) ;
799+ if let Union1 :: cost( nodeCost) = ( nodes[ pos. wrapping_add ( len) ] ) . u {
800+ if cost < nodeCost {
801+ UpdateZopfliNode ( nodes, pos, start, len, len_code, dist, 0usize , cost) ;
802+ result = max ( result, len) ;
826803 }
827804 }
828805 }
806+ len = len. wrapping_add ( 1 ) ;
829807 }
830- break ;
831808 }
832- k = k. wrapping_add ( 1 ) ;
833809 }
834810 result
835811}
0 commit comments