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