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(JobRequest job) async {
var session = PerformanceProfiler().startSession(category: "DatastoreRenderer.executeJob");
// 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
RenderthemeZoomlevel renderthemeLevel = rendertheme.prepareZoomlevel(job.tile.zoomLevel);
session.checkpoint("after prepareZoomlevel");
_datastoreReader ??= await IsolateDatastoreReader.create(datastore);
LayerContainerCollection? layerContainerCollection = await _datastoreReader!.read(job.tile, renderthemeLevel);
//timing.lap(100, "RenderContext ${renderContext} created");
if (layerContainerCollection == null) {
return JobResult.unsupported();
}
UiCanvas canvas = UiCanvas.forRecorder(MapsforgeSettingsMgr().tileSize, MapsforgeSettingsMgr().tileSize);
PixelProjection projection = PixelProjection(job.tile.zoomLevel);
Mappoint leftUpper = projection.getLeftUpper(job.tile);
UiRenderContext renderContext = UiRenderContext(canvas: canvas, reference: leftUpper, projection: projection);
await PainterFactory().initDrawingLayers(layerContainerCollection.drawings);
for (RenderInfo renderInfo in layerContainerCollection.drawings.renderInfos) {
renderInfo.render(renderContext);
}
await PainterFactory().initDrawingLayers(layerContainerCollection.clashingInfoCollection);
for (RenderInfo renderInfo in layerContainerCollection.clashingInfoCollection.renderInfos) {
renderInfo.render(renderContext);
}
if (useSeparateLabelLayer) {
// Returning the canvas with the map but without labels onto it. The labels have to be drawn directly into the view.
layerContainerCollection.labels.clear();
} else {
// rendering the labels directly into the canvas. Rotation of labels if the map rotates is not supported in this case.
layerContainerCollection.labels.collisionFreeOrdered();
_processLabels(renderContext, layerContainerCollection.labels, job.tile);
await PainterFactory().initDrawingLayers(layerContainerCollection.labels);
for (RenderInfo renderInfo in layerContainerCollection.labels.renderInfos) {
renderInfo.render(renderContext);
}
}
session.checkpoint("data read and prepared");
TilePicture? picture = await canvas.finalizeBitmap();
canvas.dispose();
session.complete();
//_log.info("Executing ${job.toString()} returns ${bitmap.toString()}");
//_log.info("ways: ${mapReadResult.ways.length}, Areas: ${Area.count}, ShapePaintPolylineContainer: ${ShapePaintPolylineContainer.count}");
return JobResult.normal(picture, layerContainerCollection.labels);
}