Program: 76093
Project: 76093
Buggy source:
void _zoom(int x,int y){
  _zooming=false;
  Graphics graphics=getGraphics();
  if (graphics == null)   return;
  boolean handled=false;
  if ((_zoomin == true) && (_drawn == true)) {
    if (_zoomxn != -1 || _zoomyn != -1) {
      int minx=Math.min(_zoomx,_zoomxn);
      int maxx=Math.max(_zoomx,_zoomxn);
      int miny=Math.min(_zoomy,_zoomyn);
      int maxy=Math.max(_zoomy,_zoomyn);
      graphics.setXORMode(_boxColor);
      graphics.drawRect(minx,miny,maxx - minx,maxy - miny);
      graphics.setPaintMode();
      if (y > _lry)       y=_lry;
      if (y < _uly)       y=_uly;
      if (x > _lrx)       x=_lrx;
      if (x < _ulx)       x=_ulx;
      if ((Math.abs(_zoomx - x) > 5) && (Math.abs(_zoomy - y) > 5)) {
        double a=_xMin + (_zoomx - _ulx) / _xscale;
        double b=_xMin + (x - _ulx) / _xscale;
        if (a < b)         _setXRange(a,b);
 else         _setXRange(b,a);
        a=_yMax - (_zoomy - _uly) / _yscale;
        b=_yMax - (y - _uly) / _yscale;
        if (a < b)         setYRange(a,b);
 else         setYRange(b,a);
      }
      repaint();
      handled=true;
    }
  }
 else   if ((_zoomout == true) && (_drawn == true)) {
    graphics.setXORMode(_boxColor);
    int x_diff=Math.abs(_zoomx - _zoomxn);
    int y_diff=Math.abs(_zoomy - _zoomyn);
    graphics.drawRect(_zoomx - 15 - x_diff,_zoomy - 15 - y_diff,30 + x_diff * 2,30 + y_diff * 2);
    graphics.setPaintMode();
    double a=(double)(Math.abs(_zoomx - x)) / 30.0;
    double b=(double)(Math.abs(_zoomy - y)) / 30.0;
    double newx1=_xMax + (_xMax - _xMin) * a;
    double newx2=_xMin - (_xMax - _xMin) * a;
    double newy1=_yMax + (_yMax - _yMin) * b;
    double newy2=_yMin - (_yMax - _yMin) * b;
    zoom(newx2,newy2,newx1,newy1);
    handled=true;
  }
 else   if (_drawn == false) {
    repaint();
    handled=true;
  }
  _drawn=false;
  _zoomin=_zoomout=false;
  _zoomxn=_zoomyn=_zoomx=_zoomy=-1;
}

Fixed version (ground truth):
void _zoom(int x,int y){
  _zooming=false;
  Graphics graphics=getGraphics();
  if (graphics == null)   return;
  boolean handled=false;
  if ((_zoomin == true) && (_drawn == true)) {
    if (_zoomxn != -1 || _zoomyn != -1) {
      int minx=Math.min(_zoomx,_zoomxn);
      int maxx=Math.max(_zoomx,_zoomxn);
      int miny=Math.min(_zoomy,_zoomyn);
      int maxy=Math.max(_zoomy,_zoomyn);
      graphics.setXORMode(_boxColor);
      graphics.drawRect(minx,miny,maxx - minx,maxy - miny);
      graphics.setPaintMode();
      if (y > _lry)       y=_lry;
      if (y < _uly)       y=_uly;
      if (x > _lrx)       x=_lrx;
      if (x < _ulx)       x=_ulx;
      if ((Math.abs(_zoomx - x) > 5) && (Math.abs(_zoomy - y) > 5)) {
        double a=_xMin + (_zoomx - _ulx) / _xscale;
        double b=_xMin + (x - _ulx) / _xscale;
        if (a < b)         setXRange(a,b);
 else         setXRange(b,a);
        a=_yMax - (_zoomy - _uly) / _yscale;
        b=_yMax - (y - _uly) / _yscale;
        if (a < b)         setYRange(a,b);
 else         setYRange(b,a);
      }
      repaint();
      handled=true;
    }
  }
 else   if ((_zoomout == true) && (_drawn == true)) {
    graphics.setXORMode(_boxColor);
    int x_diff=Math.abs(_zoomx - _zoomxn);
    int y_diff=Math.abs(_zoomy - _zoomyn);
    graphics.drawRect(_zoomx - 15 - x_diff,_zoomy - 15 - y_diff,30 + x_diff * 2,30 + y_diff * 2);
    graphics.setPaintMode();
    double a=(double)(Math.abs(_zoomx - x)) / 30.0;
    double b=(double)(Math.abs(_zoomy - y)) / 30.0;
    double newx1=_xMax + (_xMax - _xMin) * a;
    double newx2=_xMin - (_xMax - _xMin) * a;
    double newy1=_yMax + (_yMax - _yMin) * b;
    double newy2=_yMin - (_yMax - _yMin) * b;
    zoom(newx2,newy2,newx1,newy1);
    handled=true;
  }
 else   if (_drawn == false) {
    repaint();
    handled=true;
  }
  _drawn=false;
  _zoomin=_zoomout=false;
  _zoomxn=_zoomyn=_zoomx=_zoomy=-1;
}