private void calcNormalMatchPrices ( int pos , int posState , int avail , int anyMatchPrice , int startLen ) { // If the longest match is so long that it would not fit into // the opts array, shorten the matches. if ( matches . len [ matches . count - 1 ] > avail ) { matches . count = 0 ; while ( matches . len [ matches . count ] < avail ) ++ matches . count ; matches . len [ matches . count ++ ] = avail ; } if ( matches . len [ matches . count - 1 ] < startLen ) return ; while ( optEnd < optCur + matches . len [ matches . count - 1 ] ) opts [ ++ optEnd ] . reset ( ) ; int normalMatchPrice = getNormalMatchPrice ( anyMatchPrice , opts [ optCur ] . state ) ; int match = 0 ; while ( startLen > matches . len [ match ] ) ++ match ; for ( int len = startLen ; ; ++ len ) { int dist = matches . dist [ match ] ; // Calculate the price of a match of len bytes from the nearest // possible distance. int matchAndLenPrice = getMatchAndLenPrice ( normalMatchPrice , dist , len , posState ) ; if ( matchAndLenPrice < opts [ optCur + len ] . price ) opts [ optCur + len ] . set1 ( matchAndLenPrice , optCur , dist + REPS ) ; if ( len != matches . len [ match ] ) continue ; // Try match + literal + rep0. First get the length of the rep0. int len2Limit = Math . min ( niceLen , avail - len - 1 ) ; int len2 = lz . getMatchLen ( len + 1 , dist , len2Limit ) ; if ( len2 >= MATCH_LEN_MIN ) { nextState . set ( opts [ optCur ] . state ) ; nextState . updateMatch ( ) ; // Literal int curByte = lz . getByte ( len , 0 ) ; int matchByte = lz . getByte ( 0 ) ; // lz.getByte(len, len) int prevByte = lz . getByte ( len , 1 ) ; int price = matchAndLenPrice + literalEncoder . getPrice ( curByte , matchByte , prevByte , pos + len , nextState ) ; nextState . updateLiteral ( ) ; // Rep0 int nextPosState = ( pos + len + 1 ) & posMask ; price += getLongRepAndLenPrice ( 0 , len2 , nextState , nextPosState ) ; int i = optCur + len + 1 + len2 ; while ( optEnd < i ) opts [ ++ optEnd ] . reset ( ) ; if ( price < opts [ i ] . price ) opts [ i ] . set3 ( price , optCur , dist + REPS , len , 0 ) ; } if ( ++ match == matches . count ) break ; } }
Calculates prices of a normal match and normal match + literal + rep0 .