diff --git a/pmc/surface.cc b/pmc/surface.cc --- a/pmc/surface.cc +++ b/pmc/surface.cc @@ -19,9 +19,12 @@ SDL_Init (SDL_INIT_VIDEO); screen = SDL_SetVideoMode (width, height, depth, SDL_HWSURFACE); red = SDL_MapRGB (screen->format, 0xff, 0x00, 0x00); + green = SDL_MapRGB (screen->format, 0x00, 0xff, 0x00); + blue = SDL_MapRGB (screen->format, 0x00, 0x00, 0xff); black = SDL_MapRGB (screen->format, 0x00, 0x00, 0x00); color = red; + bpp = screen->format->BytesPerPixel; } Surface::~Surface () @@ -31,13 +34,19 @@ void Surface::drawPixel (int x, int y) { + if (x < 0 || y < 0) + return; + + if (x > width || y > height) + return; + if (SDL_MUSTLOCK (screen)) { if (SDL_LockSurface (screen) < 0) { return; } } - switch (screen->format->BytesPerPixel) { + switch (bpp) { case 1:{ /* vermutlich 8 Bit */ Uint8 *bufp; @@ -96,18 +105,6 @@ int dx; int dy; - Uint8 *lineAddr; - Sint32 yOffset; - - /* - * SANITY CHECK: fix segfault in *((Uint16 *) (lineAddr + (x << 1))) = (Uint16) color; - */ - if (y1 < 0 || y2 < 0) - return; - - if (x1 < 0 || x2 < 0) - return; - dx = x2 - x1; ax = abs (dx) << 1; sx = sign (dx); @@ -115,23 +112,20 @@ dy = y2 - y1; ay = abs (dy) << 1; sy = sign (dy); - yOffset = sy * screen->pitch; x = x1; y = y1; - lineAddr = ((Uint8 *) screen->pixels) + (y * screen->pitch); if (ax > ay) { /* x dominant */ d = ay - (ax >> 1); for (;;) { - *((Uint16 *) (lineAddr + (x << 1))) = (Uint16) color; + drawPixel (x, y); if (x == x2) { return; } if (d >= 0) { y += sy; - lineAddr += yOffset; d -= ax; } x += sx; @@ -140,7 +134,7 @@ } else { /* y dominant */ d = ax - (ay >> 1); for (;;) { - *((Uint16 *) (lineAddr + (x << 1))) = (Uint16) color; + drawPixel (x, y); if (y == y2) { return; @@ -150,7 +144,6 @@ d -= ay; } y += sy; - lineAddr += yOffset; d += ax; } } @@ -170,5 +163,13 @@ case RED: color = red; break; + case GREEN: + color = green; + break; + case BLUE: + color = blue; + break; + default: + color = red; }; }