private int setorientation()
{
switch (orientation)
{
case Orientation.TOPLEFT:
case Orientation.LEFTTOP:
if (req_orientation == Orientation.TOPRIGHT || req_orientation == Orientation.RIGHTTOP)
return FLIP_HORIZONTALLY;
else if (req_orientation == Orientation.BOTRIGHT || req_orientation == Orientation.RIGHTBOT)
return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
else if (req_orientation == Orientation.BOTLEFT || req_orientation == Orientation.LEFTBOT)
return FLIP_VERTICALLY;
return 0;
case Orientation.TOPRIGHT:
case Orientation.RIGHTTOP:
if (req_orientation == Orientation.TOPLEFT || req_orientation == Orientation.LEFTTOP)
return FLIP_HORIZONTALLY;
else if (req_orientation == Orientation.BOTRIGHT || req_orientation == Orientation.RIGHTBOT)
return FLIP_VERTICALLY;
else if (req_orientation == Orientation.BOTLEFT || req_orientation == Orientation.LEFTBOT)
return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
return 0;
case Orientation.BOTRIGHT:
case Orientation.RIGHTBOT:
if (req_orientation == Orientation.TOPLEFT || req_orientation == Orientation.LEFTTOP)
return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
else if (req_orientation == Orientation.TOPRIGHT || req_orientation == Orientation.RIGHTTOP)
return FLIP_VERTICALLY;
else if (req_orientation == Orientation.BOTLEFT || req_orientation == Orientation.LEFTBOT)
return FLIP_HORIZONTALLY;
return 0;
case Orientation.BOTLEFT:
case Orientation.LEFTBOT:
if (req_orientation == Orientation.TOPLEFT || req_orientation == Orientation.LEFTTOP)
return FLIP_VERTICALLY;
else if (req_orientation == Orientation.TOPRIGHT || req_orientation == Orientation.RIGHTTOP)
return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
else if (req_orientation == Orientation.BOTRIGHT || req_orientation == Orientation.RIGHTBOT)
return FLIP_HORIZONTALLY;
return 0;
}
return 0;
}
/// <summary> /// Get a strip-organized image with /// SamplesPerPixel > 1 /// PlanarConfiguration separated /// We assume that all such images are RGB. /// </summary> private static bool gtStripSeparate(TiffRgbaImage img, int[] raster, int offset, int width, int height) { int stripsize = img.tif.StripSize(); byte[] buf = new byte[(img.alpha != 0 ? 4 : 3) * stripsize]; int p0 = 0; int p1 = p0 + stripsize; int p2 = p1 + stripsize; int pa = p2 + stripsize; pa = (img.alpha != 0 ? (p2 + stripsize) : -1); int flip = img.setorientation(); int y; int rasterShift; if ((flip & FLIP_VERTICALLY) != 0) { y = height - 1; rasterShift = -(width + width); } else { y = 0; rasterShift = -(width - width); } FieldValue[] result = img.tif.GetFieldDefaulted(TiffTag.ROWSPERSTRIP); int rowsperstrip = result[0].ToInt(); int scanline = img.tif.ScanlineSize(); int bufferShift = (width < img.width ? img.width - width : 0); bool ret = true; for (int row = 0; row < height; ) { int rowstoread = rowsperstrip - (row + img.row_offset) % rowsperstrip; int nrow = (row + rowstoread > height ? height - row : rowstoread); int offset_row = row + img.row_offset; if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 0), buf, p0, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr) { ret = false; break; } if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 1), buf, p1, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr) { ret = false; break; } if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 2), buf, p2, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr) { ret = false; break; } if (img.alpha != 0) { if ((img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 3), buf, pa, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr)) { ret = false; break; } } int pos = ((row + img.row_offset) % rowsperstrip) * scanline; img.putSeparate(img, raster, offset + y * width, rasterShift, 0, y, width, nrow, buf, p0 + pos, p1 + pos, p2 + pos, img.alpha != 0 ? (pa + pos) : -1, bufferShift); 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; }