diff --git a/pmc/sdl.cc b/pmc/sdl.cc new file mode 100644 --- /dev/null +++ b/pmc/sdl.cc @@ -0,0 +1,76 @@ +/*** + * + * $Id: sdl.cc,v 1.1.1.1 2008-04-28 17:33:22 mbroeker Exp $ + * $Source: /development/cpp/pmc/sdl.cc,v $ + * + */ + +#include + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define abs(a) (((a)<0) ? -(a) : (a)) +#define sign(a) (((a)<0) ? -1 : (a)>0 ? 1 : 0) + +void drawLine (SDL_Surface * s, int x1, int y1, int x2, int y2, Uint32 color) +{ + int d; + int x; + int y; + int ax; + int ay; + int sx; + int sy; + int dx; + int dy; + + Uint8 *lineAddr; + Sint32 yOffset; + + dx = x2 - x1; + ax = abs (dx) << 1; + sx = sign (dx); + + dy = y2 - y1; + ay = abs (dy) << 1; + sy = sign (dy); + yOffset = sy * s->pitch; + + x = x1; + y = y1; + + lineAddr = ((Uint8 *) s->pixels) + (y * s->pitch); + if (ax > ay) { /* x dominant */ + d = ay - (ax >> 1); + for (;;) { + *((Uint16 *) (lineAddr + (x << 1))) = (Uint16) color; + + if (x == x2) { + return; + } + if (d >= 0) { + y += sy; + lineAddr += yOffset; + d -= ax; + } + x += sx; + d += ay; + } + } else { /* y dominant */ + d = ax - (ay >> 1); + for (;;) { + *((Uint16 *) (lineAddr + (x << 1))) = (Uint16) color; + + if (y == y2) { + return; + } + if (d >= 0) { + x += sx; + d -= ay; + } + y += sy; + lineAddr += yOffset; + d += ax; + } + } +}