private void calc1BytePrices ( int pos , int posState , int avail , int anyRepPrice ) { // This will be set to true if using a literal or a short rep. boolean nextIsByte = false ; int curByte = lz . getByte ( 0 ) ; int matchByte = lz . getByte ( opts [ optCur ] . reps [ 0 ] + 1 ) ; // Try a literal. int literalPrice = opts [ optCur ] . price + literalEncoder . getPrice ( curByte , matchByte , lz . getByte ( 1 ) , pos , opts [ optCur ] . state ) ; if ( literalPrice < opts [ optCur + 1 ] . price ) { opts [ optCur + 1 ] . set1 ( literalPrice , optCur , - 1 ) ; nextIsByte = true ; } // Try a short rep. if ( matchByte == curByte && ( opts [ optCur + 1 ] . optPrev == optCur || opts [ optCur + 1 ] . backPrev != 0 ) ) { int shortRepPrice = getShortRepPrice ( anyRepPrice , opts [ optCur ] . state , posState ) ; if ( shortRepPrice <= opts [ optCur + 1 ] . price ) { opts [ optCur + 1 ] . set1 ( shortRepPrice , optCur , 0 ) ; nextIsByte = true ; } } // If neither a literal nor a short rep was the cheapest choice, // try literal + long rep0. if ( ! nextIsByte && matchByte != curByte && avail > MATCH_LEN_MIN ) { int lenLimit = Math . min ( niceLen , avail - 1 ) ; int len = lz . getMatchLen ( 1 , opts [ optCur ] . reps [ 0 ] , lenLimit ) ; if ( len >= MATCH_LEN_MIN ) { nextState . set ( opts [ optCur ] . state ) ; nextState . updateLiteral ( ) ; int nextPosState = ( pos + 1 ) & posMask ; int price = literalPrice + getLongRepAndLenPrice ( 0 , len , nextState , nextPosState ) ; int i = optCur + 1 + len ; while ( optEnd < i ) opts [ ++ optEnd ] . reset ( ) ; if ( price < opts [ i ] . price ) opts [ i ] . set2 ( price , optCur , 0 ) ; } } }
Calculates prices of a literal a short rep and literal + rep0 .