executeJob method

  1. @override
Future<JobResult> executeJob(
  1. Job 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(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);
}