private static bool gtTileSeparate(TiffRgbaImage img, int[] raster, int offset, int width, int height)
{
int tilesize = img.tif.TileSize();
byte[] buf = new byte[(img.alpha != 0 ? 4 : 3) * tilesize];
int p0 = 0;
int p1 = p0 + tilesize;
int p2 = p1 + tilesize;
int pa = (img.alpha != 0 ? (p2 + tilesize) : -1);
FieldValue[] result = img.tif.GetField(TiffTag.TILEWIDTH);
int tileWidth = result[0].ToInt();
result = img.tif.GetField(TiffTag.TILELENGTH);
int tileHeight = result[0].ToInt();
int flip = img.setorientation();
int y;
int rasterShift;
if ((flip & FLIP_VERTICALLY) != 0)
{
y = height - 1;
rasterShift = -(tileWidth + width);
}
else
{
y = 0;
rasterShift = -(tileWidth - width);
}
bool ret = true;
for (int row = 0; row < height; )
{
int rowstoread = tileHeight - (row + img.row_offset) % tileHeight;
int nrow = (row + rowstoread > height ? height - row : rowstoread);
for (int col = 0; col < width; col += tileWidth)
{
if (img.tif.ReadTile(buf, p0, col + img.col_offset, row + img.row_offset, 0, 0) < 0 && img.stoponerr)
{
ret = false;
break;
}
if (img.tif.ReadTile(buf, p1, col + img.col_offset, row + img.row_offset, 0, 1) < 0 && img.stoponerr)
{
ret = false;
break;
}
if (img.tif.ReadTile(buf, p2, col + img.col_offset, row + img.row_offset, 0, 2) < 0 && img.stoponerr)
{
ret = false;
break;
}
if (img.alpha != 0)
{
if (img.tif.ReadTile(buf, pa, col + img.col_offset, row + img.row_offset, 0, 3) < 0 && img.stoponerr)
{
ret = false;
break;
}
}
int pos = ((row + img.row_offset) % tileHeight) * img.tif.TileRowSize();
if (col + tileWidth > width)
{
// Tile is clipped horizontally.
// Calculate visible portion and skewing factors.
int npix = width - col;
int bufferShift = tileWidth - npix;
img.putSeparate(img, raster, offset + y * width + col, rasterShift + bufferShift,
col, y, npix, nrow,
buf, p0 + pos, p1 + pos, p2 + pos, img.alpha != 0 ? (pa + pos) : -1, bufferShift);
}
else
{
img.putSeparate(img, raster, offset + y * width + col, rasterShift,
col, y, tileWidth, nrow,
buf, p0 + pos, p1 + pos, p2 + pos, img.alpha != 0 ? (pa + pos) : -1, 0);
}
}
y += ((flip & FLIP_VERTICALLY) != 0 ? -nrow : nrow);
row += nrow;
}
if ((flip & FLIP_HORIZONTALLY) != 0)
{
for (int line = 0; line < height; line++)
{
int left = offset + line * width;
int right = left + width - 1;
while (left < right)
{
int temp = raster[left];
raster[left] = raster[right];
raster[right] = temp;
left++;
right--;
}
}
}
return ret;
}