private void DirectWriteBSQNormal(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, enumDataType dataType, int xBufferSize, int yBufferSize) { IVirtualScan0 virtualScan0 = _rasterDataProvider as IVirtualScan0; if (virtualScan0.IsVirtualScan0) { xOffset += virtualScan0.OffsetX; yOffset += virtualScan0.OffsetY; } if (xOffset == 0 && xSize == _width) { DirectWriteBSQNormalQuickly(yOffset, ySize, buffer, dataType); } else { int srcDataTypeSize = DataTypeHelper.SizeOf(_dataType); int rowSize = _width * srcDataTypeSize; long offset = yOffset * rowSize + xOffset * srcDataTypeSize; int rowBlockSize = xSize * srcDataTypeSize; int rightBank = _width * srcDataTypeSize - rowBlockSize; byte[] rowBlockBuffer = new byte[rowBlockSize]; for (int row = 0; row < ySize; row++, offset = offset + rowBlockSize + rightBank, buffer = IntPtr.Add(buffer, rowBlockSize)) { Marshal.Copy(buffer, rowBlockBuffer, 0, rowBlockSize); _accessor.WriteArray <byte>(offset, rowBlockBuffer, 0, rowBlockSize); } } }
private void DirectReadBSQNormal(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, enumDataType dataType, int xBufferSize, int yBufferSize) { IVirtualScan0 virtualScan0 = _rasterDataProvider as IVirtualScan0; if (virtualScan0.IsVirtualScan0) { xOffset += virtualScan0.OffsetX; yOffset += virtualScan0.OffsetY; } int srcDataTypeSize = DataTypeHelper.SizeOf(_dataType); int rowSize = _width * srcDataTypeSize; int offset = yOffset * rowSize; int endRow = yOffset + ySize; int colOffset = xOffset * srcDataTypeSize; int srcRowBlockSize = xSize * srcDataTypeSize; byte[] srcRowBlockBuffer = new byte[srcRowBlockSize]; int dstRowBlockSize = xBufferSize * srcDataTypeSize; byte[] dstRowBlockBuffer = new byte[dstRowBlockSize]; offset += colOffset; float rowScale = ySize / (float)yBufferSize; float colScale = xSize / (float)xBufferSize; int srcRow = 0; for (int dstRow = 0; dstRow < yBufferSize; dstRow++, srcRow = (int)(dstRow * rowScale), buffer = IntPtr.Add(buffer, dstRowBlockSize)) { _accessor.ReadArray <byte>(offset + srcRow * rowSize, srcRowBlockBuffer, 0, srcRowBlockSize); for (int dstCol = 0; dstCol < xBufferSize; dstCol++) { int srcCol = (int)(dstCol * colScale); int dstIdx = dstCol * srcDataTypeSize; int srcIdx = srcCol * srcDataTypeSize; for (int b = 0; b < srcDataTypeSize; b++) { dstRowBlockBuffer[dstIdx + b] = srcRowBlockBuffer[srcIdx + b]; } } Marshal.Copy(dstRowBlockBuffer, 0, buffer, dstRowBlockSize); } }