executeJob method

  1. @override
Future<JobResult> executeJob(
  1. JobRequest job
)
override

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