Implement blits from mega surfaces to regular Bitmaps
This is used in events that take their sprite from a tile out of the tileset.
This commit is contained in:
parent
0fc6022dd0
commit
dff2d79a70
|
@ -319,10 +319,48 @@ void Bitmap::stretchBlt(const IntRect &destRect,
|
||||||
opacity = clamp(opacity, 0, 255);
|
opacity = clamp(opacity, 0, 255);
|
||||||
|
|
||||||
if (opacity == 0)
|
if (opacity == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (source.megaSurface())
|
||||||
{
|
{
|
||||||
|
/* Don't do transparent blits for now */
|
||||||
|
if (opacity < 255)
|
||||||
|
source.ensureNonMega();
|
||||||
|
|
||||||
|
SDL_Surface *srcSurf = source.megaSurface();
|
||||||
|
|
||||||
|
int bpp;
|
||||||
|
Uint32 rMask, gMask, bMask, aMask;
|
||||||
|
SDL_PixelFormatEnumToMasks(SDL_PIXELFORMAT_ABGR8888,
|
||||||
|
&bpp, &rMask, &gMask, &bMask, &aMask);
|
||||||
|
SDL_Surface *blitTemp =
|
||||||
|
SDL_CreateRGBSurface(0, destRect.w, destRect.h, bpp, rMask, gMask, bMask, aMask);
|
||||||
|
|
||||||
|
SDL_Rect srcRect;
|
||||||
|
srcRect.x = sourceRect.x;
|
||||||
|
srcRect.y = sourceRect.y;
|
||||||
|
srcRect.w = sourceRect.w;
|
||||||
|
srcRect.h = sourceRect.h;
|
||||||
|
|
||||||
|
SDL_Rect dstRect;
|
||||||
|
dstRect.x = dstRect.y = 0;
|
||||||
|
dstRect.w = blitTemp->w;
|
||||||
|
dstRect.h = blitTemp->h;
|
||||||
|
|
||||||
|
// FXIME: This is supposed to be a scaled blit, put SDL2 for some reason
|
||||||
|
// makes the source surface unusable after BlitScaled() is called. Investigate!
|
||||||
|
SDL_BlitSurface(srcSurf, &srcRect, blitTemp, &dstRect);
|
||||||
|
|
||||||
|
TEX::bind(p->tex.tex);
|
||||||
|
TEX::uploadSubImage(destRect.x, destRect.y, destRect.w, destRect.h, blitTemp->pixels, GL_RGBA);
|
||||||
|
|
||||||
|
SDL_FreeSurface(blitTemp);
|
||||||
|
|
||||||
|
modified();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (opacity == 255 && !p->touchesTaintedArea(destRect))
|
|
||||||
|
if (opacity == 255 && !p->touchesTaintedArea(destRect))
|
||||||
{
|
{
|
||||||
/* Fast blit */
|
/* Fast blit */
|
||||||
flush();
|
flush();
|
||||||
|
@ -746,12 +784,12 @@ TEXFBO &Bitmap::getGLTypes()
|
||||||
return p->tex;
|
return p->tex;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Surface *Bitmap::megaSurface()
|
SDL_Surface *Bitmap::megaSurface() const
|
||||||
{
|
{
|
||||||
return p->megaSurface;
|
return p->megaSurface;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bitmap::ensureNonMega()
|
void Bitmap::ensureNonMega() const
|
||||||
{
|
{
|
||||||
if (isDisposed())
|
if (isDisposed())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -105,8 +105,8 @@ public:
|
||||||
/* <internal> */
|
/* <internal> */
|
||||||
void flush() const;
|
void flush() const;
|
||||||
TEXFBO &getGLTypes();
|
TEXFBO &getGLTypes();
|
||||||
SDL_Surface *megaSurface();
|
SDL_Surface *megaSurface() const;
|
||||||
void ensureNonMega();
|
void ensureNonMega() const;
|
||||||
|
|
||||||
/* Binds the backing texture and sets the correct
|
/* Binds the backing texture and sets the correct
|
||||||
* texture size uniform in shader */
|
* texture size uniform in shader */
|
||||||
|
|
Loading…
Reference in New Issue