public virtual void restore()
{
int maxsbi, minsbi;
if (!saved)
{
throw new System.ArgumentException();
}
// Invalidate last encoded body buffer
lbbuf = null;
//-- Restore tha data
// Use reference caches to minimize array access overhead
TagTreeEncoder[][][] ttIncl_t_c, ttMaxBP_t_c;
TagTreeEncoder[][] ttIncl_t_c_r, ttMaxBP_t_c_r;
int[][][] lblock_t_c, bak_lblock_t_c;
int[][] prevtIdxs_t_c_r, bak_prevtIdxs_t_c_r;
// Loop on tiles
for (int t = ttIncl.Length - 1; t >= 0; t--)
{
// Loop on components
for (int c = ttIncl[t].Length - 1; c >= 0; c--)
{
// Initialize reference caches
lblock_t_c = lblock[t][c];
bak_lblock_t_c = bak_lblock[t][c];
ttIncl_t_c = ttIncl[t][c];
ttMaxBP_t_c = ttMaxBP[t][c];
// Loop on resolution levels
for (int r = lblock_t_c.Length - 1; r >= 0; r--)
{
// Initialize reference caches
ttIncl_t_c_r = ttIncl_t_c[r];
ttMaxBP_t_c_r = ttMaxBP_t_c[r];
prevtIdxs_t_c_r = prevtIdxs[t][c][r];
bak_prevtIdxs_t_c_r = bak_prevtIdxs[t][c][r];
// Loop on subbands
minsbi = (r == 0)?0:1;
maxsbi = (r == 0)?1:4;
for (int s = minsbi; s < maxsbi; s++)
{
// Restore 'lblock'
Array.Copy(bak_lblock_t_c[r][s], 0, lblock_t_c[r][s], 0, lblock_t_c[r][s].Length);
// Restore 'prevtIdxs'
Array.Copy(bak_prevtIdxs_t_c_r[s], 0, prevtIdxs_t_c_r[s], 0, prevtIdxs_t_c_r[s].Length);
} // End loop on subbands
// Loop on precincts
for (int p = ppinfo[t][c][r].Length - 1; p >= 0; p--)
{
if (p < ttIncl_t_c_r.Length)
{
// Loop on subbands
for (int s = minsbi; s < maxsbi; s++)
{
ttIncl_t_c_r[p][s].restore();
ttMaxBP_t_c_r[p][s].restore();
} // End loop on subbands
}
} // End loop on precincts
} // End loop on resolution levels
} // End loop on components
} // End loop on tiles
}