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;
}