From c6eebefd77dd52562d6caefd5ea55bd4173eb27d Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Wed, 5 Mar 2025 01:15:40 +0000 Subject: [PATCH] Convert texture pixel format if necessary This makes the game run on modern macOS. FossilOrigin-Name: 12641927d964516871cccb92bc0171dab7fd3239212538f480b617951e7f9e6c --- src/rendergl.mm | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/src/rendergl.mm b/src/rendergl.mm index c5fdcc1..c56c7c4 100644 --- a/src/rendergl.mm +++ b/src/rendergl.mm @@ -70,20 +70,43 @@ cleangl() { if (qsphere) gluDeleteQuadric(qsphere); -}; +} bool installtex(int tnum, char *texname, int &xs, int &ys, bool clamp) { SDL_Surface *s = IMG_Load(texname); - if (!s) { + if (s == NULL) { conoutf(@"couldn't load texture %s", texname); return false; - }; + } + if (s->format->BitsPerPixel != 24) { - conoutf(@"texture must be 24bpp: %s", texname); - return false; - }; + SDL_PixelFormat *format = + SDL_AllocFormat(SDL_PIXELFORMAT_RGB24); + if (format == NULL) { + conoutf(@"texture cannot be converted to 24bpp: %s", + texname); + return false; + } + + @try { + SDL_Surface *converted = + SDL_ConvertSurface(s, format, 0); + if (converted == NULL) { + conoutf( + @"texture cannot be converted to 24bpp: %s", + texname); + return false; + } + + SDL_FreeSurface(s); + s = converted; + } @finally { + SDL_FreeFormat(format); + } + } + // loopi(s->w*s->h*3) { uchar *p = (uchar *)s->pixels+i; *p = 255-*p; }; glBindTexture(GL_TEXTURE_2D, tnum); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); @@ -95,28 +118,35 @@ installtex(int tnum, char *texname, int &xs, int &ys, bool clamp) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // NEAREST); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + xs = s->w; ys = s->h; while (xs > glmaxtexsize || ys > glmaxtexsize) { xs /= 2; ys /= 2; - }; + } + void *scaledimg = s->pixels; + if (xs != s->w) { conoutf(@"warning: quality loss: scaling %s", texname); // for voodoo cards under linux scaledimg = alloc(xs * ys * 3); gluScaleImage(GL_RGB, s->w, s->h, GL_UNSIGNED_BYTE, s->pixels, xs, ys, GL_UNSIGNED_BYTE, scaledimg); - }; + } + if (gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, xs, ys, GL_RGB, GL_UNSIGNED_BYTE, scaledimg)) fatal(@"could not build mipmaps"); + if (xs != s->w) free(scaledimg); + SDL_FreeSurface(s); + return true; -}; +} // management of texture slots // each texture slot can have multople texture frames, of which currently only