public override DataBlk getInternCompData(DataBlk blk, int c)
{
int k, j, i, mi; // counters
int levShift = 1 << (bitDepth - 1);
// Check component index
if (c != 0)
throw new System.ArgumentException();
// Check type of block provided as an argument
if (blk.DataType != DataBlk.TYPE_INT)
{
if (intBlk == null)
intBlk = new DataBlkInt(blk.ulx, blk.uly, blk.w, blk.h);
else
{
intBlk.ulx = blk.ulx;
intBlk.uly = blk.uly;
intBlk.w = blk.w;
intBlk.h = blk.h;
}
blk = intBlk;
}
// Get data array
int[] barr = (int[]) blk.Data;
if (barr == null || barr.Length < blk.w * blk.h * packBytes)
{
barr = new int[blk.w * blk.h];
blk.Data = barr;
}
int paddingLength = (32 - bitDepth);
if (buf == null || buf.Length < packBytes * blk.w)
{
buf = new byte[packBytes * blk.w];
}
try
{
switch (packBytes)
{
// Switch between one of the 3 byte packet type
case 1: // Samples packed into 1 byte
// Read line by line
mi = blk.uly + blk.h;
if (isSigned)
{
for (i = blk.uly; i < mi; i++)
{
// Reposition in input
in_Renamed.Seek(offset + i * w + blk.ulx, System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, blk.w);
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = blk.w - 1; j >= 0; k--)
barr[k] = (((buf[j--] & 0xFF) << paddingLength) >> paddingLength);
}
}
else
{
// Not signed
for (i = blk.uly; i < mi; i++)
{
// Reposition in input
in_Renamed.Seek(offset + i * w + blk.ulx, System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, blk.w);
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = blk.w - 1; j >= 0; k--)
barr[k] = (SupportClass.URShift(((buf[j--] & 0xFF) << paddingLength), paddingLength)) - levShift;
}
}
break;
case 2: // Samples packed into 2 bytes
// Read line by line
mi = blk.uly + blk.h;
if (isSigned)
{
for (i = blk.uly; i < mi; i++)
{
// Reposition in input
in_Renamed.Seek(offset + 2 * (i * w + blk.ulx), System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, blk.w << 1);
switch (byteOrder)
{
case CSJ2K.j2k.io.EndianType_Fields.LITTLE_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 1) - 1; j >= 0; k--)
{
barr[k] = ((((buf[j--] & 0xFF) << 8) | (buf[j--] & 0xFF)) << paddingLength) >> paddingLength;
}
break;
case CSJ2K.j2k.io.EndianType_Fields.BIG_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 1) - 1; j >= 0; k--)
{
barr[k] = (((buf[j--] & 0xFF) | ((buf[j--] & 0xFF) << 8)) << paddingLength) >> paddingLength;
}
break;
default:
throw new System.InvalidOperationException("Internal JJ2000 bug");
}
}
}
else
{
// If not signed
for (i = blk.uly; i < mi; i++)
{
// Reposition in input
in_Renamed.Seek(offset + 2 * (i * w + blk.ulx), System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, blk.w << 1);
switch (byteOrder)
{
case CSJ2K.j2k.io.EndianType_Fields.LITTLE_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 1) - 1; j >= 0; k--)
{
barr[k] = (SupportClass.URShift(((((buf[j--] & 0xFF) << 8) | (buf[j--] & 0xFF)) << paddingLength), paddingLength)) - levShift;
}
break;
case CSJ2K.j2k.io.EndianType_Fields.BIG_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 1) - 1; j >= 0; k--)
{
barr[k] = (SupportClass.URShift((((buf[j--] & 0xFF) | ((buf[j--] & 0xFF) << 8)) << paddingLength), paddingLength)) - levShift;
}
break;
default:
throw new System.InvalidOperationException("Internal JJ2000 bug");
}
}
}
break;
case 4: // Samples packed into 4 bytes
// Read line by line
mi = blk.uly + blk.h;
if (isSigned)
{
for (i = blk.uly; i < mi; i++)
{
// Reposition in input
in_Renamed.Seek(offset + 4 * (i * w + blk.ulx), System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, blk.w << 2);
switch (byteOrder)
{
case CSJ2K.j2k.io.EndianType_Fields.LITTLE_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 2) - 1; j >= 0; k--)
{
barr[k] = ((((buf[j--] & 0xFF) << 24) | ((buf[j--] & 0xFF) << 16) | ((buf[j--] & 0xFF) << 8) | (buf[j--] & 0xFF)) << paddingLength) >> paddingLength;
}
break;
case CSJ2K.j2k.io.EndianType_Fields.BIG_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 2) - 1; j >= 0; k--)
{
barr[k] = (((buf[j--] & 0xFF) | ((buf[j--] & 0xFF) << 8) | ((buf[j--] & 0xFF) << 16) | ((buf[j--] & 0xFF) << 24)) << paddingLength) >> paddingLength;
}
break;
default:
throw new System.InvalidOperationException("Internal JJ2000 bug");
}
}
}
else
{
for (i = blk.uly; i < mi; i++)
{
// Reposition in input
in_Renamed.Seek(offset + 4 * (i * w + blk.ulx), System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, blk.w << 2);
switch (byteOrder)
{
case CSJ2K.j2k.io.EndianType_Fields.LITTLE_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 2) - 1; j >= 0; k--)
{
barr[k] = (SupportClass.URShift(((((buf[j--] & 0xFF) << 24) | ((buf[j--] & 0xFF) << 16) | ((buf[j--] & 0xFF) << 8) | (buf[j--] & 0xFF)) << paddingLength), paddingLength)) - levShift;
}
break;
case CSJ2K.j2k.io.EndianType_Fields.BIG_ENDIAN:
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = (blk.w << 2) - 1; j >= 0; k--)
{
barr[k] = (SupportClass.URShift((((buf[j--] & 0xFF) | ((buf[j--] & 0xFF) << 8) | ((buf[j--] & 0xFF) << 16) | ((buf[j--] & 0xFF) << 24)) << paddingLength), paddingLength)) - levShift;
}
break;
default:
throw new System.InvalidOperationException("Internal JJ2000 bug");
}
}
}
break;
default:
throw new System.IO.IOException("PGX supports only bit-depth between" + " 1 and 31");
}
}
catch (System.IO.IOException e)
{
JJ2KExceptionHandler.handleException(e);
}
// Turn off the progressive attribute
blk.progressive = false;
// Set buffer attributes
blk.offset = 0;
blk.scanw = blk.w;
return blk;
}