Change the create Bitmap from surface constructor to always take ownership of the surface, and provide an option to leave it as a mega surface

This commit is contained in:
Wayward Heart 2023-12-16 16:22:48 -06:00
parent bd01e11f56
commit c89f3d5bd7
2 changed files with 7 additions and 15 deletions

View file

@ -621,7 +621,7 @@ Bitmap::Bitmap(const char *filename)
SDL_Surface *imgSurf = handler.surface;
initFromSurface(imgSurf, hiresBitmap, true);
initFromSurface(imgSurf, hiresBitmap, false);
}
Bitmap::Bitmap(int width, int height, bool isHires)
@ -789,7 +789,7 @@ Bitmap::Bitmap(TEXFBO &other)
p->addTaintedArea(rect());
}
Bitmap::Bitmap(SDL_Surface *imgSurf, SDL_Surface *imgSurfHires)
Bitmap::Bitmap(SDL_Surface *imgSurf, SDL_Surface *imgSurfHires, bool forceMega)
{
Bitmap *hiresBitmap = nullptr;
@ -799,7 +799,7 @@ Bitmap::Bitmap(SDL_Surface *imgSurf, SDL_Surface *imgSurfHires)
hiresBitmap->setLores(this);
}
initFromSurface(imgSurf, hiresBitmap, false);
initFromSurface(imgSurf, hiresBitmap, forceMega);
}
Bitmap::~Bitmap()
@ -807,18 +807,14 @@ Bitmap::~Bitmap()
dispose();
}
void Bitmap::initFromSurface(SDL_Surface *imgSurf, Bitmap *hiresBitmap, bool freeSurface)
void Bitmap::initFromSurface(SDL_Surface *imgSurf, Bitmap *hiresBitmap, bool forceMega)
{
p->ensureFormat(imgSurf, SDL_PIXELFORMAT_ABGR8888);
if (imgSurf->w > glState.caps.maxTexSize || imgSurf->h > glState.caps.maxTexSize)
if (imgSurf->w > glState.caps.maxTexSize || imgSurf->h > glState.caps.maxTexSize || forceMega)
{
/* Mega surface */
if(!freeSurface) {
throw Exception(Exception::RGSSError, "Cloning Mega Bitmap from Surface not supported");
}
p = new BitmapPrivate(this);
p->selfHires = hiresBitmap;
p->megaSurface = imgSurf;
@ -848,10 +844,6 @@ void Bitmap::initFromSurface(SDL_Surface *imgSurf, Bitmap *hiresBitmap, bool fre
TEX::bind(p->gl.tex);
TEX::uploadImage(p->gl.width, p->gl.height, imgSurf->pixels, GL_RGBA);
if (freeSurface) {
SDL_FreeSurface(imgSurf);
}
}
p->addTaintedArea(rect());

View file

@ -42,7 +42,7 @@ public:
Bitmap(int width, int height, bool isHires = false);
Bitmap(void *pixeldata, int width, int height);
Bitmap(TEXFBO &other);
Bitmap(SDL_Surface *imgSurf, SDL_Surface *imgSurfHires);
Bitmap(SDL_Surface *imgSurf, SDL_Surface *imgSurfHires, bool forceMega = false);
/* Clone constructor */
@ -50,7 +50,7 @@ public:
Bitmap(const Bitmap &other, int frame = -2);
~Bitmap();
void initFromSurface(SDL_Surface *imgSurf, Bitmap *hiresBitmap, bool freeSurface);
void initFromSurface(SDL_Surface *imgSurf, Bitmap *hiresBitmap, bool forceMega = false);
int width() const;
int height() const;