public virtual void encodeTilePartHeader(int tileLength, int tileIdx)
{
int tmp;
Coord numTiles = ralloc.getNumTiles(null);
ralloc.setTile(tileIdx % numTiles.x, tileIdx / numTiles.x);
// +--------------------------+
// | SOT maker segment |
// +--------------------------+
// SOT marker
hbuf.Write((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.SOT, 8));
hbuf.Write((System.Byte) (CSJ2K.j2k.codestream.Markers.SOT & 0x00FF));
// Lsot (10 bytes)
hbuf.Write((System.Byte) 0);
hbuf.Write((System.Byte) 10);
// Isot
if (tileIdx > 65534)
{
throw new System.ArgumentException("Trying to write a tile-part " + "header whose tile index is " + "too high");
}
hbuf.Write((System.Byte) (tileIdx >> 8));
hbuf.Write((System.Byte) tileIdx);
// Psot
tmp = tileLength;
hbuf.Write((System.Byte) (tmp >> 24));
hbuf.Write((System.Byte) (tmp >> 16));
hbuf.Write((System.Byte) (tmp >> 8));
hbuf.Write((System.Byte) tmp);
// TPsot
hbuf.Write((System.Byte) 0); // Only one tile-part currently supported !
// TNsot
hbuf.Write((System.Byte) 1); // Only one tile-part currently supported !
// +--------------------------+
// | COD maker segment |
// +--------------------------+
bool isEresUsed = ((System.String) encSpec.tts.getDefault()).Equals("predict");
bool isEresUsedInTile = ((System.String) encSpec.tts.getTileDef(tileIdx)).Equals("predict");
bool tileCODwritten = false;
if (encSpec.wfs.isTileSpecified(tileIdx) || encSpec.cts.isTileSpecified(tileIdx) || encSpec.dls.isTileSpecified(tileIdx) || encSpec.bms.isTileSpecified(tileIdx) || encSpec.mqrs.isTileSpecified(tileIdx) || encSpec.rts.isTileSpecified(tileIdx) || encSpec.css.isTileSpecified(tileIdx) || encSpec.pss.isTileSpecified(tileIdx) || encSpec.sops.isTileSpecified(tileIdx) || encSpec.sss.isTileSpecified(tileIdx) || encSpec.pocs.isTileSpecified(tileIdx) || encSpec.ephs.isTileSpecified(tileIdx) || encSpec.cblks.isTileSpecified(tileIdx) || (isEresUsed != isEresUsedInTile))
{
writeCOD(false, tileIdx);
tileCODwritten = true;
}
// +--------------------------+
// | COC maker segment |
// +--------------------------+
for (int c = 0; c < nComp; c++)
{
bool isEresUsedInTileComp = ((System.String) encSpec.tts.getTileCompVal(tileIdx, c)).Equals("predict");
if (encSpec.wfs.isTileCompSpecified(tileIdx, c) || encSpec.dls.isTileCompSpecified(tileIdx, c) || encSpec.bms.isTileCompSpecified(tileIdx, c) || encSpec.mqrs.isTileCompSpecified(tileIdx, c) || encSpec.rts.isTileCompSpecified(tileIdx, c) || encSpec.css.isTileCompSpecified(tileIdx, c) || encSpec.pss.isTileCompSpecified(tileIdx, c) || encSpec.sss.isTileCompSpecified(tileIdx, c) || encSpec.cblks.isTileCompSpecified(tileIdx, c) || (isEresUsedInTileComp != isEresUsed))
{
writeCOC(false, tileIdx, c);
}
else if (tileCODwritten)
{
if (encSpec.wfs.isCompSpecified(c) || encSpec.dls.isCompSpecified(c) || encSpec.bms.isCompSpecified(c) || encSpec.mqrs.isCompSpecified(c) || encSpec.rts.isCompSpecified(c) || encSpec.sss.isCompSpecified(c) || encSpec.css.isCompSpecified(c) || encSpec.pss.isCompSpecified(c) || encSpec.cblks.isCompSpecified(c) || (encSpec.tts.isCompSpecified(c) && ((System.String) encSpec.tts.getCompDef(c)).Equals("predict")))
{
writeCOC(false, tileIdx, c);
}
}
}
// +--------------------------+
// | QCD maker segment |
// +--------------------------+
bool tileQCDwritten = false;
if (encSpec.qts.isTileSpecified(tileIdx) || encSpec.qsss.isTileSpecified(tileIdx) || encSpec.dls.isTileSpecified(tileIdx) || encSpec.gbs.isTileSpecified(tileIdx))
{
writeTileQCD(tileIdx);
tileQCDwritten = true;
}
else
{
deftilenr = defimgn;
}
// +--------------------------+
// | QCC maker segment |
// +--------------------------+
for (int c = 0; c < nComp; c++)
{
if (dwt.getNomRangeBits(c) != deftilenr || encSpec.qts.isTileCompSpecified(tileIdx, c) || encSpec.qsss.isTileCompSpecified(tileIdx, c) || encSpec.dls.isTileCompSpecified(tileIdx, c) || encSpec.gbs.isTileCompSpecified(tileIdx, c))
{
writeTileQCC(tileIdx, c);
}
else if (tileQCDwritten)
{
if (encSpec.qts.isCompSpecified(c) || encSpec.qsss.isCompSpecified(c) || encSpec.dls.isCompSpecified(c) || encSpec.gbs.isCompSpecified(c))
{
writeTileQCC(tileIdx, c);
}
}
}
// +--------------------------+
// | RGN maker segment |
// +--------------------------+
if (roiSc.useRoi() && (!roiSc.BlockAligned))
writeRGN(tileIdx);
// +--------------------------+
// | POC maker segment |
// +--------------------------+
Progression[] prog;
if (encSpec.pocs.isTileSpecified(tileIdx))
{
prog = (Progression[]) (encSpec.pocs.getTileDef(tileIdx));
if (prog.Length > 1)
writePOC(false, tileIdx);
}
// +--------------------------+
// | SOD maker |
// +--------------------------+
hbuf.Write((System.Byte) SupportClass.URShift(CSJ2K.j2k.codestream.Markers.SOD, 8));
hbuf.Write((System.Byte) (CSJ2K.j2k.codestream.Markers.SOD & 0x00FF));
}