import java.awt.Color;

public class OutlineTriDrawer extends TriangleDrawer {

  public OutlineTriDrawer(Vertex2D v0, Vertex2D v1, Vertex2D v2) {
    super(v0, v1, v2);
  }
  
  public void draw(Raster r) {
    r.setPixel(v0.argb, (int) v0.x, (int) v0.y);
    r.setPixel(v1.argb, (int) v1.x, (int) v1.y);
    r.setPixel(v2.argb, (int) v2.x, (int) v2.y);
 
    lineFast((int) v0.x, (int)v0.y, (int)v1.x, (int)v1.y, 
	     new Color(v0.argb), r);
    lineFast((int)v1.x, (int)v1.y, (int)v2.x, (int)v2.y, 
	     new Color(v1.argb), r);
    lineFast((int)v2.x, (int)v2.y, (int)v0.x, (int)v0.y, 
	     new Color(v2.argb), r);
  }


  /** Implementation of Bresenham's line-drawing algorithm copied from
      6.837 Lecture 5, Slide 20 
  */
  private void lineFast(int x0, int y0, int x1, int y1, 
		       Color color, Raster raster) {
    int pix = color.getRGB();
    int dy = y1 - y0;
    int dx = x1 - x0;
    int stepx, stepy;
    if (dy < 0) { dy = -dy;  stepy = -raster.width; } else { stepy = raster.width; }
    if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
    dy <<= 1;
    dx <<= 1;
    y0 *= raster.width;
    y1 *= raster.width;
    raster.pixel[x0+y0] = pix;
    if (dx > dy) {
      int fraction = dy - (dx >> 1);
      while (x0 != x1) {
	if (fraction >= 0) {
	  y0 += stepy;
	  fraction -= dx;
	}
	x0 += stepx;
	fraction += dy;
	raster.pixel[x0+y0] = pix;
      }
    } else {
      int fraction = dx - (dy >> 1);
      while (y0 != y1) {
	if (fraction >= 0) {
	  x0 += stepx;
	  fraction -= dy;
	}
	y0 += stepy;
	fraction += dx;
	raster.pixel[x0+y0] = pix;
      }
    }
  }

}
