private static void putcontig8bitYCbCr42tile(
TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift,
int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift)
{
int rasterOffset2 = rasterOffset + width + rasterShift;
int incr = 2 * rasterShift + width;
bufferShift = (bufferShift * 10) / 4;
if ((height & 3) == 0 && (width & 1) == 0)
{
for (; height >= 2; height -= 2)
{
x = width >> 2;
do
{
int Cb = buffer[offset + 8];
int Cr = buffer[offset + 9];
img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 4], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 5], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset2 + 2], buffer[offset + 6], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset2 + 3], buffer[offset + 7], Cb, Cr);
rasterOffset += 4;
rasterOffset2 += 4;
offset += 10;
}
while (--x != 0);
rasterOffset += incr;
rasterOffset2 += incr;
offset += bufferShift;
}
}
else
{
while (height > 0)
{
for (x = width; x > 0; )
{
int Cb = buffer[offset + 8];
int Cr = buffer[offset + 9];
bool x_goOn = false;
if (x < 1 || x > 3)
{
if (height != 1)
img.YCbCrtoRGB(out raster[rasterOffset2 + 3], buffer[offset + 7], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr);
x_goOn = true;
}
if (x == 3 || x_goOn)
{
if (height != 1)
img.YCbCrtoRGB(out raster[rasterOffset2 + 2], buffer[offset + 6], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr);
x_goOn = true;
}
if (x == 2 || x_goOn)
{
if (height != 1)
img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 5], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr);
x_goOn = true;
}
if (x == 1 || x_goOn)
{
if (height != 1)
img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 4], Cb, Cr);
img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr);
}
if (x < 4)
{
rasterOffset += x;
rasterOffset2 += x;
x = 0;
}
else
{
rasterOffset += 4;
rasterOffset2 += 4;
x -= 4;
}
offset += 10;
}
if (height <= 2)
break;
height -= 2;
rasterOffset += incr;
rasterOffset2 += incr;
offset += bufferShift;
}
}
}