/// <summary> /// Finish up at the end of a Huffman-compressed scan. /// </summary> private void finish_pass_huff() { if (m_cinfo.m_progressive_mode) { /* Flush out any buffered data */ emit_eobrun(); flush_bits_e(); } else { /* Load up working state ... flush_bits needs it */ savable_state state = new savable_state(); state.ASSIGN_STATE(m_saved); /* Flush out the last data */ if (!flush_bits_s(state)) m_cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CANT_SUSPEND); /* Update state */ m_saved.ASSIGN_STATE(state); } }
/// <summary> /// Encode and output one MCU's worth of Huffman-compressed coefficients. /// </summary> private bool encode_mcu_huff(JBLOCK[][] MCU_data) { /* Load up working state */ savable_state state = new savable_state(); state.ASSIGN_STATE(m_saved); /* Emit restart marker if needed */ if (m_cinfo.m_restart_interval != 0) { if (m_restarts_to_go == 0) { if (!emit_restart_s(state, m_next_restart_num)) return false; } } /* Encode the MCU data blocks */ for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) { int ci = m_cinfo.m_MCU_membership[blkn]; jpeg_component_info compptr = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; if (!encode_one_block(state, MCU_data[blkn][0].data, state.last_dc_val[ci], m_dc_derived_tbls[compptr.Dc_tbl_no], m_ac_derived_tbls[compptr.Ac_tbl_no])) { return false; } /* Update last_dc_val */ state.last_dc_val[ci] = MCU_data[blkn][0][0]; } /* Completed MCU, so update state */ m_saved.ASSIGN_STATE(state); /* Update restart-interval state too */ if (m_cinfo.m_restart_interval != 0) { if (m_restarts_to_go == 0) { m_restarts_to_go = m_cinfo.m_restart_interval; m_next_restart_num++; m_next_restart_num &= 7; } m_restarts_to_go--; } return true; }