Exemple #1
0
        public RawImage DecodeImage( Rectangle rect )
        {
            // Calculate the integral rectangle, i.e. on block boundaries
            Rectangle integralrect = CoordMap.FitToGrid( rect );
            // Get the size of the rectangle in blocks
            Size size = CoordMap.ActualToBlocks( integralrect.Size );

            // Create the image
            RawImage image = new RawImage( zoom, integralrect );
            ImageDecoder decoder = new ImageDecoder( image );

            #if false
            // Create a grid of decompressed blocks first
            Point gridloc = integralrect.Location;
            for ( int y=0; y<size.Height; ++y ) {
                for ( int x=0; x<size.Width; ++x ) {
                    MapBlock self = (MapBlock)this[GetBlockIndex( gridloc )];
                    MapBlock right = (MapBlock)this[GetBlockIndex( gridloc.X + BlockSize, gridloc.Y )];
                    MapBlock bottom = (MapBlock)this[GetBlockIndex( gridloc.X, gridloc.Y + BlockSize )];
                    MapBlock bottomright = (MapBlock)this[GetBlockIndex( gridloc.X + BlockSize, gridloc.Y + BlockSize )];

                    decoder.Decode4( x << BlockFactor, y << BlockFactor, self, right, bottom, bottomright );

                    gridloc.X = NormalizeX( gridloc.X + (BlockSize << zoom) );
                }
                gridloc.Y += BlockSize << zoom;
                gridloc.X = integralrect.Location.X;
            }
            #else
            // Create a grid of decompressed blocks first
            Point gridloc = new Point( NormalizeX( integralrect.Right - BlockSize ), integralrect.Bottom - BlockSize);
            for ( int x=size.Width-1; x>=0; --x ) {
                MapBlock self = (MapBlock)this[GetBlockIndex( gridloc )];
                MapBlock right = (MapBlock)this[GetBlockIndex( gridloc.X + BlockSize, gridloc.Y )];
                MapBlock bottom = (MapBlock)this[GetBlockIndex( gridloc.X, gridloc.Y + BlockSize )];
                MapBlock bottomright = (MapBlock)this[GetBlockIndex( gridloc.X + BlockSize, gridloc.Y + BlockSize )];
                gridloc.Y -= BlockSize;

                decoder.Decode4( x << BlockFactor, (size.Height-1) << BlockFactor, self, right, bottom, bottomright );
                for ( int y=size.Height-2; y>=0; --y ) {
                    self = (MapBlock)this[GetBlockIndex( gridloc )];
                    right = (MapBlock)this[GetBlockIndex( gridloc.X + BlockSize, gridloc.Y )];

                    decoder.Decode2( x << BlockFactor, y << BlockFactor, self, right );
                    gridloc.Y -= BlockSize;
                }
                gridloc.X = NormalizeX( gridloc.X - BlockSize );
                gridloc.Y = integralrect.Bottom - BlockSize;
            }
            #endif
            return image;
        }
Exemple #2
0
        public RawImage DecodeBlockImage( MapBlock block, Point location )
        {
            location = CoordMap.FitToGrid( location );
            RawImage image = new RawImage( zoom, new Rectangle( location, new Size( BlockSize, BlockSize ) ) );

            ImageDecoder decoder = new ImageDecoder( image );
            decoder.Decode1( 0, 0, block );

            return image;
        }