public override bool Contains(TileIndex id)
        {
            // todo probably preload existing images into fileMap.
            // todo probably save previous fileMaps.
            if (id.Level != currentLevel)
            {
                fileMap      = new Dictionary <TileIndex, bool>(new TileIndex.TileIndexEqualityComparer());
                currentLevel = id.Level;

                if (MapTileProvider.GetTotalTilesCount(currentLevel) <= maxIndicesToPrecache)
                {
                    Stopwatch timer     = Stopwatch.StartNew();
                    var       directory = new DirectoryInfo(GetZoomDir(currentLevel));
                    if (directory.Exists)
                    {
                        var files     = directory.GetFiles();
                        var fileNames = (from file in files
                                         select file.Name).ToList();
                        fileNames.Sort();

                        var tileInfos = from tile in MapTileProvider.GetTilesForLevel(currentLevel)
                                        let name = GetFileName(GetNameByIndex(tile))
                                                   orderby name
                                                   select new { Tile = tile, Name = name };

                        foreach (var tileInfo in tileInfos)
                        {
                            fileMap[tileInfo.Tile] = fileNames.Contains(tileInfo.Name);
                        }
                        MapsTraceSource.Instance.ServerInformationTraceSource
                        .TraceInformation($"Precached directory for level {currentLevel}: {timer.ElapsedMilliseconds} ms");
                    }
                }
            }

            if (fileMap.ContainsKey(id))
            {
                return(fileMap[id]);
            }
            else
            {
                string path = GetImagePath(id);
                bool   res  = File.Exists(path);
                fileMap[id] = res;
                return(res);
            }
        }
Example #2
0
        protected List <VisibleTileInfo> GetVisibleTiles()
        {
            var      transform = plotter.Viewport.Transform;
            Rect     output    = plotter.Viewport.Output;
            DataRect visible   = plotter.Viewport.Visible;

            var tileInfos = (from tile in tileProvider.GetTilesForRegion(TransformRegion(visible), tileProvider.Level)
                             let visibleRect = Transform(tileProvider.GetTileBounds(tile))
                                               let screenRect = visibleRect.ViewportToScreen(transform)
                                                                where output.IntersectsWith(screenRect)
                                                                select new VisibleTileInfo {
                Tile = tile, ScreenBounds = screenRect, VisibleBounds = visibleRect
            }).ToList();

            if (tileInfos.Count > MapTileProvider.GetTotalTilesCount(tileProvider.Level))
            {
                //Debugger.Break();
            }

            return(tileInfos);
        }
Example #3
0
        protected void OnRender()
        {
            if (DesignerProperties.GetIsInDesignMode(this))
            {
                return;
            }

            if (plotter == null)
            {
                return;
            }

            panel.Children.Clear();

            freeChildren = new List <MapElement>(panel.Children.Count);
            for (int i = 0; i < panel.Children.Count; i++)
            {
                freeChildren.Add((MapElement)panel.Children[i]);
            }

            rendering         = true;
            invalidatePending = false;

            var      transform = plotter.Viewport.Transform;
            Rect     output    = plotter.Viewport.Output;
            DataRect visible   = plotter.Viewport.Visible;

            visibleBounds = visible;

            drawnBounds = DataRect.Empty;

            var tileInfos = GetVisibleTiles();

            var lowerTilesList = GetLoadedLowerTiles(tileInfos);

            // displaying lower tiles
            foreach (var tile in lowerTilesList)
            {
                if (server.IsLoaded(tile))
                {
                    var      bmp         = server[tile];
                    DataRect visibleRect = tileProvider.GetTileBounds(tile);
                    DrawImage(bmp, visibleRect, tile);
                }
                else
                {
                    server.BeginLoadImage(tile);
                }
            }

            int count = 0;

            foreach (var tileInfo in tileInfos)
            {
                drawnBounds.Union(tileInfo.VisibleBounds);

                count++;
                if (server.IsLoaded(tileInfo.Tile))
                {
                    var bmp = server[tileInfo.Tile];
                    DrawImage(bmp, tileInfo.VisibleBounds, tileInfo.Tile);
                }
                else
                {
                    server.BeginLoadImage(tileInfo.Tile);
                }
            }
            showsWholeMap = count == MapTileProvider.GetTotalTilesCount(tileProvider.Level);

            foreach (var item in freeChildren)
            {
                panel.Children.Remove(item);
                pool.Put(item);
            }

            foreach (MapElement item in panel.Children)
            {
                if (item.Bitmap == null)
                {
                    panel.Children.Remove(item);
                    pool.Put(item);
                }
            }

            rendering = false;

            Debug.WriteLine("Drawn " + Environment.TickCount);
        }