Exemple #1
0
        private ProcessRasterBlockDimensionDelegate CreateProcessBlockDimensionDelegate(int dimension, int[] windowPos, int[] windowSize,
                                                                                        ProcessRasterWindowSpanDelegate processWindowSpanDelegate, int[] rasterTileOfs, int[] blockRasterTileOfs, int[] windowOfs, int[] blockWindowOfs, int[] blockSize)
        {
            int rasterTileSizeD = m_tileSize[dimension];
            int windowSizeD     = windowSize[dimension];

            if (dimension > 0)
            {
                ProcessRasterBlockDimensionDelegate innerDelegate = CreateProcessBlockDimensionDelegate(dimension - 1, windowPos, windowSize, processWindowSpanDelegate, rasterTileOfs, blockRasterTileOfs, windowOfs, blockWindowOfs, blockSize);

                return(delegate(int rasterTileBaseIndex, int rasterTileIndexOfs, int windowIndexOfs)
                {
                    int rasterTileOfsD = rasterTileOfs[dimension];
                    int windowOfsD = windowOfs[dimension];
                    int blockSizeD = blockSize[dimension];

                    for (int blockOfsD = 0; blockOfsD < blockSizeD; ++rasterTileOfsD, ++windowOfsD, ++blockOfsD)
                    {
                        int innerRasterTileIndexOfs = rasterTileIndexOfs * rasterTileSizeD + rasterTileOfsD;
                        int innerWindowIndexOfs = windowIndexOfs * windowSizeD + windowOfsD;

                        blockRasterTileOfs[dimension] = rasterTileOfsD;
                        blockWindowOfs[dimension] = windowOfsD;

                        innerDelegate(rasterTileBaseIndex, innerRasterTileIndexOfs, innerWindowIndexOfs);
                    }
                });
            }
            else
            {
                return(delegate(int rasterTileBaseIndex, int rasterTileIndexOfs, int windowIndexOfs)
                {
                    int rasterTileOfsD = rasterTileOfs[dimension];
                    int windowOfsD = windowOfs[dimension];
                    int blockSizeD = blockSize[dimension];

                    int innerRasterTileIndexOfs = rasterTileIndexOfs * rasterTileSizeD + rasterTileOfsD;
                    int innerWindowIndexOfs = windowIndexOfs * windowSizeD + windowOfsD;

                    blockRasterTileOfs[dimension] = rasterTileOfsD;
                    blockWindowOfs[dimension] = windowOfsD;

                    int rasterIndex = rasterTileBaseIndex + innerRasterTileIndexOfs;

                    processWindowSpanDelegate(rasterIndex, blockRasterTileOfs, innerWindowIndexOfs, blockWindowOfs, blockSizeD);
                });
            }
        }
Exemple #2
0
        private ProcessRasterWindowDimensionDelegate CreateProcessRasterWindowDimensionDelegate(int dimension, bool useVertices, int[] windowPos, int[] windowSize,
                                                                                                ProcessRasterWindowSpanDelegate processRasterWindowSpanDelegate, int[] rasterTileOfs, int[] windowOfs, int[] blockSize)
        {
            int rasterSizeD = useVertices ? m_raster.GetVertexIndexCount(dimension) : m_raster.GetVertexIndexCount(dimension) - 1;
            int tileSizeD   = m_tileSize[dimension];
            int tileCountD  = (rasterSizeD + tileSizeD - 1) / tileSizeD;
            int windowSizeD = windowSize[dimension];
            int windowPosD  = windowPos[dimension];

            ProcessRasterWindowDimensionDelegate innerDelegate;

            if (dimension > 0)
            {
                innerDelegate = CreateProcessRasterWindowDimensionDelegate(dimension - 1, useVertices, windowPos, windowSize, processRasterWindowSpanDelegate, rasterTileOfs, windowOfs, blockSize);

                return(delegate(int rasterTileNum)
                {
                    int windowOfsD = 0;
                    while (windowOfsD < windowSizeD)
                    {
                        int rasterPosD = windowPosD + windowOfsD;
                        if (rasterPosD < 0)
                        {
                            windowOfsD += -rasterPosD;
                            continue;
                        }
                        if (rasterPosD >= rasterSizeD)
                        {
                            break;
                        }

                        int rasterTileNumD = rasterPosD / tileSizeD;
                        int rasterTileOfsD = rasterPosD % tileSizeD;

                        int innerRasterTileNum = rasterTileNum * tileCountD + rasterTileNumD;

                        int nextRasterPosD = (rasterTileNumD + 1) * tileSizeD;
                        if (nextRasterPosD > rasterSizeD)
                        {
                            nextRasterPosD = rasterSizeD;
                        }
                        if (nextRasterPosD > windowPosD + windowSizeD)
                        {
                            nextRasterPosD = windowPosD + windowSizeD;
                        }

                        rasterTileOfs[dimension] = rasterTileOfsD;
                        windowOfs[dimension] = windowOfsD;
                        blockSize[dimension] = nextRasterPosD - rasterPosD;

                        innerDelegate(innerRasterTileNum);

                        windowOfsD += nextRasterPosD - rasterPosD;
                    }
                });
            }
            else
            {
                int rasterTileIndexCount = m_tileIndexCount;

                int rasterDimension = m_raster.Dimension;

                int[] blockRasterTileOfs = new int[rasterDimension];
                int[] blockWindowOfs     = new int[rasterDimension];

                ProcessRasterBlockDimensionDelegate processRasterBlockDelegate = CreateProcessBlockDimensionDelegate(rasterDimension - 1, windowPos, windowSize, processRasterWindowSpanDelegate, rasterTileOfs, blockRasterTileOfs, windowOfs, blockWindowOfs, blockSize);

                return(delegate(int rasterTileNum)
                {
                    int windowOfsD = 0;
                    while (windowOfsD < windowSizeD)
                    {
                        int rasterPosD = windowPosD + windowOfsD;
                        if (rasterPosD < 0)
                        {
                            windowOfsD += -rasterPosD;
                            continue;
                        }
                        if (rasterPosD >= rasterSizeD)
                        {
                            break;
                        }

                        int rasterTileNumD = rasterPosD / tileSizeD;
                        int rasterTileOfsD = rasterPosD % tileSizeD;

                        int innerRasterTileNum = rasterTileNum * tileCountD + rasterTileNumD;

                        int nextRasterPosD = (rasterTileNumD + 1) * tileSizeD;
                        if (nextRasterPosD > rasterSizeD)
                        {
                            nextRasterPosD = rasterSizeD;
                        }
                        if (nextRasterPosD > windowPosD + windowSizeD)
                        {
                            nextRasterPosD = windowPosD + windowSizeD;
                        }

                        rasterTileOfs[dimension] = rasterTileOfsD;
                        windowOfs[dimension] = windowOfsD;
                        blockSize[dimension] = nextRasterPosD - rasterPosD;

                        int rasterTileBaseIndex = innerRasterTileNum * rasterTileIndexCount;

                        processRasterBlockDelegate(rasterTileBaseIndex, 0, 0);

                        windowOfsD += nextRasterPosD - rasterPosD;
                    }
                });
            }
        }