From 6b339b147ace2a895179174d6c02db37f1ec6e69 Mon Sep 17 00:00:00 2001 From: solene Date: Sun, 11 Apr 2021 13:17:41 +0000 Subject: [PATCH] Patch a SDL texture issue making the game not playable Upstream issue: https://github.com/TurningWheel/Barony/issues/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 https://github.com/TurningWheel/Barony/pull/582 Patches for the port done by Nam Nguyen thanks everyone for fixing this issue ok sthen@ brynet@ and maintainer (David Carlier) --- games/barony/Makefile | 3 +- games/barony/patches/patch-src_draw_cpp | 109 +++++++++++++++++++++ games/barony/patches/patch-src_files_cpp | 19 ++++ games/barony/patches/patch-src_opengl_cpp | 102 +++++++++++++++++++ games/barony/patches/patch-src_savepng_cpp | 19 ++++ 5 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 games/barony/patches/patch-src_draw_cpp create mode 100644 games/barony/patches/patch-src_files_cpp create mode 100644 games/barony/patches/patch-src_opengl_cpp create mode 100644 games/barony/patches/patch-src_savepng_cpp diff --git a/games/barony/Makefile b/games/barony/Makefile index 9a8221c7bdb9..aaea36351cd8 100644 --- a/games/barony/Makefile +++ b/games/barony/Makefile @@ -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 diff --git a/games/barony/patches/patch-src_draw_cpp b/games/barony/patches/patch-src_draw_cpp new file mode 100644 index 000000000000..5f1eeabd5797 --- /dev/null +++ b/games/barony/patches/patch-src_draw_cpp @@ -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 diff --git a/games/barony/patches/patch-src_files_cpp b/games/barony/patches/patch-src_files_cpp new file mode 100644 index 000000000000..7cf1ab3036cf --- /dev/null +++ b/games/barony/patches/patch-src_files_cpp @@ -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 diff --git a/games/barony/patches/patch-src_opengl_cpp b/games/barony/patches/patch-src_opengl_cpp new file mode 100644 index 000000000000..a39a0a1100d0 --- /dev/null +++ b/games/barony/patches/patch-src_opengl_cpp @@ -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(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(); diff --git a/games/barony/patches/patch-src_savepng_cpp b/games/barony/patches/patch-src_savepng_cpp new file mode 100644 index 000000000000..01d1e33ec847 --- /dev/null +++ b/games/barony/patches/patch-src_savepng_cpp @@ -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; + } +