private IDrawableRuler computeScaler(final GanttRenderingData data) {
    final Rectangle dataScreenArea = getDataArea(data);
    if (data.isLog()) {
      List<Span> spans = new ArrayList<Span>(Span.valueOfDurations(data.getDurations()));

      if (data.getDurations().size() > 0) {
        ITaskDuration first = data.getDurations().get(0);
        ITaskDuration last = data.getDurations().get(data.getDurations().size() - 1);
        Span emptyBefore = Span.valueOf(data.getLogspan().getStart(), first.getStartTime());
        spans.add(0, emptyBefore);

        Span emptyAfter =
            Span.valueOf(last.getStartTime() + last.getDurationTime(), data.getLogspan().getEnd());
        spans.add(emptyAfter);
      }
      return new FixedMidPointRuler(
          dataScreenArea.x, dataScreenArea.width, data.getTransform(), data.getMarker(), spans);

    } else {
      long firstDuration = data.getLogspan().getStart();
      long lastDuration = 0;

      if (data.getMarker() <= 0) {
        lastDuration = (long) (firstDuration + ((TIME_RANGE / data.getZoomLevel()) / 2));
      } else {
        firstDuration = (long) (data.getMarker() - ((TIME_RANGE / data.getZoomLevel()) / 2));
        if (firstDuration < 0) {
          firstDuration = data.getLogspan().getStart();
        }
        lastDuration = (long) (data.getMarker() + ((TIME_RANGE / data.getZoomLevel()) / 2));
      }

      return new SimpleLinearScaleRuler(
          data.getMarker(),
          Span.valueOf(firstDuration, lastDuration),
          Span.valueOf(dataScreenArea.x, dataScreenArea.width));
    }
  }