Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
            }
        }