protected void encodeRowFromInt(int[] row) { if (row.Length == ImgInfo.SamplesPerRowPacked && !needsPack) { // some duplication of code - because this case is typical and it works faster this way int j = 1; if (ImgInfo.BitDepth <= 8) { foreach (int x in row) // optimized { rowb[j++] = (byte)x; } } else { // 16 bitspc foreach (int x in row) // optimized { rowb[j++] = (byte)(x >> 8); rowb[j++] = (byte)(x); } } } else { // perhaps we need to pack? if (row.Length >= ImgInfo.SamplesPerRow && needsPack) { ImageLine.packInplaceInt(ImgInfo, row, row, false); // row is packed in place! } int samplesPerRowPacked = ImgInfo.SamplesPerRowPacked; if (ImgInfo.BitDepth <= 8) { for (int i = 0, j = 1; i < samplesPerRowPacked; i++) { rowb[j++] = (byte)row[i]; } } else { // 16 bitspc for (int i = 0, j = 1; i < samplesPerRowPacked; i++) { rowb[j++] = (byte)(row[i] >> 8); rowb[j++] = (byte)(row[i]); } } } }
public static int[] Pack(ImageInfo imgInfo, int[] src, int[] dst, bool scale) { int len0 = imgInfo.SamplesPerRowPacked; if (dst == null || dst.Length < len0) { dst = new int[len0]; } if (imgInfo.Packed) { ImageLine.packInplaceInt(imgInfo, src, dst, scale); } else { Array.Copy(src, 0, dst, 0, len0); } return(dst); }