forked from openbsd/ports
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Patch a SDL texture issue making the game not playable
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
Showing
5 changed files
with
251 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|