On, Tue Apr 15, 2008, Lenard Lindstrom wrote: [...] Sounds like a memory access bug (24bpp once more, I think). Can you please give the attached patch a try? It just changes the precedences for 24bpp pixel assignments slightly. Regards Marcus
Index: src/pixelarray_methods.c =================================================================== --- src/pixelarray_methods.c (Revision 1216) +++ src/pixelarray_methods.c (Arbeitskopie) @@ -267,9 +267,8 @@ posx = 0; while (posx < array->xlen) { - px = (Uint8 *) (pixels + vy * newsurf->pitch) + vx * 3; - vpx = (Uint8 *) ((Uint8*) origpixels + y * array->padding) + - x * 3; + px = ((Uint8 *) (pixels + vy * newsurf->pitch) + vx * 3); + vpx = ((Uint8 *) (origpixels + y * array->padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = @@ -533,7 +532,7 @@ posx = 0; while (posx < array->xlen) { - px = (Uint8 *) (pixels + y * surface->pitch) + x * 3; + px = ((Uint8 *) (pixels + y * surface->pitch) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor = (px[0]) + (px[1] << 8) + (px[2] << 16); if (distance) @@ -750,7 +749,7 @@ posx = 0; while (posx < newarray->xlen) { - px = (Uint8 *) (pixels + y * surface->pitch) + x * 3; + px = ((Uint8 *) (pixels + y * surface->pitch) + x * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor = (px[0]) + (px[1] << 8) + (px[2] << 16); if (distance) @@ -1023,8 +1022,8 @@ posx = 0; while (posx < newarray->xlen) { - px1 = (Uint8 *) (pixels1 + y * surface1->pitch) + x * 3; - px2 = (Uint8 *) (pixels2 + vy * surface2->pitch) + vx * 3; + px1 = ((Uint8 *) (pixels1 + y * surface1->pitch) + x * 3); + px2 = ((Uint8 *) (pixels2 + vy * surface2->pitch) + vx * 3); #if SDL_BYTEORDER == SDL_LIL_ENDIAN pxcolor1 = (px1[0]) + (px1[1] << 8) + (px1[2] << 16); pxcolor2 = (px2[0]) + (px2[1] << 8) + (px2[2] << 16); Index: src/pixelarray.c =================================================================== --- src/pixelarray.c (Revision 1216) +++ src/pixelarray.c (Arbeitskopie) @@ -758,9 +758,8 @@ x = xstart; while (posx < xlen) { - px = (Uint8 *) (pixels + y * padding) + x * 3; - vpx = (Uint8 *) ((Uint8*) valpixels + vy * val->padding) + - vx * 3; + px = ((Uint8 *) (pixels + y * padding) + x * 3); + vpx = ((Uint8 *) (valpixels + vy * val->padding) + vx * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = @@ -958,7 +957,7 @@ while (posx < xlen) { color = *colorvals++; - px = (Uint8 *) (pixels + y * padding) + x * 3; + px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8); @@ -1094,7 +1093,7 @@ x = xstart; while (posx < xlen) { - px = (Uint8 *) (pixels + y * padding) + x * 3; + px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8); @@ -1253,7 +1252,7 @@ x = xstart; while (posx < xlen) { - px = (Uint8 *) (pixels + y * padding) + x * 3; + px = ((Uint8 *) (pixels + y * padding) + x * 3); #if (SDL_BYTEORDER == SDL_LIL_ENDIAN) *(px + (format->Rshift >> 3)) = (Uint8) (color >> 16); *(px + (format->Gshift >> 3)) = (Uint8) (color >> 8);
Attachment:
pgpXGirk5CeK4.pgp
Description: PGP signature