public getInternCompData ( CSJ2K.j2k.image.DataBlk blk, int c ) : CSJ2K.j2k.image.DataBlk | ||
blk | CSJ2K.j2k.image.DataBlk | Its coordinates and dimensions specify the area to /// return. Some fields in this object are modified to return the data. /// /// |
c | int | The index of the component from which to get the data. Only 0, /// 1 and 3 are valid. /// /// |
return | CSJ2K.j2k.image.DataBlk |
public override DataBlk getInternCompData(DataBlk blk, int c)
{
// Check component index
if (c < 0 || c > 2)
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;
}
// If asking a component for the first time for this block, read the 3
// components
if ((barr[c] == null) || (dbi.ulx > blk.ulx) || (dbi.uly > blk.uly) || (dbi.ulx + dbi.w < blk.ulx + blk.w) || (dbi.uly + dbi.h < blk.uly + blk.h))
{
int k, j, i, mi;
int[] red, green, blue;
// Reset data arrays if needed
if (barr[c] == null || barr[c].Length < blk.w * blk.h)
{
barr[c] = new int[blk.w * blk.h];
}
blk.Data = barr[c];
i = (c + 1) % 3;
if (barr[i] == null || barr[i].Length < blk.w * blk.h)
{
barr[i] = new int[blk.w * blk.h];
}
i = (c + 2) % 3;
if (barr[i] == null || barr[i].Length < blk.w * blk.h)
{
barr[i] = new int[blk.w * blk.h];
}
// set attributes of the DataBlk used for buffering
dbi.ulx = blk.ulx;
dbi.uly = blk.uly;
dbi.w = blk.w;
dbi.h = blk.h;
// Check line buffer
if (buf == null || buf.Length < 3 * blk.w)
{
buf = new byte[3 * blk.w];
}
red = barr[0];
green = barr[1];
blue = barr[2];
try
{
// Read line by line
mi = blk.uly + blk.h;
for (i = blk.uly; i < mi; i++)
{
// Reposition in input offset takes care of
// header offset
in_Renamed.Seek(offset + i * 3 * w + 3 * blk.ulx, System.IO.SeekOrigin.Begin);
in_Renamed.Read(buf, 0, 3 * blk.w);
for (k = (i - blk.uly) * blk.w + blk.w - 1, j = 3 * blk.w - 1; j >= 0; k--)
{
// Read every third sample
blue[k] = (((byte) buf[j--]) & 0xFF) - DC_OFFSET;
green[k] = (((byte) buf[j--]) & 0xFF) - DC_OFFSET;
red[k] = (((byte) buf[j--]) & 0xFF) - DC_OFFSET;
}
}
}
catch (System.IO.IOException e)
{
JJ2KExceptionHandler.handleException(e);
}
barr[0] = red;
barr[1] = green;
barr[2] = blue;
// Set buffer attributes
blk.Data = barr[c];
blk.offset = 0;
blk.scanw = blk.w;
}
else
{
//Asking for the 2nd or 3rd block component
blk.Data = barr[c];
blk.offset = (blk.ulx - dbi.ulx) * dbi.w + blk.ulx - dbi.ulx;
blk.scanw = dbi.scanw;
}
// Turn off the progressive attribute
blk.progressive = false;
return blk;
}