1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-12-22 17:49:43 +01:00

Add inbounds pixel assertion to DrawPixel/ReadPixel

I was running the game through Valgrind and I noticed a memory error
where the game was attempting to read a pixel that was just outside the
image. Since this is an error that doesn't immediately result in a
segfault, I figured that it would be prudent to put in an assertion to
make it loud and clear that a memory error is, in fact, happening here.

Similarly, drawing to a pixel just outside the surface wouldn't result
in a crash, so I copy-pasted the check there too (with changes).
This commit is contained in:
Misa 2023-12-29 11:34:16 -08:00
parent e1e5e43089
commit 6f435661e7

View file

@ -81,6 +81,20 @@ SDL_Surface* GetSubSurface( SDL_Surface* metaSurface, int x, int y, int width, i
void DrawPixel(SDL_Surface* surface, const int x, const int y, const SDL_Color color) void DrawPixel(SDL_Surface* surface, const int x, const int y, const SDL_Color color)
{ {
const SDL_Point point = {x, y};
const SDL_Rect rect = {0, 0, surface->w, surface->h};
const bool inbounds = SDL_PointInRect(&point, &rect);
if (!inbounds)
{
WHINE_ONCE_ARGS((
"Pixel draw is not inbounds: "
"Attempted to draw to %i,%i in %ix%i surface",
x, y, surface->w, surface->h
));
SDL_assert(0 && "Pixel draw is not inbounds!");
return;
}
const SDL_PixelFormat* fmt = surface->format; const SDL_PixelFormat* fmt = surface->format;
const int bpp = fmt->BytesPerPixel; const int bpp = fmt->BytesPerPixel;
Uint32* pixel = (Uint32*) ((Uint8*) surface->pixels + y * surface->pitch + x * bpp); Uint32* pixel = (Uint32*) ((Uint8*) surface->pixels + y * surface->pitch + x * bpp);
@ -100,10 +114,24 @@ void DrawPixel(SDL_Surface* surface, const int x, const int y, const SDL_Color c
SDL_Color ReadPixel(const SDL_Surface* surface, const int x, const int y) SDL_Color ReadPixel(const SDL_Surface* surface, const int x, const int y)
{ {
SDL_Color color = {0, 0, 0, 0};
const SDL_Point point = {x, y};
const SDL_Rect rect = {0, 0, surface->w, surface->h};
const bool inbounds = SDL_PointInRect(&point, &rect);
if (!inbounds)
{
WHINE_ONCE_ARGS((
"Pixel read is not inbounds: "
"Attempted to read %i,%i in %ix%i surface",
x, y, surface->w, surface->h
));
SDL_assert(0 && "Pixel read is not inbounds!");
return color;
}
const SDL_PixelFormat* fmt = surface->format; const SDL_PixelFormat* fmt = surface->format;
const int bpp = surface->format->BytesPerPixel; const int bpp = surface->format->BytesPerPixel;
const Uint32* pixel = (Uint32*) ((Uint8*) surface->pixels + y * surface->pitch + x * bpp); const Uint32* pixel = (Uint32*) ((Uint8*) surface->pixels + y * surface->pitch + x * bpp);
SDL_Color color = {0, 0, 0, 0};
switch (bpp) switch (bpp)
{ {