Overlay is now using Surfaces instead of Textures.

This commit is contained in:
Scott Duensing 2019-12-11 20:41:10 -06:00
parent 794177b078
commit 70dd504b7b

View file

@ -68,7 +68,7 @@ typedef struct SpriteS {
int id;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpadded"
SDL_Texture *texture;
SDL_Surface *surface;
#pragma GCC diagnostic pop
UT_hash_handle hh;
} SpriteT;
@ -162,7 +162,7 @@ static MouseT _mice[MAX_MICE];
static lua_State *_luaContext = NULL;
static SDL_Color _colorForeground = { 255, 255, 255, 255 };
static SDL_Color _colorBackground = { 0, 0, 0, 0 };
static SDL_Texture *_overlay = NULL;
static SDL_Surface *_overlay = NULL;
static SDL_Window *_window = NULL;
static SDL_Renderer *_renderer = NULL;
static int _nextSpriteId = 0;
@ -417,7 +417,6 @@ int apiDaphneScreenshot(lua_State *L) {
luaTrace(L, "daphneScreenshot", "%s", filename);
SDL_SetRenderTarget(_renderer, NULL);
texture = SDL_GetRenderTarget(_renderer);
if (SDL_QueryTexture(texture, &format, NULL, &x, &y) < 0) luaDie(L, "daphneScreenshot", "%s", SDL_GetError());
pixels = malloc((size_t)x * (size_t)y * SDL_BYTESPERPIXEL(format));
@ -428,7 +427,6 @@ int apiDaphneScreenshot(lua_State *L) {
if (IMG_SavePNG(surface, filename) < 0) luaDie(L, "daphneScreenshot", "%s", IMG_GetError());
SDL_FreeSurface(surface);
free(pixels);
SDL_SetRenderTarget(_renderer, _overlay);
return 0;
}
@ -546,13 +544,9 @@ int apiDiscPauseAtFrame(lua_State *L) {
int apiDiscPlay(lua_State *L) {
(void)L;
if (_discStopped) {
videoPlay(_videoHandle);
_discStopped = false;
luaTrace(L, "discPlay", "");
} else {
luaTrace(L, "discPlay", "Failed! Disc is stopped.");
}
return 0;
}
@ -764,7 +758,6 @@ int apiFontPrint(lua_State *L) {
const char *message = NULL;
double d = 0;
SDL_Surface *textSurface = NULL;
SDL_Texture *texture = NULL;
SDL_Rect dest;
if (n == 3) {
@ -795,11 +788,10 @@ int apiFontPrint(lua_State *L) {
SDL_SetSurfaceBlendMode(textSurface, SDL_BLENDMODE_BLEND);
// Transparent index is 0
SDL_SetColorKey(textSurface, true, 0);
texture = SDL_CreateTextureFromSurface(_renderer, textSurface);
dest.w = textSurface->w;
dest.h = textSurface->h;
SDL_BlitSurface(textSurface, NULL, _overlay, &dest);
SDL_FreeSurface(textSurface);
if (!texture) luaDie(L, "fontPrint", "%s", SDL_GetError());
if (SDL_QueryTexture(texture, NULL, NULL, &dest.w, &dest.h) < 0) luaDie(L, "fontPrint", "%s", SDL_GetError());
SDL_RenderCopy(_renderer, texture, NULL, &dest);
}
}
}
@ -871,40 +863,34 @@ int apiFontToSprite(lua_State *L) {
int n = lua_gettop(L);
int result = -1;
const char *message = NULL;
SDL_Surface *textSurface = NULL;
SpriteT *sprite = NULL;
if (n == 1) {
if (lua_isstring(L, 1)) {
if (_fontCurrent) {
textSurface = NULL;
message = lua_tostring(L, 1);
switch (_fontQuality) {
case 1:
textSurface = TTF_RenderText_Solid(_fontCurrent->font, message, _colorForeground);
break;
case 2:
textSurface = TTF_RenderText_Shaded(_fontCurrent->font, message, _colorForeground, _colorBackground);
break;
case 3:
textSurface = TTF_RenderText_Blended(_fontCurrent->font, message, _colorForeground);
break;
}
if (!textSurface) {
luaDie(L, "fontToSprite", "Font surface is null!");
} else {
SDL_SetSurfaceBlendMode(textSurface, SDL_BLENDMODE_BLEND);
// Transparent index is 0
SDL_SetColorKey(textSurface, true, 0);
// Create spirte
sprite = (SpriteT *)calloc(1, sizeof(SpriteT));
if (!sprite) luaDie(L, "fontToSprite", "Unable to allocate new text sprite.");
sprite->texture = SDL_CreateTextureFromSurface(_renderer, textSurface);
SDL_FreeSurface(textSurface);
if (!sprite->texture) luaDie(L, "fontToSprite", "%s", SDL_GetError());
message = lua_tostring(L, 1);
switch (_fontQuality) {
case 1:
sprite->surface = TTF_RenderText_Solid(_fontCurrent->font, message, _colorForeground);
break;
case 2:
sprite->surface = TTF_RenderText_Shaded(_fontCurrent->font, message, _colorForeground, _colorBackground);
break;
case 3:
sprite->surface = TTF_RenderText_Blended(_fontCurrent->font, message, _colorForeground);
break;
}
if (!sprite->surface) {
luaDie(L, "fontToSprite", "Font surface is null!");
} else {
SDL_SetColorKey(sprite->surface, true, 0);
//SDL_SetSurfaceAlphaMod(sprite->surface, 255);
sprite->id = _nextSpriteId;
result = _nextSpriteId++;
HASH_ADD_INT(_spriteList, id, sprite);
@ -913,7 +899,7 @@ int apiFontToSprite(lua_State *L) {
}
}
if (textSurface) {
if (sprite->surface) {
luaTrace(L, "fontToSprite", "%d %s", result, message);
} else {
luaTrace(L, "fontToSprite", "Failed!");
@ -926,39 +912,22 @@ int apiFontToSprite(lua_State *L) {
int apiOverlayClear(lua_State *L) {
(void)L;
SDL_SetRenderDrawColor(_renderer, _colorBackground.r, _colorBackground.g, _colorBackground.b, _colorBackground.a);
SDL_RenderClear(_renderer);
SDL_FillRect(_overlay, NULL, SDL_MapRGBA(_overlay->format, _colorBackground.r, _colorBackground.g, _colorBackground.b, _colorBackground.a));
luaTrace(L, "overlayClear", "");
return 0;
}
int apiOverlayGetHeight(lua_State *L) {
Uint32 format;
int access;
int x;
int y;
if (SDL_QueryTexture(_overlay, &format, &access, &x, &y) < 0) luaDie(L, "overlayGetHeight", "%s", SDL_GetError());
luaTrace(L, "overlayGetHeight", "%d", y);
lua_pushinteger(L, y);
luaTrace(L, "overlayGetWidth", "%d", _overlay->h);
lua_pushinteger(L, _overlay->h);
return 1;
}
int apiOverlayGetWidth(lua_State *L) {
Uint32 format;
int access;
int x;
int y;
if (SDL_QueryTexture(_overlay, &format, &access, &x, &y) < 0) luaDie(L, "overlayGetWidth", "%s", SDL_GetError());
luaTrace(L, "overlayGetWidth", "%d", x);
lua_pushinteger(L, x);
luaTrace(L, "overlayGetWidth", "%d", _overlay->w);
lua_pushinteger(L, _overlay->w);
return 1;
}
@ -1275,8 +1244,9 @@ int apiSpriteDraw(lua_State *L) {
d = lua_tonumber(L, 3); id = (int)d;
HASH_FIND_INT(_spriteList, &id, sprite);
if (!sprite) luaDie(L, "spriteDraw", "No sprite at index %d in apiSpriteGetWidth.", id);
if (SDL_QueryTexture(sprite->texture, NULL, NULL, &dest.w, &dest.h) < 0) luaDie(L, "spriteDraw", "%s", SDL_GetError());
SDL_RenderCopy(_renderer, sprite->texture, NULL, &dest);
dest.w = sprite->surface->w;
dest.h = sprite->surface->h;
SDL_BlitSurface(sprite->surface, NULL, _overlay, &dest);
}
}
}
@ -1296,11 +1266,7 @@ int apiSpriteGetHeight(lua_State *L) {
int n = lua_gettop(L);
int result = -1;
int id = -1;
int access;
int x;
int y;
double d;
Uint32 format;
SpriteT *sprite = NULL;
if (n == 1) {
@ -1309,8 +1275,7 @@ int apiSpriteGetHeight(lua_State *L) {
// Get our sprite structure
HASH_FIND_INT(_spriteList, &id, sprite);
if (!sprite) luaDie(L, "spriteGetHeight", "No sprite at index %d in apiSpriteGetWidth.", id);
if (SDL_QueryTexture(sprite->texture, &format, &access, &x, &y) < 0) luaDie(L, "spriteGetHeight", "%s", SDL_GetError());
result = y;
result = sprite->surface->h;
}
}
@ -1329,11 +1294,7 @@ int apiSpriteGetWidth(lua_State *L) {
int n = lua_gettop(L);
int result = -1;
int id = -1;
int access;
int x;
int y;
double d;
Uint32 format;
SpriteT *sprite = NULL;
lua_Debug ar;
@ -1346,8 +1307,7 @@ int apiSpriteGetWidth(lua_State *L) {
// Get our sprite structure
HASH_FIND_INT(_spriteList, &id, sprite);
if (!sprite) luaDie(L, "spriteGetWidth", "No sprite at index %d in apiSpriteGetWidth.", id);
if (SDL_QueryTexture(sprite->texture, &format, &access, &x, &y) < 0) luaDie(L, "spriteGetWidth", "%s", SDL_GetError());
result = x;
result = sprite->surface->w;
}
}
@ -1367,25 +1327,22 @@ int apiSpriteLoad(lua_State *L) {
int result = -1;
const char *name = NULL;
SpriteT *sprite = NULL;
SDL_Surface *image = NULL;
if (n == 1) {
if (lua_isstring(L, 1)) {
name = lua_tostring(L, 1);
image = IMG_Load(name);
if (!image) luaDie(L, "spriteLoad", "%s", IMG_GetError());
sprite = (SpriteT *)calloc(1, sizeof(SpriteT));
if (!sprite) luaDie(L, "spriteLoad", "Unable to allocate new sprite.");
sprite->texture = SDL_CreateTextureFromSurface(_renderer, image);
SDL_FreeSurface(image);
if (!sprite->texture) luaDie(L, "spriteLoad", "%s", SDL_GetError());
name = lua_tostring(L, 1);
sprite->surface = IMG_Load(name);
if (!sprite->surface) luaDie(L, "spriteLoad", "%s", IMG_GetError());
SDL_SetColorKey(sprite->surface, true, 0);
sprite->id = _nextSpriteId;
result = _nextSpriteId++;
HASH_ADD_INT(_spriteList, id, sprite);
}
}
if (sprite) {
if (sprite->surface) {
luaTrace(L, "spriteLoad", "%d %s", result, name);
} else {
luaTrace(L, "spriteLoad", "Failed!");
@ -1418,9 +1375,7 @@ int apiVldpGetPixel(lua_State *L) {
rect.w = 1;
d = lua_tonumber(L, 1); rect.x = (int)d;
d = lua_tonumber(L, 2); rect.y = (int)d;
SDL_SetRenderTarget(_renderer, NULL);
if (SDL_RenderReadPixels(_renderer, &rect, SDL_PIXELFORMAT_BGRA32, pixel, SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32)) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError());
SDL_SetRenderTarget(_renderer, _overlay);
if (SDL_RenderReadPixels(_renderer, &rect, SDL_PIXELFORMAT_BGRA32, pixel, SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32) * videoGetWidth(_videoHandle)) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError());
result = true;
}
}
@ -1973,6 +1928,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) {
int lastFrame = -1;
int intReturn = 0;
SDL_Texture *videoTexture = NULL;
SDL_Texture *overlayTexture = NULL;
SpriteT *sprite = NULL;
SpriteT *spriteTemp = NULL;
SoundT *sound = NULL;
@ -2083,17 +2039,14 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) {
// Should we resize the window?
//***TODO***
// Create overlay texture
// Create overlay surface
_overlayScaleX = 0.5;
_overlayScaleY = 0.5;
x = (int)(videoGetWidth(_videoHandle) * _overlayScaleX);
y = (int)(videoGetHeight(_videoHandle) * _overlayScaleY);
_overlay = SDL_CreateTexture(_renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_TARGET, x, y);
_overlay = SDL_CreateRGBSurfaceWithFormat(0, x, y, 32, SDL_PIXELFORMAT_BGRA32);
if (_overlay == NULL) utilDie("%s", SDL_GetError());
SDL_SetTextureBlendMode(_overlay, SDL_BLENDMODE_BLEND);
if (_confStretchVideo) {
SDL_RenderSetLogicalSize(_renderer, x, y);
}
SDL_SetColorKey(_overlay, true, 0);
// Mouse setup
_mouseCount = ManyMouse_Init();
@ -2270,7 +2223,6 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) {
}
// Call game code
SDL_SetRenderTarget(_renderer, _overlay);
callLua("onOverlayUpdate", ">i", &intReturn);
if (intReturn == 1) {
_refreshDisplay = true;
@ -2286,10 +2238,16 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) {
// Update display
if (_refreshDisplay) {
//***TODO*** Handle overlay and blank disk frames
SDL_SetRenderTarget(_renderer, NULL);
SDL_RenderCopy(_renderer, videoTexture, NULL, NULL);
//makeZeroTransparent(_overlay);
SDL_RenderCopy(_renderer, _overlay, NULL, NULL);
overlayTexture = SDL_CreateTextureFromSurface(_renderer, _overlay);
if (!overlayTexture) utilDie("%s", SDL_GetError());
if (!_confStretchVideo) {
SDL_RenderSetLogicalSize(renderer, videoGetWidth(_videoHandle), videoGetHeight(_videoHandle));
}
SDL_RenderCopy(_renderer, overlayTexture, NULL, NULL);
SDL_DestroyTexture(overlayTexture);
overlayTexture = NULL;
SDL_RenderPresent(_renderer);
_refreshDisplay = false;
}
@ -2306,7 +2264,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) {
lua_close(_luaContext);
// Free overlay
SDL_DestroyTexture(_overlay);
SDL_FreeSurface(_overlay);
// Unload fonts
HASH_ITER(hh, _fontList, font, fontTemp) {
@ -2334,7 +2292,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) {
#pragma GCC diagnostic ignored "-Wcast-align"
HASH_DEL(_spriteList, sprite);
#pragma GCC diagnostic pop
SDL_DestroyTexture(sprite->texture);
SDL_FreeSurface(sprite->surface);
free(sprite);
}