Ejemplo n.º 1
0
        public void RenderPointOfInterestCircle(RenderContext renderContext, float radius, IPaint fill, IPaint stroke, int level, PointOfInterest poi)
        {
            Point poiPosition = MercatorProjection.GetPixelRelativeToTile(poi.Position, renderContext.rendererJob.tile);

            renderContext.AddToCurrentDrawingLayer(level, new ShapePaintContainer(new CircleContainer(poiPosition, radius), stroke));
            renderContext.AddToCurrentDrawingLayer(level, new ShapePaintContainer(new CircleContainer(poiPosition, radius), fill));
        }
Ejemplo n.º 2
0
        private void RenderWaterBackground(RenderContext renderContext)
        {
            renderContext.DrawingLayers = (sbyte)0;
            Point[]           coordinates = GetTilePixelCoordinates(renderContext.rendererJob.tile.TileSize);
            PolylineContainer way         = new PolylineContainer(coordinates, renderContext.rendererJob.tile, new List <Tag>()
            {
                TAG_NATURAL_WATER
            });

            renderContext.renderTheme.MatchClosedWay(this, renderContext, way);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Draws a bitmap just with outside colour, used for bitmaps outside of map area. </summary>
        /// <param name="renderContext"> the RenderContext </param>
        /// <returns> bitmap drawn in single colour. </returns>
        private ITileBitmap CreateBackgroundBitmap(RenderContext renderContext)
        {
            ITileBitmap bitmap = this.graphicFactory.CreateTileBitmap(renderContext.rendererJob.tile.TileSize, renderContext.rendererJob.hasAlpha);

            renderContext.canvasRasterer.CanvasBitmap = bitmap;
            if (!renderContext.rendererJob.hasAlpha)
            {
                renderContext.canvasRasterer.Fill(renderContext.renderTheme.MapBackgroundOutside);
            }

            return(bitmap);
        }
Ejemplo n.º 4
0
        private void RenderWay(RenderContext renderContext, PolylineContainer way)
        {
            renderContext.DrawingLayers = way.Layer;

            if (way.ClosedWay)
            {
                renderContext.renderTheme.MatchClosedWay(this, renderContext, way);
            }
            else
            {
                renderContext.renderTheme.MatchLinearWay(this, renderContext, way);
            }
        }
Ejemplo n.º 5
0
        internal virtual void DrawWays(RenderContext renderContext)
        {
            int levelsPerLayer = renderContext.ways[0].Count;

            for (int layer = 0, layers = renderContext.ways.Count; layer < layers; ++layer)
            {
                IList <IList <ShapePaintContainer> > shapePaintContainers = renderContext.ways[layer];

                for (int level = 0; level < levelsPerLayer; ++level)
                {
                    IList <ShapePaintContainer> wayList = shapePaintContainers[level];

                    for (int index = wayList.Count - 1; index >= 0; --index)
                    {
                        DrawShapePaintContainer(wayList[index]);
                    }
                }
            }
        }
Ejemplo n.º 6
0
        private void ProcessReadMapData(RenderContext renderContext, MapReadResult mapReadResult)
        {
            if (mapReadResult == null)
            {
                return;
            }

            foreach (PointOfInterest pointOfInterest in mapReadResult.PointOfInterests)
            {
                RenderPointOfInterest(renderContext, pointOfInterest);
            }

            foreach (Way way in mapReadResult.Ways)
            {
                RenderWay(renderContext, new PolylineContainer(way, renderContext.rendererJob.tile));
            }

            if (mapReadResult.IsWater)
            {
                RenderWaterBackground(renderContext);
            }
        }
Ejemplo n.º 7
0
 public void RenderWaySymbol(RenderContext renderContext, Display display, int priority, IBitmap symbol, float dy, bool alignCenter, bool repeat, float repeatGap, float repeatStart, bool rotate, PolylineContainer way)
 {
     WayDecorator.RenderSymbol(symbol, display, priority, dy, alignCenter, repeat, repeatGap, repeatStart, rotate, way.CoordinatesAbsolute, renderContext.labels);
 }
Ejemplo n.º 8
0
 public void RenderArea(RenderContext renderContext, IPaint fill, IPaint stroke, int level, PolylineContainer way)
 {
     renderContext.AddToCurrentDrawingLayer(level, new ShapePaintContainer(way, stroke));
     renderContext.AddToCurrentDrawingLayer(level, new ShapePaintContainer(way, fill));
 }
Ejemplo n.º 9
0
        public void RenderAreaCaption(RenderContext renderContext, Display display, int priority, string caption, float horizontalOffset, float verticalOffset, IPaint fill, IPaint stroke, Position position, int maxTextWidth, PolylineContainer way)
        {
            Point centerPoint = way.CenterAbsolute.Offset(horizontalOffset, verticalOffset);

            renderContext.labels.Add(this.graphicFactory.CreatePointTextContainer(centerPoint, display, priority, caption, fill, stroke, null, position, maxTextWidth));
        }
Ejemplo n.º 10
0
 private void RenderPointOfInterest(RenderContext renderContext, PointOfInterest pointOfInterest)
 {
     renderContext.DrawingLayers = pointOfInterest.Layer;
     renderContext.renderTheme.MatchNode(this, renderContext, pointOfInterest);
 }
Ejemplo n.º 11
0
        private ISet <MapElementContainer> ProcessLabels(RenderContext renderContext)
        {
            // if we are drawing the labels per tile, we need to establish which tile-overlapping
            // elements need to be drawn.

            ISet <MapElementContainer> labelsToDraw = new HashSet <MapElementContainer>();

            lock (tileDependencies)
            {
                // first we need to get the labels from the adjacent tiles if they have already been drawn
                // as those overlapping items must also be drawn on the current tile. They must be drawn regardless
                // of priority clashes as a part of them has alread been drawn.
                ISet <Tile> neighbours = renderContext.rendererJob.tile.Neighbours;
                ISet <MapElementContainer> undrawableElements = new HashSet <MapElementContainer>();

                tileDependencies.AddTileInProgress(renderContext.rendererJob.tile);
                for (var i = neighbours.Count - 1; i >= 0; i--)
                {
                    Tile neighbour = neighbours.ElementAt(i);

                    if (tileDependencies.IsTileInProgress(neighbour) || tileCache.ContainsKey(renderContext.rendererJob.OtherTile(neighbour)))
                    {
                        // if a tile has already been drawn, the elements drawn that overlap onto the
                        // current tile should be in the tile dependencies, we add them to the labels that
                        // need to be drawn onto this tile. For the multi-threaded renderer we also need to take
                        // those tiles into account that are not yet in the TileCache: this is taken care of by the
                        // set of tilesInProgress inside the TileDependencies.
                        labelsToDraw.UnionWith(tileDependencies.GetOverlappingElements(neighbour, renderContext.rendererJob.tile));

                        // but we need to remove the labels for this tile that overlap onto a tile that has been drawn
                        foreach (MapElementContainer current in renderContext.labels)
                        {
                            if (current.Intersects(neighbour.BoundaryAbsolute))
                            {
                                undrawableElements.Add(current);
                            }
                        }
                        // since we already have the data from that tile, we do not need to get the data for
                        // it, so remove it from the neighbours list.
                        neighbours.Remove(neighbour);
                    }
                    else
                    {
                        tileDependencies.RemoveTileData(neighbour);
                    }
                }

                // now we remove the elements that overlap onto a drawn tile from the list of labels
                // for this tile
                foreach (var element in undrawableElements)
                {
                    renderContext.labels.Remove(element);
                }

                // at this point we have two lists: one is the list of labels that must be drawn because
                // they already overlap from other tiles. The second one is currentLabels that contains
                // the elements on this tile that do not overlap onto a drawn tile. Now we sort this list and
                // remove those elements that clash in this list already.
                ICollection <MapElementContainer> currentElementsOrdered = LayerUtil.CollisionFreeOrdered(renderContext.labels);

                // now we go through this list, ordered by priority, to see which can be drawn without clashing.
                IEnumerator <MapElementContainer> currentMapElementsIterator = currentElementsOrdered.GetEnumerator();
                while (currentMapElementsIterator.MoveNext())
                {
                    MapElementContainer current = currentMapElementsIterator.Current;
                    foreach (MapElementContainer label in labelsToDraw)
                    {
                        if (label.ClashesWith(current))
                        {
                            break;
                        }
                    }
                }

                labelsToDraw.UnionWith(currentElementsOrdered);

                // update dependencies, add to the dependencies list all the elements that overlap to the
                // neighbouring tiles, first clearing out the cache for this relation.
                foreach (Tile tile in neighbours)
                {
                    tileDependencies.RemoveTileData(renderContext.rendererJob.tile, tile);
                    foreach (MapElementContainer element in labelsToDraw)
                    {
                        if (element.Intersects(tile.BoundaryAbsolute))
                        {
                            tileDependencies.AddOverlappingElement(renderContext.rendererJob.tile, tile, element);
                        }
                    }
                }
            }
            return(labelsToDraw);
        }
Ejemplo n.º 12
0
 public void RenderWayText(RenderContext renderContext, Display display, int priority, string textKey, float dy, IPaint fill, IPaint stroke, PolylineContainer way)
 {
     WayDecorator.RenderText(way.Tile, textKey, display, priority, dy, fill, stroke, way.CoordinatesAbsolute, renderContext.labels);
 }
Ejemplo n.º 13
0
 internal virtual bool RenderBitmap(RenderContext renderContext)
 {
     return(!renderContext.renderTheme.HasMapBackgroundOutside() || this.mapDatabase.SupportsTile(renderContext.rendererJob.tile));
 }
Ejemplo n.º 14
0
        /// <summary>
        /// Called when a job needs to be executed.
        /// </summary>
        /// <param name="rendererJob">
        ///            the job that should be executed. </param>
        public virtual SKImage ExecuteJob(RendererJob rendererJob)
        {
            RenderTheme renderTheme;

            try
            {
                // Wait until RenderTheme is ready
                renderTheme = rendererJob.renderThemeFuture.Result;
            }
            catch (Exception e)
            {
                LOGGER.Fatal("Error to retrieve render theme from future", e);
                return(null);
            }

            RenderContext renderContext = null;

            try
            {
                renderContext = new RenderContext(renderTheme, rendererJob, new CanvasRasterer(graphicFactory));

                renderContext.canvasRasterer.Canvas = graphicFactory.CreateCanvas(renderContext.rendererJob.tile.TileSize, renderContext.rendererJob.tile.TileSize);

                if (RenderBitmap(renderContext))
                {
                    if (this.mapDatabase != null)
                    {
                        MapReadResult mapReadResult = this.mapDatabase.ReadMapData(rendererJob.tile);
                        ProcessReadMapData(renderContext, mapReadResult);
                    }

                    if (!rendererJob.labelsOnly)
                    {
                        //bitmap = this.graphicFactory.CreateTileBitmap(renderContext.rendererJob.tile.TileSize, renderContext.rendererJob.hasAlpha);
                        //bitmap.Timestamp = rendererJob.mapDataStore.GetDataTimestamp(renderContext.rendererJob.tile);
                        //renderContext.canvasRasterer.CanvasBitmap = bitmap;
                        if (!rendererJob.hasAlpha && rendererJob.displayModel.BackgroundColor != renderContext.renderTheme.MapBackground)
                        {
                            renderContext.canvasRasterer.Fill(renderContext.renderTheme.MapBackground);
                        }
                        renderContext.canvasRasterer.DrawWays(renderContext);
                    }

                    if (renderLabels)
                    {
                        ISet <MapElementContainer> labelsToDraw = ProcessLabels(renderContext);
                        // now draw the ways and the labels
                        renderContext.canvasRasterer.DrawMapElements(labelsToDraw, renderContext.rendererJob.tile);
                    }
                    else
                    {
                        // store elements for this tile in the label cache
                        this.labelStore.StoreMapItems(renderContext.rendererJob.tile, renderContext.labels);
                    }

                    //if (!rendererJob.labelsOnly && renderContext.renderTheme.HasMapBackgroundOutside())
                    //{
                    //	// blank out all areas outside of map
                    //	Rectangle insideArea = this.mapDatabase.BoundingBox.GetPositionRelativeToTile(renderContext.rendererJob.tile);
                    //	if (!rendererJob.hasAlpha)
                    //	{
                    //		//renderContext.canvasRasterer.FillOutsideAreas(renderContext.renderTheme.MapBackgroundOutside, insideArea);
                    //	}
                    //	else
                    //	{
                    //		//renderContext.canvasRasterer.FillOutsideAreas(Color.Transparent, insideArea);
                    //	}
                    //}

                    return(((SkiaCanvas)renderContext.canvasRasterer.Canvas).Image);
                }

                // Draws a bitmap just with outside colour, used for bitmaps outside of map area.
                if (!renderContext.rendererJob.hasAlpha)
                {
                    //renderContext.canvasRasterer.Fill(renderContext.renderTheme.MapBackgroundOutside);
                }

                return(((SkiaCanvas)renderContext.canvasRasterer.Canvas).Image);
            }
            finally
            {
                if (renderContext != null)
                {
                    renderContext.Destroy();
                }
            }
        }
Ejemplo n.º 15
0
 public void RenderWay(RenderContext renderContext, IPaint stroke, float dy, int level, PolylineContainer way)
 {
     renderContext.AddToCurrentDrawingLayer(level, new ShapePaintContainer(way, stroke, dy));
 }
Ejemplo n.º 16
0
        public void RenderPointOfInterestSymbol(RenderContext renderContext, Display display, int priority, IBitmap symbol, PointOfInterest poi)
        {
            Point poiPosition = MercatorProjection.GetPixelAbsolute(poi.Position, renderContext.rendererJob.tile.MapSize);

            renderContext.labels.Add(new SymbolContainer(poiPosition, display, priority, symbol));
        }
Ejemplo n.º 17
0
        public void RenderAreaSymbol(RenderContext renderContext, Display display, int priority, IBitmap symbol, PolylineContainer way)
        {
            Point centerPosition = way.CenterAbsolute;

            renderContext.labels.Add(new SymbolContainer(centerPosition, display, priority, symbol));
        }
Ejemplo n.º 18
0
        public void RenderPointOfInterestCaption(RenderContext renderContext, Display display, int priority, string caption, float horizontalOffset, float verticalOffset, IPaint fill, IPaint stroke, Position position, int maxTextWidth, PointOfInterest poi)
        {
            Point poiPosition = MercatorProjection.GetPixelAbsolute(poi.Position, renderContext.rendererJob.tile.MapSize);

            renderContext.labels.Add(this.graphicFactory.CreatePointTextContainer(poiPosition.Offset(horizontalOffset, verticalOffset), display, priority, caption, fill, stroke, null, position, maxTextWidth));
        }