void draw_line_rgb(int x0, int y0, int x1, int y1, DrawColor color, DrawImage* img) { int xs; int ys; int dx = x1-x0; if (dx < 0) { dx = -dx; xs = -1; } else xs = 1; int dy = y1-y0; if (dy < 0) { dy = -dy; ys = -1; } else ys = 1; int n = (dx > dy) ? dx : dy; if (dx == 0) { for (int i = 0; i < dy; i++) { draw_point_rgb(x0, y0, color, img); y0 += ys; } } else if (dy == 0) { draw_hline_rgb(x0, y0, x1, color, img); } else if (dx > dy) { n = dx; dy += dy; int e = dy - dx; dx += dx; for(int i = 0; i < n; i++) { draw_point_rgb(x0, y0, color, img); if (e >= 0) { y0 += ys; e -= dx; } e += dy; x0 += xs; } } else { n = dy; dx += dx; int e = dx - dy; dy += dy; for(int i = 0; i < n; i++) { draw_point_rgb(x0, y0, color, img); if (e >= 0) { x0 += xs; e -= dy; } e += dx; y0 += ys; } } }
void draw_line_rgb(uint8_t *img, int x0, int y0, int x1, int y1, uint32_t color, int w, int h, int rowstride) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ dx = x1-x0; if (dx < 0) dx = -dx, xs = -1; else xs = 1; dy = y1-y0; if (dy < 0) dy = -dy, ys = -1; else ys = 1; n = (dx > dy) ? dx : dy; if (dx == 0) { /* vertical */ for (i = 0; i < dy; i++) { draw_point_rgb(img, x0, y0, color, w, h, rowstride); y0 += ys; } } else if (dy == 0) { /* horizontal */ draw_hline_rgb(img, x0, y0, x1, color, w, h, rowstride); } else if (dx > dy) { /* bresenham, horizontal slope */ n = dx; dy += dy; e = dy - dx; dx += dx; for (i = 0; i < n; i++) { draw_point_rgb(img, x0, y0, color, w, h, rowstride); if (e >= 0) { y0 += ys; e -= dx; } e += dy; x0 += xs; } } else { /* bresenham, vertical slope */ n = dy; dx += dx; e = dx - dy; dy += dy; for (i = 0; i < n; i++) { draw_point_rgb(img, x0, y0, color, w, h, rowstride); if (e >= 0) { x0 += xs; e -= dy; } e += dx; y0 += ys; } } }