executeJob method
Executes a given job and returns a future with the bitmap of this job. @returns null if the datastore does not support the requested tile @returns the Bitmap for the requested tile
Implementation
@override
Future<JobResult> executeJob(Job job) async {
Timing timing = Timing(log: _log, active: true, prefix: "${job.tile.toString()} ");
// current performance measurements for isolates indicates that isolates are too slow so it makes no sense to use them currently. Seems
// we need something like 600ms to start an isolate whereas the whole read-process just needs about 200ms
RenderthemeLevel renderthemeLevel = this.renderTheme.prepareZoomlevel(job.tile.zoomLevel);
timing.lap(100, "$renderthemeLevel prepareZoomlevel");
RenderContext? renderContext = await _datastoreReader.read(datastore, job.tile, renderthemeLevel, renderTheme.levels);
//timing.lap(100, "RenderContext ${renderContext} created");
if (renderContext == null) {
TilePicture bmp = await createNoDataBitmap(MapsforgeConstants().tileSize);
return JobResult(bmp, JOBRESULT.UNSUPPORTED);
}
await renderContext.initDrawingLayers(symbolCache);
//renderContext.statistics();
CanvasRasterer canvasRasterer = CanvasRasterer(MapsforgeConstants().tileSize, MapsforgeConstants().tileSize, "MapDatastoreRenderer ${job.tile.toString()}");
canvasRasterer.startCanvasBitmap();
Mappoint leftUpper = renderContext.projection.getLeftUpper(renderContext.upperLeft);
//canvasRasterer.canvas.translate(-leftUpper.x, -leftUpper.y);
canvasRasterer.drawWays(renderContext, leftUpper);
List<RenderInfo> renderInfos = LayerUtil.collisionFreeOrdered(renderContext.labels, renderContext.projection);
renderContext.labels.clear();
renderContext.labels.addAll(renderInfos);
for (List<RenderInfo> wayList in renderContext.clashDrawingLayer.ways) {
List<RenderInfo> renderInfos = LayerUtil.collisionFreeOrdered(wayList, renderContext.projection);
wayList.clear();
wayList.addAll(renderInfos);
}
int labelCount = 0;
if (this.renderLabels) {
_LabelResult labelResult = _processLabels(renderContext);
labelCount = labelResult.labelsToDisposeAfterDrawing.length + labelResult.labelsForNeighbours.length;
//_log.info("Labels to draw: $labelsToDraw");
// now draw the ways and the labels
canvasRasterer.drawMapElements(labelResult.labelsForNeighbours, renderContext.projection, leftUpper, job.tile);
canvasRasterer.drawMapElements(labelResult.labelsToDisposeAfterDrawing, renderContext.projection, leftUpper, job.tile);
// labelsToDraw.forEach((element) {
// _log.info(
// " $element, ${element.boundaryAbsolute!.intersects(renderContext.projection.boundaryAbsolute(job.tile)) ? "intersects" : "non-intersects"}");
// });
}
timing.lap(100, "RenderContext ${renderContext} final");
TilePicture? picture = await canvasRasterer.finalizeCanvasBitmap();
canvasRasterer.destroy();
timing.done(100, "RenderContext ${renderContext} , $labelCount labels, ${canvasRasterer} completed");
//_log.info("Executing ${job.toString()} returns ${bitmap.toString()}");
//_log.info("ways: ${mapReadResult.ways.length}, Areas: ${Area.count}, ShapePaintPolylineContainer: ${ShapePaintPolylineContainer.count}");
return JobResult(picture, JOBRESULT.NORMAL, renderContext.labels);
}