/** * Sierra's Bresenham line drawing. * WARNING: Do not replace this with Graphics::drawLine(), as this causes issues * with flood fill, due to small difference in the Bresenham logic. */ void GfxScreen::drawLine(Common::Point startPoint, Common::Point endPoint, byte color, byte priority, byte control) { int16 maxWidth = _width - 1; int16 maxHeight = _height - 1; // we need to clip values here, lsl3 room 620 background picture draws a line from 0, 199 t 320, 199 // otherwise we would get heap corruption. int16 left = CLIP<int16>(startPoint.x, 0, maxWidth); int16 top = CLIP<int16>(startPoint.y, 0, maxHeight); int16 right = CLIP<int16>(endPoint.x, 0, maxWidth); int16 bottom = CLIP<int16>(endPoint.y, 0, maxHeight); //set_drawing_flag byte drawMask = getDrawingMask(color, priority, control); // horizontal line if (top == bottom) { if (right < left) SWAP(right, left); for (int i = left; i <= right; i++) putPixel(i, top, drawMask, color, priority, control); return; } // vertical line if (left == right) { if (top > bottom) SWAP(top, bottom); for (int i = top; i <= bottom; i++) putPixel(left, i, drawMask, color, priority, control); return; } // sloped line - draw with Bresenham algorithm int dy = bottom - top; int dx = right - left; int stepy = dy < 0 ? -1 : 1; int stepx = dx < 0 ? -1 : 1; dy = ABS(dy) << 1; dx = ABS(dx) << 1; // setting the 1st and last pixel putPixel(left, top, drawMask, color, priority, control); putPixel(right, bottom, drawMask, color, priority, control); // drawing the line if (dx > dy) { // going horizontal int fraction = dy - (dx >> 1); while (left != right) { if (fraction >= 0) { top += stepy; fraction -= dx; } left += stepx; fraction += dy; putPixel(left, top, drawMask, color, priority, control); } } else { // going vertical
/** * Sierra's Bresenham line drawing. * WARNING: Do not replace this with Graphics::drawLine(), as this causes issues * with flood fill, due to small difference in the Bresenham logic. */ void GfxScreen::drawLine(Common::Point startPoint, Common::Point endPoint, byte color, byte priority, byte control) { int16 left = startPoint.x; int16 top = startPoint.y; int16 right = endPoint.x; int16 bottom = endPoint.y; //set_drawing_flag byte drawMask = getDrawingMask(color, priority, control); // horizontal line if (top == bottom) { if (right < left) SWAP(right, left); for (int i = left; i <= right; i++) putPixel(i, top, drawMask, color, priority, control); return; } // vertical line if (left == right) { if (top > bottom) SWAP(top, bottom); for (int i = top; i <= bottom; i++) putPixel(left, i, drawMask, color, priority, control); return; } // sloped line - draw with Bresenham algorithm int dy = bottom - top; int dx = right - left; int stepy = dy < 0 ? -1 : 1; int stepx = dx < 0 ? -1 : 1; dy = ABS(dy) << 1; dx = ABS(dx) << 1; // setting the 1st and last pixel putPixel(left, top, drawMask, color, priority, control); putPixel(right, bottom, drawMask, color, priority, control); // drawing the line if (dx > dy) { // going horizontal int fraction = dy - (dx >> 1); while (left != right) { if (fraction >= 0) { top += stepy; fraction -= dx; } left += stepx; fraction += dy; putPixel(left, top, drawMask, color, priority, control); } } else { // going vertical