public void lineTwoStep(int x0, int y0, int x1, int y1, Color color) { int pix = color.getRGB(); int dy = y1 - y0; int dx = x1 - x0; int stepx, stepy; if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } raster.setPixel(pix, x0, y0); raster.setPixel(pix, x1, y1); if (dx > dy) { int length = (dx - 1) >> 2; int extras = (dx - 1) & 3; int incr2 = (dy << 2) - (dx << 1); if (incr2 < 0) { int c = dy << 1; int incr1 = c << 1; int d = incr1 - dx; for (int i = 0; i < length; i++) { x0 += stepx; x1 -= stepx; if (d < 0) { // Pattern: raster.setPixel(pix, x0, y0); // raster.setPixel(pix, x0 += stepx, y0); // x o o raster.setPixel(pix, x1, y1); // raster.setPixel(pix, x1 -= stepx, y1); d += incr1; } else { if (d < c) { // Pattern: raster.setPixel(pix, x0, y0); // o raster.setPixel(pix, x0 += stepx, y0 += stepy); // x o raster.setPixel(pix, x1, y1); // raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } else { raster.setPixel(pix, x0, y0 += stepy); // Pattern: raster.setPixel(pix, x0 += stepx, y0); // o o raster.setPixel(pix, x1, y1 -= stepy); // x raster.setPixel(pix, x1 -= stepx, y1); // } d += incr2; } } if (extras > 0) { if (d < 0) { raster.setPixel(pix, x0 += stepx, y0); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1); } else if (d < c) { raster.setPixel(pix, x0 += stepx, y0); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1); } else { raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } } } else { int c = (dy - dx) << 1; int incr1 = c << 1; int d = incr1 + dx; for (int i = 0; i < length; i++) { x0 += stepx; x1 -= stepx; if (d > 0) { raster.setPixel(pix, x0, y0 += stepy); // Pattern: raster.setPixel(pix, x0 += stepx, y0 += stepy); // o raster.setPixel(pix, x1, y1 -= stepy); // o raster.setPixel(pix, x1 -= stepx, y1 -= stepy); // x d += incr1; } else { if (d < c) { raster.setPixel(pix, x0, y0); // Pattern: raster.setPixel(pix, x0 += stepx, y0 += stepy); // o raster.setPixel(pix, x1, y1); // x o raster.setPixel(pix, x1 -= stepx, y1 -= stepy); // } else { raster.setPixel(pix, x0, y0 += stepy); // Pattern: raster.setPixel(pix, x0 += stepx, y0); // o o raster.setPixel(pix, x1, y1 -= stepy); // x raster.setPixel(pix, x1 -= stepx, y1); // } d += incr2; } } if (extras > 0) { if (d > 0) { raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } else if (d < c) { raster.setPixel(pix, x0 += stepx, y0); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1); } else { raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0); if (extras > 2) { if (d > c) raster.setPixel(pix, x1 -= stepx, y1 -= stepy); else raster.setPixel(pix, x1 -= stepx, y1); } } } } } else { int length = (dy - 1) >> 2; int extras = (dy - 1) & 3; int incr2 = (dx << 2) - (dy << 1); if (incr2 < 0) { int c = dx << 1; int incr1 = c << 1; int d = incr1 - dy; for (int i = 0; i < length; i++) { y0 += stepy; y1 -= stepy; if (d < 0) { raster.setPixel(pix, x0, y0); raster.setPixel(pix, x0, y0 += stepy); raster.setPixel(pix, x1, y1); raster.setPixel(pix, x1, y1 -= stepy); d += incr1; } else { if (d < c) { raster.setPixel(pix, x0, y0); raster.setPixel(pix, x0 += stepx, y0 += stepy); raster.setPixel(pix, x1, y1); raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } else { raster.setPixel(pix, x0 += stepx, y0); raster.setPixel(pix, x0, y0 += stepy); raster.setPixel(pix, x1 -= stepx, y1); raster.setPixel(pix, x1, y1 -= stepy); } d += incr2; } } if (extras > 0) { if (d < 0) { raster.setPixel(pix, x0, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1, y1 -= stepy); } else if (d < c) { raster.setPixel(pix, stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1, y1 -= stepy); } else { raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } } } else { int c = (dx - dy) << 1; int incr1 = c << 1; int d = incr1 + dy; for (int i = 0; i < length; i++) { y0 += stepy; y1 -= stepy; if (d > 0) { raster.setPixel(pix, x0 += stepx, y0); raster.setPixel(pix, x0 += stepx, y0 += stepy); raster.setPixel(pix, x1 -= stepy, y1); raster.setPixel(pix, x1 -= stepx, y1 -= stepy); d += incr1; } else { if (d < c) { raster.setPixel(pix, x0, y0); raster.setPixel(pix, x0 += stepx, y0 += stepy); raster.setPixel(pix, x1, y1); raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } else { raster.setPixel(pix, x0 += stepx, y0); raster.setPixel(pix, x0, y0 += stepy); raster.setPixel(pix, x1 -= stepx, y1); raster.setPixel(pix, x1, y1 -= stepy); } d += incr2; } } if (extras > 0) { if (d > 0) { raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1 -= stepx, y1 -= stepy); } else if (d < c) { raster.setPixel(pix, x0, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 2) raster.setPixel(pix, x1, y1 -= stepy); } else { raster.setPixel(pix, x0 += stepx, y0 += stepy); if (extras > 1) raster.setPixel(pix, x0, y0 += stepy); if (extras > 2) { if (d > c) raster.setPixel(pix, x1 -= stepx, y1 -= stepy); else raster.setPixel(pix, x1, y1 -= stepy); } } } } } }