private void drawMarker(final GanttRenderingData data) {
   final int markerX = ruler.toScreen(data.getMarker()) + data.getBounds().x / 2;
   if (markerX < ruler.min()) {
     return;
   }
   data.getGraphics()
       .drawString(
           TimeFormat.format(data.getFormatString(), data.getMarker()),
           markerX + LABEL_OFFSET_X,
           (int) (LANE_HEIGHT * VERIFCAL_MARKER_ADJUST + LEGEND_HEIGHT),
           true);
   data.getGraphics()
       .drawLine(
           markerX, LANE_HEIGHT + LEGEND_HEIGHT, markerX, LANE_START + lanes.size() * LANE_HEIGHT);
 }
 private void drawDurations(final GanttRenderingData data, final GanttDraw ganttDrawData) {
   colorByTypeMap.clear();
   for (final IDuration d : data.getDurations()) {
     drawDurationItem(data, d, ganttDrawData);
     if (d.contains(data.getMarker())) {
       data.setMarkerAt(d);
     }
   }
 }
  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));
    }
  }