# HG changeset patch # User Sam Lantinga # Date 1229781259 0 # Node ID 1863c8b596583337b6330819e5bf62c0c4f7982a # Parent 67f84eb26ea1db4e99ab6b445c0a39c13ee3a99d Placeholder for line drawing algorithm (current code doesn't work) diff -r 67f84eb26ea1 -r 1863c8b59658 src/video/SDL_drawline.c --- a/src/video/SDL_drawline.c Sat Dec 20 13:53:54 2008 +0000 +++ b/src/video/SDL_drawline.c Sat Dec 20 13:54:19 2008 +0000 @@ -24,8 +24,62 @@ #include "SDL_video.h" #include "SDL_blit.h" +#define ABS(x) (x < 0 ? -x : x) -int +#define SWAP(x, y) (x ^= y ^= x ^= y) + +#define BRESENHAM(x0, y0, x1, y1, op, color) \ +{ \ + int deltax, deltay, steep, error, xstep, ystep, x, y; \ + \ + deltax = ABS(x1 - x0); \ + deltay = ABS(y1 - y0); \ + steep = deltay > deltax; \ + error = deltax / 2; \ + if (steep) { \ + SWAP(x0, y0); \ + SWAP(x1, y1); \ + } \ + y = y0; \ + if (x0 > x1) { \ + xstep = -1; \ + deltax = -deltax; \ + } else { \ + xstep = 1; \ + } \ + if (y0 < y1) { \ + ystep = 1; \ + } else { \ + ystep = -1; \ + } \ + if (!steep) { \ + for (x = x0; x != x1; x += xstep) { \ + op(x, y, color); \ + error -= deltay; \ + if (error < 0) { \ + y = y + ystep; \ + error += deltax; \ + } \ + } \ + } else { \ + for (x = x0; x != x1; x += xstep) { \ + op(y, x, color); \ + error -= deltay; \ + if (error < 0) { \ + y = y + ystep; \ + error += deltax; \ + } \ + } \ + } \ +} + +#define SETPIXEL(x, y, type, bpp, color) \ + *(type *)(dst->pixels + y * dst->pitch + x * bpp) = (type) color + +#define SETPIXEL1(x, y, color) SETPIXEL(x, y, Uint8, 1, color); +#define SETPIXEL2(x, y, color) SETPIXEL(x, y, Uint16, 2, color); +#define SETPIXEL4(x, y, color) SETPIXEL(x, y, Uint32, 4, color); + SDL_DrawLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color) { /* This function doesn't work on surfaces < 8 bpp */ @@ -41,8 +95,21 @@ } */ - SDL_Unsupported(); - return -1; + switch (dst->format->BytesPerPixel) { + case 1: + BRESENHAM(x1, y1, x2, y2, SETPIXEL1, color); + break; + case 2: + BRESENHAM(x1, y1, x2, y2, SETPIXEL2, color); + break; + case 3: + SDL_Unsupported(); + return -1; + case 4: + BRESENHAM(x1, y1, x2, y2, SETPIXEL4, color); + break; + } + return 0; } /* vi: set ts=4 sw=4 expandtab: */