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; }
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; }