protected override void GetSource( Envelope extent, int width, int height, DynamicLayer.OnImageComplete onComplete )
        {
            //List<MapPoint> mapPoints = new List<MapPoint>();
            //List<Point> points = new List<Point>();

            //int count = 0;
            //while( count < 1000 )
            //{
            //    mapPoints.Add(new MapPoint(extent.XMin + (extent.Width * (_random.Next(100)/100.00)), 
            //        extent.YMin + (extent.Height * (_random.Next(100)/100.00)), 
            //        extent.SpatialReference));
            //    count++;
            //}

            //foreach( MapPoint entry in mapPoints )
            //{
            //    double M11 = ( double ) width / 360.00;
            //    double M22 = -( double ) height / 180.00;
            //    double M12 = 0.00;
            //    double M21 = 0.00;
            //    double offsetX = 180.00 * ( ( double ) width / 360.00 );
            //    double offsetY = 90.00 * ( ( double ) height / 180.0 );

            //    Matrix transform = new Matrix( M11, M12, M21, M22, offsetX, offsetY );
            //    points.Add( transform.Transform( new Point( entry.X, entry.Y ) ) );
            //}

            if( _timer != null )
                _timer.Dispose();

            _currentWidth = width;
            _currentHeight = height;

            _pngRenderer = new RainDropPngRenderer( _currentWidth, _currentHeight );

            ParameterizedThreadStart starter = new ParameterizedThreadStart( ( pngRenderer ) =>
            {
                Stream imageStream = InitalizeImage( pngRenderer as RainDropPngRenderer );

                Dispatcher.BeginInvoke( () =>
                {
                    _image = new BitmapImage();
                    _image.SetSource( imageStream );
                    onComplete( _image, width, height, extent );
                    _timer = new Timer( timer_Tick, _pngRenderer, new TimeSpan( 0, 0, 0 ), TimeSpan.FromMilliseconds( RippleIntervalMilliSeconds ) );
                } );
            } );
            new Thread( starter ).Start( _pngRenderer );
        }
 private Stream InitalizeImage( RainDropPngRenderer pngRenderer )
 {
     pngRenderer.Display( Background );
     return pngRenderer.GetImageStream();
 }