Program: 11332
Project: 11332
Buggy source:
@Override public void doPaintTo(GlimpseContext context){
  super.doPaintTo(context);
  if (textRenderer == null)   return;
  GL3 gl3=context.getGL().getGL3();
  Axis1D axis=getAxis1D(context);
  GlimpseBounds bounds=getBounds(context);
  int width=bounds.getWidth();
  int height=bounds.getHeight();
  if (width == 0 || height == 0)   return;
  List<TimeStamp> tickTimes=handler.tickTimes(axis,width);
  double tickInterval=handler.tickInterval(tickTimes);
  progLine.begin(gl3);
  try {
    pathLine.clear();
    for (    TimeStamp t : tickTimes) {
      float x=(float)fromTimeStamp(t);
      pathLine.moveTo(x,height);
      pathLine.lineTo(x,height - tickSize);
    }
    style.thickness_PX=tickLineWidth;
    style.rgba=tickColor;
    progLine.setViewport(gl3,bounds);
    progLine.setOrtho(gl3,(float)axis.getMin(),(float)axis.getMax(),-0.5f,height - 0.5f);
    progLine.draw(gl3,style,pathLine);
    if (showCurrentTimeLabel)     drawCurrentTimeTick(gl3,axis,width,height);
  }
  finally {
    progLine.end(gl3);
  }
  textRenderer.beginRendering(width,height);
  try {
    GlimpseColor.setColor(textRenderer,textColor);
    if (tickInterval <= Time.fromMinutes(1)) {
      double jTimeText=printTickLabels(tickTimes,axis,handler.getSecondMinuteFormat(),width,height);
      if (isShowDateLabels())       printHoverLabels(tickTimes,axis,handler.getHourDayMonthFormat(),handler.getHourStructFactory(),jTimeText,width,height);
    }
 else     if (tickInterval <= Time.fromHours(12)) {
      double jTimeText=printTickLabels(tickTimes,axis,handler.getHourMinuteFormat(),width,height);
      if (isShowDateLabels())       printHoverLabels(tickTimes,axis,handler.getDayMonthYearFormat(),handler.getDayStructFactory(),jTimeText,width,height);
    }
 else     if (tickInterval <= Time.fromDays(10)) {
      double jTimeText=printTickLabels(tickTimes,axis,handler.getDayFormat(),width,height);
      if (isShowDateLabels())       printHoverLabels(tickTimes,axis,handler.getMonthYearFormat(),handler.getMonthStructFactory(),jTimeText,width,height);
    }
 else     if (tickInterval <= Time.fromDays(60)) {
      double jTimeText=printTickLabels(tickTimes,axis,handler.getMonthFormat(),width,height);
      if (isShowDateLabels())       printHoverLabels(tickTimes,axis,handler.getYearFormat(),handler.getYearStructFactory(),jTimeText,width,height);
    }
 else {
      printTickLabels(tickTimes,axis,handler.getYearFormat(),width,height);
    }
  }
  finally {
    textRenderer.endRendering();
  }
}

Fixed version (ground truth):
@Override public void doPaintTo(GlimpseContext context){
  super.doPaintTo(context);
  if (textRenderer == null)   return;
  GL3 gl3=context.getGL().getGL3();
  Axis1D axis=getAxis1D(context);
  GlimpseBounds bounds=getBounds(context);
  int width=bounds.getWidth();
  int height=bounds.getHeight();
  if (width == 0 || height == 0)   return;
  List<TimeStamp> tickTimes=handler.getTickPositions(axis,width);
  progLine.begin(gl3);
  try {
    pathLine.clear();
    for (    TimeStamp t : tickTimes) {
      float x=(float)fromTimeStamp(t);
      pathLine.moveTo(x,height);
      pathLine.lineTo(x,height - tickSize);
    }
    style.thickness_PX=tickLineWidth;
    style.rgba=tickColor;
    progLine.setViewport(gl3,bounds);
    progLine.setOrtho(gl3,(float)axis.getMin(),(float)axis.getMax(),-0.5f,height - 0.5f);
    progLine.draw(gl3,style,pathLine);
    if (showCurrentTimeLabel)     drawCurrentTimeTick(gl3,axis,width,height);
  }
  finally {
    progLine.end(gl3);
  }
  List<String> tickLabels=handler.getTickLabels(axis,tickTimes);
  textRenderer.beginRendering(width,height);
  try {
    double jTimeText=printTickLabels(tickLabels,tickTimes,axis,width,height);
    if (isShowDateLabels())     printHoverLabels(tickTimes,axis,jTimeText,width,height);
  }
  finally {
    textRenderer.endRendering();
  }
}