@@ -247,9 +247,9 @@ struct fuji_compressed_block final {
247247 const FujiDecompressor::FujiHeader& header,
248248 const fuji_compressed_params& common_info);
249249
250- void reset (const fuji_compressed_params& params );
250+ void reset ();
251251
252- BitPumpMSB pump;
252+ Optional< BitPumpMSB> pump;
253253
254254 // tables of gradients
255255 std::array<std::array<int_pair, 41 >, 3 > grad_even;
@@ -297,21 +297,18 @@ struct fuji_compressed_block final {
297297fuji_compressed_block::fuji_compressed_block (
298298 Array2DRef<uint16_t > img_, const FujiDecompressor::FujiHeader& header_,
299299 const fuji_compressed_params& common_info_)
300- : img(img_), header(header_), common_info(common_info_) {}
301-
302- void fuji_compressed_block::reset (const fuji_compressed_params& params) {
303- const unsigned line_size = sizeof (uint16_t ) * (params.line_width + 2 );
304-
305- linealloc.resize (ltotal * (params.line_width + 2 ), 0 );
306- lines = Array2DRef<uint16_t >(&linealloc[0 ], params.line_width + 2 , ltotal);
300+ : img(img_), header(header_), common_info(common_info_),
301+ linealloc (ltotal * (common_info.line_width + 2 ), 0),
302+ lines(&linealloc[0 ], common_info.line_width + 2 , ltotal) {}
307303
304+ void fuji_compressed_block::reset () {
308305 MSan::Allocated (CroppedArray2DRef (lines));
309306
310307 // Zero-initialize first two (read-only, carry-in) lines of each color,
311308 // including first and last helper columns of the second row.
312309 // This is needed for correctness.
313310 for (xt_lines color : {R0, G0, B0}) {
314- memset (&lines (color, 0 ), 0 , 2 * line_size );
311+ memset (&lines (color, 0 ), 0 , 2 * sizeof ( uint16_t ) * lines. width );
315312
316313 // On the first row, we don't need to zero-init helper columns.
317314 MSan::Allocated (lines (color, 0 ));
@@ -327,9 +324,9 @@ void fuji_compressed_block::reset(const fuji_compressed_params& params) {
327324
328325 for (int j = 0 ; j < 3 ; j++) {
329326 for (int i = 0 ; i < 41 ; i++) {
330- grad_even[j][i].value1 = params .maxDiff ;
327+ grad_even[j][i].value1 = common_info .maxDiff ;
331328 grad_even[j][i].value2 = 1 ;
332- grad_odd[j][i].value1 = params .maxDiff ;
329+ grad_odd[j][i].value1 = common_info .maxDiff ;
333330 grad_odd[j][i].value2 = 1 ;
334331 }
335332 }
@@ -447,7 +444,7 @@ fuji_compressed_block::fuji_decode_sample(int grad, int interp_val,
447444 std::array<int_pair, 41 >& grads) {
448445 int gradient = std::abs (grad);
449446
450- int sampleBits = fuji_zerobits (pump);
447+ int sampleBits = fuji_zerobits (* pump);
451448
452449 int codeBits;
453450 int codeDelta;
@@ -460,9 +457,9 @@ fuji_compressed_block::fuji_decode_sample(int grad, int interp_val,
460457 }
461458
462459 int code = 0 ;
463- pump. fill (32 );
460+ pump-> fill (32 );
464461 if (codeBits)
465- code = pump. getBitsNoFill (codeBits);
462+ code = pump-> getBitsNoFill (codeBits);
466463 code += codeDelta;
467464
468465 if (code < 0 || code >= common_info.total_values ) {
@@ -811,7 +808,7 @@ void FujiDecompressorImpl::decompressThread() const noexcept {
811808#endif
812809 for (int block = 0 ; block < header.blocks_in_row ; ++block) {
813810 FujiStrip strip (header, block, strips (block));
814- block_info.reset (common_info );
811+ block_info.reset ();
815812 try {
816813 block_info.pump = BitPumpMSB (strip.bs .peekRemainingBuffer ());
817814 block_info.fuji_decode_strip (strip);
0 commit comments