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

  RenderContext? renderContext;
  if (useIsolate) {
    renderContext = await FlutterIsolateInstance.isolateCompute(
        DatastoreReaderIsolate.read,
        DatastoreReaderIsolateRequest(
            datastore, job.tile, renderthemeLevel, renderTheme.levels));
  } else {
    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);
  timing.lap(100, "RenderContext ${renderContext}  initialized");
  //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);
  timing.lap(200, "startCanvasBitmap");
  canvasRasterer.drawWays(renderContext, leftUpper);
  timing.lap(100, "${renderContext.drawingLayers.length} way-layers");

  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);
    // labelResult.labelsToDisposeAfterDrawing.forEach((element) {
    //   element.dispose();
    // });
    timing.lap(200, "$labelCount labels");
    // labelsToDraw.forEach((element) {
    //   _log.info(
    //       "  $element, ${element.boundaryAbsolute!.intersects(renderContext.projection.boundaryAbsolute(job.tile)) ? "intersects" : "non-intersects"}");
    // });
  } else {
    // this.labelStore.storeMapItems(
    //     job.tile, renderContext.labels, renderContext.projection);
    timing.lap(200, "storeMapItems");
  }
//    if (!job.labelsOnly && renderContext.renderTheme.hasMapBackgroundOutside()) {
//      // blank out all areas outside of map
//      Rectangle insideArea = this.mapDataStore.boundingBox().getPositionRelativeToTile(job.tile);
//      if (!job.hasAlpha) {
//        renderContext.canvasRasterer.fillOutsideAreas(renderContext.renderTheme.getMapBackgroundOutside(), insideArea);
//      } else {
//        renderContext.canvasRasterer.fillOutsideAreas(Color.TRANSPARENT, insideArea);
//      }
//    }
  TilePicture? picture = await canvasRasterer.finalizeCanvasBitmap();
  canvasRasterer.destroy();
  timing.lap(100,
      "RenderContext ${renderContext} , $labelCount labels, ${canvasRasterer.canvas.debugAction()}");
  //_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);
}