Skip to content

Commit

Permalink
Patch a SDL texture issue making the game not playable
Browse files Browse the repository at this point in the history
Upstream issue: TurningWheel/Barony#580

SDL bisect done by Nam Nguyen to find which SDL change introduced the
texture issue in Barony.

Barony fix sent upstream by Sylvain Becker
TurningWheel/Barony#582

Patches for the port done by Nam Nguyen <namn at berkeley.edu>

thanks everyone for fixing this issue

ok sthen@ brynet@ and maintainer (David Carlier)
  • Loading branch information
rapenne-s authored and Aisha Tammy committed May 10, 2021
1 parent 0cea4c4 commit 6b339b1
Show file tree
Hide file tree
Showing 5 changed files with 251 additions and 1 deletion.
3 changes: 2 additions & 1 deletion games/barony/Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# $OpenBSD: Makefile,v 1.7 2020/10/04 11:38:58 solene Exp $
# $OpenBSD: Makefile,v 1.8 2021/04/11 13:17:41 solene Exp $

V = 3.3.7
COMMENT = 3D, first person roguelike
PKGNAME = ${DISTNAME:L}
CATEGORIES = games x11
REVISION = 0

GH_ACCOUNT = TurningWheel
GH_PROJECT = Barony
Expand Down
109 changes: 109 additions & 0 deletions games/barony/patches/patch-src_draw_cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
$OpenBSD: patch-src_draw_cpp,v 1.2 2021/04/11 13:17:41 solene Exp $

Use 'userdata' instead of 'refcount'. 'refcount' is a private SDL_Surface field.
Use 'imgref' and not 'imgref + 1'

see: https://github.com/TurningWheel/Barony/pull/582

Index: src/draw.cpp
--- src/draw.cpp.orig
+++ src/draw.cpp
@@ -443,7 +443,7 @@ void drawImageRotatedAlpha( SDL_Surface* image, SDL_Re
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
glColor4f(1, 1, 1, alpha / 255.1);
glBegin(GL_QUADS);
glTexCoord2f(1.0 * ((real_t)src->x / image->w), 1.0 * ((real_t)src->y / image->h));
@@ -492,7 +492,7 @@ void drawImageColor( SDL_Surface* image, SDL_Rect* src
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
real_t r = ((Uint8)(color >> mainsurface->format->Rshift)) / 255.f;
real_t g = ((Uint8)(color >> mainsurface->format->Gshift)) / 255.f;
real_t b = ((Uint8)(color >> mainsurface->format->Bshift)) / 255.f;
@@ -546,7 +546,7 @@ void drawImageAlpha( SDL_Surface* image, SDL_Rect* src
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
glColor4f(1, 1, 1, alpha / 255.1);
glPushMatrix();
glBegin(GL_QUADS);
@@ -596,7 +596,7 @@ void drawImage( SDL_Surface* image, SDL_Rect* src, SDL
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
glColor4f(1, 1, 1, 1);
glPushMatrix();
glBegin(GL_QUADS);
@@ -646,7 +646,7 @@ void drawImageRing(SDL_Surface* image, SDL_Rect* src,
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
glColor4f(1, 1, 1, alpha / 255.f);
glPushMatrix();

@@ -771,7 +771,7 @@ void drawImageScaled( SDL_Surface* image, SDL_Rect* sr
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
glColor4f(1, 1, 1, 1);
glPushMatrix();
glBegin(GL_QUADS);
@@ -826,7 +826,7 @@ void drawImageScaledPartial(SDL_Surface* image, SDL_Re
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
glColor4f(1, 1, 1, 1);
glPushMatrix();
glBegin(GL_QUADS);
@@ -889,7 +889,7 @@ void drawImageScaledColor(SDL_Surface* image, SDL_Rect
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
real_t r = ((Uint8)(color >> mainsurface->format->Rshift)) / 255.f;
real_t g = ((Uint8)(color >> mainsurface->format->Gshift)) / 255.f;
real_t b = ((Uint8)(color >> mainsurface->format->Bshift)) / 255.f;
@@ -985,7 +985,7 @@ void drawImageFancy( SDL_Surface* image, Uint32 color,
}

// draw a textured quad
- glBindTexture(GL_TEXTURE_2D, texid[image->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)image->userdata]);
real_t r = ((Uint8)(color >> mainsurface->format->Rshift)) / 255.f;
real_t g = ((Uint8)(color >> mainsurface->format->Gshift)) / 255.f;
real_t b = ((Uint8)(color >> mainsurface->format->Bshift)) / 255.f;
@@ -2186,7 +2186,7 @@ void drawWindowFancy(int x1, int y1, int x2, int y2)
glVertex2f(x2 - 1, yres - y1 - 1);
glEnd();
glColor3f(.75, .75, .75);
- glBindTexture(GL_TEXTURE_2D, texid[fancyWindow_bmp->refcount]); // wood texture
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)fancyWindow_bmp->userdata]); // wood texture
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(x1 + 2, yres - y1 - 2);
@@ -2322,7 +2322,7 @@ SDL_Rect ttfPrintTextColor( TTF_Font* font, int x, int
SDL_BlitSurface(textSurf, NULL, surf, &pos);
// load the text outline surface as a GL texture
allsurfaces[imgref] = surf;
- allsurfaces[imgref]->refcount = imgref;
+ allsurfaces[imgref]->userdata = (void*) imgref;
glLoadTexture(allsurfaces[imgref], imgref);
imgref++;
// store the surface in the text surface cache
19 changes: 19 additions & 0 deletions games/barony/patches/patch-src_files_cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
$OpenBSD: patch-src_files_cpp,v 1.1 2021/04/11 13:17:41 solene Exp $

Use 'userdata' instead of 'refcount'. 'refcount' is a private SDL_Surface field.
Use 'imgref' and not 'imgref + 1'

see: https://github.com/TurningWheel/Barony/pull/582

Index: src/files.cpp
--- src/files.cpp.orig
+++ src/files.cpp
@@ -591,7 +591,7 @@ SDL_Surface* loadImage(char const * const filename)

// load the new surface as a GL texture
allsurfaces[imgref] = newSurface;
- allsurfaces[imgref]->refcount = imgref + 1;
+ allsurfaces[imgref]->userdata = (void *)(imgref);
glLoadTexture(allsurfaces[imgref], imgref);

// free the translated surface
102 changes: 102 additions & 0 deletions games/barony/patches/patch-src_opengl_cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
$OpenBSD: patch-src_opengl_cpp,v 1.1 2021/04/11 13:17:41 solene Exp $

Use 'userdata' instead of 'refcount'. 'refcount' is a private SDL_Surface field.
Use 'imgref' and not 'imgref + 1'

see: https://github.com/TurningWheel/Barony/pull/582

Index: src/opengl.cpp
--- src/opengl.cpp.orig
+++ src/opengl.cpp
@@ -500,7 +500,7 @@ void glDrawSprite(view_t* camera, Entity* entity, int
}
if ( mode == REALCOLORS )
{
- glBindTexture(GL_TEXTURE_2D, texid[sprite->refcount]);
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)sprite->userdata]);
}
else
{
@@ -586,7 +586,7 @@ void glDrawSpriteFromImage(view_t* camera, Entity* ent
//int x, y;
real_t s = 1;
SDL_Surface* image = sprites[0];
- GLuint textureId = texid[sprites[0]->refcount];
+ GLuint textureId = texid[(long int)sprites[0]->userdata];
char textToRetrieve[128];

if ( text.compare("") == 0 )
@@ -603,7 +603,7 @@ void glDrawSpriteFromImage(view_t* camera, Entity* ent
textToRetrieve[std::min(static_cast<int>(strlen(text.c_str())), 22)] = '\0';
if ( (image = ttfTextHashRetrieve(ttfTextHash, textToRetrieve, ttf12, true)) != NULL )
{
- textureId = texid[image->refcount];
+ textureId = texid[(long int)image->userdata];
}
else
{
@@ -627,7 +627,7 @@ void glDrawSpriteFromImage(view_t* camera, Entity* ent
SDL_BlitSurface(textSurf, NULL, image, &pos);
// load the text outline surface as a GL texture
allsurfaces[imgref] = image;
- allsurfaces[imgref]->refcount = imgref;
+ allsurfaces[imgref]->userdata = (void *)((long int)imgref);
glLoadTexture(allsurfaces[imgref], imgref);
imgref++;
// store the surface in the text surface cache
@@ -635,7 +635,7 @@ void glDrawSpriteFromImage(view_t* camera, Entity* ent
{
printlog("warning: failed to store text outline surface with imgref %d\n", imgref - 1);
}
- textureId = texid[image->refcount];
+ textureId = texid[(long int)image->userdata];
}
// setup projection
glMatrixMode(GL_PROJECTION);
@@ -864,7 +864,7 @@ void glDrawWorld(view_t* camera, int mode)

// first (higher) sky layer
glColor4f(1.f, 1.f, 1.f, .5);
- glBindTexture(GL_TEXTURE_2D, texid[tiles[cloudtile]->refcount]); // sky tile
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)tiles[cloudtile]->userdata]); // sky tile
glBegin( GL_QUADS );
glTexCoord2f((real_t)(ticks % 60) / 60, (real_t)(ticks % 60) / 60);
glVertex3f(-CLIPFAR * 16, 64, -CLIPFAR * 16);
@@ -881,7 +881,7 @@ void glDrawWorld(view_t* camera, int mode)

// second (closer) sky layer
glColor4f(1.f, 1.f, 1.f, .5);
- glBindTexture(GL_TEXTURE_2D, texid[tiles[cloudtile]->refcount]); // sky tile
+ glBindTexture(GL_TEXTURE_2D, texid[(long int)tiles[cloudtile]->userdata]); // sky tile
glBegin( GL_QUADS );
glTexCoord2f((real_t)(ticks % 240) / 240, (real_t)(ticks % 240) / 240);
glVertex3f(-CLIPFAR * 16, 32, -CLIPFAR * 16);
@@ -954,13 +954,13 @@ void glDrawWorld(view_t* camera, int mode)
{
if ( map.tiles[index] < 0 || map.tiles[index] >= numtiles )
{
- new_tex = texid[sprites[0]->refcount];
- //glBindTexture(GL_TEXTURE_2D, texid[sprites[0]->refcount]);
+ new_tex = texid[(long int)sprites[0]->userdata];
+ //glBindTexture(GL_TEXTURE_2D, texid[(long int)sprites[0]->userdata]);
}
else
{
- new_tex = texid[tiles[map.tiles[index]]->refcount];
- //glBindTexture(GL_TEXTURE_2D, texid[tiles[map.tiles[index]]->refcount]);
+ new_tex = texid[(long int)tiles[map.tiles[index]]->userdata];
+ //glBindTexture(GL_TEXTURE_2D, texid[(long int)tiles[map.tiles[index]]->userdata]);
}
}
else
@@ -1282,8 +1282,8 @@ void glDrawWorld(view_t* camera, int mode)
// bind texture
if ( mode == REALCOLORS )
{
- new_tex = texid[tiles[mapceilingtile]->refcount];
- //glBindTexture(GL_TEXTURE_2D, texid[tiles[50]->refcount]); // rock tile
+ new_tex = texid[(long int)tiles[mapceilingtile]->userdata];
+ //glBindTexture(GL_TEXTURE_2D, texid[(long int)tiles[50]->userdata]); // rock tile
if (cur_tex!=new_tex)
{
glEnd();
19 changes: 19 additions & 0 deletions games/barony/patches/patch-src_savepng_cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
$OpenBSD: patch-src_savepng_cpp,v 1.1 2021/04/11 13:17:41 solene Exp $

Use 'userdata' instead of 'refcount'. 'refcount' is a private SDL_Surface field.
Use 'imgref' and not 'imgref + 1'

see: https://github.com/TurningWheel/Barony/pull/582

Index: src/savepng.cpp
--- src/savepng.cpp.orig
+++ src/savepng.cpp
@@ -59,7 +59,7 @@ SDL_Surface* SDL_PNGFormatAlpha(SDL_Surface* src)
/* NO-OP for images < 32bpp and 32bpp images that already have Alpha channel */
if (src->format->BitsPerPixel <= 24 || src->format->Amask)
{
- src->refcount++;
+ src->userdata = (void *)((long int) src->userdata + 1);
return src;
}

0 comments on commit 6b339b1

Please sign in to comment.